본문 바로가기

카테고리 없음

24.01.04 과제 계속

먼저 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이걸 넣어야 한다고 한다.

그래서 이걸 원수매니나 매니투원 위에 넣으면 된다고 한다.

 

근데 어떻게든 전부 해결했나 싶었는데, 모든 댓글 목록에 할일이 붙어서 나오는 바람에 이번엔 이것들을 또 분리시켜야 할거같다. 이건 또 다음에...