안녕하세요, Brad입니다:) 자바를 공부하면 DTO에 대해 누구나 한번씩 들어봅니다. 하지만 전 그 필요성과 그 사용에 대해서 명확하게 파악하고 있진 않았던 것 같습니다. 오늘 수업에서 그것에 대한 작은 깨달음을 얻을 수 있었습니다!
DTO가 무엇인가?
DTO는 Data Transfer Object의 약자로 데이터를 다른 서버로 전달하기 위한 것이 주목적이라고 합니다. 하지만 지금 단계 전 DB를 사용하고 있지 않으니 현재는 다음 프로세스(출력)를 위한 데이터를 담는 용도로 주로 사용하고 있습니다. 비슷한 개념으로 VO(Value Objec)도 있는데요. 이 부분은 좀 더 공부하고 기록하려고 합니다.
왜 필요한가?
객체지향 프로그래밍 관점에서 DTO를 만들어내는 것이 큰 의미가 있습니다. 그 이유는 만약 Model(또는 Domain)에서 로직을 처리하고 그 클래스에서 바로 출력부로 넘겨주게 되면 로직에 접근할 위험이 있기 때문입니다.
예를 들어 '사다리게임' 이전에 했던 '레이싱카'의 경우 주로 로직들이 Car, RacingGame에 담겨있었습니다. 이 상태에서 RacingGame안에 있던 Car의 List를 출력부로 바로 넘겨주면 출력부에서 Car의 로직에 접근할 위험이 있습니다. 따라서 이 경우 Car에서 로직이 없는 CarDto를 만든 다음 이 CarDto의 List를 출력부에 넘겨줄 수 있도록 할 수 있습니다. 이를 통하여 Car의 로직에 바로 접근할 수 없게 합니다.
어떻게 사용할까?
DTO의 경우 Domain에서 로직을 처리한 결과값들을 넣습니다. Domain에서 DTO를 처리해주기 위한 메서드를 만드는 것입니다. 이 메서드 구성은 로직에서 처리한 값을 DTO 생성자에 담아 객체를 생성하여 반환합니다. 만약 그 DTO가 하나라면 바로 받아 사용하고, 여러 DTO값이라면 List를 사용하여 담은 다음에 사용 할 수 있습니다.
DTO라는 점을 분명히 하기위해 DTO의 클래스 이름에 DTO를 붙입니다.
Java Beans은 무엇일까?
DTO와 Java Beans의 관계에 대해선 DTO의 형식으로 Java Beans를 따르고 있다고 생각하면 됩니다. 위키피디아에서는 Java Beans에 대해서 이렇게 정의하고 있습니다.
In computing based on the Java Platform, JavaBeans are classes that encapsulate many objects into a single object (the bean). They are serializable, have a zero-argument constructor, and allow access to properties using getter and setter methods. The name "Bean" was given to encompass this standard, which aims to create reusable software components for Java.
위키피디아에서 설명하였듯이 기본적으로 다음과 같은 형식을 지니고 있습니다.
- 인스턴스 변수, default생성자, getter/setter
- default생성자 이외 다른 생성자를 만들어 default 생성자를 사용하고 있지 않더라도 default 생성자를 명시
- boolean 타입의 경우 setter는 동일하지만 getter의 경우 is~ 형태로 이름을 짓는다
Beans 기입형식은 최대한 개발도구를 이용하는 방식으로 하여 실수를 줄이는 것이 좋습니다.
여기서 드는 의문은 과연 Getter/Setter를 사용하면 분명 그 부작용도 있을텐데 반드시 Java Beans형식을 따라야 하느냐 입니다. 이에 대한 답으로 우선 위험은 있을 수 있음은 인정합니다. 하지만 주로 로직이 없는 DTO에 이런 형식을 이용한다는 점과 그리고 반드시 Java Beans형식에 따를 필요는 없다는 점에서 물론 유연하게 대처할 수도 있음을 말하고 싶습니다. 만약 Setter 만큼은 꼭 없애고 싶다면 생성자를 이용하면 됩니다.
'Language > Java' 카테고리의 다른 글
제네릭(Generic) (0) | 2018.11.23 |
---|---|
예외처리 (0) | 2018.10.25 |
enum (2) | 2018.10.22 |
인터페이스(Interface) (0) | 2018.10.15 |
상속(Inheritance) (3) | 2018.10.11 |