πŸ“Œ μ˜ˆμ™Έ

이호인·2022λ…„ 5μ›” 11일
0

Java

λͺ©λ‘ 보기
4/6

μˆ˜μ—… λ“€μœΌλ©΄μ„œ try-catch 문을 JSP μˆ˜μ—… JDBC κ΄€λ ¨ μ½”λ“œ λ•Œ 처음 λ§Œλ‚¬λ˜ κ²ƒμœΌλ‘œ κΈ°μ–΅ν•œλ‹€. κ·Έ λ‹Ήμ‹œ μ™œ μ‚¬μš©ν•˜λŠ”μ§€λ§Œ μ•Œκ³  λ„˜μ–΄κ°€μ„œ μ–΄λ–€ 상황에 κΌ­ μ¨μ€˜μ•Όν•˜κ³  μ–΄λ–€ μ‹μœΌλ‘œ μ“°λ©΄ μ•ˆλ˜λŠ”μ§€ μžμ„ΈνžˆλŠ” μ•Œμ§€ λͺ»ν–ˆλ‹€. λΆ€λ„λŸ½μ§€λ§Œ ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜λ©΄μ„œ IDEκ°€ 빨간쀄 κ·Έμ–΄μ£Όλ©΄ μ“°κ³  μ•„λ‹ˆλ©΄ μ•ˆ μ“°κ³  그런 μ‹μ΄μ–΄μ„œ κΈ°λŠ₯ κ΅¬ν˜„ ν•  λ•Œ λ‹€λ₯Έ λΈ”λ‘œκ·Έλ₯Ό μ°Έκ³ ν•˜λ©΄ μ˜ˆμ™Έ 처리λ₯Ό ν•΄μ€€ λͺ¨μŠ΅μ„ λ³Ό λ•Œλ§ˆλ‹€ λΆˆμ•ˆν–ˆλ‹€. ν•˜μ§€λ§Œ μ œλŒ€λ‘œ μ•Œμ§€ λͺ»ν•˜κ³  κ·Έμ € 따라 μ“°λŠ” 것은 μ˜λ―Έκ°€ μ—†λŠ” 것 κ°™μ•„μ„œ λ‚˜μ€‘μ— ν•œλ²ˆ 정리 해봐야겠닀 μƒκ°ν–ˆμ—ˆλŠ”λ° 이번 κΈ°νšŒμ— κ³΅λΆ€ν•˜κ³  ν”„λ‘œμ νŠΈμ—λ„ μ μš©μ‹œμΌœλ³΄λ €κ³  ν•œλ‹€. πŸ˜ƒ

μ—λŸ¬ (Error)와 μ˜ˆμ™Έ (Exception)의 차이

πŸ“Œ μ—λŸ¬ (Error)

  • java.lang.Error 클래슀의 μ„œλΈŒ ν΄λž˜μŠ€λ“€
  • μ—λŸ¬λŠ” 였λ₯˜, 즉 μ‹œμŠ€ν…œμ— λ­”κ°€ 비정상적인 상황이 λ°œμƒν–ˆμ„ κ²½μš°μ— μ‚¬μš©λœλ‹€.
  • 주둜 μžλ°” VMμ—μ„œ λ°œμƒμ‹œν‚€λŠ” 것이며 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œμ—μ„œ μž‘μ„ 수 μ—†κΈ° λ•Œλ¬Έμ— μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” μ—λŸ¬μ— λŒ€ν•œ 처리λ₯Ό 신경쓰지 μ•Šμ•„λ„ λœλ‹€.

πŸ“Œ μ˜ˆμ™Έ (Exception)

  • java.lang.Exception ν΄λž˜μŠ€μ™€ κ·Έ μ„œλΈŒ ν΄λž˜μŠ€λ“€
  • κ°œλ°œμžκ°€ λ§Œλ“  μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œμ˜ μž‘μ—… 쀑에 μ˜ˆμ™Έμƒν™©μ΄ λ°œμƒν–ˆμ„ κ²½μš°μ— μ‚¬μš©λœλ‹€.

1. Checked Exception

  • Exception 클래슀의 μ„œλΈŒν΄λž˜μŠ€μ΄λ©΄μ„œ RuntimeException 클래슀λ₯Ό μƒμ†ν•˜μ§€ μ•Šμ€ 것
  • 일반적으둜 μ˜ˆμ™ΈλΌκ³  ν•˜λŠ” 것듀은 보톡 Checked Exception
  • 확인 μ‹œμ  : 컴파일 단계
  • μ˜ˆμ™Έ λ°œμƒ μ‹œ : roll-back ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • Checked Exception이 λ°œμƒν•  수 μžˆλŠ” λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•  경우 λ°˜λ“œμ‹œ catch문으둜 μž‘κ±°λ‚˜ throwsλ₯Ό μ •μ˜ν•΄μ„œ λ©”μ†Œλ“œ λ°–μœΌλ‘œ λ˜μ Έμ•Ό 컴파일 μ—λŸ¬κ°€ μΌμ–΄λ‚˜μ§€ μ•ŠλŠ”λ‹€.
    --> μ•„κΉŒ μ²˜μŒμ— λ§ν•œ 빨간쀄 γ…Žγ…Ž
  • ex) IOException , SQLException λ“±..
    IOException은 파일 첨뢀 κΈ°λŠ₯ κ΅¬ν˜„ν•  λ•Œ 많이 λ³Έ 것 κ°™λ‹€. 파일 경둜 λͺ» μ°Ύκ³  그럴 λ•Œ ?

