(4) How was your day? - Entity 수정 및 comment 기능 추가

HEYDAY7·2022년 11월 25일
0

시작하며

지난번 나의 과오를 돌아보며 JPA 관련 공부들을 했고 이를 코드로 적용시키려고 한다. 이 글은 Entity 탐구 글을 먼저 보고 오는 것이 좋으며, 이 글은 내용이나 팁 보다는 그저 작업 기록용 글이다.

작업

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)
    }
}
  • 전체적으로 PrimaryKeyEntity를 상속받아 작성하였다.
  • 일반 변수는 var로
  • constructor 에서 받기는 하나 수정이 불가능하게 하고 싶은 변수는 protected set을 통해서 보호를
  • list 들의 경우 kotlin backing properties를 이용해 정의하고, 따로 수정용 method를 추가해줬다.

Entity를 변화시켰기에 Service 등 여러 부분의 코드들도 부차적으로 수정해주었다.

DTO 작성(정리) 및 mapper 작성

해당 작업이 이 commit에서 잘 확인할 수 있다.

기존에도 DTO를 사용은 했었는데, Entity를 수정하며 확실하게 구조를 잡았다. 결정한 사항들은 다음과 같다.

  • Entity는 Service단 까지, Controller에서 DTO와 Entity mapping이 일어난다.(살짝 고민인 부분이 있음)
  • DTO는 Request, Response용을 분리한다.
  • DTO에서는 순환참조 이슈를 해결하기 위해 필드를 조금 줄이거나, id만을 담는다.(ex: user.diaries를 dto에서는 diary id만을 담도록 작성한다.)

Comment 추가

Comment 추가 commit
Diary의 Comment를 달 수 있도록 추가하였다. 만들어 가다 보니 게시판이랑 뭐가 다를까... 싶기는 하지만 뭐든 지금의 목표는 하나의 완성된 결과물을 내는 것이기에 굳이 상관하지 않는다.

Comment 기능은 현재 작성과 삭제만 된다. 수정은 구현할 수는 있지만 두 가지 고민이 생겨 멈춰두었다.

  1. 가장 큰 이슈는 원하는데로 front 코드를 짜는게 머리가 아프다... comment 수정의 경우 그 바로 html 코드가 수정되서 화면 전환 없이 진행하고 싶은데 해당 내용을 다 까먹은지 오래고 다시 이걸 고민하는 시간이 살짝 아까워 멈춰두었다.
  2. update를 짜는데에 고민이 생겼다. 이는 사실 comment에만 해당되는 문제는 아니다. DTO를 넘기지 service로 넘기지 않으려다 보니 update의 경우 controller -> service로 넘어갈 때 어떤 형식으로 넘기는지에 대한 고민이 아직 해결되지 않았다. Entity를 불러와서 수정해서 넘겨야할지, field들 만 넘기고 service에서 처리할지 이런 고민 말이다.

마무리

본 글은 하루동안 작업한 내용이 아니라 밀렸던 내용들을 그냥 순서대로 기록만! 해 두었다. 결국 핵심은 Entity와 DTO들을 정리했고, Comment 기능도 추가했다~ 정도이다.
다음 글에서는 바로 이어서 해당 작업까지의 결과물을 Docker container로 구동시키는 것을 진행하겠다.

profile
(전) Junior Android Developer (현) Backend 이직 준비생

0개의 댓글