[ Spring ] Basic RSET - 6. Service 메인 로직 구현

jwkwon0817·2023년 9월 2일
0

Backend

목록 보기
31/32
post-thumbnail

먼저 Service에서는 Repository를 받아와야하는데 다양한 Injection 방식 중 생성자 주입을 사용할거다.

생성자 주입을 사용하는 이유

따라서 클래스에 @RequiredArgsConstructor 어노테이션을 붙여준다.

이 어노테이션은 final이 붙은 필드에 대한 생성자를 자동으로 만들어준다.

그리고 필드로는 아래 코드를 입력한다.

private final BoardRepository boardRepository

그리고 CRUD를 구현해야 하니 createBoard, updateBoard, deleteBoard, retrieveAll, retrieve 메서드를 만들어준다.

public BoardDto createBoard(final BoardRequestDto boardDto) {
   Board savedBoard = boardRepository.save(boardDto.toEntity());
   
   return BoardDto.builder()
      .id(savedBoard.getId())
      .title(savedBoard.getTitle())
      .content(savedBoard.getContent())
      .createdDate(savedBoard.getCreatedDate())
      .modifiedDate(savedBoard.getModifiedDate())
      .build();
}

public BoardDto updateBoard(final Long id, final BoardRequestDto boardDto) {
   Board board = retrieve(id);
   board.update(boardDto.getTitle(), boardDto.getContent());
   
   boardRepository.save(board);
   
   return BoardDto.builder()
      .id(board.getId())
      .title(board.getTitle())
      .content(board.getContent())
      .createdDate(board.getCreatedDate())
      .modifiedDate(board.getModifiedDate())
      .build();
}

public void deleteBoard(final Long id) {
   boardRepository.delete(retrieve(id));
}

public List<Board> retrieveAll() {
   return boardRepository.findAllByOrderByIdDesc();
}

public Board retrieve(final Long id) {
   return boardRepository.findById(id)
      .orElseThrow(() -> new EntityNotFoundException("해당 게시글이 없습니다. id=" + id));
}

인자에 final을 붙여주는 이유는 해당 값이 메서드 내에서 바뀌지 않게 하기 위함이다.

또한 외부(Controller)에서 접근할 수 있도록 접근 제어자를 public으로 설정해 주었다.


JPA에서 자동으로 지원해 주는 메서드인 save, delete, findById를 사용해서 구현해 주었다.

이외에도 다양한 메서드를 기본으로 제공해 주고 Repository 글에서 설명드린 것처럼 쿼리 메서드로 다양한 메서드를 커스텀해서 만들 수 있다.

복잡한 쿼리는 @Query 어노테이션으로 JPQL을 사용해서 구현할 수 있다.


retrieve()에서는 JPA의 findById 메서드를 통해서 ID를 기준으로 엔티티를 찾고 없으면 EntityNotFoundException을 던지도록 만들었다.

createBoard()에서는 인자로 받은 BoardRequestDto를 Entity로 변환하고 그 값을 JPA의 save 메서드를 통해서 저장하고 savedBoard 변수에 담았다.
그리고 DTO를 반환해 주었다.

updateBoard()에서는 Board 엔티티에서 구현한 update 메서드로 title과 content를 수정해 주고 createBoard()와 마찬가지로 DTO를 반환해 주었다.

deleteBoard()에서는 앞서 구현한 retrieve() 메서드를 통해 엔티티를 가져오고 그 값을 바로 delete() 메서드를 통해 삭제시킨다.

retrieveAll()은 Repository에서 정의한 findAllByOrderByIdDesc 메서드를 통해서 값을 가져온다.
왜냐하면 프론트엔드에서 작업할 때 최신순으로 보여주면 보기 편하기 때문이다.
이는 Repository의 메서드 이름을 바꿔서 자유롭게 수정일 기준 등으로 바꿀 수 있다.

profile
SRIHS 119th SW

0개의 댓글