package com.example.codingsonyeondan.domain.songs
import com.example.codingsonyeondan.domain.album.model.Album
import com.example.codingsonyeondan.domain.songs.dto.SongDTO
import jakarta.persistence.*
@Entity
@Table(name = "song", schema = "public")
data class Song(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
val id: Long = 0,
@Column(name = "title")
var title: String,
@Column(name = "composer")
var composer: String,
@Column(name = "lyrics")
var lyrics: String,
@Column(name = "link")
var link: String,
@ManyToOne
@JoinColumn(name = "album", nullable = false)
var album: Album? = null
){
companion object {
fun toDto(song: Song): SongDTO {
return SongDTO(
id = song.id,
title = song.title,
composer = song.composer,
lyrics = song.lyrics,
link = song.link,
)
}
}
}
이러면 song테이블에 album이 포함되어 있다는데, 데이터베이스엔 당연히 앨범이 없다. 송 테이블엔 아이디, 작곡가, 가사 링크가 있지 앨범 테이블은 당연히 앨범에 가있으니까. 그래서 그걸 고쳐야 했다.
@ManyToOne
@JoinColumn(name = "album", nullable = false)
var album: Album? = null 이녀석을 이렇게 바꾼다.
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "album_id")
var album: Album
이제 앨범 아이디를 받아올수 있게 됬는데, 그런데도 id를 인식 못해서 튜터님께 상담을 받았는데, 알고보니 데이터베이스에 앨범 아이디 테이블을 만들어야 한다는 거였다.
그때 오류를 알아낸 방식은,
스웨거까진 다 되는데 post song를 했는데 작동을 안한다? 그럼 다시 인텔리제이로 돌아가서 에러코드를 보면 된다. 문제없이 코드가 작동했을경우 오류를 알아내는 방식이다. 오늘 처음 알았다!!
그렇게 나온 녀석이 바로 column "album_id" of relation "song" does not exist 이게 바로 데이터베이스에 앨범 아이디가 없다는 뜻이였다. 그래서 데이터베이스에 앨범 아이디를넣자, 작동했다!
그런데, 작동한 뒤에 뜨는 메시지를 보자 can't parse JSON. Raw result: 곡을 삭제하였습니다. 라는 문구가 메시지 앞에 나오는게 아닌가?
곡을 삭제하였습니다. 이렇게 나올때 메시지만 나오게 바꾸려면
return ResponseEntity.ok("곡을 삭제하였습니다.") 이걸
return ResponseEntity.ok("곡을 삭제하였습니다.") 이걸
return ResponseEntity.ok(mapOf("message" to "곡을 삭제하였습니다."))
이렇게 바꾸면 된다. 그러면 이제 메시지만 뜨게 되는데, 이렇게만 하면 결과가 틀려도 메시지를 띄우기에 맞는지 아닌지 알수가 없다. 그래서 필요한것이,
ResponseEntity.status(HttpStatus.NOT_FOUND)
이게 있어야 틀렸을때 정상적인것마냥 작동하는걸 막을수 있다.
정확하게 설명하자면,
@DeleteMapping("/{albumId}/song/{songId}",produces = [MediaType.APPLICATION_JSON_VALUE])
fun deleteSong(@PathVariable albumId: Long, @PathVariable songId: Long): ResponseEntity<Map<String, String>> {
songService.deleteSong(albumId, songId)
return ResponseEntity.ok(mapOf("message" to "곡을 삭제하였습니다."))
}
이것을
@DeleteMapping("/{albumId}/song/{songId}", produces = [MediaType.TEXT_PLAIN_VALUE])
fun deleteSong(@PathVariable albumId: Long, @PathVariable songId: Long): ResponseEntity<out Any> {
val song = songService.getSong(albumId, songId)
return if (song != null) {
songService.deleteSong(albumId, songId)
ResponseEntity.ok(mapOf("message" to "곡을 삭제하였습니다."))
} else {
ResponseEntity.status(HttpStatus.NOT_FOUND).body("존재하지 않는 곡입니다.")
}
}
이렇게 if, else를 이용해야 한다.
이제 에러도 안나고 스웨거도 정상작동하고 메시지도 아무 문제가 없다!