결론

원시값 포장과 VO는 서로 다르다.

  원시값 포장 VO
용도 책임 분리를 위한 원시값 포장 값 표현을 위한 포장
동등성 보장 할수도, 아닐 수도 무조건 보장해야함
불변 불변 일수도, 아닐수도 무조건 불변이어야함


조엘이 쏘아올린 작은 공

image

조엘이 쏘아올린 작은 공으로 여러 크루들이 원시값 포장과 VO 객체의 차이에 대해 이야기를 나눴다.


대화 내용

🧑🏻 손너잘
약간 결이 다르다고 생각합니다.
원시값을 포장하는것은 원시값을 다루는 책임을 이동시키기 위함이고, 값 객체로 만드는 것은 객체를 “값”으로 표현하기 위함이라 생각합니다. 원시값을 포장하는건 스레드 세이프 하지않지만, 값 객체는 스레드 세이프 하다는 간단한 예시로 제 의견 표현이 될 것 같아요.


9️⃣ 현구막
헉… 저는 VO 개념을 인비의 테코톡을 통해 처음 알게되었는데 ‘원시값을 포장하라가 VO를 만들어라 였구나!’ 라고 이해하고 사용해왔어요.
@조엘과 @손너잘의 글을 읽다보니 둘의 차이가 궁금해졌어요.
둘의 차이를 표현하는 키워드는 불변(final)인가요, 동등성(equals/hashCode)인가요?


🕹️ 조이
전 아직 둘의 다른점을 잘 모르겠어요. 둘 다 원시값을 포장하고 “값”을 객체화해서 책임을 캡슐화하지 않나요?
hashCode/equals 오버라이드도 원시값포장, VO에서 모두 해주고요.

@손너잘이 말한 원시값 포장이 thread-safe 하지 않다는건 어떤건가요?
전 아직까지 thread-safe하지 않은 원시값포장은 본적이 없어서 잘 모르겠어요.


🥔 웨지
저는 원시값 랩핑 -> VO를 만드는 방법 중에 하나라고 생각을 해왔어용.. ‘__’
VO는 개념상 동등성이 필수(값이 동일할 때 동등하지 않으면 VO가 아님),
final은 선택(필수적이지만 불변하지 않다고 VO가 아닌 것은 아님) 이정도로 생각하고 있었어용

덧) 좀 더 생각해봤는데 불변함도 VO에 필수인걸로 정정할게요 ㅎ_ㅎ 사실상 필수는 필수지 뭐… 싶어졌음다.


9️⃣ 현구막
사람의 이름을 예시로 고민해보았는데

  • 원시값 포장
    • 제이슨과 제이슨을 서로 다른 사람으로 볼 수 있다.
  • VO
    • 제이슨과 제이슨을 서로 같은 사람으로 본다.

가 될 수 있겠네요. 확실히 원시값 포장과 VO는 서로 다른 것 같아요!
동등성의 차이를 갖는 것은 맞는거같은데, 스레드-세이프는 저도 잘 모르겠네요 😭


🧑🏻 손너잘
@조이 제 의견이 현구막 의견이에요!
스레드세이프관련 내용은, 래핑을 한다고 해서 언제나 equals, hashcode를 override하고 불변을 만든다는 보장은 없지만, 값 객체는 이 모든걸 하는걸 강제한다고 생각해요. 그래서 차이점이 있다고 말한거였어요.

@웨지 VO는 불변해야 한다고 생각합니다.


🥔 웨지
@손너잘 오 마침 메세지 편집중이었는데 ‘_’ 저도 필수인걸로 정정!!


🧑🏻 손너잘
@웨지 ㅋㅋㅋㅋㅋ 겹쳤네융,.. 그리고 저는 VO가 원시값 래핑의 방법 중 하나라 생각하는데 어케 생각 하시나요?


🥔 웨지
@손너잘 다른분들 의견 들어보니 원시값 랩핑, VO간에는 의미차이가 있는거 같네요. 그래서 VO가 원시값 래핑의 방법 중 하나 수용하겠습니당. 현실적으로는 원시값 랩핑 할 때 VO를 만들 것 같아요.


🕹️ 조이
@손너잘 현구막의 예시와 같이 설명을 들으니 이해가 가네요.

+마지막 의견에 동의합니다 원시값포장이 VO를 포괄하는 개념인 느낌!


😎 루트
제가 제대로 이해한건지 모르겠는데, 그럼 VO면 무조건 원시값 포장인 상태인가요?


🕹️ 조이
근데 생각해보니 VO라고 꼭 원시값만 포장할 필요는 없지 않나요ㅋㅋ


🌳 나봄
@루트 VO는 위에서 손너잘이 이야기했듯이 객체 자체를 값으로 보기 위해 만든 것이라 VO안에는 원시값이 하나만 포장 될 수도 있고 여러개 또는 원시값이 아닌 것을 값으로 보기위해 포장 될 수도 있어요!


😎 루트
그럼 VO가 원시값 포장 중 하나는 아니지 않나요? 처음에 손너잘이 이야기했던것처럼 VO는 값을 나타내기위한 용도, 원시값 포장은 책임의 분리의 의도일 뿐인거같아요.

그냥 우연히 VO와 원시값 포장이 같이 처리되는 경우가 많아서 혼동되거 있는거처럼 느껴지네요.


🧑🏻 손너잘
맞네, 걍 둘은 다르게 봐야하는게 맞는듯요!!


🕹️ 조이
@루트 그러네요. 원시값포장이 VO를 포괄한다는 의견 철회!


🥔 웨지
서로 별개의 개념이라 원시값 랩핑 하는 방법 중 VO 생성이 있고, VO도 원시값만 포장할 수 있는건 아니라고 이해중입니당~~~!


😎 루트
@웨지 아하 그런 의미였군요!!


9️⃣ 현구막

  • 원시값 포장
    • ‘원시값’만 포장
    • 동등성 지킬수도, 아닐수도.
    • 불변일수도, 아닐수도.
  • VO
    • 값 표현을 위해서 이것저것 포장
    • 동등성이 보장되어야함
    • 불변이 보장되어야함

정리하면 이렇게 될까요?
이거 또 기록해둬야지 안그럼 까먹을라..


🌳 나봄
뒷북인 것 같지만 자바에서 VO 가장 좋은 예시는 String 같아요!
문자열 자체를 하나의 값으로 보기 위해 char 배열을 감싼 형태니까!
char배열은 원시값은 아니니까 String 은 원시값 포장이 아니지만 VO객체인 것?!


References

  • 조엘이 쏘아올린 작은 공

태그:

업데이트:

댓글남기기