📚[Backend Development] Java Spring 프레임워크의 계층 - Dmain Layer (도메인 계층)
✅ Domain Layer (도메인 계층)
-
주요 컴포넌트 :
@Entity
(JPA 사용시), DTO(Data Transfer Object) - 역할 : 애플리케이션에서 사용하는 데이터의 구조를 정의합니다.
-
설명 : 이 계층은 다른 모든 계층에서 사용되는 핵심 데이터 객체를 포함합니다.
- 도메인 객체/Entity : 데이터베이스 테이블과 직접 매핑되는 객체로, 데이터와 관련된 비즈니스 로직을 포함하기도 합니다.
- DTO (Data Transfer Object) : 계층 간 데이터 전송을 위해 사용하는 객체입니다. 예를 들어, Controller에서 요청 데이터를 받을 때나, 사용자에게 필요한 데이터만 가공하여 응답할 때 사용됩니다.
이러한 계층 분리는 각 부분의 독립성을 높여주어, 한 계층의 수정이 다른 계층에 미치는 영향을 최소화하고 코드의 재사용성을 높이는 장점이 있습니다.
Domain Layer는 애플리케이션의 핵심 데이터 모델을 정의하고, 모든 계층에서 일관된 데이터 구조를 사용하도록 보장하기 위해 사용합니다.
✅ 1. ‘데이터의 구조를 정의한다’의 의미
이는 애플리케이션에서 다루는 핵심 대상들의 속성과 관계를 코드로 명시하는 것을 의미합니다.
예를 들어 ‘게시글’은 ‘제목’, ‘내용’, ‘작성자’를 속성으로 가지고, 하나의 ‘작성자’는 여러 ‘게시글’을 가질 수 있다는 관계를 자바 클래스로 설계하는 것입니다.
✅ 2. ‘핵심 데이터 객체’란 무엇인가요?
애플리케이션의 존재 이유가 되는 핵심적인 데이터를 메모리상에서 표현하는 자바 객체입니다.
쇼핑몰이라면 상품
, 주문
, 회원
객체가 여기에 해당하며, 이 객체들을 중심으로 모든 비즈니스 로직이 동작합니다.
✅ 3. ‘도메인 객체/Entity’란 무엇인가요?
핵심 데이터 객체 중, 데이터베이스 테이블과 직접적으로 일대일 매핑되는 객체를 말합니다.
보통 JPA의 @Entity
어노테이션이 붙으며, 데이터의 영속성(Persistence)을 관리하는 대상이 됩니다.
데이터베이스의 한 행(Row)이 하나의 Entity 객체라고 볼 수 있습니다.
✅ 4. ‘DTO (Data Transfer Object)’는 무엇인가요?
계층 간 데이터 전송을 위해 사용되는 전용 객체입니다.
Entity가 데이터베이스와 직접 연결된 ‘살아있는 객체’라면, DTO는 특정 요청이나 응답에 필요한 데이터들만 담아 전달하는 단순한 ‘데이터 상자’입니다.
예를 들어, 사용자의 비밀번호까지 포함된 User
Entity와 달리, 화면에 보여줄 이름
과 이메일
만 담은 UserResponseDTO
를 만들어 사용합니다.
✅ 5. ‘DTO’와 ‘DAO’의 차이점
- DTO (Data Transfer Object) : 데이터를 담아 옮기는 ‘객체(Object)’ 입니다. getter/setter 외에 다른 로직을 갖지 않는 순수한 데이터 컨데이너 입니다.
-
DAO (Data Access Object) : 데이터에 접근하는 로직을 담은 ‘객체(Object)’ 입니다. 데이터베이스에 연결하여 CRUD(생성, 조회, 수정, 삭제) 작업을 수행하는 메서드들을 포함하는 설계 패턴입니다. 현대 스프링에서는
@Respository
인터페이스가 이 역할을 대신합니다.
구분 | DTO (Data Transfer Object) | DAO (Data Access Object) |
---|---|---|
목적 | 데이터 전달 | 데이터 접근 |
역할 | 데이터 컨테이너 (데이터를 담는 상자) | 데이터 접근 로직 (데이터를 꺼내는 도구) |
로직 | 없음 (Getter/Setter만 가짐) | 데이터 CRUD 로직 포함 |
현대 스프링 | DTO Class |
@Repository Interface |
✅ 6. Domain Layer는 언제 사용하나요?
애플리케이션을 설계하는 가장 첫 단계부터 사용하며, 개발 과정 내내 모든 계층에서 참조됩니다.
비즈니스 로직을 처리하거나, 데이터베이스에 데이터를 저장하거나, 화면에 데이터를 표시할 때 항상 이 계층에 정의된 객체를 기준으로 작업을 수행합니다.
✅ 7. Domain Layer는 어디서 사용하나요?
특정 위치에 국한되지 않고, 애플리케이션의 모든 계층(Presentation, Business, Data Access)에서 사용되는 공통 분모입니다.
아키텍처의 중심에 위치하여 애플리케이션의 핵심 데이터 모델을 형성합니다.
✅ 8. Domain Layer는 어떻게 사용하나요?
주로 순수 자바 객체(POJO, Plain Old Java Object) 로 구현합니다.
-
@Entity
클래스 : 데이터베이스 테이블과 매핑되는 핵심 도메인 객체를 정의합니다. - DTO(Data Transfer Object) 클래스 : 계층 간 데이터 전송을 위한 데이터 상자를 정의합니다.
- Enum 클래스 : ‘회원 등급’ (BRONZE, SILVER, GOLD)처럼 정해진 값들의 집합을 정의합니다.
✅ 9. Domain Layer는 왜 사용하나요?
가장 중요한 이유는 애플리케이션의 데이터 모델을 중앙에서 관리하여 일관성을 유지하기 위함입니다.
- 관심사 분리 : 데이터의 ‘구조’와 데이터를 ‘처리’하는 로직을 분리하여 시스템을 명확하게 만듭니다.
- 재사용성 및 일관성 : 모든 계층이 동일한 데이터 구조(객체)를 공유하므로, 코드의 재사용성이 높아지고 데이터 불일치 문제가 줄어듭니다.
- 애플리케이션의 본질 표현 : 이 계층은 애플리케이션이 ‘무엇’에 관한 것인지(e.g, 게시글, 댓글, 회원)를 명확하게 보여주는 청사진 역할을 합니다.
✅ @Entity
컴포넌트
@Entity
는 자바 클래스를 데이터베이스 테이블과 매핑하여 JPA(Java Persistence API)가 관리할 수 있도록 할 때 사용합니다.
✅ 1. @Entity
는 언제 사용하나요?
데이터베이스 테이블에 저장하고 관리해야 할 데이터를 객체로 만들 때 사용합니다.
예를 들어 ‘회원’, ‘게시글’, ‘상품’처럼 영속적으로 저장되어야 하는 도메인 객체를 정의할 때 사용됩니다.
✅ 2. @Entity
는 어디서 사용하나요?
애플리케이션 아키텍처의 Domain Layer(도메인 계층)에서 사용됩니다.
이 계층에 속한 클래스들은 애플리케이션의 핵심 데이터 구조를 나타냅니다.
✅ 3. @Entity
는 어떻게 사용하나요?
클래스 선언부 위에 @Entity
어노테이션을 붙여서 사용합니다.
또한, 테이블의 기본 키(Primary Key)에 해당하는 필드에는 @Id
어노테이션을 반드시 붙여줘야 합니다.
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
// 이 클래스가 데이터베이스 테이블과 매핑되는 엔티티임을 선언합니다.
@Entity
public class User {
// 이 필드가 테이블의 기본 키(Primary Key)임을 나타냅니다.
@Id
// 기본 키 값을 자동으로 생성하는 방식을 지정합니다. (예: 데이터베이스에 위임)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String email;
// Getter, Setter, 기본 생성자 등
}
✅ 4. @Entity
는 왜 사용하나요?
가장 중요한 이유는 객체지향 프로그래밍과 관계형 데이터베이스 사이의 패러다임 불일치를 해결하기 위함입니다.
@Entity
를 사용하여 객체와 테이블을 매핑하면, JPA가 해당 객체를 영속성 컨텍스트(Persistence Context)에서 관리할 수 있게 됩니다.
-
객체 중심 개발 : 개발자는 SQL 쿼리가 아닌 자바 객체를 다루는 데 집중할 수 있습니다.
user.setUsername("new name")
처럼 객체의 상태만 변경하면, JPA가 알아서 적절한 UPDATE 쿼리를 생성하여 데이터베이스에 반영해줍니다. - 생산성 및 유지보수성 : 반복적인 CRUD SQL 작성을 줄여주고, 데이터베이스에 독립적인 코드를 작성할 수 있어 생산성과 유지보수성이 향상됩니다.