먼저 Task랑 Comment를 연결하려면,
@Entity
class Task(
// 기타 필드
@OneToMany(mappedBy = "task")
val comments: List<Comment> = listOf()
)
@Entity
class Comment(
// 기타 필드
@ManyToOne
@JoinColumn(name = "task_id")
val task: Task
)
할일 하나에 댓글들을 연결해야하니 할일은 OneToMany, 댓글은 ManyToOne으로 연결해야 한다.
@Entity
data class Task(
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long? = null,
var title: String = "",
var content: String = "",
var writer: String = "",
var createdAt: LocalDateTime = LocalDateTime.now(),
@OneToMany(mappedBy = "task", cascade = [CascadeType.ALL], orphanRemoval = true)
var comments: List<Comment> = ArrayList()
) {
constructor() : this(id = null)
}
@Entity
data class Comment(
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long? = null,
var content: String? = null,
var author: String? = null,
var password: String? = null,
var createdDate: LocalDateTime? = null,
@ManyToOne
@JoinColumn(name = "task_id")
var task: Task? = null
) {
// 보조 생성자
constructor(content: String, author: String, password: String) :
this(id = null, content = content, author = author, password = password, createdDate = LocalDateTime.now())
}
하지만 이건 연결만 됬을 뿐이라서 더 작업이 필요.
data class CommentRequest(
val content: String,
val author: String,
val password: String,
val taskId: Long
)
이렇게 새로운 클래스를 넣어서 task의 아이디로 코멘트를 만들수 있게 하고
@PostMapping("/comments")
fun createComment(@RequestBody commentRequest: CommentRequest): ResponseEntity<Comment> {
val task = taskRepository.findById(commentRequest.taskId)
.orElseThrow { IllegalArgumentException("Task not found with id ${commentRequest.taskId}") }
val comment = Comment(
content = commentRequest.content,
author = commentRequest.author,
password = commentRequest.password,
task = task
)
return ResponseEntity.ok(commentRepository.save(comment))
}
코맨트에 이걸 넣고
@GetMapping("/tasks/{id}")
fun getTask(@PathVariable id: Long): ResponseEntity<Task> {
val task = taskRepository.findById(id)
.orElseThrow { IllegalArgumentException("Task not found with id $id") }
return ResponseEntity.ok(task)
}
태스크엔 이걸 넣어서 서로 연결시켜보려 했는데,
StackOverflowError
라는 에러가 떳다!!
이게 서로가 서로를 무한히 참조해서 그런거라고 하던데, 그걸 막기 위해선 @JsonManagedReference이걸 넣어야 한다고 한다.
그래서 이걸 원수매니나 매니투원 위에 넣으면 된다고 한다.
근데 어떻게든 전부 해결했나 싶었는데, 모든 댓글 목록에 할일이 붙어서 나오는 바람에 이번엔 이것들을 또 분리시켜야 할거같다. 이건 또 다음에...