💡 .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를 받도록 구현했다.
// 컨벤션 삭제
@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에서 컨벤션을 조회 후 없을경우 예외처리를 하도록 설계했다.
테스트
// 테스트용 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 테스트이다.
'Project > 깃터디 (gitudy)' 카테고리의 다른 글
[깃터디/Alarm] 스터디장 가입승인/거부 알림(fcm) api 구현 (0) | 2024.05.16 |
---|---|
[깃터디/Alarm] 스터디 가입 신청 알림(fcm) api 구현 (0) | 2024.05.16 |
[깃터디/Convention] 컨벤션 수정 api 구현 (0) | 2024.05.11 |
[깃터디/Convention] 컨벤션 조회 api 구현 (1) | 2024.05.11 |
[깃터디/Convention] 컨벤션 등록 api 구현 (0) | 2024.05.11 |
댓글