모델, 엔티티, DTO

Workwork·2022년 8월 9일
0

React.Boot.Aws

목록 보기
13/19
post-thumbnail

<React.js, 스프링 부트, AWS로 배우는 웹 개발 101>(김다정 지음)을 따라 TO-DO 앱을 하나 만들 예정이다.

앞으로 쓸 대부분의 포스팅(이미지/글)은 위의 서적을 참고/출처로 작성되었음을 미리 밝힌다.

애플리케이션의 클래스를 두 가지로 나누면..
1. 일을 하는 클래스(기능을 수행하는 클래스)
: 컨트롤러, 서비스, 퍼시스턴스 로직
2. 데이터를 담는 클래스
이렇게 나눌 수 있다.

public calss TodoService {
	public List<Todo> getTodos(String userId) {
    	List<Todo> todos = new ArrayList<>();
        
        // ... 비즈니스 로직
        
        return todos;
    }
}

public class WebController {
	private TodoService todoService;
    
    public String getTodo(Request request) {
    // request validation
    
    if(request.uerId == null) {
    	JSONObject json = new JSONObject();
        json.put("error", "missing uer id");
        return json.toString();
    }
    
    // 서비스 레이어
    List<Todo> todos = service.getTodos(request.userId);
    
    return this.getResponse(todos);
    }

여기서 TodoService는 List todos를 리턴한다.
이는 Todo 오브젝트 리스트다. Todo 오브젝트는 기능이 없다. db에서 반환된 정보만 갖고 있다.

이렇게 아무 기능 없이 db에서 반환된 비즈니스 데이터를 담기 위한 클래스들을.. 그 기능에 따라 엔티티/모델/DTO(Data Transfer Object) 등으로 부른다.

모델과 엔티티

모델 : 비즈니스 데이터를 담는 역할과 데이터베이스의 테이블과 스키마를 표현하는 두 역할을 한다. 큰 애플리케이션의 경우 이 둘을 따로 구현하지만 규모가 작을 경우 합쳐서 구현하기도 한다.

package com.example.demo.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; // Todo 타이틀(예: 운동하기)
	private boolean done; // true - todo를 완료한 경우(checked)	
}

몇 가지 어노테이션을 짚고 가자

@Builder

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

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

이게 Builder 패턴의 예인데.. 솔직히 이 부분은 공부를 좀 더 해야할 것 같다. 아무튼 생성자를 이용하는 거랑 비슷한데, 생성자처럼 매개변수의 순서를 기억할 필요가 없다는 장점이 있다.

@NoArgsConstructor

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

public TodoEntity() {
  }
@AllAgsConstructor

모든 멤버 변수를 매개변수로 받는 생성자를 구현.

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 메서드를 구현해 준다.
  
```java
public String getId() {
  	return id;
  }

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

DTO

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

  1. 비즈니스 로직을 캡슐화 하기 위해 : 모델은 DB 테이블 구조와 유사하다. 모델이 갖고 있는 필드들은 테이블의 스키마와 비슷할 확률이 높다. 대부분의 비즈니스는 외부인이 자사 db 스키마 아는 걸 원치 않는다. DTO로 변환하면 내부 로직, db 구조를 숨길 수 있다.
  2. 클라이언트가 필요한 정보를 모델이 전부 포함하지 않는 경우가 있다. 모델은 서비스 로직과 관련이 없기 때문에 에러 메세지를 모델에 담기는 애매하다. 이런 경우 DTO에 에러 메세지 필드를 선언하고 포함시키면 된다.
profile
나만 알아보면 된다는 마음으로 작더라도 조금씩

0개의 댓글