본문 바로가기
Framekwork/SPRING

[SPRING BOOT] 즐겨찾기 추가 및 해제 (삭제) method 분리

by 아이엠제니 2024. 7. 19.

 


 

 

 

 

[SPRING BOOT] 즐겨찾기 추가 및 해제 (삭제) method 하나로 작성

즐겨찾기 추가/삭제 기능을 구현했다. method 하나에 즐겨찾기 추가/삭제 한 번에 구현post/delete method로 나눠서 구현 이 게시물은 1번으로 작업한 걸 올리는 거고, 추후에 2번으로 작업한 것을 올

devje.tistory.com

기존에 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