Entity, Repository, DTO, UseCase
클린 아키텍처(Clean Architecture) 혹은 DDD(Domain-Driven Design) 같은 설계 패턴에서 사용되며, 프론트엔드와 백엔드에서 조금씩 다르게 적용되는 개념
도메인 모델을 나타내는 객체로, 주로 데이터베이스의 테이블과 매칭된다. 단순한 데이터 구조가 아니라 비즈니스 로직을 포함할 수도 있다.
class User {
constructor(
public id: number,
public name: string,
public email: string
) {}
updateEmail(newEmail: string) {
this.email = newEmail;
}
}
데이터 저장소(DB, API 등)와 엔티티 간의 중개 역할을 한다. 엔티티를 직접 다루지 않고, 추상화된 인터페이스를 통해 데이터에 접근하도록 한다.
interface UserRepository {
findById(id: number): Promise<User | null>;
save(user: User): Promise<void>;
}
데이터를 전송하기 위한 객체로, 엔티티와 분리되어 있으며 주로 API 요청 및 응답에 사용된다.
class CreateUserDTO {
constructor(
public name: string,
public email: string
) {}
}
비즈니스 로직을 처리하는 서비스 계층. 엔티티와 레포지토리를 조합하여 실제 애플리케이션의 동작을 수행하는 역할을 한다.
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를 조합하여 동작) |
이러한 구조를 적용하면 코드의 응집도가 높아지고, 유지보수성이 좋아지며, 테스트가 쉬워지는 장점이 있다.