본문 바로가기
Book/자바,스프링 개발자를 위한 실용주의 프로그래밍

2.2 객체의 종류 (DTO,DAO,Entity ..)

by burning-man 2024. 9. 4.

💭 개요

Vo, Dto, Dao, Entity 등등 여러가지의 객체들을 알아보자

 

💡 공부한 것

 

DTO (Data Transfer Object)

 

데이터 전송을 목적으로 사용되는 객체이다. 다른 객체의 메서드를 호출하거나 시스템을 호출 할 때, 매개변수를 일일이 모두 나열해서 전달하는게 불편해서 데이터를 묶어서 보내려고 만들어진 객체이다.

💡 그 이상의 그 이하의 의미도 없다.

 

DAO (Data Access Object)

데이터베이스 접근과 관련된 역할을 지닌 객체이다. 복잡하고 번거로운 데이터베이스 접근 관련 로직을 전문적으로 처리하기 위해 만들어진 객체이다. DAO의 목적은 도메인 로직과 데이터베이스 연결로직을 분리 하기 위함이다.

  1. 데이터베이스와의 연결을 관리한다.
  2. 데이터베이스에 연결해 데이터에 대한 CRUD 연산을 수행한다.
  3. 보안 취약성을 고려한 쿼리를 작성한다.

Entity

엔티티는 데이터를 표현하려는 유무형의 대상이다. 엔티티는 보편적인 개념을 가지고 있는데 이 개념이 어디에서 사용되느냐에 나뉜다.

  1. 도메인 엔티티
    1. 도메인 이란 어떤 ‘비즈니스 영역’이다.
    2. 비즈니스 영역에 해당 되는 개념들을 클래스로 만들 수 있는데 이런 개념 모델들을 도메인 모델이라 부른다.
    3. 이런 도메인 모델 중 식별자의 존재, 비즈니스 로직, 생애주기 등 유독 특별한 모델이 있는데 이를 도메인 엔티티라고 부른다.
  2. DB 엔티티
    1. 관계형 데이터베이스 분야에서 어떤 유무형의 객체를 표현하는데 사용하는 용어이다.
    2. DB 엔티티들은 서로 구별될 수 있다.
  3. JPA 엔티티
    1. 관계형 데이터베이스에 있는 데이터를 객체로 매핑하는데 사용되는 클래스이다.
    2. @Entity 어노테이션을 사용한다. → 영속성 객체를 만들기 위한 도구이다.
    3. 도메인 엔티티 보다는 DB 엔티티에 더 가까운 개념이다.

 

이 세가지 개념은 모두 엔티티라는 큰 카테고리의 하위 개념일뿐이다.

 

객체지향에서는 온전한 객체와 객체들간의 협력을 추구했고, 엔티티를 표현하는데 ‘클래스’를 사용했다.

데이터베이스에서는 데이터의 정합성, 중복 제거와 같은 부분을 신경 썼고, ‘테이블’을 사용해 데이터를 표현했다.

 

각자의 세계에서 나름의 세상을 구축하고 있었으나, 시간이 흘러 양쪽이 협업할 필요가 있었다.

개발자는 데이터베이스에서 데이터를 가져와서, 도메인 모델에다 데이터를 옮기는 작업을 해야했는데 이러한 작업을 대신 해주는 라이브러리가 있었다. 대표적으로는 MyBatis가 있다.

DB에 쿼리를 던지고, 필요한 데이터를 선택적으로 읽어왔다. 그리고 쿼리의 결과를 도메인 모델에 ‘매핑’ 했다.

 

이러한 ‘매핑 작업’ 들이 지루해지면서 ORM 이라는 솔루션이 등장한다. Object Relational mapping의 약자로, 말 그대로 관계형 데이터베이스에 있는 데이터를 객체에 매핑하는 솔루션이다. 자바 진영의 대표적인 ORM 솔루션은 JPA 이고, JPA의 구현체로 하이버네이트를 사용한다.

 

전체적인 정리

  • 엔티티는 데이터를 표현하려는 유무형의 대상이다.
  • 소프트웨어 개발 분야에서 말하는 엔티티는 도메인 엔티티이다.
  • 도메인 엔티티는 도메인 모델 중에서도 식별 가능하고 비즈니스 로직을 갖고 있는 조금 특별하게 관리되는 객체이다.
  • DB 엔티티는 데이터베이스 분야에서 데이터로 표현하려는 대상이다.
  • JPA 엔티티는 관계형 데이터베이스의 엔티티를 지칭한다.
  • JPA의 @Entity 어노테이션이 적용된 객체는 ‘영속성 객체’이다.
  • JPA의 @Entity 어노테이션은 영속성 객체를 만들기 위한 도구일 뿐이다.
  • 도메인 엔티티와 DB 엔티티는 다르다.

 

소프트웨어 설계가 추구하는 가치

  • 불변성
  • 예측 가능성
  • 역할의 분리
  • 항상성

불변성을 가진 객체 생성의 목적은 본질적으로 불확실성이 존재하는 소프트웨어 개발의 특징을 예측 가능한 동작을 보장하기 위함이다. 불변 객체는 상태 변화로 인한 버그와 오류를 방지하고, 코드의 안정성을 높이는데 중요한 역할을 한다.

역할의 분리는 시스템 내 구성요소가 고유한 책임과 역할을 가지도록 설계하는 것을 의미한다. 이를 통해 시스템은 모듈화되고, 각 요소들 간의 결합도가 낮아져 유지보수와 확장이 용이해진다. 역할이 분명하게 분리되면 확장이 쉬워지고 테스트와 디버깅이 더 쉬워진다.

항상성은 시스템이 예외 상황에서도 일관된 동작을 유지하도록 설계하는 것을 말한다. 항상성을 고려한 설계는 시스템이 예측 가능하고 사용자에게 일관된 경험을 제공할 수 있게 한다.

 

🔠 Keyword 정리

DTO, DAO, Entity, 도메인, 도메인 모델, 도메인 엔티티, DB 엔티티, JPA 엔티티, JPA, 하이버네이트, 불변성, 예측 가능성, 역할의 분리, 항상성