2. Unchecked Exception

  • RuntimeException을 μƒμ†ν•œ ν΄λž˜μŠ€λ“€
  • 확인 단계 : μ‹€ν–‰ 단계
  • μ˜ˆμ™Έ λ°œμƒ μ‹œ : roll-back ν•œλ‹€.
  • λͺ…μ‹œμ μΈ μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό κ°•μ œν•˜μ§€ μ•ŠλŠ”λ‹€. (λ¬Όλ‘  μž‘μ•„μ€˜λ„ μƒκ΄€μ—†μŒ)
  • ex) NullPointerException, IllegalArgumentException λ“±
    --> μ˜ˆμƒν•˜μ§€ λͺ»ν•˜λŠ” λΆ€λΆ„μ—μ„œ λ°œμƒν•˜λŠ” 것이 μ•„λ‹ˆλΌ 개발자의 λΆ€μ£Όμ˜λ‘œ λ°œμƒν•˜λŠ” 경우기 λ•Œλ¬Έμ— ꡳ이 μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό κ°•μ œν•˜μ§€ μ•ŠλŠ” 것!

πŸ“Œ μ˜ˆμ™Έμ²˜λ¦¬ 방법

1. μ˜ˆμ™Έ 볡ꡬ

int maxretry = MAX_RETRY;
while(maxretry --> 0) {
	try{
    	// μ˜ˆμ™Έκ°€ λ°œμƒν•  κ°€λŠ₯성이 μžˆλŠ” μ‹œλ„
        return; // μž‘μ—… 성곡 μ‹œ 리턴
    }
    catch (SomeException e) {
    	// 둜그 좜λ ₯. 정해진 μ‹œκ°„λ§ŒνΌ λŒ€κΈ°
    }
    finally {
    	// λ¦¬μ†ŒμŠ€ λ°˜λ‚© 및 정리 μž‘μ—…
    }
}
throw new RetryFailedException(); // μ΅œλŒ€ μž¬μ‹œλ„ 횟수λ₯Ό λ„˜κΈ°λ©΄ 직접 μ˜ˆμ™Έ λ°œμƒ
  • μ˜ˆμ™Έ 볡ꡬ의 핡심 : μ˜ˆμ™Έκ°€ λ°œμƒν•΄λ„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ 정상적인 νλ¦„μœΌλ‘œ μ§„ν–‰λœλ‹€.
  • μœ„ μ˜ˆμ œλŠ” λ„€νŠΈμ›Œν¬ ν™˜κ²½μ΄ 쒋지 μ•Šμ•„ μ„œλ²„μ— 접속이 μ•ˆλ˜λŠ” μƒν™©μ˜ μ‹œμŠ€ν…œμ— μ μš©ν•˜λ©΄ νš¨κ³Όμ μ΄λ‹€.

2. μ˜ˆμ™Έμ²˜λ¦¬ νšŒν”Ό

public void add() throws SQLException{
	// JDBC API (κ΅¬ν˜„ 둜직)
}
  • μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ throwsλ₯Ό 톡해 ν˜ΈμΆœν•œ μͺ½μœΌλ‘œ μ˜ˆμ™Έλ₯Ό λ˜μ§€κ³  κ·Έ 처리λ₯Ό νšŒν”Όν•˜λŠ” 것이닀.
  • (정말 λ§Žμ€ κ³³μ—μ„œ 아무 생각없이 λ¬΄λΆ„λ³„ν•œ throws μ‚¬μš©μ€ λ¬΄μ±…μž„ν•˜λ©° μœ„ν—˜ν•˜λ‹€κ³  μ„€λͺ…ν•œλ‹€.)
  • κΈ΄λ°€ν•œ 관계에 μžˆλŠ” λ‹€λ₯Έ μ˜€λΈŒμ νŠΈμ—κ²Œ μ˜ˆμ™Έμ²˜λ¦¬ μ±…μž„μ„ λΆ„λͺ…νžˆ μ§€κ²Œ ν•˜κ±°λ‚˜, μžμ‹ μ„ μ‚¬μš©ν•˜λŠ” μͺ½μ—μ„œ μ˜ˆμ™Έλ₯Ό λ‹€λ£¨λŠ” 것이 μ΅œμ„ μ˜ λ°©λ²•μ΄λΌλŠ” λΆ„λͺ…ν•œ 확신이 μžˆμ–΄μ•Ό ν•œλ‹€.

3. μ˜ˆμ™Έ μ „ν™˜

