Recent Posts
Recent Comments
Link
11-21 14:38
Today
Total
관리 메뉴

삶 가운데 남긴 기록 AACII.TISTORY.COM

Spring boot todo - Model, Entity, DTO 본문

DEV&OPS/Java

Spring boot todo - Model, Entity, DTO

ALEPH.GEM 2022. 8. 30. 10:42

아키텍처

Request → Controller(프레젠테이션 레이어, DTO)  → Service(비즈니스 레이어, Model) → Persistence(퍼시스턴스 레이어, Entity) → DB(데이터베이스 레이어) → Persistence(entity) → Service(model) → Controller (DTO)→ Response

 

 

Model, Entity

비지니스 데이터를 담는 역할을 Model이라 부르고 데이터베이스의 테이블의 스키마를 표현하는 역할을 Entity라고 합니다.

아키텍처의 각 레이어 별로 부르는 이름이 다를 뿐, 이름은 신경 쓰실 필요는 없습니다.

 

 

Lombok 어노테이션

@Builder 
디자인 패턴 중에서 빌더 패턴으로 구현하여 객체를 생성해줍니다.
생성자로 생성하는 것과 차이가 있다면 매개변수의 순서에 관계없이 생성이 가능하다는 점입니다.
TodoEntity todo = TodoEntity.builder().id("24252526631").userId("dev").title("제목").build();​
@NoArgsConstructor
매개변수가 없는 생성자를 구현해줍니다.
@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
getter/setter 를 자동으로 구현해줍니다.
public String getId(){
    retrun id;
}
public String setId(String id){
    this.id = id;
}
//생략​

 

 

DTO(Data Transfer Object)

현업 프로젝트에서 response에서 model을 그대로 리턴하지는 않고 DTO로 변환해서 리턴하는 것이 보통입니다.

왜냐하면 비지니스 로직을 캡슐화하여 DB 스키마와 유사한 model을 숨기기 위해서입니다.

또, 에러 메시지 같은 것들은 서비스 로직과는 관계가 없어서 DTO에서 처리하는 것이 보통입니다. 

 

 

모델(Entity)
DB 스키마와 유사한 객체입니다.
package ds.co.kr.todo.model;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class TodoEntity {
	private String id;
	private String userId;
	private String title;
	private boolean done;
}​

 

Request용 DTO
package ds.co.kr.todo.dto;

import ds.co.kr.todo.model.TodoEntity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class TodoDTO {
	private String id;
	private String title;
	private boolean done;
	
	public TodoDTO(final TodoEntity entity) {
		this.id = entity.getId();
		this.title = entity.getTitle();
		this.done = entity.isDone();
	}
}​

 

Response용 DTO
package ds.co.kr.todo.dto;

import java.util.List;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class ResponseDTO<T> {
	private String error;
	private List<T> data;
}​

 

 

 

 

 

 

 

728x90