Bibi's DevLog ๐Ÿค“๐ŸŽ

[Java] Value Object (VO) ๊ฐ’ ๊ฐ์ฒด ๋ณธ๋ฌธ

๐Ÿ–ฅ BE ๋ฐฑ์—”๋“œ/Java ์ž๋ฐ”

[Java] Value Object (VO) ๊ฐ’ ๊ฐ์ฒด

๋น„๋น„ bibi 2021. 2. 18. 23:50

์ž๋ฐ” Value Object (VO) ๊ฐ’ ๊ฐ์ฒด

ValueObject๋ž€?์„ ๋ณด๊ณ  ๊ณต๋ถ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

ValueObject๋Š” ๊ฐ’์œผ๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๊ฐ์ฒด์ด๋‹ค.

์ •ํ™•ํ•œ ์˜๋ฏธ๋Š” Value Object Pattern ์œผ๋กœ, ๊ฐ์ฒด๋ฅผ ๊ฐ’์ฒ˜๋Ÿผ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

Primitive Obsession - ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ๊ธฐ๋ณธํƒ€์ž…์„ ์“ฐ๋Š” ๋‚˜์œ ๊ด€์Šต.

๊ฐ ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ธฐ์กด ์ž๋ฃŒํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์•„๋‹Œ ๊ทธ ๊ฐ์ฒด๋ฅผ ์œ„ํ•œ ์ž๋ฃŒํ˜•์„ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. Value Object๋„ ๊ทธ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

Value Object ๊ฐ’ ๊ฐ์ฒด ๋Š”..

  • ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๋ณ€์ˆ˜๊ฐ€ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์„ค์ •๋œ ํ›„์—๋Š” ๊ฒฐ์ฝ” ๋ณ€ํ•˜์ง€ ์•Š์Œ์„ ๋ณด์žฅํ•จ.

  • (๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ) uniqueํ•œ ๊ตฌ๋ถ„์ž๊ฐ€ ์—†๋‹ค.
    ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ฒŒ ๋ฌด์˜๋ฏธํ•˜๊ธฐ ๋–„๋ฌธ. (๋‹จ์ˆœํ•œ ''๊ฐ’''์ด๊ธฐ ๋•Œ๋ฌธ์—.)

    • ์ผ๋ฐ˜ ๊ฐ์ฒด๋Š” ๊ฐ๊ฐ uniqueํ•œ ๊ตฌ๋ถ„์ž(ํ•ด์‹œ์ฝ”๋“œ, ์ฆ‰ ์ฃผ์†Œ๊ฐ’ ๋“ฑ)๊ฐ€ ์žˆ๋‹ค.
  • value๋ฅผ ๋‹ด๋Š” ๊ฒŒ ์ฃผ ๋ชฉ์ ์ด๋‹ค. value๋Š” ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ฐ์ฒด๋ฅผ Value Object๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • private ์†์„ฑ์„ ๊ฐ€์ง€๋ฉฐ ๋‹ค๋ฅธ Value Object์™€ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋‹ค
  • ๋ถˆ๋ณ€ํ•˜๋ฉฐ ์ˆ˜์ •์ž(setter)๊ฐ€ ์—†๋‹ค
  • ๋„๋ฉ”์ธ์˜ ์˜๋ฏธ๋ก ์„ ๋ฐ˜์˜ํ•œ๋‹ค
  • ๋Ÿฐํƒ€์ž„ ๋™์•ˆ ์ •๋ณด์˜ ํ๋ฆ„๊ณผ ๋ณ€ํ™˜๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค€๋‹ค
  • default ๋ฐ ์“ธ๋ชจ์—†๋Š” getter๊ฐ€ ์—†๋‹ค

Value Object์˜ ํŠน์„ฑ

1.๋ถˆ๋ณ€์„ฑ Immutability - ์ˆ˜์ •์ž(setter)๊ฐ€ ์—†๋‹ค

Value Object๋Š” ๋ถˆ๋ณ€์„ฑ์„ ์ง€๋…€์•ผ ํ•œ๋‹ค.

์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ํ•œ ๋ฒˆ ์ƒ์„ฑ๋˜๋ฉด ์ดํ›„ ๋‚ด๋ถ€ ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†์–ด์•ผ ํ•œ๋‹ค.
์ฆ‰, VO๊ฐ์ฒด๋Š” ์‚ฌ์šฉ ๋„์ค‘์— ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

  • setter๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • GC์— ์˜ํ—ค ํ๊ธฐ๋  ๋•Œ ๊นŒ์ง€ ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.

๋ถˆ๋ณ€์„ฑ์œผ๋กœ ์–ป๋Š” ์žฅ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1.Reference(์ฐธ์กฐ)๋กœ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • side effect๋ฅผ ํ”ผํ•˜๋ฉด์„œ, ๋™์‹œ์— ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ๊ณผ ๋ถ€ํ•˜๋ฅผ ๊ฐ์†Œ์‹œํ‚จ๋‹ค.
  • ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๊ทธ ์žฅ์ ์ด ๋šœ๋ ทํ•ด์ง„๋‹ค.

