Language/Java

DTO(Data Transfer Object)는 왜 써야 할까~?

쿠키오빠 2024. 9. 12. 23:50
반응형

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 메서드를 통해서 호출한다면 코드가 명확하고 유지 보수성이 더 좋을 것이다.

 

내 생각엔 ... 그렇다... 공부를 더 해보고 틀린 점이 있다면 수정 하겠다....

 

넘 졸립다.. 자야겠다...

반응형