티스토리 뷰
최근에 서비스 개발 코드들을 보면서 옛날 클래스 네이밍/아키텍처 패턴을 보고 있습니다.
예를 들어 DTO, DAO 같은 것들 말이죠.
대략적으로는 알지만, 오랜만에 봐서 그런지 헷갈려 정리해놓고자 합니다.
이 글에서는 일반적으로 이런 역할을 가진다
라고 이야기하지만 무조건 적인 것은 아닙니다. 변질된 사례도 많고, 구현하는 사람마다 이해하는 바가 다르기 때문입니다.
그리고 개인적인 의견입니다만 최근에는 여기서 말하는 모든 네이밍/패턴은 많이 사용되지 않는다고 생각합니다. 여러 다른 프레임워크/구현체(ex. JPA/Hibernate 등)들이 어느정도 많이 사용되면서 다른 명명 패턴/추상화(ex. Repository 등)를 사용하고 있기 때문입니다.
하지만 그럼에도 팀 및 정해진 인원들이 어느정도 정해진 컨벤션 내에서 활용한다면 코드를 이해하고 역할과 책임을 나누는데 도움이 될 것 이라고 생각합니다.
이 글에서 이야기 할 것들은 다음과 같습니다. 이후로 이것들을 약어
라고 부르겠습니다.
- DTO, DAO, PO, SO, BO, VO
DTO
Data Transfer Object
의 약자로 Java 생태계에서 가장 일반적으로 많이 사용됩니다.
쉽게 이야기하면 한 위치에서 다른 위치로 전송할 데이터가 포함된 캡슐화 된 객체를 의미합니다.
처음 DTO가 등장했을 때는 데이터베이스에서 가져온 데이터를 캡슐화하고, 이를 외부에서 활용할 때 사용하는 용도/매커니즘으로 사용했습니다.
요즘은 더 많이 다양하게 사용하고 있는데요. 데이터 계층 뿐 아니라 HTTP RESTful API 요청 간 데이터를 전송하기 위한 요청/응답 개체로도 사용합니다. 또한, 여러 레이어/모듈 간 데이터를 캡슐화 해 주고받는 경우에도 이를 활용하기도 합니다.
DAO
Data Access Object
의 약자로 데이터 액세스 개체를 의미합니다. DTO와 마찬가지로 많이 사용되는 패턴입니다.
데이터 액세스 라는 이름에서 알 수 있듯 데이터베이스 액세스를 캡슐화하는 책임을 가집니다.
아래 그림을 참조하시면 잘 와닿으실 겁니다.
사실 이 패턴은 최근 Java/Spring 개발환경에서는 많이 사용되지 않는 추세입니다. Spring Boot/Spring Data project에서는 데이터베이스 액세스를 캡슐화하는 개체로 Repository
약어를 사용하고 있기 때문입니다.
그래서 DAO보단 오히려 Repository가 더 많이 사용되는 추세입니다. 그렇기에 Spring Data가 아니더라도 Repository 라는 약어를 이용해 패턴을 구현하는 경우도 있습니다.
PO
Persistent Object
약자로 데이터베이스에 저장할 데이터를 캡슐화하는 개체를 의미합니다.
DTO/DAO와 조금 헷갈릴 수 있는데요. 이름에서 알 수 있듯 데이터베이스에 저장되어 지속(Persistent)된다는 의미로 이해해서 데이터베이스에 유지되어야 하는 개체로 이해하면 됩니다.
사실 DAO처럼 PO도 많이 사용되지 않는 추세입니다.
JPA 같은 ORM이 많이 활용되면서 PO 대신 Entity
약어가 많이 사용되고 있습니다.
SO
Service Object
약자로 서비스 레이어에서 활용되는 데이터를 캡슐화한 개체를 의미합니다.
데이터 관련 기능을 캡슐화하기 위한 용도로 DAO/DTO가 사용되는 것과 달리 SO는 비즈니스 로직을 캡슐화 하기 위한 용도로 사용됩니다.
개인적인 경험으로 SO로 명명하지 않고 Service
로 사용하는 경우가 많았던 것 같습니다. 기능적으로 같은 것이라고 보면 됩니다.
BO
Business Object
약자로 비즈니스 로직을 담고 있는 개체입니다. 사실 SO와 유사한 개념으로 활용된다고 보면 됩니다.
'엥? 기능적으로 유사한데 왜 나눠?'라고 생각할 수 있는데, 이 모든 것들을 다 사용할 필요는 없습니다.
단순히 팀/사람/Java 생태계에서 사용되는 약어/용어일 뿐입니다. 필요한 것만 가져다 사용하면 됩니다.
SO와 같이 사용되는 경우, BO에 직접적인 비즈니스 로직을 담고 SO를 Facade 또는 Orchestrator로 BO를 사용하도록 구현할 수도 있습니다.
VO
Value Object
의 약자로 특정 값을 나타내는 개체입니다.
개체를 구성하는 몇 가지 속성(필드)을 가지고, 변경이 불가능(불변개체)하도록 구현해 Value 자체로 사용될 수 있도록 구현합니다.
특정 계층에 속하지 않기에 모든 계층 어디서나 값 자체로 사용할 수 있습니다.
'Development > Java, Kotlin, Frameworks' 카테고리의 다른 글
사이드 프로젝트 Spring boot 3.0 migration (3) | 2022.12.28 |
---|---|
Spring boot, JPA 환경에서의 더 좋은 쿼리 로깅 하기 (0) | 2022.11.21 |
R2DBC를 사용해보자 (3) - Join (Many-To-One, One-To-One, One-To-Many) (0) | 2022.08.15 |
R2DBC를 사용해보자 (2) - CRUD를 만들어보자 (0) | 2022.08.15 |
R2DBC를 사용해보자 (1) - 왜 사용할까? (0) | 2022.08.15 |
- Total
- Today
- Yesterday
- 일상
- 비동기
- docker
- Clean Architecture
- hexagonal architecture
- WebFlux
- HTTP
- Spring boot
- java
- container
- Istio
- Kubernetes
- python
- jasync
- Spring
- 하루
- MySQL
- Algorithm
- 알고리즘
- gradle
- Log
- 로그
- k8s
- boj
- 쿠버네티스
- 클린 아키텍처
- Intellij
- c++
- 백준
- tag
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |