지난번 나의 과오를 돌아보며 JPA 관련 공부들을 했고 이를 코드로 적용시키려고 한다. 이 글은 Entity 탐구 글을 먼저 보고 오는 것이 좋으며, 이 글은 내용이나 팁 보다는 그저 작업 기록용 글이다.
## User.kt
@Entity
class User(
email: String,
@Column(nullable = false)
var name: String,
@Column(nullable = false)
var picture: String,
@Enumerated(EnumType.STRING)
var role: Role,
): PrimaryKeyEntity() {
@Column(unique = true, nullable = false)
var email = email
protected set
@Column(nullable = false)
var createdAt: LocalDateTime = LocalDateTime.now()
protected set
@OneToMany(
cascade = [CascadeType.PERSIST, CascadeType.REMOVE],
fetch = FetchType.LAZY,
mappedBy = "writer"
)
private val _diaries: MutableList<Diary> = mutableListOf()
val diaries: List<Diary> get() = _diaries.toList()
fun addDiary(diary: Diary) {
_diaries.add(diary)
}
fun removeDiary(diary: Diary) {
_diaries.remove(diary)
}
}
enum class Role(
val key: String,
val title: String
) {
ADMIN("ROLE_ADMIN", "관리자"),
USER("ROLE_USER", "사용자")
}
## Action.kt
@Entity
@Table(name = "action")
class Action(
@Column(nullable = false)
var type: ActionType = ActionType.Any,
@Column(nullable = false)
var comment: String,
): PrimaryKeyEntity() {
@Column(nullable = false)
val createdAt: LocalDateTime = LocalDateTime.now()
}
enum class ActionType {
Work, Study, Exercise, Hobby, Any
}
## Diary.kt
@Entity
class Diary(
@Column(nullable = false)
var title: String = "",
@Column(nullable = false)
var body: String = "",
@Column(nullable = false)
var isPrivate: Boolean = false,
writer: User
): PrimaryKeyEntity() {
@OneToMany(
cascade = [CascadeType.ALL],
orphanRemoval = true
)
private val _actions: MutableList<Action> = mutableListOf()
val actions: List<Action> get() = _actions.toList()
@ManyToOne
@JoinColumn(name = "user_id", nullable = false)
var writer: User = writer
protected set
fun addAction(action: Action) {
_actions.add(action)
}
fun removeAction(action: Action) {
_actions.remove(action)
}
}
Entity를 변화시켰기에 Service 등 여러 부분의 코드들도 부차적으로 수정해주었다.
해당 작업이 이 commit에서 잘 확인할 수 있다.
기존에도 DTO를 사용은 했었는데, Entity를 수정하며 확실하게 구조를 잡았다. 결정한 사항들은 다음과 같다.
Comment 추가 commit
Diary의 Comment를 달 수 있도록 추가하였다. 만들어 가다 보니 게시판이랑 뭐가 다를까... 싶기는 하지만 뭐든 지금의 목표는 하나의 완성된 결과물을 내는 것이기에 굳이 상관하지 않는다.
Comment 기능은 현재 작성과 삭제만 된다. 수정은 구현할 수는 있지만 두 가지 고민이 생겨 멈춰두었다.
- 가장 큰 이슈는 원하는데로 front 코드를 짜는게 머리가 아프다... comment 수정의 경우 그 바로 html 코드가 수정되서 화면 전환 없이 진행하고 싶은데 해당 내용을 다 까먹은지 오래고 다시 이걸 고민하는 시간이 살짝 아까워 멈춰두었다.
- update를 짜는데에 고민이 생겼다. 이는 사실 comment에만 해당되는 문제는 아니다. DTO를 넘기지 service로 넘기지 않으려다 보니 update의 경우 controller -> service로 넘어갈 때 어떤 형식으로 넘기는지에 대한 고민이 아직 해결되지 않았다. Entity를 불러와서 수정해서 넘겨야할지, field들 만 넘기고 service에서 처리할지 이런 고민 말이다.
본 글은 하루동안 작업한 내용이 아니라 밀렸던 내용들을 그냥 순서대로 기록만! 해 두었다. 결국 핵심은 Entity와 DTO들을 정리했고, Comment 기능도 추가했다~ 정도이다.
다음 글에서는 바로 이어서 해당 작업까지의 결과물을 Docker container로 구동시키는 것을 진행하겠다.