본문 바로가기
Projects/청하-청년을 위한 커뮤니티 서비스

[청하] 32. 정책 찜하기 해제 기능 구현

by Lpromotion 2024. 10. 22.

“정책 찜하기”한 경우 이것을 해제하기 위한 기능을 구현했다.

 

1. 프로젝트 구조

src/main/java/com/example/withpeace/
│
├── domain/                   # 도메인 모델 (엔티티)
│   ├── YouthPolicy.java      # 청년 정책 엔티티
│   └── FavoritePolicy.java   # 청년 정책 찜하기 엔티티
│
├── repository/                       # 데이터 접근 계층
│   ├── YouthPolicyRepository.java    # 청년 정책 레포지토리
│   └── FavoritePolicyRepository.java # 정책 찜하기 레포지토리
│
├── controller/               # 컨트롤러 계층
│   └── PolicyController.java # 정책 관련 API 엔드포인트
│
└── service/                  # 비즈니스 로직 계층
    └── PolicyService.java    # 정책 관련 비즈니스 로직

 

2. 컨트롤러 구현

YouthPolicyController

public class YouthPolicyController {
    private final YouthPolicyService youthPolicyService;
    // ... (기존 코드 생략)
    
    // 정책 찜하기 해제
    @DeleteMapping("/{policyId}/favorites")
    public  ResponseDto<?> deleteFavoritePolicy(@UserId Long userId, @PathVariable String policyId) {
        youthPolicyService.deleteFavoritePolicy(userId, policyId);
        return ResponseDto.ok(true);
    }
}

사용자 ID와 정책 ID를 파라미터로 받아 서비스로 전달한다.

 

3. 서비스 구현

YouthPolicyService

@Service
@RequiredArgsConstructor
@Slf4j
public class YouthPolicyService {
    // ... (기존 코드 생략)

    @Transactional
    public void deleteFavoritePolicy(Long userId, String policyId) {
        User user = getUserById(userId);
        FavoritePolicy favoritePolicy = favoritePolicyRepository.findByUserAndPolicyId(user, policyId);

        try {
            // 찜하기 해제가 되어있지 않은 경우 찜하기 해제 처리 수행
            if(favoritePolicy != null)
                favoritePolicyRepository.delete(favoritePolicy);
        } catch (Exception e) {
            throw new CommonException(ErrorCode.FAVORITE_YOUTH_POLICY_ERROR);
        }
    }

}
  1. 사용자를 조회한다. (존재 여부 확인)
  2. 해당 사용자의 정책 찜하기 정보를 조회한다.
  3. 찜하기 정보가 존재하는 경우에만 삭제를 수행한다.

`findByUserAndPolicyId` 는 사용자와 정책 ID로 찜한 정책을 찾는다.

 

4. API 응답 예시

요청 URL

[DELETE] http://cheongha.site/api/v1/policies/R2024080625806/favorites

 

Response Body

{
  "data": true
  "error": null
}
반응형

댓글