2.๋ช…ํ™•ํ•œ ์ด๋ฆ„๊ณผ ๋™์ž‘์„ ๊ฐ€์ง„๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ์•„๋ž˜ ๊ทœ์น™์„ ์ง€ํ‚ค๋ฉฐ VO๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.

  • VO์˜ ์ดˆ๊ธฐ ํด๋ž˜์Šค์—๋Š” ์ƒ์„ฑ์ž์™€ private ์ธ์Šคํ„ด์Šค๋ณ€์ˆ˜๋งŒ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • VO๊ฐ€ ์–ธ์ œ ์‚ฌ์šฉ๋ ์ง€ ์ดํ•ด๋  ๋•Œ๋งŒ ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
    ํŠนํžˆ, ๋ฌด์˜๋ฏธํ•œ getter ๋ฉ”์†Œ๋“œ๋ฅผ VO์— ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋˜, ์ด๋ฅผ ์œ„ํ•ด ์•„๋ž˜ ๊ทœ์น™์„ ์ง€ํ‚ค๋ฉฐ VO๋ฅผ ์กฐ์ž‘ํ•ด์•ผ ํ•œ๋‹ค.

  • VO์˜ ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ๋Š” ์ƒ์„ฑ์ž ๋˜๋Š” static ๋ฉ”์†Œ๋“œ๋งŒ์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ํ˜„์žฌ ๊ฐ์ฒด์—์„œ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜์—ฌ ๋‹ค๋ฅธ ์œ ํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
  • ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ ํŒจํ„ด์„ ํ™œ์šฉํ•ด ์ƒ์„ฑํ•œ๋‹ค (private ์ƒ์„ฑ์ž)

2.value equality ๊ฐ’ ๋™๋“ฑ์„ฑ - ๋‚ด๋ถ€ ๊ฐ’ ๋™๋“ฑ์„ฑ ๊ฒ€์‚ฌ

VO๋Š” ๋™๋“ฑ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค.
๊ฐ๊ฐ์˜ ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด ๋‘ VO๊ฐ์ฒด๋Š” ๋™์ผํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•ด์•ผ ํ•œ๋‹ค.

value equality ๊ฐ’ ๋™๋“ฑ์„ฑ ์ด๋ž€?

: ๋‚ด๋ถ€ ๊ฐ’์ด ๋ชจ๋‘ ๊ฐ๊ฐ ๋™์ผํ•˜๋‹ค๋ฉด, ๋‘ ๊ฐ์ฒด๋Š” ๋™์ผํ•œ ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ•œ๋‹ค.

๋‚ด๊ฐ€ ๊ฐ€์ง„ 1000์›๊ณผ ์นœ๊ตฌ๊ฐ€ ๊ฐ€์ง„ 1000์›์€ ๋‘˜ ๋‹ค ๋˜‘๊ฐ™์€ 1000์›์ด๋‹ค.
์ด๋Š” ๋‚ด 1000์›๊ณผ ์นœ๊ตฌ์˜ 1000์›์ด ๊ฐ™์€ ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
์ด ๋–„, ๋‘ 1000์›์€ Value Object๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

๋™๋“ฑ์„ฑ ๊ฒ€์‚ฌ

: ๋‚ด๋ถ€ ๊ฐ’์ด ๊ฐ๊ฐ ๋ชจ๋‘ ๋™์ผํ•œ์ง€๋ฅผ ํ™•์ธํ•˜์—ฌ ๋‘ ๊ฐ์ฒด๊ฐ€ ๋™์ผํ•œ์ง€(๋™๋“ฑ์„ฑ์„ ๊ฐ€์ง€๋Š”์ง€) ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ.

๋™์ผ์„ฑ๊ณผ ๋™๋“ฑ์„ฑ (== ์™€ equals())

  • ๋™์ผ์„ฑ identity
    : ์‹๋ณ„์ž๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‘ ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€์ง€ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋Š” ์„ฑ์งˆ.
    ๋‘ ์ธ์Šคํ„ด์Šค์˜ ๊ฐ’์ด ๊ฐ™์•„๋„ ์„œ๋กœ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋ผ๋ฉด ๋™์ผ์„ฑ์ด ์—†๋‹ค๊ณ  ํŒ๋‹จํ•œ๋‹ค.

    • ์˜ˆ๋ฅผ ๋“ค์–ด == ์—ฐ์‚ฐ์ž๋กœ ๋น„๊ต๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
      ==๋Š” ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์ด ๊ฐ™์€์ง€๋ฅผ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๋™๋“ฑ์„ฑ equality
    : ์ƒํƒœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‘ ๊ฐ’์ด ๊ฐ™์€์ง€ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋Š” ์„ฑ์งˆ.
    ๋‘ ์ธ์Šคํ„ด์Šค๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋ผ๋„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด ๋™๋“ฑ์„ฑ์ด ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ•œ๋‹ค.

    • ์˜ˆ๋ฅผ ๋“ค์–ด Object์˜ equals() ๋ฉ”์†Œ๋“œ๋กœ ๋น„๊ต๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
      equals()๋Š” ๊ฐ์ฒด์˜ ๊ฐ’์ด ๊ฐ™์€์ง€๋ฅผ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

3.self validation ์ž๊ฐ€ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ - ์ƒ์„ฑ์ž์—์„œ ์œ ํšจ์„ฑ์„ ํ™•์ธ(validate)

VO๋Š” ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฐ’์œผ๋กœ ๊ฐ’ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†์–ด์•ผ ํ•œ๋‹ค.
์ฆ‰, ๋ชจ๋“  ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋Š” ์ƒ์„ฑ ์‹œ๊ฐ„์— ์ด๋ฃจ์–ด์ ธ์•ผ ํ•œ๋‹ค.

  • VO์˜ ์ƒ์„ฑ์ž ๋‹จ๊ณ„๋ถ€ํ„ฐ ๊ฐ’์˜ ์œ ํšจ์„ฑ์„ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.
  • ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค์— if๊ฐ€ ์กด์žฌํ•ด์„  ์•ˆ ๋œ๋‹ค.
  • ๋ช…์‹œ์ ์œผ๋กœ ์ œ์•ฝ ์กฐ๊ฑด์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.