๐ 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