PHpullh
학습 라이브러리/Java/클린 아키텍처

JAVA · 디자인패턴

클린 아키텍처

의존성 역전 원칙에 기반한 클린 아키텍처의 계층 구조와 구현입니다.

디자인패턴고급클린아키텍처의존성역전유스케이스포트어댑터

핵심 설명

의존성 역전 원칙에 기반한 클린 아키텍처의 계층 구조와 구현입니다.

Java code

// 클린 아키텍처 — 안쪽에서 바깥으로
// 1. 엔터티 (도메인 핵심)
record User(String id, String name, String email) {
    User {
        if (name == null || name.isBlank())
            throw new IllegalArgumentException("이름 필수");
    }
}

// 2. 유스케이스 (비즈니스 규칙)
interface UserRepository { // 포트 (추상)
    User findById(String id);
    void save(User user);
}

class CreateUserUseCase {
    private final UserRepository repo;

    CreateUserUseCase(UserRepository repo) { this.repo = repo; }

    User execute(String name, String email) {
        User user = new User(
            java.util.UUID.randomUUID().toString(), name, email);
        repo.save(user);
        return user;
    }
}

// 3. 어댑터 (외부 시스템 구현)
class InMemoryUserRepository implements UserRepository {
    private final java.util.Map<String, User> store = new java.util.HashMap<>();

    public User findById(String id) { return store.get(id); }
    public void save(User user) { store.put(user.id(), user); }
}

// 4. 프레임워크 (진입점)
class Main {
    public static void main(String[] args) {
        UserRepository repo = new InMemoryUserRepository();
        CreateUserUseCase useCase = new CreateUserUseCase(repo);
        User user = useCase.execute("홍길동", "hong@test.com");
        System.out.println("생성: " + user);
    }
}

학습 팁

의존성 방향은 항상 바깥에서 안쪽입니다. 유스케이스가 리포지토리 인터페이스를 정의하고, 어댑터가 구현합니다(의존성 역전).

주의할 점

엔터티에 프레임워크 어노테이션(@Entity, @Column)을 붙이면 도메인이 프레임워크에 의존하게 됩니다. 분리하세요.

자주 묻는 질문

클린 아키텍처란 무엇인가요?

의존성 역전 원칙에 기반한 클린 아키텍처의 계층 구조와 구현입니다.

클린 아키텍처 학습 시 주의할 점은 무엇인가요?

엔터티에 프레임워크 어노테이션( @Entity , @Column )을 붙이면 도메인이 프레임워크에 의존하게 됩니다. 분리하세요.