<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 패턴을 사용해 오브젝트를 생성할 수 있다.
TodoEntity todo = TodoEntity.builder()
.id("t-10123123")
.userId("developer")
.title("Implement Model")
.build();
이게 Builder 패턴의 예인데.. 솔직히 이 부분은 공부를 좀 더 해야할 것 같다. 아무튼 생성자를 이용하는 거랑 비슷한데, 생성자처럼 매개변수의 순서를 기억할 필요가 없다는 장점이 있다.
@NoArgsConstructor 어노테이션은 매개변수가 없는 생성자를 구현한다.
public TodoEntity() {
}
모든 멤버 변수를 매개변수로 받는 생성자를 구현.
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로 변환해서 리턴한다. 왜?~!!~!