멀티모듈 리팩토링

minyeob·2023년 4월 4일
0

Spring

목록 보기
11/11

1. 멀티모듈 리팩토링

기존 프로젝트에서는 하나로 묶여진 코드들 안에서 API, Domain, DB의 의존성이 서로 엉켜있는 상태일 것이다. 따라서 이번 멀티 모듈 리팩토링을 통해 의존성 관계를 정리하고 유지보수 하기 좋은 코드를 생성해볼 것이다.

Chooz - 멀티 모듈 프로젝트 에서의 의존성 흐름

이 그림에서 눈여겨봐야 할 점은 Domain 에는 어떠한 의존성도 추가하지 않는 것이다. 따라서 다른 모듈과의 결합성을 낮추고 모듈의 독립성을 보장함으로써 단단한 도메인을 만들 수 있다. 기존 프로젝트에서는 JPA 엔티티가 도메인 객체의 역할을 해주고 있기 때문에 도메인과 JPA의 경계가 모호했다. 하지만 모듈프로젝트 에서는 JPA → Domain 의존성을 가지게 되고, 더이상 JPA 엔티티가 도메인 객체 모델로써의 역할을 해줄 수 없기 때문에 엔티티와 도메인 객체의 분리가 필요하다.


앞으로 어떤 방향으로 코딩을 해야할지 정리를 해보자면

  1. 도메인 객체의 로직은 모두 DOMAIN 모듈에서 책임지게 되고 (DOMAIN 모듈은 영속성 관련한 인터페이스들만 위치)
  2. 영속성 관련 로직은 Storage 모듈이 책임진다 (JPA 모듈에서 영속성 구현체들을 만든다)
  3. API 모듈에서는 중간에서? 도메인 모듈 JPA 모듈을 상호 작용 해주는 역할을 한다( JPA 의존성이 왜 필요한지는 잘 모르겠어서 의존성을 빼고 돌려보니, UserRepository 빈이 스프링 컨텍스트에 등록되어 있지 않아서 오류가 발생했다)

로그인 로직

API 모듈 SignUpController

registerUser 요청 GeneralSignUpRequest (이름,email,password)

GeneralSignUpRequest.toDomain() 메소드를 통해 Domain 에 있는 DTO 인 GeneralSignUpInfo 로 변환하여 signupService.signup 호출(); (항상 똑같은 필드를 가진 DTO를 API,Domain에 두개 만들어야 하는 건가?)

Domain 모듈 SignupService

SignUpService.signUp() 에서는 GeneralSignUpInfo 정보를 받아가지고 User 도메인 객체를 생성한다 → userRepository.register(user) 를 호출한다.

Storage 모듈 UserRepositoryAdaptor, UserJPARepository

userRepository의 구현체인 Storage 모듈의 UserRepositoryAdaptor의 register 메소드가 호출되고

이 register메소드에서 JPARepository를 상속받은 UserJPARepository를 주입받아

userJPARepository.save(userEntity) 를 실행하여 DB에 user정보를 저장하게 된다. (User - > UserEntity로 변경해야 함)

profile
백엔드 개발자를 꿈꾸며 공부한 내용을 기록하고 있습니다.

0개의 댓글