기존에 method 하나로 작성했던 즐겨찾기 추가 및 해제 포스팅이다.
이 포스팅에서는 위처럼 만든 이후에, 아예 method를 분리해서 만든 즐겨찾기 추가 및 해제 코드를 남겨보려고 한다.
01. controller
@RequiredArgsConstructor
@Slf4j
@RestController
@RequestMapping("/board")
public class Board () {
private final BoardService boardService;
@PostMapping("/favorite")
public ResponseEntity<ApiResult<String>> createBoardFavorite(Long boardId) {
boardService.boardFavorite(boardId);
ApiResult<String> response = ApiResult.<String>builder()
.code(ApiResultCode.succeed)
.build();
return new ResponseEntity<>(response, HttpStatus.OK);
}
@DeleteMapping("/favorite")
public ResponseEntity<ApiResult<String>> deleteboardFavorite(Long boardId) {
boardService.deleteBoardFavorite(boardId);
ApiResult<String> response = ApiResult.<String>builder()
.code(ApiResultCode.succeed)
.build();
return new ResponseEntity<>(response, HttpStatus.OK);
}
}
- `Long boardId` 파라미터
- 기존에는 `Long boardId`, `Boolean enabled` 이렇게 2개의 파라미터를 받았었다.
- 하나의 method로 true/false를 구분하기 위해서 나눴었다.
- 하지만 method가 아예 분리되었기 때문에, enabled 파라미터는 삭제를 했다.
- `createBoardFavorite`와 `deleteBoardFavorite` 모두 boardId 파라미터값을 담아 service를 호출한다.
02. service
@RequiredArgsConstructor
@Service
@Transactional
@Slf4j
public class BoardService {
private final BoardFavoriteRepository boardFavoriteRepository;
public void boardFavorite(Long boardId) {
Board board = boardRepository.findById(boardId).orElseThrow(() -> new IllegalArgumentException("Not Found Board"));
Long memberId = principal.getMemberId();
BoardFavorite existingFavorite = boardFavoriteRepository.findByBoardAndMemberId(board, memberId);
if (existingFavorite != null) {
throw new IllegalArgumentException("FavoriteBoard already exists");
}
gboardFavoriteRepository.save(new BoardFavorite(board, memberId));
}
public void deleteBoardFavorite(Long boardId) {
Board board = boardRepository.findById(boardId).orElseThrow(() -> new IllegalArgumentException("Not Found Board"));
Long memberId = principal.getMemberId();
BoardFavorite existingFavorite = boardFavoriteRepository.findByBoardAndMemberId(board, memberId);
if (existingFavorite == null) {
throw new IllegalArgumentException("FavoriteBoard already deleted");
}
boardFavoriteRepository.delete(existingFavorite);
}
}
- `boardFavorite`
- 게시물 조회 및 로그인 user id 조회
- 즐겨찾기 db에 게시물 번호와 해당 유저가 일치하는 즐겨찾기가 있는지 조회
- 만약 즐겨찾기가 존재한다면 이미 존재한다고 예외 처리
- 만약 즐겨찾기가 존재하지 않는다면, 즐겨찾기 추가
- `deleteBoardFavorite`
- 게시물 조회 및 로그인 user id 조회
- 즐겨찾기 db에 게시물 번호와 해당 유저가 일치하는 즐겨찾기가 있는지 조회
- 만약 조회하는 즐겨찾기가 존재하지 않으면, 이미 삭제되었다고 예외 처리
- 만약 즐겨찾기가 존재한다면, 해당 즐겨찾기 삭제
처음에는 즐겨찾기도 삭제하는 게 아니라, 'enabled'라는 컬럼을 두고 true/false로 업데이트를 했었다.
현재는 즐겨찾기가 해제되면, 아예 테이블에서 삭제를 해버린다.
03. entity
import lombok.*;
import org.hibernate.annotations.Comment;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Positive;
import java.time.ZonedDateTime;
@Entity
@DynamicInsert
@DynamicUpdate
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@Table(indexes = {
@Index(name = "IDX_BOARD_FAVORITE__MEMBER_BOARD", columnList = "memberId,boardId")
})
public class BoardFavorite {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Positive
@Comment("PK")
private Long id;
@Comment("가이드 id")
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "boardId")
@NotNull
private Board board;
@Comment("멤버 id")
@NotNull
private Long memberId;
@Comment("즐겨찾기 생성 날짜")
@NotNull
private ZonedDateTime created;
@Comment("즐겨찾기 수정 날짜")
private ZonedDateTime modified;
@PrePersist
public void prePersist() {
if (created == null) {
created = ZonedDateTime.now();
}
if (modified == null) {
modified = ZonedDateTime.now();
}
}
@PreUpdate
public void preUpdate() {
if (modified == null) {
modified = ZonedDateTime.now();
}
}
public BoardFavorite(Board board, Long memberId) {
this.board = board;
this.memberId = memberId;
}
}
- entity에서 `enabled` 필드는 필요가 없어져서 삭제했다.
- `sort` 또한 삭제
04. repository
public interface BoardFavoriteRepository extends JpaRepository<BoardFavorite, Long> {
BoardFavorite findByBoardAndMemberId(Board boardId, Long memberId);
}
- 기존에 정렬을 위한 sort 관련된 것도 필요가 없어져서 삭제했다.
기존에 method 하나로 처리되던 것을 2개로 분리해서 즐겨찾기를 추가/해제도 해봤다.
이다음으로는 즐겨찾기 관련한 service 로직을 처음에 작성했던 것과 중간에 수정했던 코드들에 대해 남겨보려고 한다.
그 후기에 대해서 적어보고 싶기 때문에 남기게 될 글이다.
그건 다음 포스팅으로.
300x250
'Framekwork > SPRING' 카테고리의 다른 글
[스프링 부트 3 백엔드 개발자 되기] p.77 dependencies - lombok 오류 (0) | 2024.08.05 |
---|---|
[SPRING BOOT] 즐겨찾기 추가/해제 코드 변천사 (0) | 2024.07.23 |
[SPRING BOOT] 즐겨찾기 추가 및 해제 (삭제) method 하나로 작성 (0) | 2024.07.18 |
[Thymeleaf] config에 설정된 url 패턴을 타임리프 src 경로로 설정 (0) | 2024.07.10 |
[SPRING] @BeforeEach @AfterEach 어노테이션 (0) | 2024.04.17 |