✨ Spring batch를 만들던 중, 데이터 클래스를 만들어야 하는 시간이 왔다. 한 6년 전에 국비 교육을 들은 개발자들이라면 알겠지만, 그때는 무조건 vo, service, controller, interface로 이루어진 구조를 가지고 왔기에 뇌가 없이 vo라고 만들다가, VO와 DTO의 차이를 조금 더 명확하게 알아야겠다는 생각을 했다. 네. 저 3년차 맞아요.
🪡 VO(Value Object)
VO는 값을 나타내는 객체로, 도메인 로직을 포함할 수 있는 특징이 있기 때문에 주로 도메인 모델의 일부로 사용된다.
🐣 특징
불변성(Immutability) : VO는 생성 이후 내부 상태가 변하지 않는다. 그렇기 때문에 안전하게 공유되고 캐싱될 수 있다.
동등성(Equality) : 내부 값이 같다면 같은 객체로 취급된다. 두개의 vo 객체의 값이 같다면 두 객체는 동일하다고 간주한다.
자체 검증(Self-validation) : 생성 이후에 내부 상태가 변하지 않기 때문에, 생성 시점에 유효성 검사를 수행할 수 있다.
🐥사용 예시
좌표[Point(x, y)], 화폐[Money(amount, currency)], 날짜[Date(year, month, day)]
✨ 장점
불변성을 가지고 있기 때문에 여러 스레드에서 안전하게 사용할 수 있고, 값 비교를 통해 간편하게 동등성에 대한 체크가 가능하다.
⭐️ 단점
상태를 변경하기 위해서는 새로운 객체를 만들어야 하기 때문에, 잦은 상태 변화가 필요한 경우 비효율적일 수 있다.
✏️ 어떤 상황에 사용할까
사용 예시처럼 값 자체가 중요한 경우 또는 값에 대한 비교가 필요할 때, 객체의 불변성을 유지해야 하는 경우 VO를 사용해야 한다.
🧶 DTO (Data Transfer Object)
DTO는 프로세스간 데이터를 전송을 위한 객체이며, 여기에는 데이터베이스, 웹 서비스, 애플리케이션 레이어 간의 데이터 전송도 포함된다.
🐣 특징
단순 컨테이너: DTO는 데이터의 속성만을 포함하기 때문에, 주로 getter/setter만 가지고 있다.
비즈니스 로직 부재 : 데이터 전송이 목적이기 때문에 복잡한 비즈니스 로직을 포함하지 않는다.
가변성 : 데이터를 쉽게 수정 및 가공하는 것이 가능하다.
직렬화 : 네트워크 전송 또는 파일 저장을 위하여 직렬화가 가능하다. (주로 서비스 계층과 프레젠테이션 계층 사이에서 사용된다.)
🐥사용 예시
API 요청/응답 : 클라이언트와 서버 간 데이터 교환을 위한 객체
데이터베이스 조회 결과 : 데이터베이스에서 조회된 데이터를 서비스 레이어로 전달
파일 I/O : 파일로부터 읽거나 파일에 쓰기 위한 데이터 객체
✨ 장점
데이터 전송을 위하여 간편한 구조를 가지고 있으며, 직렬화와 역직렬화를 통해 네트워크 통신 또는 파일 저장에 용이하다.
⭐️ 단점
상태를 변경하기 위해서는 새로운 객체를 만들어야 하기 때문에, 잦은 상태 변화가 필요한 경우 비효율적일 수 있다.
✏️ 어떤 상황에 사용할까
계층 간 또는 시스템 간의 시스템 데이터를 전송할 때나 외부 시스템과의 데이터 교환 시에 사용한다.
🏹 언제 쓸까?
VO는 다중 스레드 또는 프로세스의 환경에서 안전하게 공유할 수 있는 불변값의 데이터일 때에 유리하다. 또는, 좌표 두 개를 두고 동일한 좌표인지 비교를 하는 상황에서 사용할 수 있다.
DTO는 계층 간에서 데이터를 전송하는 것이 필요할 때 필요하다. 예를 들어, 컨트롤러에서 서비스로 전송하거나 외부 시스템과 데이터를 교환할 때 필요하다.
'JAVA&KOTLIN' 카테고리의 다른 글
[Spring Batch] S3 버킷 스트리밍 방식 vs 로컬 다운로드 방식 (0) | 2024.08.23 |
---|---|
[Spring Batch&Kotlin] WebFlux 를 쓰는 이유? 그리고 발견된 문제 (0) | 2024.08.05 |
[Spring Boot & kotlin] bean과 JobScope (0) | 2024.07.26 |