- Logger 설정
- CRUD REST API
persistence > service > controller 순서로 구현
디버깅을 위한 로그 설정
로그를 남기기 위해 System.out.println 사용하면 번거롭
로그는 용도에 따라 info, debug, warn, error로 나눌 수 있다. (로그레벨)
이러한 기능을 제공하는 라이브러리가 Slf4j이고 @Slf4j
로 사용한다.
JpaRepository를 상속하는 TodoRepository.java 를 사용한다.
TodoService.java에 create 메서드 생성
create의 구성은 아래와 같다.
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());
}
private void validate(final TodoEntity entity) {
if (entity == null) {
log.warn("Entity cannot be null.");
throw new RuntimeException("Entity cannot be null.");
}
if (entity.getUserId() == null) {
log.warn("Unknown User.");
throw new RuntimeException("Unknown User.");
}
}
사용자에게서 TodoDTO를 요청 바디로 전달받고, 이를 TodoEntity로 변환하여 저장하도록
create()가 리턴하는 엔티티도 DTO로 변환
public ResponseEntity createTodo(@RequestBody TodoDTO dto) {
try {
String tempUserId = "temp";
// Entity로 변환
TodoEntity entity = TodoDTO.toEntity(dto);
// 로그인은 추후 구현 (인증, 인가)
entity.setId(null);
entity.setUserId(tempUserId);
// TodoEntity 생성, 엔티티 리스트를 받음
List<TodoEntity> entities = service.create(entity);
// 받은 엔티티 리스트를 DTO 리스트로 변환
List<TodoDTO> dtos = entities.stream().map(TodoDTO::new).collect(Collectors.toList());
// DTO 리스트를 Response로 보낸다
ResponseDTO<TodoDTO> response = ResponseDTO.<TodoDTO>builder().data(dtos).build();
return ResponseEntity.ok().body(response);
} catch (Exception e) {
String err = e.getMessage();
ResponseDTO<TodoDTO> response = ResponseDTO.<TodoDTO>builder().error(err).build();
return ResponseEntity.badRequest().body(response);
}
}
Todo 리스트를 검색하는 repository, service, controller
TodoRepository.java 그대로 사용
TodoRepository의 findUserById
활용한다.
public List<TodoEntity> retrieve(final String userId) {
return repository.findByUserId(userId);
}
사용자의 아이디를 이용하여 해당 아이디의 todo 리스트를 반환받음
GetMapping만 다르고 createTodo와 비슷
@GetMapping
public ResponseEntity<?> retrieveTodoList(){
String tempUserId = "temp";
List<TodoEntity> entities=service.retrieve(tempUserId);
List<TodoDTO> dtos = entities.stream().map(TodoDTO::new).collect(Collectors.toList());
ResponseDTO<TodoDTO> response = ResponseDTO.<TodoDTO>builder().data(dtos).build();
return ResponseEntity.ok().body(response);
}
TodoRepository.java 그대로 사용
public List<TodoEntity> update(final TodoEntity entity) {
// 유효성 검사
validate(entity);
// nullPointError 방지하기 위해 Optional
final Optional<TodoEntity> original = repository.findById(entity.getId());
// 존재하는 엔티티라면 값 덮어쓰기
original.ifPresent(todo -> {
todo.setTitle((entity.getTitle()));
todo.setDone(entity.isDone());
// DB에 업데이트된 todo 저장
repository.save(todo);
});
// todo리스트 반환
return retrieve(entity.getUserId());
}
@PutMapping
설정
service.update(entity);
제외 나머지는 retrieveTodoList
와 동일
TodoRepository.java 그대로 사용
public List<TodoEntity> delete(final TodoEntity entity) {
validate(entity);
try {
repository.delete(entity);
}catch (Exception e) {
log.error("Error deleting entity " + entity.getId(), e);
throw new RuntimeException("Error deleting entity " + entity.getId());
}
return retrieve(entity.getUserId());
}
@DeleteMapping
어노테이션 설정
코드 내용은 service.delete(entity) 부분만 바꿔주고 나머지는 createTodo()
와 동일