유튜브 제미니의 개발실무를 운영하고 있습니다.
깜짜
2024.05.13
0
아라레
2024.04.30
1
비오
2024.04.29
OMG
2024.04.09
종운
2024.04.04
질문&답변
2024.04.07
모듈에 대한 단방향 의존
제가 생각하는 구조는 1번 코드와 2번 코드 모두 아닙니다. 이 강의 설명 기준에서는 API 모듈 이 자체적으로 디비 접근 의존성을 갖지 않고 DB 모듈 을 사용하는게 핵심입니다. 그렇기에 인터페이스 없이 API 모듈이 DB 모듈을 의존하고 있는 형태가 전부 입니다. (강의 중간에 인터페이스를 맞춘다 는 얘기는 메소드 시그니처 를 맞춘다는 의미로 이해하시면 됩니다.) 그래서 대략 이러한 구조라고 보시면 될 것 같습니다. // Payments-API 모듈 //// 의존성 implementation(project(":storage:db-core")) //// 코드 class PaymentAppender(val paymentRepository: PaymentRepository){ fun append(user: User, payment: NewPayment): Payment { // ... 중략 } } // db-core 모듈 //// 의존성 implementation(project("...:spring-boot-starter-data-jpa")) /** * 의존성이 변경된다면 * implementation(project("...:hyper-persistence")) **/ //// 코드 class PaymentRepository( val paymentJpaRepository: PaymentJpaRepository /** * 의존성이 변경된다면 * val paymentHyperRepository: PaymentHyperRepository **/ ){ fun newPayment(paymentPersist: PaymentPersist): PaymentPersistResult { val saved = paymentJpaRepository.save(paymentCommand.toEntity()) /** * 의존성이 변경된다면 * val saved = paymentHyperRepository.insert(paymentCommand.toEntity()) **/ return saved.toResult() } } PaymentDB, PaymentDB2 가 별도 모듈이 있는게 아니라, DB-Core 안에서 변경을 대응하는 관점입니다. -- 소프트웨어는 단계적으로 진화해야 하기 때문에 이 강의에서는 초반 단계 정도의 기본적으로 생각해 볼거리를 중심으로 설명하고 있으므로 완전한 예제가 적절히 나오지 않습니다. 초반 단계 프로젝트 구조는 https://github.com/team-dodn/spring-boot-kotlin-template 를 참고하시면 됩니다. 실제 더 진화한 인터페이스(코드 상에서 쓰는 Interface 를 의미)와 구현 방향성 관련해서는 직접적으로 설명 및 표현하고 있지 않지만, 좀 더 진화된 기준의 구조를 참고하시려면 아래 영상의 후반 부 모듈 구조에 대한 걸 참고하시면 좋을 것 같습니다. https://youtu.be/RVO02Z1dLF8?si=FQdWoLdoBntwTfFS 또 이 아래 영상에서도 참고하실 부분이 있을 것 같습니다 https://youtu.be/p5ZMF2bpE6A?si=EE4JB5X2h6HS4F18 질문 남겨주셔서 감사합니다 :D