Skip to content

DTO 작성 관련

Lee kangmin edited this page Sep 24, 2024 · 1 revision

Entity → Response DTO static 메서드를 써야 하나요?

static으로 선언하고 싶지 않다면, 두 가지 방법이 있다.

Entity 안에 Response DTO를 만드는 메서드가 있다면, static으로 선언하지 않아도 된다. 그러나 Entity가 Dto에 의존해서는 안된다.

Response를 만들 때 생성자로 만드는 것도 가능하다. new ResponseDto(Entity entity)

그런데,

static 메서드 쓰면 된다. Factory method → static으로 할 수밖에 없다.

프로그램의 시작부터 끝까지 메모리에 올라가있는 것을 이야기하는데,

static 메서드를 쓴다고 메모리 공간을 더 차지하는 것이 아니다. 프로그램의 시작부터 끝까지 메모리에 올라가있는 것은 메서드 정보 뿐이다.

힙 메모리에 올라가는 것은 객체이다.

객체는 필드와 메서드를 가진다.

image

getName(); 메서드

→ 객체마다 달라지는가? NO

객체마다 달라질 필요가 없기 때문에 메모리에 static처럼 올라간다.

달라지는 것은 **필드**밖에 없다. 필드만 별개의 메모리에 담는 것이다. 메서드는 달라지지 않는다.

메서드는 어차피 똑같으니까 객체마다 달라질 것이 없다.

메서드는 static 이든 아니든 static 처럼 돌아간다. 인스턴스 메서드든 아니든 getName() 메서드를 3개를 만들지 않는 것이다.

🙆‍♂️ 메서드는 static 처럼 올라간다 !!

Request DTO → Entity static 메서드 🙅

본인이 Request인데 Parameter로 Request를 받는 것은 당연히 아니다.

this로 해결

Record

→ VO, DTO와는 다르다.

  • 불변(final)
  • VO의 몇 가지 조건 중 하나가 불변인거지, 불변이라고 다 VO는 아니다.
항목 VO DTO
불변성 O X (불변일 필요는 없지만 불변이어도 상관 없음)
캡슐화 O (내부 필드를 감추는 것) X
로직 O X
설명 도메인 객체, 상태를 유지하며 비즈니스 로직을 포함 데이터만 운반하는 자료구조

💭 Dto 안에 toDto 로직을 넣는 것이 맞는가? 고민 ing . . .

VO를 Record로 사용해서는 안된다. Record를 사용하면 캡슐화를 할 수가 없다. 내부 필드가 다 드러난다.

PhoneNumber → 외부의 문자열을 넣는다.

String 하나로 관리를 할 수도 있었을 것이고, 경우에 따라서는 이거를 세 개를 나눌 수도 있었을 것이다.

String1, String2, String3 내부 필드를 세 개로 둘 수도 있다. 이는 캡슐화의 영역인 것이다.

package org.example.catch_line.common.model.vo;

public class PhoneNumber {

    private final String string1;
    private final String string2;
    private final String string3;
    
    public PhoneNumber(String phoneNumberValue) {
        this.phoneNumberValue = phoneNumberValue;
        validatePhoneNumber();
        removeHyphoon();
        this.string1 = getFirst();
        this.string2 = getMiddle();
        this.string3 = getLast();
    }
    
    public PhoneNumber(String string1, String string2, String string3) {
		    this.string1 = string1;
		    this.string2 = string2;
		    this.string3 = string3; 
    }

    
    private void validatePhoneNumber() {
		    // 전화번호 검증
    }
    
    private void removeHyphoon() {
		    // "-"를 제거
    }   
    
    private String getFirst() {
		    // 010-1111-2222
		    // "010"
    }
    
    private String getMiddle() {
		    // 010-1111-2222
		    // "1111"
    }
    
    private String getLast() {
		    // 010-1111-2222
		    // "2222"
    }
}
new PhoneNumber(”010”, “1212”, “3434”);

외부에서는 볼 수 없다.

캡슐화 → 내부를 어떻게 관리할 것인가?

외부에서 @getter 등의 메서드로 내부 필드를 볼 수 없어야 한다.

사실 VO에서도 @Getter를 다 빼야 순수한 Value Object가 될 것이다.

Response DTO

생성된 ID랑 HttpStatusCode를 내려주는 것이 정석이다.

created은 201일 것이다.

그런데 ok(200)만 내려줘도 된다. 불필요하다면 그래도 된다.