Language/Java

β˜• (Un)Checked Exceptionκ³Ό νŠΈλžœμž­μ…˜μ˜ μ˜€ν•΄μ™€ μ§„μ‹€

인파_ 2022. 11. 23. 09:24

μžλ°”μ˜ νŠΈλžœμž­μ…˜

잘λͺ» μ•Œλ €μ§„ (Un)Checked Exception νŠΈλžœμž­μ…˜

Checked Exception κ³Ό Unchecked Exception 차이λ₯Ό μ•Œμ•„λ³Όλ•Œ λ‹€μŒκ³Ό 같은 정리본을 발견 ν•˜μ˜€λ‹€.

만일 μ½”λ“œμ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν–ˆλŠ”λ° Checked Exception 이면 둀백을 ν•˜μ§€μ•Šκ³  κ·ΈλŒ€λ‘œ μ§„ν–‰λ˜κ³ , 만일 Unchecked Exception 이면 둀백을 ν•œλ‹€λŠ” μ–˜κΈ°μ΄λ‹€.

μžλ°”μ˜ νŠΈλžœμž­μ…˜

κ·ΈλŸ¬λ‚˜ μ΄λŠ” λ°˜μ€ 맞고 λ°˜μ€ ν‹€λ¦° μ •μ˜μ΄λ‹€.

λ°±κΈ°μ„ λ‹˜μ˜ κ°•μ˜μ—μ„œλ„ 이 뢀뢄에 λŒ€ν•΄μ„œ λ”°λ”ν•˜κ²Œ ν˜Όλ‚΄μ£Όμ‹œκΈ°λ„ ν•œλ‹€. μ§€κΈˆ λΆ€ν„° κ·Έ 이유λ₯Ό μ•Œμ•„λ³΄μž.


μžλ°”μ˜ νŠΈλžœμž­μ…˜ 닀루기

νŠΈλžœμž­μ…˜μ€ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œλ„ μ“°μ΄λŠ” κ°œλ…μœΌλ‘œμ„œ, ν•˜λ‚˜μ˜ μž‘μ—… λ‹¨μœ„λ₯Ό λœ»ν•œλ‹€.

예λ₯Όλ“€μ–΄ μ‡Όν•‘λͺ°μ˜ "μƒν’ˆλ°œμ†‘"μ΄λΌλŠ” νŠΈλžœμž­μ…˜μ„ κ°€μ •ν•΄ 보자.

"μƒν’ˆλ°œμ†‘" μ΄λΌλŠ” νŠΈλžœμž­μ…˜μ—λŠ” "포μž₯" → "μ˜μˆ˜μ¦λ°œν–‰" → "λ°œμ†‘" 순으둜 μ²˜λ¦¬κ°€ λœλ‹€.

만일 이 3κ°€μ§€ μž‘μ—… 쀑간에 ν•˜λ‚˜λΌλ„ μ‹€νŒ¨ν•œλ‹€λ©΄ 3κ°€μ§€ μž‘μ—…μ„ λͺ¨λ‘ μ·¨μ†Œν•˜κ³  "μƒν’ˆλ°œμ†‘" μ „ μƒνƒœλ‘œ λ˜λŒλ €μ•Ό ν•œλ‹€. μ™œλƒν•˜λ©΄ λͺ¨λ‘ μ·¨μ†Œν•˜μ§€ μ•ŠμœΌλ©΄ 배솑 처리 κ³Όμ •μ—μ„œ λ¬Έμ œκ°€ 생겨 꼬일 수 있기 λ•Œλ¬Έμ΄λ‹€.

 

ν”„λ‘œκ·Έλž¨μ΄ λ‹€μŒκ³Ό 같이 μž‘μ„±λ˜μ–΄ μžˆλ‹€κ³  κ°€μ • ν•΄ 보자.

μ•„λž˜λŠ” μ‹€μ œ μ½”λ“œκ°€ μ•„λ‹ˆλΌ μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€λ₯Ό κ°„λž΅ν•˜κ²Œ ν‘œν˜„ν•œ μ˜μ‚¬ μ½”λ“œμ΄λ‹€.

public void μƒν’ˆλ°œμ†‘() {
    포μž₯();
    μ˜μˆ˜μ¦λ°œν–‰();
    λ°œμ†‘();
}

public void 포μž₯() {
   ...
}

public void μ˜μˆ˜μ¦λ°œν–‰() {
   ...
}

public void λ°œμ†‘() {
   ...
}

μ‡Όν•‘λͺ° μš΄μ˜μžλŠ” 포μž₯, μ˜μˆ˜μ¦λ°œν–‰, λ°œμ†‘μ΄λΌλŠ” μ„Έκ°€μ§€ 쀑 1가지라도 μ‹€νŒ¨ν•˜λ©΄ λͺ¨λ‘ μ·¨μ†Œν•˜κ³  μ‹Άμ–΄ν•œλ‹€.

