VO&DTO와 Map

» dev

교육 받을 때는 데이터 객체를 DTO로 관리했는데, 업무중 VO와 Map으로 데이터를 관리하는걸 알게되었다. 정확한 개념을 정리하고자한다.

Java Beans

  • 일반적으로 자바빈은 속성과 그 속성에 대한 getter, setter 메서드로 구성된 객체(VO)를 말하며 데이터 전송에 사용되는 객체이다.
  • 자바로 작성된 재사용이 가능한 소프트웨어컴포넌트 -> getter, setter 메서드를 통해 컴포넌트에 접근 가능하다.

VO(Value Object)

  • 데이터 그 자체로 의미있는 것을 담고있는 객체 DTO와 동일한 개념이긴하나 차이점은 Read-Only 속성 객체이다.
    • 값을 위해 사용하는 오브젝트로써, 값 표현을 위한 불변의 클래스.
  • VO의 경우 생성자를 통해 지정된 값은 변경될수 없도록 setter가 없다. getter를 통해 값 조회만 가능하도록 만들어야한다.
  • 간단한 독립체(Entity)를 뜻하는 작은 객체를 의미한다.
VO a = new VO(1);
VO b = new VO(1);

a==b

DTO(Data Transfer Object)

  • 데이터를 객체로 변환하는 것. 계층(계층은 View-Controller-Service-Repository 각 레이어들을 뜻한다.)간 데이터 교환을 위한 객체.
    • 데이터 교환을 위해 선언한 Java Beans 규약을 맞추어 작성한 클래스.
  • 일반적인 DTO는 로직을 가지고 있지 않다. 순수한 데이터 객체이며 속성과 속성에 접근하기 위한 getter, setter메서드로만 구성되어있는 POJO (특정 인터페이스 또는 클래스를 상속하지 않는 일반 자바 객체)
DTO a = new DTO(1);
DTO b = new DTO(1);

a != b

Entity

  • 실제 DB 테이블과 매핑된 오브젝트.
  • DTO와 Entity를 분리하는 이유 : View 레이어와 DB 레이어의 역할을 분리하기 위해서 사용된디.
  • View 레이어와 통신하는 DTO의 경우 개발도중에 잦은 변화가 일어날수 있는 반면에 DB 레이어는 변경되지 않아야 하기 때문에 구분해두는 이유도 있다.

Map

  • Key와 Value의 쌍으로 값을 저장하는 컬렉션.
  • Map의 Key 또는 Value가 null인 경우, 해당 필드 자체를 key로 가져가지 않는다.

Opinion

굳이 장단점을 다루진 않겠다. 나 조차도 VO랑 Map을 혼용해서 쓰고 있기 때문에 무엇이 더 낫다라고 말하는 것보단 하나라도 더 제대로 쓸 수 있다면 그것이 나에게 베스트..나는 그냥 3개월차 쭈니어니까.. 다만 회사에서 Map을 주로쓰고 사수님도 Map을 더 선호하셔서 나도 Map의 편리성을 누리고 있다. 처음에 VO로 해봤는데 다루는 데이터가 많다보니 소스가 점점 길어졌다.