Community

๐Ÿ›  Java Optional ์€ ์–ธ์ œ ์‚ฌ์šฉํ•ด์•ผํ• ๊นŒ?

Java ์˜ Optional Class ๋ฅผ ์•Œ๊ณ  ๊ณ„์‹ ๊ฐ€์š”? ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๊ฒŒ ๋˜๋ฉด ๊ณ ์งˆ์ ์œผ๋กœ ๋งŒ๋‚˜๊ฒŒ ๋˜๋Š” NullPointException(aka. NPE)์„ ํ”ผํ•˜๊ณ ์ž Java8 ๋ถ€ํ„ฐ ์ง€์›ํ•˜๊ธฐ ์‹œ์ž‘ํ•œ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ NPE ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” null ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•ด์•ผํ• ํ…๋ฐ์š”, ๊ฒ€์‚ฌํ•ด์•ผํ•  ๋ณ€์ˆ˜๊ฐ€ ๋งŽ์œผ๋ฉด ๋งŽ์„์ˆ˜๋ก ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ  ๋ฒˆ๊ฑฐ๋กœ์šธ์ˆ˜ ์žˆ์ง€๋งŒ Optional ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฅผ ๊ฐ„์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ฌด์กฐ๊ฑด Optional ์„ ์“ฐ๋Š”๊ฒŒ ๋งž๋Š”๊ฑธ๊นŒ์š”? ์งˆ๋ฌธ์„ ๋ณด์…จ์„ ๋•Œ๋ถ€ํ„ฐ ์˜ˆ์ƒํ•˜์‹  ๋Œ€๋กœ ๋ฌด์กฐ๊ฑด์ ์œผ๋กœ ๋‚จ์šฉํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ ์ข‹์ง„ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์–ธ์ œ Optional ์„ ์“ฐ๋Š”๊ฒŒ ์ข‹์„๊นŒ์š”? ๊ทธ๋ฆฌ๊ณ  ์–ธ์ œ Optional ์„ ์•ˆ์“ฐ๋Š”๊ฒŒ ์ข‹์„๊นŒ์š”? ๐Ÿ‘ Optional ์„ ์“ฐ๊ธฐ ์ข‹์€ ์˜ˆ โœ”๏ธ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์ด ์ž ์žฌ์ ์œผ๋กœ null ์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฐ˜ํ™˜๊ฐ’์ด ์ž ์žฌ์ ์œผ๋กœ null ์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ „์— Optional Class ๋กœ ๋žฉํ•‘ํ•˜๋ฉด ํ˜ธ์ถœ์ž๋Š” ๊ฒฐ๊ณผ๊ฐ€ null ์ผ ์ˆ˜ ์žˆ์Œ์„ ์•Œ๊ฒŒ ๋˜๊ณ  Optional Class ์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” API ๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœ์ž์—๊ฒŒ ์–ด๋А ์ •๋„์˜ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ DB ๋“ฑ๊ณผ ๊ฐ™์ด ๊ฒ€์ƒ‰๋œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์ถ”๊ฐ€ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ Optional ์€ ์ด๋ฅผ ์œ„ํ•œ ๋ฉ‹์ง„ API ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. โœ”๏ธ Getter ๋ž˜ํ•‘ ๋„๋ฉ”์ธ ๋ชจ๋ธ์˜ ํŠน์ • ํ•„๋“œ ์ค‘์— null ์ผ ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ(nullable)๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ํ•„๋“œ์— ๋Œ€ํ•œ Getter method ์˜ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ Optional ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‚ฌ์šฉํ•˜๋Š” ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์—์„œ NPE ๋ฅผ ํ”ผํ•˜๋ฉด์„œ ์ ์ ˆํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ๊ณ , ์ง๋ ฌํ™” ๋ฌธ์ œ๋„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ‘Ž Optional ์„ ์“ฐ๊ธฐ ์•ˆ ์ข‹์€ ์˜ˆ โœ”๏ธ ๋งค์šฐ ๊ฐ„๋‹จํ•œ ๋…ผ๋ฆฌ ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์ฒดํฌ๋ฅผ ํ•  ๋•Œ Optional ์„ ํ™œ์šฉํ•˜๋Š”๊ฑด ์ฝ”๋“œ๋ฅผ ๋”์šฑ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Project Reactor ์™€ ๊ฐ™์€ Reactive Programming ์„ ํ•˜๋ฉด ์ข…์ข… ๋งˆ์ฃผ์น˜๊ฒŒ ๋˜๋Š” ๊ฐ„๋‹จํ•œ ๋กœ์ง์„ ๋งค์šฐ ๋ณต์žกํ•˜๊ฒŒ ํ’€์–ด๊ฐ€๊ฒŒ ๋˜๋Š” ์•ˆํ‹ฐ ํŒจํ„ด์ด ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. โœ”๏ธ ํด๋ž˜์Šค ํ•„๋“œ ๋ฐ ๋ฉ”์†Œ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜ Optional Class ๋Š” Serializable ์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ํด๋ž˜์Šค ํ•„๋“œ๋กœ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ž ์žฌ์ ์ธ ์ง๋ ฌํ™” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์–ด ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์š”์ธ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ Optional ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ์‹œ null ์„ ๋„˜๊ฒจ์•ผํ•˜๋Š” ๊ฒฝ์šฐ ๋ถˆํ•„์š”ํ•˜๊ฒŒ Optional ์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ Optional ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋ณด๋‹จ, null ์„ ๋„˜๊ฒจ์•ผ ํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ œ๊ฑฐํ•œ ๋ฒ„์ „์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•˜๋Š”๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค. ๊ณต์œ  ๋“œ๋ฆฐ ๋งํฌ์— ์ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์˜ˆ์‹œ๊ฐ€ ๋‚˜์™€์žˆ์œผ๋‹ˆ ๊ด€์‹ฌ์žˆ์œผ์‹  ๋ถ„๋“ค์€ ํ•œ๋ฒˆ ๋ณด์‹œ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ”— ์›๋ฌธ ๋งํฌ: https://medium.com/javarevisited/4-reasons-why-you-should-use-java-optional-or-not-4e44d51a9645

์•Œ๋ฆผ

์•Œ๋ฆผ์ด ์—†์Šต๋‹ˆ๋‹ค