이런경우, 각 μž‘μ—… λ©”μ„œλ“œμ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ μƒμœ„ λ©”μ„œλ“œμΈ μƒν’ˆλ°œμ†‘() μ—μ„œ μ²˜λ¦¬ν•˜λ„λ‘ throws λ₯Ό μ„€μ •ν•΄μ£Όκ³ , μƒν’ˆλ°œμ†‘() λ©”μ„œλ“œμ—μ„œ try - catch 문으둜 μž‘μ—…λ“€μ„ 감싸주면 λœλ‹€.

그러면, 포μž₯, μ˜μˆ˜μ¦λ°œν–‰, λ°œμ†‘ λ©”μ„œλ“œ μ—μ„œ ν•˜λ‚˜μ˜ μž‘μ—…μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄, μ˜ˆμ™Έλ₯Ό μƒμœ„ λ©”μ„œλ“œλ‘œ throwν•˜κ³ , μƒν’ˆλ°œμ†‘ λ©”μ„œλ“œμ—μ„œ throw된 μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜μ—¬, μ˜ˆμ™Έκ°€ λ°œμƒν•œ μž‘μ—… κ·Έ λ’€λ‘œλŠ” μž‘μ—…μ΄ μ§„ν–‰λ˜μ§€ μ•ŠμœΌλ©°, catchλ¬Έμ—μ„œ λͺ¨λ‘ μ·¨μ†Œν•˜λŠ” μž‘μ—… λ©”μ„œλ“œλ₯Ό μ‹€ν–‰ν•œλ‹€λ©΄, μ™„λ²½ν•œ νŠΈλžœμž­μ…˜ 처리 둜직이 μ™„μ„±λœλ‹€.

public void μƒν’ˆλ°œμ†‘() {
    try {
        포μž₯();
        μ˜μˆ˜μ¦λ°œν–‰();
        λ°œμ†‘();
    }catch(μ˜ˆμ™Έ) {
        λͺ¨λ‘μ·¨μ†Œ();  // ν•˜λ‚˜λΌλ„ μ‹€νŒ¨ν•˜λ©΄ λͺ¨λ‘ μ·¨μ†Œν•œλ‹€.
    }
}

public void 포μž₯() throws μ˜ˆμ™Έ {
   ...
}

public void μ˜μˆ˜μ¦λ°œν–‰() throws μ˜ˆμ™Έ {
   ...
}

public void λ°œμ†‘() throws μ˜ˆμ™Έ {
   ...
}

λ°˜λŒ€λ‘œ 각 μž‘μ—… λ©”μ„œλ“œ λ‚΄μ—μ„œ 일일히 try - catch μ˜ˆμ™Έ 처리λ₯Ό ν•΄μ€€λ‹€λ©΄, 만일 3κ°€μ§€ μž‘μ—…μ€‘ ν•˜λ‚˜κ°€ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ”λΌλ„ μž‘μ—… λ©”μ„œλ“œ μ‹€ν–‰ μžμ²΄μ—λŠ” 영ν–₯을 μ£Όμ§€ μ•Šμ•„ 3κ°€μ§€ μž‘μ—…μ΄ μƒν’ˆλ°œμ†‘ λ©”μ„œλ“œμ—μ„œ μ œμ•½ 없이 λͺ¨λ‘ μ‹€ν–‰λ˜κ²Œ λœλ‹€.

public void μƒν’ˆλ°œμ†‘() {
    포μž₯(); 
    μ˜μˆ˜μ¦λ°œν–‰(); // 민일 영수증 λ°œν–‰ κ³Όμ •μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•΄λ„, λ©”μ„œλ“œ λ‚΄μ—μ„œ 자체적으둜 μ˜ˆμ™Έ 처리λ₯Ό ν•΄μ£Όμ—ˆκΈ° λ•Œλ¬Έμ—
    λ°œμ†‘(); // μ˜μˆ˜μ¦λ°œν–‰μ·¨μ†Œλ₯Ό ν–ˆμ§€λ§Œ κ²°κ΅­ λ°œμ†‘ μž‘μ—… λ©”μ„œλ“œλŠ” μ‹€ν–‰λ˜κ²Œ λ˜μ–΄λ²„λ¦°λ‹€.
}

public void 포μž₯(){
    try {
       ...
    }catch(μ˜ˆμ™Έ) {
       포μž₯μ·¨μ†Œ();
    }
}

public void μ˜μˆ˜μ¦λ°œν–‰() {
    try {
       ...
    }catch(μ˜ˆμ™Έ) {
       μ˜μˆ˜μ¦λ°œν–‰μ·¨μ†Œ();
    }
}

public void λ°œμ†‘() {
    try {
       ...
    }catch(μ˜ˆμ™Έ) {
       λ°œμ†‘μ·¨μ†Œ();
    }
}

μ΄λ ‡κ²Œ μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό μ–΄λŠ μž‘μ—… λ©”μ†Œλ“œμ— ν•˜λŠλƒμ— 따라, μž‘μ—…μ„ μ·¨μ†Œν•˜κ³  둀백을 ν• μ§€, μ•„λ‹ˆλ©΄ 둀백을 ν•˜μ§€ μ•Šκ³  κ·Έλƒ₯ μ§„ν–‰ν• μ§€ κ°œλ°œμžκ°€ 직접 μ •ν• μˆ˜ μžˆλŠ” 것이닀.


