JAN's History

<Optional>์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ : Null ์•ˆ์ „์„ฑ๊ณผ ๋ช…์‹œ์  ์ฝ”๋”ฉ ๋ณธ๋ฌธ

์Šคํ”„๋ง

<Optional>์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ : Null ์•ˆ์ „์„ฑ๊ณผ ๋ช…์‹œ์  ์ฝ”๋”ฉ

JANNNNNN 2024. 4. 17. 12:31

NullPointException๐Ÿ‘Ž๐Ÿผ

ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋‹ค ๋ณด๋ฉด null ์ฐธ์กฐ ์—๋Ÿฌ(NullPointerException)๋Š” ๊ฐ€์žฅ ํ”ผํ•˜๊ณ  ์‹ถ์€ ์—๋Ÿฌ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค

์ด๋Ÿฐ ์—๋Ÿฌ๋Š” ๋Ÿฐํƒ€์ž„ ์‹œ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ๊ทธ๋žจ์˜ ์‹ ๋ขฐ์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฌ๊ณ , ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐ์—๋„ ์–ด๋ ค์›€์ด ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.!

 

Optional Class

Java 8๋ถ€ํ„ฐ ๋„์ž…๋œ Optional ํด๋ž˜์Šค๋Š” ์ด๋Ÿฌํ•œ null ์ฐธ์กฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Optional์€ '์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ , ์—†์„ ์ˆ˜๋„ ์žˆ๋Š” ๊ฐ’'์„ ๋ž˜ํ•‘ํ•˜๋Š” ํŠน๋ณ„ํ•œ ์ปจํ…Œ์ด๋„ˆ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

 

Optional์„ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ์ด์œ 

  • ๋ช…์‹œ์ ์ธ null์ฒดํฌ๋ฅผ ํ•ด์ค๋‹ˆ๋‹ค.
    • isPresent()๋‚˜ get()๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ช…์‹œ์ ์œผ๋กœ null์ฒดํฌ๋ฅผ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‹ค์ˆ˜๋กœ null๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์ƒํ™ฉ์„ ์ปดํŒŒ์ผ ์ „์— ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
  • Null์— ๋Œ€ํ•œ ์•ˆ์ „ํ•œ ์ฒ˜๋ฆฌ
    • orElse(), orElseGet() ๋“ฑ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด null์ผ ๊ฒฝ์šฐ ๋Œ€์ฒด๊ฐ’์„ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ ๋ณ„๋„ ๋กœ์ง์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ Null์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ
    • Optional์„ ์‚ฌ์šฉํ•˜๋ฉด null์ฒดํฌ์™€ ๋กœ์ง์ด ๋ช…ํ™•ํ•ด์„œ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์ ธ ์ค‘์ฒฉ if๋ฌธ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜๋„ ์ „๋‹ฌ
    • ์ฝ”๋“œ์ƒ์—์„œ ์–ด๋–ค null์ด ๋ฐœ์ƒํ•˜๋Š”์ง€๋ฅผ ์‰ฝ๊ฒŒ ์•Œ์•„์ฐจ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์˜ˆ์‹œ

Optional<MemberEntity> optionalMemberEntity = memberRepository.findById(id);
if(optionalMemberEntity.isPresent()) {
    return MemberDto._toMemberDto_(optionalMemberEntity.get());
} else {
    return null;
}

์ด ์ฝ”๋“œ์—์„œ memberRepository.findById(id)๋Š” ID๋กœ ํšŒ์› ์ •๋ณด๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ํ•ด๋‹น ID์˜ ํšŒ์›์ด ์—†๋‹ค๋ฉด null์ด ๋ฐ˜ํ™˜๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋ฐ˜ํ™˜๊ฐ’์„ Optional<MemberEntity>๋กœ ๋ฐ›์•„ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋งŒ์•ฝ Optional ๋‚ด๋ถ€์— ๊ฐ’์ด ์žˆ๋‹ค๋ฉด, isPresent()๋Š” true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  get()์œผ๋กœ ๊ทธ ๊ฐ’์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ’์ด ์—†๋‹ค๋ฉด isPresent()๋Š” false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๋Œ€์ฒด๊ฐ’์„ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ ๋ณ„๋„ ๋กœ์ง์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ •๋ฆฌ

๋”ฐ๋ผ์„œ null์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋‹ค๋ฃจ๊ณ  ์‹ถ๋‹ค๋ฉด, ๊ทธ๋ฆฌ๊ณ  ๋ช…์‹œ์ ์ด๊ณ  ๊ฐ€๋…์„ฑ ๋†’์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด Optional ํด๋ž˜์Šค๋ฅผ ์ ๊ทน ํ™œ์šฉํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค!