We will find a way, we always have.

-interstellar

Programming Language/자바

[자바] VO와 Record

Redddy 2024. 3. 9. 00:39
우테코 메타인지 말하기 스터디때 준비한 글

 

VO (Value Objects)

VO는 Value Objects의 약자로 값 객체를 나타낸다. 자바에서 VO를 사용하는 이유는 명확한 의미전달 및 책임 캡슐화이다.

 

단순히 원시값을 사용할 때와는 달리 이 객체가 어떤 역할을 담당하고 있는지를 이름을 통해 전달할 수 있다. 그리고 요구사항이 주어졌을 때 해당 객체 내에서 요구사항을 구현하여 캡슐화를 지킬수 있다.

 

VO 사용시 유의사항

equals() && hashcode()

VO를 만들었다면 필수로 equals() && hashcode() 메서드를 구현해줘야 한다.

equals() && hashcode()가 구현되지 않았다면 객체의 값을 비교하는 것이 아니라 객체의 주소를 비교하기 때문에 원하는 대로 동작하지 않을 수 있다. 

 

예를 들어 Set<CarName> carNames 라는 Set을 만들 때, 우리는 CarName의 값이 같다면 중복이 제거되길 기대하지만 주소에 대한 해시값을 생성하기에 원하는 결과가 나오지 않는다.

 

불변성

VO는 불변한다는 특징을 가지고 있다. 때문에 필드는 final을 붙여줘야 하며 setter는 열어두면 안된다.

 

 

Record

Record는 JDK 14에 등장하였고 JDK 16에 정식 기능으로 자리잡았다.

Record는 보일러 플레이트 코드를 줄여준다. 다시말해 생성자, equals(), hashcode(), getter(), toString() 을 오버라이딩 하지 않아도 필드 값으로 알아서 재정의 해준다. 

 

때문에 코드의 양이 줄어든다.

코드의 양이 줄어들면 개발 시간이 단축되고 또 코드를 읽는 시간이 줄어든다는 장점이 있다.

 

그리고 class 대신 record 를 사용한다면 이 객체는 Dto 혹은 Vo 구나라는 의도를 전달할 수 있다.