본문 바로가기
Project/깃터디 (gitudy)

[깃터디/Convention] 컨벤션 삭제 api 구현

by J-rain 2024. 5. 11.
💡 .java를 클릭시 관련 커밋으로 이동💡

 

 회고 

    // 컨벤션 삭제
    @Transactional
    public void deleteStudyConvention(Long conventionId) {

        // Convention 조회
        StudyConvention studyConvention = studyConventionRepository.findById(conventionId).orElseThrow(() -> {
            log.warn(">>>> {} : {} <<<<", conventionId, ExceptionMessage.CONVENTION_NOT_FOUND.getText());
            return new ConventionException(ExceptionMessage.CONVENTION_NOT_FOUND);
        });

        studyConventionRepository.delete(studyConvention);
    }

studyConventionRepository.findById(conventionId)를 통해 데이터베이스에서 해당 ID를 가진 StudyConvention 객체를 찾고 객체가 존재하면, studyConventionRepository.delete(studyConvention)를 호출하여 해당 엔티티를 데이터베이스에서 삭제하는 로직을 구현했다. conventionId 값은 StudyConvention 테이블의 기본 키 역할을 하므로, 이를 통해 데이터베이스에서 해당 ID를 가진 레코드를 식별하고 삭제할 수 있다. 즉, 이 ID를 기반으로 데이터베이스에서 해당 엔티티(또는 행)를 찾아서 전체 레코드를 삭제하는 것이며, 이 때 해당 엔티티에 속하는 모든 데이터(즉, 모든 컬럼 값)가 데이터베이스에서 제거된다. (하나씩 제거 필요 x)

 

 

StudyConventionController.java

    @ApiResponse(responseCode = "200", description = "컨벤션 삭제 성공")
    @DeleteMapping("/{studyInfoId}/convention/{conventionId}")
    public JsonResult<?> deleteStudyConvention(@AuthenticationPrincipal User user,
                                               @PathVariable(name = "studyInfoId") Long studyInfoId,
                                               @PathVariable(name = "conventionId") Long conventionId) {

        studyMemberService.isValidateStudyLeader(user, studyInfoId);

        studyConventionService.deleteStudyConvention(conventionId);

        return JsonResult.successOf("StudyConvention delete Success");
    }

컨벤션 삭제 컨트롤러 구현 @PathVariable 를 통하여 studyInfoId와 conventionId를 받도록 구현했다.

 

 

StudyConventionService.java

    // 컨벤션 삭제
    @Transactional
    public void deleteStudyConvention(Long conventionId) {

        // Convention 조회
        StudyConvention studyConvention = studyConventionRepository.findById(conventionId).orElseThrow(() -> {
            log.warn(">>>> {} : {} <<<<", conventionId, ExceptionMessage.CONVENTION_NOT_FOUND.getText());
            return new ConventionException(ExceptionMessage.CONVENTION_NOT_FOUND);
        });

        studyConventionRepository.delete(studyConvention);
    }

수정 api와 마찬가지로 가져온 conventionId 를 통하여 Repository에서 컨벤션을 조회 후 없을경우 예외처리를 하도록 설계했다.

 


테스트

 

StudyConventionFixture.java

    // 테스트용 StudyConvention 생성
    public static StudyConvention createStudyDefaultConvention(Long studyInfoId) {
        return StudyConvention.builder()
                .studyInfoId(studyInfoId)
                .name("컨벤션")
                .description("설명")
                .content("정규식")
                .isActive(true)
                .build();
    }

테스트용 컨벤션을 생성하는 메서드 Fixture이다.

 

 

StudyConventionControllerTest.java

   @Test
    public void Convention_삭제_테스트() throws Exception {
        //given
        User savedUser = userRepository.save(generateAuthUser());
        Map<String, String> map = TokenUtil.createTokenMap(savedUser);
        String accessToken = jwtService.generateAccessToken(map, savedUser);
        String refreshToken = jwtService.generateRefreshToken(map, savedUser);

        StudyInfo studyInfo = StudyInfoFixture.createDefaultPublicStudyInfo(savedUser.getId());
        studyInfoRepository.save(studyInfo);

        StudyConvention studyConvention = StudyConventionFixture.createStudyDefaultConvention(studyInfo.getId());
        studyConventionRepository.save(studyConvention);

        //when
        when(studyMemberService.isValidateStudyLeader(any(User.class), any(Long.class)))
                .thenReturn(UserInfoResponse.of(savedUser));
        doNothing().when(studyConventionService).deleteStudyConvention(any(Long.class));

        //then
        mockMvc.perform(delete("/study/" + studyInfo.getId() + "/convention/" + studyConvention.getId())
                        .contentType(MediaType.APPLICATION_JSON)
                        .header(AUTHORIZATION, createAuthorizationHeader(accessToken, refreshToken)))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.res_code").value(200))
                .andExpect(jsonPath("$.res_msg").value("OK"))
                .andExpect(jsonPath("$.res_obj").value("StudyConvention delete Success"))
                .andDo(print());
    }

컨트롤러 동작 검증 ( HTTP 요청을 올바르게 처리하고 적절한 응답을 반환하는지 확인)

 

 

StudyConventionServiceTest.java

    @Test
    @DisplayName("컨벤션 삭제 테스트")
    public void deleteStudyConvention() {

        //given
        User savedUser = userRepository.save(generateAuthUser());

        StudyInfo studyInfo = StudyInfoFixture.createDefaultPublicStudyInfo(savedUser.getId());
        studyInfoRepository.save(studyInfo);

        StudyMember leader = StudyMemberFixture.createStudyMemberLeader(savedUser.getId(), studyInfo.getId());
        studyMemberRepository.save(leader);

        StudyConvention studyConvention = StudyConventionFixture.createStudyDefaultConvention(studyInfo.getId());
        studyConventionRepository.save(studyConvention);

        //when
        studyMemberService.isValidateStudyLeader(savedUser, studyInfo.getId());
        studyConventionService.deleteStudyConvention(studyConvention.getId());

        // then
        assertThrows(ConventionException.class, () -> {
            studyConventionService.deleteStudyConvention(studyConvention.getId());
        }, ExceptionMessage.CONVENTION_NOT_FOUND.getText());

        assertFalse(studyConventionRepository.existsById(studyConvention.getId()));
    }

컨벤션을 저장후 삭제api 를 통하여 Repository에 남아있는지 확인하는 service 테스트이다.

댓글