2.2.2 모델, 엔티티, DTO

jaehyeok1230·2022년 11월 26일
0


1. 일을 하는 클래스 즉 기능을 수행하는 클래스. 일을 하는 클래스는 컨트롤러, 서비스, 퍼시스턴스처럼 로직을 수행하는 클래스이다.
2. 두 번째는 데이터를 담는 클래스이다. 아무 기능없이 데이터베이스에서 반환된 비즈니스 데이터를 담기 위한 클래스들을 기능에 따라 엔티티, 모델, DTO 등으로 부른다.


이 프로젝트에서는 모델과 엔티티를 한 클래스에 구현한다.(규모가 작아서) 따하서 모델은 비즈니스 데이터를 담는 역할과 데이터베이스의 테이블과 스키마를 표현하는 두 역할을 한다.

@Builder
Builder는 오브젝트 생성을 위한 디자인 패턴 중 하나이다. 이 어노테이션을 사용하면 Builder 클래스를 따로 개발하지 않고도 Builder 패턴을 사용해 오브젝트를 생성할 수 있다.

TodoEntity todo = TodoEntity.builder()
					.id("t-10348373")
                    .userId("developer")
                    .title("Implement Model")
                    .build();

이 패턴은 생성자를 사용해 오브젝트를 생성하는 것과 비슷하지만 생성자 매개변수의 순서를 기억할 필요가 없다는 장점이 있다.

@NoArgsConstructor
@NoArgsConstructor 어노테이션은 매개변수가 없는 생성자를 구현해준다.

public TodoEntity(){

}

@AllArgsConstructor
@AllArgsConstructor 어노테이션은 클래스의 모든 멤버변수를 매개변수로 받는 생성자를 구현해준다.

public TodoEntity(String id, String userId, String title, boolean done){
	super();
    this.id = id;
    this.userId = userId;
    this.title = title;
    this.done = done;
}

@Data
@Data 어노테이션은 클래스 멤버 변수의 Getter/Setter 메서드를 구현해준다.

public String getId(){
	return id;
}

public void setId(String id){
	this.id = id;
}

DTO

서비스가 요청을 처리하고 클라이언트로 반환할 때, 모델 자체를 그대로 리턴하는 경우는 별로 없다. 보통은 DTO로 변환해 리턴한다.
그 이유는

  • 비즈니스 로직을 캡슐화하기 위함이다.

모델은 DB 테이블 구조와 매우 유사하고 모델이 가지고 있는 필드들은 테이블의 스키마와 비슷할 확률이 높다. 대부분의 회사들은 외부인이 자사의 DB의 스키마를 아는 것을 원치 않는다. 이때 DTO처럼 다른 오브젝트로 바꿔 반환하면 외부 사용자에게 서비스 내부의 로직, DB 구조 등을 숨길 수 있다.

  • 클라이언트가 필요한 정보를 모델이 전부 포함하지 않는 경우가 많기 때문이다.

예를 들어 에러 메시지의 경우 서비스 실행 도중 유저에러가 나면 이 에러 메시지를 어디에 포함해야 하는지 애매하기 때문이다. 이런 경우 DTO에 에러 메시지 필드를 선언하고 DTO에 포함하면 된다.

0개의 댓글