컨트롤러는 유저에게서 TodoDto를 요청바디로 넘겨받고 이를 TodoEntity로 변환해 저장해야 하며 또 TodoService의 Create()가 리턴하는 TodoEntity를 TodoDTO로 변환해 리턴해야 한다.
HTTP 응답을 반환할 때,
비지니스 로직을 캡슐화
하거나추가적인 정보를 함께 반환
하기 위해 DTO를 사용한다.
또 데이타베이스 테이블을 자바 내에서 사용하기 위해 엔티티를 사용하며
보통 데이타베이스 테이블 하나마다 그에 상응하는 예를 들어 MySQL의 Todo테이블과 TodoEntity.java같은 엔티티 클래스가 존재
한다. 엔티티 클래스는 클래스 그 자체가 테이블을 정의해야 한다.
또 이런 ORM(Object Relation Mapping)작업을 집중적으로 해주는 DAO(Data Access Object클래스)를 작성해야 한다.
package com.example.springTest.dto;
import com.example.springTest.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();
}
public static TodoEntity todoEntity(final TodoDTO dto){
return TodoEntity.builder().id(dto.getId()).title(dto.getTitle()).done(dto.isDone()).build();
}
}
service에서 repository를 사용하여 엔티티를 데이타베이스에 저장하고 데이타베이스 에서 원하는 값을 검색하여 리턴 받는다
package com.example.springTest.service;
import com.example.springTest.model.TodoEntity;
import com.example.springTest.persistence.TodoRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class TodoService {
@Autowired
private TodoRepository repository;
public List<TodoEntity> create(final TodoEntity entity){
repository.save(entity);
//엔티티를 데이타베이스에 저장한다.
return repository.findByUserId(entity.getUserId());
//저장된 엔티티를 포함하는 새리스트를 리턴한다.
}
}
package com.example.springTest.controller;
import com.example.springTest.dto.TodoDTO;
import com.example.springTest.model.TodoEntity;
import org.springframework.web.bind.annotation.*;
import com.example.springTest.service.TodoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import java.util.List;
import java.util.ArrayList;
import java.util.stream.Collectors;
import com.example.springTest.dto.ResponseDTO;
@RestController
@RequestMapping("todo")
public class TodoController {
@Autowired
private TodoService service;
@PostMapping
public ResponseEntity<?> createTodo(@RequestBody TodoDTO dto){
try {
TodoEntity entity = TodoDTO.todoEntity(dto);
//유저에게서 TodoDto를 요청바디로 넘겨받고 이를 TodoEntity로 변환한다.
List<TodoEntity> entities = service.create(entity);
//서비스에서 TodoEntity를 저장
List<TodoDTO> dtos = entities.stream().map(TodoDTO::new).collect(Collectors.toList());
//자바 스트림을 이용해 리턴된 엔티티 리스트를 TodoDTO 리스트로 변환.
ResponseDTO<TodoDTO> response = ResponseDTO.<TodoDTO>builder().data(dtos).build();
//변환된 TodoDTO리스트를 이용해 ResponseDTO를 초기화한다.
return ResponseEntity.ok().body(response);
//ResponseDTO를 리턴한다.
}catch (Exception e){
String error = e.getMessage();
ResponseDTO<TodoDTO> response = ResponseDTO.<TodoDTO>builder().error(error).build();
return ResponseEntity.badRequest().body(response);
}
}
}