JPA์์ Optional ์ฒ๋ฆฌ
Optional ์ฒ๋ฆฌ
JPA์ Repository์์ ์กฐํํ ๋ ๋์ค๋ Optional ํ์ ์ ์ฒ๋ฆฌํด๋ณด์.
Service
์น ์ ํ๋ฆฌ์ผ์ด์
๊ณ์ธต ๊ตฌ์กฐ ์ค ์๋น์ค ๊ณ์ธต์ ๋๋ฉ์ธ์ ๋ํ ์ ๋ณด๋ฅผ ๋ฆฌํฌ์งํฐ๋ฆฌ์์ ์กฐํํ๊ณ , ์ ๋ณด๋ฅผ ๊ฐ๊ณตํ์ฌ ์ปจํธ๋กค๋ฌ๋ก ๋ณด๋ด์ฃผ๋ ์ผ์ ํ๋ค.
์ด๋, JPA์ ๋ฆฌํฌ์งํฐ๋ฆฌ์์ find๋ฅผ ํ๋ฉด, ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ฒด๋ฅผ return ํ๋ ๊ฒ์ด ์๋ Optional ํ์
์ ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๋ค.
Optinal
Optional ํ์
์ ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๋ ์ด์ ๋ ์๋น์ค์์ ์กฐํํ๊ณ ์ ํ๋ ๋๋ฉ์ธ์ ๊ดํ ์ ๋ณด๊ฐ ์์ ๋, ๋จ์ํ null
์ ๋ฆฌํดํ๋ ๊ฒ ์๋๋ผ, ์๋น์ค๋จ์์ ์ํฉ์ ๋ง๋ ํ๋ก๊ทธ๋๋ฐ์ ํ ์ ์๋๋ก ์ ๊ณตํด ์ฃผ๊ธฐ ์ํจ์ด๋ค.
Optional ํ์ ์ผ๋ก ๋ฆฌํดํ ๋ ๋ฉ์๋ ์ฒด์ธ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
- get() : ๋๋ฉ์ธ์ ์๋ฃ๊ฐ์ ๋ฆฌํดํด ์ค ๋ ์๋ฃ๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด
NoSuchElementException
Error ์์ธ๋ฅผ ๋์ ธ์ค๋ค. - orElseGet() : ๋๋ฉ์ธ์ ์๋ฃ๊ฐ์ ๋ฆฌํดํด ์ค ๋ ์๋ฃ๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด ๋๋ค์์ ๊ฒฐ๊ณผ๋ก ๊ฐ์ ๋์ฒดํ๋ค.
- orElseThrow() : ๋๋ฉ์ธ์ ์๋ฃ๊ฐ์ ๋ฆฌํดํด ์ค ๋ ์๋ฃ๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด ๋๋ค์์ ๊ฒฐ๊ณผ๋ก Error ์์ธ๋ฅผ ๋์ ธ์ค๋ค.
orElseThrow()
orElseThrow()๋ฅผ ์ด์ฉํด์ User ๋๋ฉ์ธ์ findById()
๋ก ์ฐพ์ ๋ Optional ์๋ฃํ์ ์ฒ๋ฆฌํด๋ณด์.
์ ๋ค๋ฆญ, ์ค๋ฒ๋ผ์ด๋ฉ
User user = userRepository.findById(id).orElseThrow(new Supplier<IllegalArgumentException>() {
@Override
public IllegalArgumentException get() {
return new IllegalArgumentException("ํด๋น ID์ user๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค. id : "+id);
}
orElseThrow์ ์ ๋ค๋ฆญ์ด Supplier์ด๊ณ , Supplier๋ฅผ ํตํด IllegalArgumentException
๋ฅผ ๋ ๋ ค์ค ๊ฒ์ด๋ฏ๋ก, IllegalArgumentException์ Supplier์ ์ ๋ค๋ฆญ์ผ๋ก ์ฌ์ฉํ๋ค.
๊ทธ ๋ค Supplier์ get() ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ์ฌ Error๋ฅผ ๋ฆฌํดํด์ค๋ค.
๋๋ค์
User user = userRepository.findById(id).orElseThrow(() -> {
return new IllegalArgumentException("ํด๋น ID์ user๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค. id : "+id);
});
orElseThrow
์ ์ธ์๋ก ๋ฐ๋์ Supplier๊ฐ ์ฌ ๊ฒ์ ์๊ณ , Supplier ๋ด๋ถ์์๋ get() ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ๋๋ค์์ ์์ฉํ ์๋ ์๋ค.