[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() ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋žŒ๋‹ค์‹์„ ์‘์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.