(Un)Checked Exceptionκ³Ό νŠΈλžœμž­μ…˜μ€ 아무 상관 μ—†λ‹€

λ³Έλ¬Έ μ΄ˆλ°˜μ— λ‚˜μ™€μžˆλŠ” ν‘œμ—μ„œ μ§€μ ν•œ 것 처럼, κ²°λ‘ λΆ€ν„° λ§ν•˜μžλ©΄ νŠΈλžœμž­μ…˜ κ·œμΉ™κ³Ό μ˜ˆμ™Έμ²˜λ¦¬λŠ” μ „ν˜€ 상관이 μ—†λ‹€.

μœ„μ—μ„œ μƒν’ˆλ°œμ†‘ 처리λ₯Ό μ˜μ‚¬ μ½”λ“œλ‘œ 확인해봀듯이 둀백을 ν•˜λ“  μ•ˆν•˜λ“  그것은 μ „μ μœΌλ‘œ 개발자 λ§ˆμŒμ΄λ‹€.

λ˜ν•œ μœ„μ—μ„œ λ§ν•œ νŠΈλžœμž­μ…˜μ΄, λ©”μ„Έμ§€ νŠΈλžœμž­μ…˜μ„ λ§ν•˜λŠ” 건지, λ°μ΄ν„°λ² μ΄μŠ€ νŠΈλžœμž­μ…˜μ„ λ§ν•˜λŠ” 건지도 μ• λ§€ν•˜λ‹€.

만일 λ°μ΄ν„°λ² μ΄μŠ€μ˜ νŠΈλžœμž­μ…˜μ„ λ§ν•˜λŠ” 것이라도 checked exceptoin이든 unchecked exceptoin이든 에 따라 둀백을 ν• μ§€ μ•ˆν• μ§€λŠ” μ „μ μœΌλ‘œ κ°œλ°œμžμ—κ²Œ 달렀 μžˆλ‹€.

즉, μžλ°” ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œλŠ” μœ„μ™€ 같은 κ·œμΉ™μ€ μ—†λ‹€.

 

ν•˜μ§€λ§Œ μ €λ ‡κ²Œ Exception μ’…λ₯˜μ— 따라 λ‘€λ°± μœ λ¬΄κ°€ λ‹€λ₯΄λ‹€κ³  μ •λ¦¬λœ μ΄μœ λŠ”, μžλ°”μ˜ 유λͺ…ν•œ ν”„λ ˆμž„μ›Œν¬ Spring Framework 의 νŠΈλžœμž­μ…˜ μ²˜λ¦¬μ—μ„œ λΉ„λ‘― 됐기 λ•Œλ¬Έμ΄λ‹€.

Checked / Unchecked Exception

μŠ€ν”„λ§μ—μ„œλŠ” κΈ°λ³Έμ μœΌλ‘œλŠ” λŸ°νƒ€μž„ μ˜ˆμ™Έ κ°™μ€κ²½μš° λ°”λ‘œ 둀백을 ν•œλ‹€.

κ·ΈλŸ¬λ‚˜ 이 상황도 κ°œλ°œμžκ°€ μ˜΅μ…˜μ„ μ–΄λ–»κ²Œ μ„€μ •ν•˜λŠλƒμ— 따라 μΆ©λΆ„νžˆ λ°”κΏ€ 수 μžˆλŠ” μš”μ†Œμ΄λ‹€. 예λ₯Όλ“€μ–΄ λŸ°νƒ€μž„ μžμ‹ μ˜ˆμ™Έν΄λž˜μŠ€ 쀑에 λͺ‡λͺ‡μ„ κ³¨λΌμ„œ 둀백을 ν•˜μ§€ μ•Šλ„λ‘ 섀정이 κ°€λŠ₯ν•˜λ‹€.

 

λ”°λΌμ„œ μ •λ¦¬ν•˜μžλ©΄, μžλ°”λ₯Ό μŠ€ν”„λ§κ³Ό λ™μΌμ‹œ ν•œλ‹€λ©΄ μœ„μ˜ μ •λ¦¬λŠ” λ§žμ§€λ§Œ, μžλ°” ν”„λ‘œκ·Έλž˜λ°μ—μ„œλ§Œ μƒκ°ν•œλ‹€λ©΄ checked exceptoinκ³Ό unchecked exceptoinκ³Ό νŠΈλžœμž­μ…˜ λ‘€λ°± μœ λ¬΄λŠ” 연관이 μ—†λŠ” 것이닀. 그리고 μ˜ˆμ™Έλ°œμƒμ΄ νŠΈλžœμž­μ…˜ μ²˜λ¦¬μ— λŒ€ν•΄μ„œλŠ” checked λ“  unchecked λ“  μ „μ μœΌλ‘œ 개발자 λ§ˆμŒμ— λ‹¬λ €μžˆλ‹€κ³  λ³Ό 수 μžˆλ‹€.


# 참고자료

https://www.youtube.com/watch?v=_WkMhytqoCc