Skip to content

[패키지구조] 토피케이션 패키지 구조 #25

@Allaccept12

Description

@Allaccept12
├── ServerApplication.java
├── domain
│   ├── auth
│   │   ├── model
│   │   ├── repository
│   │   └── event
│   ├── club
│   │   ├── model
│   │   ├── repository
│   │   └── event
│   ├── member
│   │   ├── model
│   │   ├── repository
│   │   └── event
│   └── topication
│       ├── model
│       │   ├── Topication.java
│       │   ├── Category.java
│       │   ├── Region.java
│       │   └── Review.java
│       ├── repository
│       │   └── TopicationRepository.java
│       └── event
│           └── TopicationCreatedEvent.java
├── application
│   ├── auth
│   │   ├── AuthService.java
│   │   └── AuthEventListener.java
│   ├── club
│   │   ├── ClubService.java
│   │   └── ClubEventListener.java
│   ├── member
│   │   ├── MemberService.java
│   │   └── MemberEventListener.java
│   └── topication
│       ├── TopicationCommandService.java //command랑 Query랑 분리하셨길래
│       ├── TopicationQueryService.java
│       ├── CategoryService.java
│       ├── RegionService.java
│       ├── ReviewService.java
│       └── TopicationEventListener.java
├── infrastructure
│   ├── config
│   │   ├── JpaConfig.java
│   │   └── SecurityConfig.java
│   ├── persistence
│   │   ├── auth
│   │   ├── club
│   │   ├── member
│   │   └── topication
│   │       ├── jpa
│   │       │   ├── entity
│   │       │   │   └── TopicationEntity.java
│   │       │   └── repository
│   │       │       ├── TopicationJpaRepository.java
│   │       │       └── TopicationRepositoryImpl.java
│   │       └── elasticsearch
│   │           └── TopicationEsAdaptor.java
│   └── kafka
│       ├── KafkaSender.java
│       ├── RetryFailListener.java
│       └── model
│           └── RetryFailMessage.java
├── interfaces
│   ├── api
│   │   ├── auth
│   │   ├── club
│   │   ├── member
│   │   └── topication
│   │       ├── TopicationController.java
│   │       ├── CategoryController.java
│   │       ├── RegionController.java
│   │       └── ReviewController.java
│   ├── dto
│   │   ├── auth
│   │   ├── club
│   │   ├── member
│   │   └── topication
│   │       └── CreateTopicationRequest.java
│   └── mapper
│       ├── auth
│       ├── club
│       ├── member
│       └── topication
│           └── TopicationMapper.java
└── common
    ├── exception
    ├── constants
    └── util
        └── BaseEntity.java

개요

  1. 도메인 중심: 각 도메인이 명확히 구분되어 있어 관련 코드를 쉽게 찾을 수 있습니다.
  2. 레이어 구분: 각 레이어(domain, application, infrastructure, interfaces)를 구분하여 관심사를 분리했습니다
  3. 의존성 방향: 외부(인프라스트럭처) → 인터페이스 → 애플리케이션 → 도메인으로 의존성이 흐릅니다.

특징

  1. 도메인 레이어는 순수한 Java 코드로만 구성하고, Spring 관련 어노테이션 등을 사용하지 않도록 합니다.
  2. 애플리케이션 레이어의 서비스들은 도메인 모델과 리포지토리 인터페이스에 의존합니다.
  3. 인프라스트럭처 레이어에서는 도메인 레이어의 인터페이스를 구현합니다.
  4. 인터페이스 레이어의 컨트롤러들은 애플리케이션 서비스를 호출하고, DTO와 도메인 모델 간의 변환을 담당하도록 합니다.
  5. 관심사 분리 및 디커플링에 사용되는 ApplicationEventPublisher 사용시 ~EventClass는 domain레이어에 위치하고, 각 Event의 Listener 는 application 레이어에 위치합니다

레이어간 역할

  1. Domain Layer:
    • 비즈니스 개념과 규칙 정의
    • 핵심 비즈니스 로직 구현
    • 도메인 이벤트 정의
    • 리포지토리 인터페이스 정의
  2. Application Layer:
    • 트랜잭션 관리
    • 여러 도메인 객체 간 조율
    • 보안, 로깅 등 크로스 커팅 관심사 처리
    • 도메인 이벤트 발행 및 처리
  3. Infrastructure Layer:
    • 데이터베이스 연동 (리포지토리 구현)
    • 외부 API 통합
    • 메시징 시스템 구현 (예: Kafka)
    • 보안 메커니즘 구현
    • 캐싱 구현
  4. Common (Shared Kernel):
    • 공통 유틸리티 클래스
    • 전역 예외 정의
    • 공통 상수 및 열거형
    • 크로스 커팅 관심사를 위한 어노테이션

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions