Entity, Repository, DTO, UseCase 개념 정리

Ha Song·2025년 4월 3일

개발공부

목록 보기
1/3
post-thumbnail

Entity, Repository, DTO, UseCase
클린 아키텍처(Clean Architecture) 혹은 DDD(Domain-Driven Design) 같은 설계 패턴에서 사용되며, 프론트엔드와 백엔드에서 조금씩 다르게 적용되는 개념

1. Entity (엔티티)

개념

도메인 모델을 나타내는 객체로, 주로 데이터베이스의 테이블과 매칭된다. 단순한 데이터 구조가 아니라 비즈니스 로직을 포함할 수도 있다.

특징

  • 데이터의 핵심 구조를 정의함
  • 데이터베이스 테이블과 1:1로 매칭될 수 있음
  • 도메인 로직(예: 유효성 검사, 상태 변경) 등을 포함할 수 있음

예제 (TypeScript, NestJS 기준)

class User {
  constructor(
    public id: number,
    public name: string,
    public email: string
  ) {}

  updateEmail(newEmail: string) {
    this.email = newEmail;
  }
}

2. Repository (레포지토리)

개념

데이터 저장소(DB, API 등)와 엔티티 간의 중개 역할을 한다. 엔티티를 직접 다루지 않고, 추상화된 인터페이스를 통해 데이터에 접근하도록 한다.

특징

  • 데이터의 조회, 저장, 수정, 삭제를 담당함
  • 데이터 접근 로직을 캡슐화하여 코드의 변경을 최소화함
  • 의존성을 줄이고 테스트를 쉽게 할 수 있음

예제 (TypeScript, NestJS 기준)

interface UserRepository {
  findById(id: number): Promise<User | null>;
  save(user: User): Promise<void>;
}

3. DTO (Data Transfer Object)

개념

데이터를 전송하기 위한 객체로, 엔티티와 분리되어 있으며 주로 API 요청 및 응답에 사용된다.

특징

  • 데이터를 전송할 때만 사용됨
  • 엔티티와 다르게 비즈니스 로직을 포함하지 않음
  • 보안 및 데이터 유효성 검증을 위해 사용될 수도 있음

예제 (TypeScript)

class CreateUserDTO {
  constructor(
    public name: string,
    public email: string
  ) {}
}

4. UseCase (유스케이스)

개념

비즈니스 로직을 처리하는 서비스 계층. 엔티티와 레포지토리를 조합하여 실제 애플리케이션의 동작을 수행하는 역할을 한다.

특징

  • 하나의 유스케이스는 하나의 특정 기능을 담당함 (예: "회원 가입", "로그인")
  • 의존성을 최소화하여 유지보수와 테스트가 용이함
  • 클린 아키텍처에서 중요한 역할을 담당함

예제 (TypeScript, NestJS 기준)

class CreateUserUseCase {
  constructor(private userRepository: UserRepository) {}

  async execute(dto: CreateUserDTO): Promise<User> {
    const user = new User(Date.now(), dto.name, dto.email);
    await this.userRepository.save(user);
    return user;
  }
}

정리

개념역할
Entity데이터 및 도메인 모델을 나타냄 (DB 테이블과 연결될 수도 있음)
Repository데이터 저장소와 엔티티 간의 연결을 담당 (데이터 조회, 저장, 삭제)
DTO데이터를 전송할 때 사용하는 객체 (엔티티와 분리)
UseCase비즈니스 로직을 수행하는 계층 (Repository + Entity를 조합하여 동작)

이러한 구조를 적용하면 코드의 응집도가 높아지고, 유지보수성이 좋아지며, 테스트가 쉬워지는 장점이 있다.

profile
NICE 한 개발자, 노흘

0개의 댓글