DTO(Data Transfer Object)는 왜 써야 할까~?
DTO 개념은 며칠전 클래스 강의를 들으며 알게 되었다.
강의 중엔 '아~ 그렇구나~' 하면서 이해는 됐는데, 도대체 왜, 굳이 DTO 클래스를 작성해야 할까?
미개한 생각으로는 굳이 DTO 클래스 없이도 여러 클래스들을 생성하여 연결 - 연결 하면 되지 않나? 라는 생각이었다.
그래서 복습하며 다시 훑어 보았다.
-------------------------------------------------------------------------------------------------------------------------------------------------
DTO란 !?
행위(메서드)위주가 아닌, 데이터를 하나로 뭉치기 위한 객체(Data Transfer Object)로 사용한다.
이러한 객체를 설계할 때는 행위가 아닌 데이터 위주이며 캡슐화를 적용하여 모든 필드를 private로 막고 각 필드값을 변경하거나 봔한하는 메서드를 세트로 미리 작성해 둔다.
(어떤 값을 쓸 지 모르니 미리 다 준비해두는 선물세트 같은 느낌이다.)
* pivate 캡슐화가 된 필드와 필드의 값을 수정할 수 있는 설정자(setter),
* 필드에 값을 접근할 수 있는 접근자(getter)로 구성이 된다.
* 주로 계층간의 데이터를 주고받을 목적이다.
<용어> 캡슐화 : 클래스 안에 데이터와 데이터를 처리하는 행위를 묶어 놓는 것
-------------------------------------------------------------------------------------------------------------------------------------------------
정의는 알아 봤고.. (여기서 왜 써야하는 지 깨달은 것 같았다.)
코드를 체크해 보자
package com.ohgiraffers.section03.dto;
public class MemberDTO
// ↓↓↓↓↓ 추상화 해놓은 것 (필요한 것들만 설정해둠) ↓↓↓↓↓↓↓↓↓
private int memberNo; // 회원번호
private String name; // 회원이름
private int age; // 나이
private char gender; // 성별
private double height; // 키
private double weight; // 몸무게
private boolean isActivated; // 회원 탈퇴 여부
public MemberDTO() {
System.out.println("MemberDTO의 기본 생성자 호출됨...");
}
/* setter(설정자) 작성 */
// 해당하는 필드(클래스 내에 값들)에 우리가 전달한 memeberNo를 대입하겠다.
public void setMemberNo(int memberNo) { //set 만 써도 인텔리제이가 안다. (그만큼 개발자들이 암묵적으로 사용한다)
this.memberNo = memberNo;
}
// alt + insert (자동으로 setter, getter 작성하는 단축기)
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setGender(char gender) {
this.gender = gender;
}
public void setHeight(double height) {
this.height = height;
}
public void setWeight(double weight) {
this.weight = weight;
}
public void setActivated(boolean activated) {
isActivated = activated;
}
/* index. 2. getter(접근자) 작성 */
public int getMemberNo () {
return memberNo;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public char getGender() {
return gender;
}
public double getHeight() {
return height;
}
public double getWeight() {
return weight;
}
public boolean isActivated() {
return isActivated;
}
@Override
public String toString() {
return "UserDTO{" +
"id='" + id + '\'' +
", pwd='" + pwd + '\'' +
", name='" + name + '\'' +
", enrollDate=" + enrollDate +
'}';
}
}
-------------------------------------------------------------------------------------------------------------------------------------------------
DTO 클래스 (코드 확인!!) 는 작성 규칙이 있는데 보통,
1. 필드에 필요한 변수 설정 (사용자의 접근을 막기 위해 private으로 작성)
2. 기본 생성자 → public 클래명 () {}
3. 매개변수가 있는 생성자 → public 클래스명 (매개변수 일부) {}
4. getter / setter 메서드 생성
5. 오버라이드 ToString 클래스를 통한 출력구문 생성
위의 5가지 틀을 유지하며 작성한다.
-------------------------------------------------------------------------------------------------------------------------------------------------
결론적으로 어떠한 프로그램을 제작할 때,
메인 클래스에서만 수백 줄의 코드를 작성한다면 유지보수가 좋지 않을 것이다. (오류 발생 시 감당이 안 된다.)
위 점을 보안하기 위해 다른 기능의 각 클래스 및 메서드에서 기능별로 호출한다면 조금 더 나은 코드가 되겠지만...
그 점 또한 기능이 많아진다면 복잡해 질 것이다.
내 생각에 DTO를 사용해야하는 가장 핵심은 getter / setter라고 생각한다.
각 기능이 있는 클래스 및 메서드를 호출 할 때 직접 호출이 아닌, getter 메서드를 통하여 호출하는 것이다.
setter는 말 그대로 해당 메서드 내에서 세팅(수정 및 구현)을 하는 것이다.
getter와 setter 메서드를 통해서 호출한다면 코드가 명확하고 유지 보수성이 더 좋을 것이다.
내 생각엔 ... 그렇다... 공부를 더 해보고 틀린 점이 있다면 수정 하겠다....
넘 졸립다.. 자야겠다...