Controller에서는 사용자의 요청에 대한 DTO를 받으며 DTO로 사용자에게 반환한다.
Controller는 Service를 통해 로직을 처리하는데 이때 DTO를 Entity로 변환하는 과정을 통하여 Service에서는 DTO가 아닌 Entity를 사용하도록 하였다.
기능 | 메소드 | url |
---|---|---|
등록 | post | /todo |
조회 | get | /todo |
수정 | put | /todo |
삭제 | delete | /todo |
@CrossOrigin("*")
@RestController
@RequestMapping("/todo")
public class TodoController {
@Autowired
TodoService todoService;
String tempUserId = "temporary-user";
@PostMapping
public ResponseEntity<?> createTodo(@RequestBody TodoDTO dto){
try{
// Entity로 변환
TodoEntity entity = dto.toEntity();
// Entity의 id는 생성 당시에 null이어야함(테이블 insert 시 자동 생성되도록 해놨기 때문,,)
entity.setId(null); // 임시 null 처리,,
// 임시 userId 사용
entity.setUserId(tempUserId);
// service를 이용해서 Entity List 생성
List<TodoEntity> entities = todoService.create(entity);
// TodoEntity 리스트를 DTO들로 변경
List<TodoDTO> dtos = entities.stream().map(TodoDTO::new).collect(Collectors.toList());
// TodoDTO 리스트를 ResponseDTO로 초기화
ResponseDTO<TodoDTO> response = ResponseDTO.<TodoDTO>builder().data(dtos).build();
// ResponseDTO를 리턴
return ResponseEntity.ok().body(response);
}catch (Exception e){
// 예외 발생 시 처리
ResponseDTO<TodoEntity> response = ResponseDTO
.<TodoEntity>builder().error(" >>> createTodo 에러 : "+ e.getMessage()).build();
return ResponseEntity.ok().body(response);
}
}
// 검색 기능(사용자 아이디로 조회)
@GetMapping
public ResponseEntity<?> searchTodo(@RequestBody TodoDTO dto){
try{
List<TodoEntity> entities = todoService.retrieve(dto.getUserId());
List<TodoDTO> dtos = entities.stream().map(TodoDTO::new).collect(Collectors.toList());
// TodoDTO 리스트를 ResponseDTO로 초기화
ResponseDTO<TodoDTO> response = ResponseDTO.<TodoDTO>builder().data(dtos).build();
// ResponseDTO를 리턴
return ResponseEntity.ok().body(response);
} catch (Exception e){
ResponseDTO<TodoEntity> response = ResponseDTO
.<TodoEntity>builder().error(" >>> searchTodo 에러 : "+ e.getMessage()).build();
return ResponseEntity.ok().body(response);
}
}
// 수정
@PutMapping
public ResponseEntity<?> updateTodo(@RequestBody TodoDTO dto){
try{
// Entity로 변환
TodoEntity entity = dto.toEntity();
// userId 초기화
entity.setUserId(tempUserId);
// 엔티티로 업데이트
List<TodoEntity> entities = todoService.update(entity);
// 엔티티 리스트를 Todo 리스트로 변환
List<TodoDTO> todos = entities.stream()
.map(TodoDTO::new).collect(Collectors.toList());
// ResponseDTO로 초기화
ResponseDTO<TodoDTO> response = ResponseDTO.<TodoDTO>builder().data(todos).build();
// ResponseDTO로 리턴
return ResponseEntity.ok().body(response);
} catch (Exception e){
ResponseDTO<TodoEntity> response = ResponseDTO
.<TodoEntity>builder().error(" >>> updateTodo 에러 : "+ e.getMessage()).build();
return ResponseEntity.ok().body(response);
}
}
// 삭제
@DeleteMapping
public ResponseEntity<?> deleteTodo(@RequestBody TodoDTO dto) {
try {
// Entity로 변환
TodoEntity entity = dto.toEntity();
// userId 초기화
entity.setUserId(tempUserId);
// 엔티티로 업데이트
List<TodoEntity> entities = todoService.delete(entity);
// 엔티티 리스트를 Todo 리스트로 변환
List<TodoDTO> todos = entities.stream()
.map(TodoDTO::new).collect(Collectors.toList());
// ResponseDTO로 초기화
ResponseDTO<TodoDTO> response = ResponseDTO.<TodoDTO>builder().data(todos).build();
// ResponseDTO로 리턴
return ResponseEntity.ok().body(response);
} catch (Exception e) {
ResponseDTO<TodoEntity> response = ResponseDTO
.<TodoEntity>builder().error("삭제 에러!"+ e.getMessage()).build();
return ResponseEntity.ok().body(response);
}
}
// 전체 목록 조회
@GetMapping("/list")
public ResponseEntity<?> selectAll() {
try{
List<TodoEntity> entities = todoService.findAll();
List<TodoDTO> todos = entities.stream().map(TodoDTO::new).collect(Collectors.toList());
ResponseDTO<TodoDTO> response = ResponseDTO.<TodoDTO>builder().data(todos).build();
return ResponseEntity.ok().body(response);
} catch (Exception e){
ResponseDTO<TodoDTO> response =
ResponseDTO.<TodoDTO>builder().error(" >>> Select All 에러: " + e.getMessage()).build();
return ResponseEntity.badRequest().body(response);
}
}
}
@Service
@Slf4j
public class TodoService {
@Autowired
private TodoRepository repository;
// 유효성 검사 (null 체크)
public void validate(final TodoEntity entity) {
if(entity == null) {
log.warn("entity가 null입니다.");
throw new RuntimeException("entity가 null입니다.");
}
if(entity.getUserId() == null) {
log.warn("userId가 없습니다!");
throw new RuntimeException("userId가 없습니다!");
}
}
// 등록
// 매개 변수로 사용된 entity참조 변수를 이용해서 원본이 바뀌지 않도록 final 선언
public List<TodoEntity> create(final TodoEntity entity) {
validate(entity);
repository.save(entity);
// 처리 후 로그 출력
log.info("Entity id: {} is saved.", entity.getId());
return repository.findByUserId(entity.getUserId());
}
// 검색(userId로 조회)
public List<TodoEntity> retrieve(final String userId){
return repository.findByUserId(userId);
}
// 수정
public List<TodoEntity> update(final TodoEntity entity){
validate(entity);
// 검색
final Optional<TodoEntity> original = repository.findById(entity.getId());
original.ifPresent(todo->{
// 수정
todo.setTitle(entity.getTitle());
todo.setDone(entity.isDone());
// 다시 저장
repository.save(todo);
});
return retrieve(entity.getUserId());
}
// 삭제
public List<TodoEntity> delete(final TodoEntity entity){
validate(entity);
try{
repository.delete(entity);
} catch (Exception e){
log.warn(entity.getTitle()+ " => 삭제 안됨 ㅠㅠ");
}
return retrieve(entity.getUserId());
}
// 전체 조회
public List<TodoEntity> findAll() {
return repository.findAll();
}
}
https://github.com/EunbiAn/webkit-backend/tree/master/springboot_TodoList_day30