.
.
.
catch(SQLException e){
	// ex) ErrorCodeκ°€ Mysql의 Duplicate Entry (1062) 이면 μ˜ˆμ™Έ μ „ν™˜
    if (e.getErrorCode() == MysqlErrorNumbers.ER_DUP_ENTRY)
    	throw DuplicateUserIdException();
    else
    	throw e; //  κ·Έ μ™Έμ˜ κ²½μš°λŠ” SQLException κ·ΈλŒ€λ‘œ
}
.
.
  • μ˜ˆμ™Έλ₯Ό μž‘μ•„μ„œ λ‹€λ₯Έ μ˜ˆμ™Έλ₯Ό λ˜μ§€λŠ” 것이닀.
  • λ§Œμ•½ κ·Έλƒ₯ SQLException을 κ·ΈλŒ€λ‘œ λ˜μ§€κ²Œ 되면 DAOλ₯Ό 톡해 μ‚¬μš©μžλ₯Ό μΆ”κ°€ν•œ μ„œλΉ„μŠ€ 계측 λ“±μ—μ„œλŠ” μ™œ SQLException이 λ°œμƒν–ˆλŠ”μ§€ μ•ŒκΈ° νž˜λ“€λ‹€.
  • μœ„ μ½”λ“œ 같은 경우 , μ€‘λ³΅λœ 아이디 κ°’ λ•Œλ¬Έμ— μ—λŸ¬κ°€ λ‚˜λŠ” 경우 ν™•μΈν•˜κ³  μ’€ 더 λͺ…ν™•ν•˜κ²Œ 인지할 수 μžˆλ„λ‘ 돕기 μœ„ν•œ 방법이닀.

❗ μ£Όμ˜ν•  점

  • μ˜ˆμ™Έλ₯Ό μž‘μ•„μ„œ μ•„λ¬΄λŸ° 쑰치λ₯Ό μ·¨ν•˜μ§€ μ•ŠλŠ” 것 ( catch문을 λΉ„μ›Œλ‘κ±°λ‚˜, μ½˜μ†”μ—λ§Œ μ°μ–΄λ‘λŠ” 것 λ“±)
  • 의미 μ—†λŠ” throwsλ₯Ό λ‚¨λ°œν•˜μ§€ 말 것
  • μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμ„ λ•Œ κ·Έ 원인을 νŒŒμ•…ν•˜κΈ° μ–΄λ €μ›Œ κ°œλ°œμ€ λ¬Όλ‘  μœ μ§€λ³΄μˆ˜μ—λ„ 어렀움을 κ²ͺ게 λœλ‹€.

πŸ“Œ 마치며

  • μ°Έκ³ ν•œ λΈ”λ‘œκ·Έ κΈ€ μ“°μ‹  뢄이 κ²°λ‘ μ—μ„œ "μ‹œμŠ€ν…œμ€ ν™”λ €ν•œ κΈ°λŠ₯보닀도 λ³΄μ•ˆμ΄ μ€‘μš”ν•˜λ‹€" λΌλŠ” 말씀을 ν•˜μ…¨λ‹€. 아직 κ²½ν—˜μ΄ μ—†μ–΄ κΈ°λŠ₯ κ΅¬ν˜„μ—λ§Œ μ§‘μ€‘ν•˜κ³  μžˆμ—ˆλ˜ 것 κ°™λ‹€. 졜근 ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜λ©΄μ„œ 기본적인 κ²Œμ‹œνŒ κΈ°λŠ₯ 밖에 μ—†λŠ”λ°λ„ λ‚΄ μ˜ˆμƒκ³ΌλŠ” λ‹€λ₯΄κ²Œ 슝슝 ꡬ멍이 λ‚˜λŠ” λͺ¨μŠ΅μ„ κ²½ν—˜ν–ˆλ‹€. 아직 νšŒμ‚¬λ₯Ό λ‹€λ‹ˆλŠ” 것은 μ•„λ‹ˆμ§€λ§Œ, λ‹€μ‹œ ν•œλ²ˆ μƒκ°ν•˜κ²Œ λ˜λŠ” 계기가 λ˜μ—ˆλ‹€. ν™”λ €ν•œ κΈ°λŠ₯κ³Ό λ§Žμ€ 편의λ₯Ό μ£ΌλŠ” 것도 μ€‘μš”ν•˜μ§€λ§Œ, 일단 μ‚¬μš©μžκ°€ λ―Ώκ³  μ“Έ 수 μžˆλŠ” μ‹œμŠ€ν…œμ„ λ§Œλ“œλŠ” 것이 κ°€μž₯ μ€‘μš”ν•œ 것 κ°™λ‹€. 곡감이 λ˜μ–΄ 남겨두고 지ν–₯ν•˜λ €κ³  ν•œλ‹€.

reference !

이일민, "ν† λΉ„μ˜ μŠ€ν”„λ§ 3.1_vol.1 μŠ€ν”„λ§μ˜ 이해와 원리", μ—μ΄μ½˜, p.279 - 291, 315
Java μ˜ˆμ™Έ(Exception) μ²˜λ¦¬μ— λŒ€ν•œ μž‘μ€ 생각 - https://www.nextree.co.kr/p3239/

profile
곡뢀 기둝

0개의 λŒ“κΈ€