[BE] TODO Layer - CRUD REST API

김주언·2022년 6월 10일
0

TODO LIST

목록 보기
5/18
post-thumbnail

서비스 개발

  • Logger 설정
  • CRUD REST API

persistence > service > controller 순서로 구현


로그 어노테이션

디버깅을 위한 로그 설정

로그를 남기기 위해 System.out.println 사용하면 번거롭
로그는 용도에 따라 info, debug, warn, error로 나눌 수 있다. (로그레벨)
이러한 기능을 제공하는 라이브러리가 Slf4j이고 @Slf4j로 사용한다.


1. CreateTodo

1.1 Persistence

JpaRepository를 상속하는 TodoRepository.java 를 사용한다.

1.2 Service

TodoService.java에 create 메서드 생성
create의 구성은 아래와 같다.

  • 검증 : 유효한 엔티티인지 검사
  • 저장 : DB에 엔티티 저장하고 로그 남기기
  • findUserById : 새로 저장된 엔티티 + 기존 엔티티 리스트 반환
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.");
    }
  }

1.3 Controller

사용자에게서 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);
        }
    }

2. RetrieveTodoList

Todo 리스트를 검색하는 repository, service, controller

2.1 Persistence

TodoRepository.java 그대로 사용

2.2 Service

TodoRepositoryfindUserById 활용한다.

    public List<TodoEntity> retrieve(final String userId) {
        return repository.findByUserId(userId);
    }

사용자의 아이디를 이용하여 해당 아이디의 todo 리스트를 반환받음

2.3 Controller

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);
    }

3. UpdateTodo

3.1 Persistence

TodoRepository.java 그대로 사용

3.2 Service

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());
    }

3.3 Controller

@PutMapping 설정
service.update(entity); 제외 나머지는 retrieveTodoList 와 동일


4. DeleteTodo

4.1 Persistence

TodoRepository.java 그대로 사용

4.2 Service

    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());
    }

4.3 Controller

@DeleteMapping어노테이션 설정
코드 내용은 service.delete(entity) 부분만 바꿔주고 나머지는 createTodo()와 동일

profile
학생 점심을 좀 차리시길 바랍니다

0개의 댓글