real-world프로젝트 Spring 시작하기(2) - DDD입문 프로젝트 구조 설정.
나는 당연하게도 웹 애플리케이션 제작이고, 배운게 간단한 3-tier 아키텍처라, Repository, Service, Controller로 분리하였다.
근데 Real-world의 다른 데모앱들은 프로젝트 구조를 거의 도메인 중심으로 가져갔다.
이때까지는 이해못했다. 왜 저렇게 했을까?
대신에 개발을 하면서 계속 생각해보기로 했다. 저 구조가 가지는 장점이 도대체 뭘까? 하니까 느껴졌다.
현재 User의 CR**만 작성했는데도 뭔가 한계가 느껴졌다.
접근성이 떨어짐.
만약 UserService를 보고 있다가 UserRepository에 수정사항이 생겼다면 /repository 디렉터리에 가서 확인해야한다. 이거 여간 불편하지않았다.
현재는 User에 관한 서비스밖에 없지만, 점점 프로젝트가 커지면 tag, comment, article, 등 더 생길것이다.
이것 또한 문제가 되는게 만약 comment에 대한 레포지토리를 찾아야하기에, 내 의식은 전부 comment에 대한 집중과 논리로 가득한 상태일 것이다. 근데 갑자기 tagRepository 보이고 articleRepository 보이면 생각의 흐름을 깨버린다. 내 머릿속에 갑자기 if
문이 들어와서 가지고 있던 집중과 논리가 깨진다는 것이다. 그래서 내가 다시 흐름을 잡아야한다는 문제가 생긴다.
이는 마찬가지로 테스트에도 작동된다.
그래서 나는 프로젝트 구조를 바꾸기로 결심하였다.
real-world 데모앱들의 구조를 참고하여 바꾸기로 했다.
intellij가 편하게 파일을 옮겨도 리팩터링을 자동으로 해주므로 큰 시간이 걸리지 않았다.
아직 개선해야할 점이 있다.
DTO안에 userResponse, userRequest, userDto라는 세 가지로 분리된 객체들이 있다.
real-world 코드를 보니 이를 하나의 모듈에서 관리할 수 있게 짤 수 있었다.
이미 정답지를 보고 짜는건 나에게 도움이 되지 않을것이니, 이것도 부딪혀가면서 수정이 필요할때 고치려고 한다.
이번에는 프로젝트 구조에 대해 한계를 느끼고 이를 리팩터링을 진행하였다.
다음에는 Global Exception, User Singup(회원가입) 서비스 구현과정에 대해 적으려고 한다. 겪은 트러블 슈팅에 대해서도 이야기할 것이고 당연히 테스트코드도 포함이다. 글이 너무 길어지면 두 개로 잘라서 쓸 것이다.
현재 이 프로젝트는 vue.js + vite + vuex + Spring boot, Spring Data JPA + Spring Security 를 이용하여 real-world 데모버전을 제작완료하였습니다. https://github.com/kkminseok/real-world-springboot