Skip to content

Link 도메인 구조 리팩토링#168

Merged
ckdals4600 merged 4 commits intomainfrom
feature/#167-link-domain-refactor
Dec 26, 2025
Merged

Link 도메인 구조 리팩토링#168
ckdals4600 merged 4 commits intomainfrom
feature/#167-link-domain-refactor

Conversation

@ckdals4600
Copy link
Contributor

관련 이슈

PR 설명

  • Link 도메인의 유지보수성과 재사용성을 높이기 위해 전반적인 아키텍처 리팩토링을 진행했습니다.
  • Controller, Facade, Service 간의 역할을 명확히 분리하고, 특히 검증(Validation) 책임을 구현체에서 인터페이스로 이동하여 설계의 일관성을 확보했습니다.

작업 내용

1. 검증 책임의 이동 (Controller -> Api)

  • 기존에 LinkController에 존재하던 @Valid, @Min, @Max 등의 검증 어노테이션을 **인터페이스(LinkApi)**로 모두 이동시켰습니다. 이에 대한 판단 근거는 다음과 같습니다.

1. 계약에 의한 설계 (Design by Contract)

  • 판단 근거: 인터페이스는 클라이언트와의 **'약속(Contract)'**이자 **'명세(Spec)'**입니다. "어떤 데이터가 유효한가"에 대한 정의는 구현 세부 사항(How)이 아닌 명세 단계(What)에서 선언되는 것이 아키텍처 관점에서 적합하다고 판단했습니다.
  • 효과: 코드를 읽는 개발자가 구현체(Controller)를 열어보지 않고도, 인터페이스만으로 입력값의 제약 조건을 명확히 파악할 수 있게 되었습니다.

2. JSR-380 표준 준수 및 충돌 방지

  • 기술적 이유: Bean Validation 스펙(JSR-380)에 따르면, 인터페이스와 구현체 양쪽에 제약 조건을 중복 선언하거나 오버라이딩할 경우 ConstraintDeclarationException이 발생할 위험이 있습니다.
  • 해결: 검증 어노테이션을 인터페이스에 일원화함으로써, 런타임 에러를 원천 차단하고 Single Source of Truth을 유지했습니다.

3. Spring AOP 프록시 동작 보장

  • 동작 원리: @Validated는 Spring AOP 기반으로 동작합니다. JDK Dynamic Proxy가 인터페이스를 기반으로 생성될 때, 인터페이스에 명시된 제약 조건이 있어야 프록시가 올바르게 검증 로직을 가로챌 수 있습니다.

2. API 응답 구조 통일 (LinkController)

  • ResponseEntity 제거:
    • 기존: ResponseEntity<BaseResponse<T>>
    • 변경: BaseResponse<T> 직접 반환
    • 목적: 불필요한 래퍼 클래스를 제거하고, 프로젝트 전반의 응답 컨벤션을 통일

3. Service 계층 반환 타입 변경 (LinkService)

  • Entity 반환 원칙 적용:
    • 기존: LinkServiceLinkRes(DTO)를 반환.
    • 변경: LinkService는 **Link(Entity)**를 반환하도록 수정.
    • 이점: 서비스 메서드가 특정 응답 DTO에 종속되지 않아, 추후 다른 도메인에서 재사용하기 용이하도록 수정

4. Facade 계층 역할 강화 (LinkFacade)

  • DTO 변환 책임 할당:
    • Service로부터 반환받은 EntityFacade에서 DTO로 변환하여 Controller로 전달
  • 트랜잭션 관리:
    • Facade 메서드에 @Transactional을 적용하여, EntityDTO로 변환하는 시점까지 영속성 컨텍스트를 유지하도록 수정

@ckdals4600 ckdals4600 linked an issue Dec 24, 2025 that may be closed by this pull request
@ckdals4600 ckdals4600 requested review from Goder-0 and minibr December 24, 2025 00:54
@ckdals4600 ckdals4600 self-assigned this Dec 24, 2025
@github-actions
Copy link

📊 코드 커버리지 리포트

Overall Project 87.79% 🍏
Files changed 100% 🍏

File Coverage
LinkController.java 100% 🍏
LinkFacade.java 100% 🍏
LinkQueryService.java 100% 🍏
LinkCommandService.java 100% 🍏
LinkService.java 100% 🍏

@ckdals4600 ckdals4600 merged commit 20dd700 into main Dec 26, 2025
1 check passed
@ckdals4600 ckdals4600 deleted the feature/#167-link-domain-refactor branch January 6, 2026 05:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Link 도메인 구조 리팩토링

2 participants