(2) How was your day? - 유저가 Diary를 적을 수 있게 만들기

HEYDAY7·2022년 11월 16일
0

시작하며

로그인 구현을 했으니 조악하게나마 html과 js를 이용해서 Diary를 실제로 만들 수 있도록 한다. 항상 그렇듯 이 글에는 모든 코드가 나오지 않는다. 따라서 github을 따로 참고하는 것을 추천한다.
(작성 날짜 2022-11-17)

작업

Diary, User relation 정리

Diary와 User간은 다대일 관계를 가지게 된다. 따라서 이와 관련해서 @OneToMany, @ManyToOne annotation을 정리했다.

## User.kt
~~~
	@OneToMany
        (cascade = [CascadeType.PERSIST],
        fetch = FetchType.LAZY,
        mappedBy = "user"
    )
    val diaries: List<Diary> = emptyList(),
~~~
## Dialog.kt
~~~
	@ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    val user: User
~~~

이 DB Relation과 관련해서는 따로 더 알아볼 예정이다. 우선 이정도로 넘어가자

Diary 생성시 User data 넘기기

이 부분에서 굉장히 많은 고민을 했다... Diary를 만들기 위해선 User에 대한 데이터가 필요하다. 그렇다면 그 User에 대한 데이터를 어디서 어떻게 뭘로 주입해줘야할까??

첫번째로 들었던 생각은 애초에 post를 쏠 때 데이터로 넘겨주는 것이었다. 근데 생각을 해보니 나는 (아마) 로그인을 session을 통해서 관리하고 있고, 굳이 post 요청을 보낼 때 유저 데이터를 넘겨주지 않아도, 중간 단계에서 session을 통해 알아올 수 있을 것 같았다. 따라서 두번째 생각으로 넘어갔다.

두번째 생각은 위에 언급했던 것처럼 session으로부터 user를 받아와 Diary를 만들어 주는 것이었고, 그 지점은 Service로 잡았다.(현재 api 내부 구조는 controller -> service -> repository이다.) 헌데 이 경우 User field를 제외한 Diary의 field data를 가지는 객체가 필요하다. 그래서 DiaryDTO를 추가하는 것으로 이 문제를 해결해보았다.

## DiaryDTO

data class DiaryDTO(
    val title: String,
    val body: String,
    val actions: List<Action> = emptyList()
)

## DiaryServiceImpl

override fun post(diaryDTO: DiaryDTO) {
        val a = RequestContextHolder.currentRequestAttributes() as ServletRequestAttributes
        val sessionUserId = (a.request.session.getAttribute("user") as SessionUser?)?.id ?: throw Exception()
        val user = userRepository.findByIdOrNull(sessionUserId) ?: throw Exception()
        val diary = Diary(
            diaryDTO.actions,
            diaryDTO.title,
            diaryDTO.body,
            user
        )
        diaryRepository.save(diary)
    }

이렇게 Service에서 RequestAttribute를 얻어와 session 안에 있는 SessionUser를 꺼내고, 이를 통해 User를 얻어와 Diary를 만들어주었다.

사실 이 코드가 내가 썼지만 너무, 너어어무 못짰다고 생각이 든다. 따라서 추후에 무조건!! 꼭!! 더 좋고 올바른 방법으로 이를 수정할 예정이다.

Html, js 작업하기

사실... 이 부분.. 결과물조차 조악하기 그지없는 이부분에 화가 나게도 시간을 제일 많이 썼다. 뭐든 제대로 알지 못하고 하려니 삽질의 삽질의 삽질의 연속이었던 것 같다. 제일 나를 골치아프게 했던 것은 action(Diary 내부 내용) data를 넘기는 파트였다. array 형태로 넘겨야 했기에 여러 문서들을 찾아보며 했지만.. 결국 돌아돌아 가장 원시적인 파트를 택했다.
좀 미리 욕심을 버렸어야 했던게 아닌가~ 하는 생각이 결국에 든다.

코드 자체는 보여주기도 부끄러우니 딱히 여기에 적지는 않는다. 대신 작업한 결과물 사진을 올린다.

  • main 화면
  • 로그인 후
  • 목록
  • detail
  • diary-post

요 정도로 오늘 작업을 마친다.

마치며

생각보다 이런저런 작업들에 시간을 너무 많이 뺏겨서 좀 아쉽다... 백엔드.. DB... Spring... Authentication 등 공부할게 참 많은데 html, js에 시간일 뺏기니 말이다. 다만 이것도 배움이라고 생각한다. 어쨌든 어느정도 프로젝트 구축을 후딱 마치려 한다. 그 이후에 조악한 부분들을 커버하면서 더 공부해 나가는 그 스텝을 밟는 생각을 하며 마친다.

Github 주소

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

0개의 댓글