부트캠프 33일차 후기
오늘 CodeKata는 2문제를 풀었다. 한 문제가 구현 문제이기도 했고, 변수도 다른 문제보다 많이 써서 헷갈려서 오래걸렸다.
오늘은 드디어 팀 프로젝트를 대강 마쳤다. 이전 주차에 했던 프로젝트에서 Member 클래스를 가져왔는데, 가져온 김에 Spring Security를 같이 가져와서 팀 프로젝트에 맞게 변형시켜 끼워넣었다. 다행히 오류 없이 정상적으로 작동한다.
그 다음 Member와 다른 Entity들을 연결하는 작업을 했고, 각 Entity의 Controller에서 EndPoint를 수정했다.
예를 들어 Album을 만들면 Song도 같이 만들 수 있도록 했다. 여기서 Controller Song의 목록을 어떻게 전달하느냐가 문제였는데, 처음엔 Song DTO List를 직접 Controller에 전달해봤다. 하지만, 어째서인지 오류가 발생해서, 차선안을 시도하였다. 그건 DTO를 새로 만들어서 그 안에 Song DTO List를 넣는 거다. 즉, 간접적으로 Controller에 만들 노래의 정보를 전달했다. 결과적으로 첫 시도의 형태보다 약간 불편하지만, 성공적으로 작동했다.
@PreAuthorize("hasAuthority('USER')")
@PostMapping(consumes = [MediaType.MULTIPART_FORM_DATA_VALUE], produces = [MediaType.APPLICATION_JSON_VALUE])
fun createAlbum(@RequestPart(required = false) image: MultipartFile?,
@RequestPart @Valid albumCreateDTO: AlbumCreateDTO,
@RequestPart songs: SongCreateListDTO,
bindingResult: BindingResult)
: ResponseEntity<AlbumDTO>
{
if(bindingResult.hasErrors()) throw InvalidDTOError("AlbumCreateDTO", bindingResult.fieldError?.defaultMessage ?: "")
return ResponseEntity.status(HttpStatus.CREATED)
.body(albumService.createAlbum(albumCreateDTO, image, songs))
}
data class SongCreateListDTO(
val songs: List<SongCreateDTO>
)
오늘 겪은 오류 중 가장 기억에 남는 오류라면, Album 삭제와 관련된 오류이다.
Album을 외래키로써 가르키는 Entity가 Song과 Comment가 있어서, 만약 내가 이 두 Entity 중 하나라도 가리키는 Album을 삭제하면 참조 무결성으로 인해 에러가 발생한다. 나는 이것을 방지하기 위해서 album이 삭제되면 song과 comment를 삭제할 수 있도록, 처음엔 단방향이였던 연관관계를 양방향으로 바꿔서 CascadeType.All로 설정도 해보고 OnDelete도 사용을 해봤다. 하지만 이상하게 어느 쪽도 작동하지 않았다. 만약 나에게 시간이 더 있었다면 이 오류를 더 파보겠지만, 안타깝게도 아니였기에, albumService에서 삭제 메소드를 실행하면 songService와 commentService를 가져와서 각각에 album ID를 통해 삭제 메소드를 정의한 후, song과 comment를 삭제를 하는 번거로운 과정을 정의하고 나서야 정상적으로 작동했다.
@Transactional
override fun deleteAlbum(albumId: Long) {
val album = getValidateAlbum(albumId)
SecurityUtil.checkUserCanAccessThis(album.creator, "album")
album.albumImage?.let { imageService.deleteImage(it.uuid) }
songService.deleteSongs(albumId); commentService.deleteComments(albumId)
return albumRepository.delete(album)
}
다음 주에 월요일 오후에 발표다. 주말에 푹 쉬고, 월요일에 아침부터 일찍 발표 준비를 하고, 발표를 해서 성공적으로 프로젝트를 마무리하자.