1. VO (Value Object: 값 객체)
"무엇인지(Identity)보다, 어떤 값을 가졌는지(Value)가 중요한 객체"
- 불변성 (Immutability): 생성자를 통해 한 번 만들어지면 그 내부의 값이 절대 변하지 않습니다. (Setter 없음, 모든 필드는 final)
- 이유: 여러 객체에서 참조하더라도 값이 바뀌지 않음을 보장하므로, **사이드 이펙트(Side Effect)**를 방지하여 코드를 안전하게 만듭니다.
- 동등성 (Equality): 객체의 주소값(Identity)이 아닌, 저장된 값들이 같다면 같은 객체로 취급합니다.
- 구현: 반드시 equals()와 hashCode() 메서드를 오버라이딩해야 합니다.
- 예시: 만 원짜리 지폐 두 장은 서로 다른 종이(주소)지만, 가치는 똑같이 '만 원'이므로 같습니다.
- 자가 검증 (Self-Validation): 객체가 생성될 때 스스로 유효성을 검사합니다.
- 예시: Money 객체 생성 시 금액이 음수(-)라면 생성자에서 예외를 던져 잘못된 객체가 만들어지는 것을 원천 봉쇄합니다.
2. DTO (Data Transfer Object: 데이터 전송 객체)
"이사짐 상자 (계층 간 데이터 운반이 목적)"
- 순수 데이터 컨테이너: 로직(비즈니스 로직)을 포함하지 않으며, 오직 getter/setter 메서드만 가집니다. (최근 Java에서는 Record를 많이 사용)
- 용도:
- Controller ↔ Service 또는 Service ↔ Repository 사이에서 데이터를 주고받을 때 사용합니다.
- DB의 엔티티(Entity) 내부 정보를 모두 노출하지 않고, 화면(View)에 필요한 데이터만 골라서 전달하기 위해 사용합니다.
3. DAO (Data Access Object: 데이터 접근 객체)
"데이터베이스 관리인"
작성해주신 3가지 특징이 핵심입니다.
- 연결 관리: DB 커넥션 풀(Connection Pool) 등을 사용하여 연결을 관리합니다.
- CRUD 수행: 실제 SQL을 날려 데이터를 조회, 수정, 삭제합니다.
- 보안: PreparedStatement 등을 사용하여 SQL Injection 공격을 방지합니다.
참고 (트렌드): 최근 Spring Data JPA 같은 ORM 기술을 사용할 때는 DAO 대신 **Repository**라는 용어를 주로 사용합니다. 역할은 비슷하지만, 구현 방식(인터페이스만 선언하면 구현체가 자동 생성됨)에서 차이가 있습니다.
보통 웹 애플리케이션은 다음과 같은 흐름으로 이 객체들을 사용합니다.
- Client가 요청을 보냄
- Controller가 요청 데이터를 DTO로 받음
- Service로 DTO를 전달
- Service는 DTO를 Entity나 VO로 변환하여 비즈니스 로직 처리
- **DAO(Repository)**를 통해 DB에 저장하거나 조회
'개발 공부 > Java-Spring' 카테고리의 다른 글
| spring ai 해보기 (0) | 2025.12.06 |
|---|---|
| 객체 지향 프로그래밍(OOP)의 특징 (0) | 2025.11.22 |
| 자바 예약어 final vs static (0) | 2025.10.23 |
| interface vs abstract class (0) | 2025.09.26 |
| 정적팩토리 메서드 (0) | 2025.08.15 |