부트캠프 일지

부트캠프 33일차 후기

여름하인 2024. 1. 12. 20:41

오늘 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)
    }

 

다음 주에 월요일 오후에 발표다. 주말에 푹 쉬고, 월요일에 아침부터 일찍 발표 준비를 하고, 발표를 해서 성공적으로 프로젝트를 마무리하자.