🌱 μΈν”„λŸ°/β˜•οΈ κΉ€μ˜ν•œμ˜ μ‹€μ „ μžλ°” - 쀑급 1편

μžλ°” μ˜ˆμ™Έμ²˜λ¦¬ 총정리

mallin 2025. 7. 11. 17:56

β˜•οΈ  κΉ€μ˜ν•œμ˜ μ‹€μ „ μžλ°” - 쀑급 1편 μ„ λ“£κ³  μž‘μ„±ν•˜λŠ” λ³΅μŠ΅ λΈ”λ‘œκ·Έ μž…λ‹ˆλ‹€.

 

0. λ°°κ²½

ν”„λ‘œκ·Έλž¨μ΄ 항상 정상 λ™μž‘λ˜μ§€λ§Œμ€ μ•ŠλŠ”λ‹€

거의 λŒ€λΆ€λΆ„μ˜ ν”„λ‘œκ·Έλž¨μ€ 였λ₯˜κ°€ λ°œμƒν•˜λŠ”λ° 이런 였λ₯˜λ₯Ό μ–΄λ–»κ²Œ μ²˜λ¦¬ν•˜λŠλƒμ— 따라 개발자의 μ‹€λ ₯이 κ²°μ •λœλ‹€

μ˜€λŠ˜μ€ 이런 였λ₯˜λ₯Ό μ²˜λ¦¬ν•˜λŠ” μ˜ˆμ™Έμ²˜λ¦¬μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž


1. μ˜ˆμ™Έ 계측

μžλ°”λŠ” ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑에 λ°œμƒν•  수 μžˆλŠ” μ˜ˆμƒμΉ˜ λͺ»ν•œ 상황을 μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ λ©”μ»€λ‹ˆμ¦˜μ„ μ œκ³΅ν•œλ‹€.

이것이 λ°”λ‘œ μ˜ˆμ™ΈμΈλ° ν”„λ‘œκ·Έλž¨μ˜ μ•ˆμ „μ„±κ³Ό 신뒰성을 λ†’μ΄λŠ”λ° μ•„μ£Ό μ€‘μš”ν•œ 역할을 ν•œλ‹€.

좜처 : κΉ€μ˜ν•œμ˜ μ‹€μ „ μžλ°” - 쀑급 1편

μžλ°”μ˜ μ˜ˆμ™Έ 계측은 μœ„μ™€ κ°™λ‹€

  1. Object : μ˜ˆμ™Έλ„ 객체이기 λ•Œλ¬Έμ— μ΅œμƒμœ„ λΆ€λͺ¨μ—” Object κ°€ μžˆλ‹€
  2. Throwable : μ΅œμƒμœ„ μ˜ˆμ™Έ
  3. Erorr : μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 볡ꡬ가 λΆˆκ°€λŠ₯ν•œ μ‹œμŠ€ν…œ μ˜ˆμ™Έλ‹€. ν•΄κ²°ν•  수 μ—†κΈ° λ•Œλ¬Έμ— κ°œλ°œμžκ°€ μ˜ˆμ™Έλ₯Ό 작으렀고 ν•΄μ„œλŠ” μ•ˆλœλ‹€
  4. Exception : 체크 μ˜ˆμ™Έ
    • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‘œμ§μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” μ΅œμƒμœ„ μ˜ˆμ™Έ
    • Exception κ³Ό ν•˜μœ„ μ˜ˆμ™ΈλŠ” μ»΄νŒŒμΌλŸ¬κ°€ μ²΄ν¬ν•˜λŠ” 체크 μ˜ˆμ™Έλ‹€
  5. RuntimeException : 언체크 μ˜ˆμ™Έ, λŸ°νƒ€μž„ μ˜ˆμ™Έ
    • μ»΄νŒŒμΌλŸ¬κ°€ μ²΄ν¬ν•˜μ§€ μ•ŠλŠ” 언체크 μ˜ˆμ™Έ
    • RuntimeException κ³Ό μžμ‹ μ˜ˆμ™ΈλŠ” λͺ¨λ‘ 언체크 μ˜ˆμ™Έλ‹€

2. μ˜ˆμ™Έ κΈ°λ³Έ κ·œμΉ™

μ˜ˆμ™ΈλŠ” 마치 폭탄 λŒλ¦¬κΈ°μ™€ κ°™λ‹€ πŸ’£

μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ μž‘μ•„μ„œ μ²˜λ¦¬ν•˜κ±°λ‚˜ μ²˜λ¦¬ν•  수 μ—†μœΌλ©΄ λ°–μœΌλ‘œ λ˜μ Έμ•Ό ν•œλ‹€

 

Main → Service → Client κ°€ μžˆλŠ” μƒν™©μ—μ„œ Client μ—μ„œ πŸ”₯ μ˜ˆμ™Έκ°€ λ°œμƒν–ˆλ‹€ !!!

 

μ˜ˆμ™Έ 처리

πŸ”₯ Client → 🧯 Service → πŸ•ŠοΈ Main
  • πŸ”₯ Client μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄, Service 둜 μ˜ˆμ™Έλ₯Ό λ˜μ§„λ‹€
  • 🧯 Service μ—μ„œ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν–ˆλ‹€
  • πŸ•ŠοΈ 그러면 Main μ—μ„œλŠ” 정상 νλ¦„μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€

 

μ˜ˆμ™Έ 던짐

πŸ”₯ Client → πŸ”₯ Service → πŸ”₯ Main
  • πŸ”₯ Client μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄, Service 둜 μ˜ˆμ™Έλ₯Ό λ˜μ§„λ‹€
  • πŸ”₯ Service 도 μ²˜λ¦¬ν•  수 μ—†μ–΄μ„œ Main 으둜 μ˜ˆμ™Έλ₯Ό λ˜μ§„λ‹€
  • πŸ”₯ Main 도 λ°–μœΌλ‘œ μ˜ˆμ™Έλ₯Ό λ˜μ§€κ³  κ²°κ΅­ μ˜ˆμ™Έ 둜그λ₯Ό 좜λ ₯ν•˜λ©΄μ„œ μ‹œμŠ€ν…œμ΄ μ’…λ£Œλœλ‹€

 

μ˜ˆμ™Έμ— λŒ€ν•œ 2κ°€μ§€ κΈ°λ³Έ κ·œμΉ™

  1. μ˜ˆμ™ΈλŠ” μž‘μ•„μ„œ μ²˜λ¦¬ν•˜κ±°λ‚˜ λ°–μœΌλ‘œ λ˜μ Έμ•Ό ν•œλ‹€
  2. μ˜ˆμ™Έλ₯Ό μž‘κ±°λ‚˜ 던질 λ•Œ μ§€μ •ν•œ μ˜ˆμ™Έ 뿐만 μ•„λ‹ˆλΌ κ·Έ μ˜ˆμ™Έμ˜ μžμ‹λ“€λ„ ν•¨κ»˜ μ²˜λ¦¬ν•  수 μžˆλ‹€

3. μ˜ˆμ™Έ μ‚¬μš©ν•˜κΈ°

μ˜ˆμ™Έ λ˜μ§€κΈ°

public class Client {
    public void call() throws MyCheckedException {
        throw new MyCheckedException("ex");
    }
}
  • throw λŠ” μƒˆλ‘œμš΄ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¨λ‹€
  • throws λŠ” λ°œμƒμ‹œν‚¨ μ˜ˆμ™Έλ₯Ό λ©”μ„œλ“œ λ°–μœΌλ‘œ λ˜μ§„λ‹€

 

μ˜ˆμ™Έ 작기

try {
// 정상 μ½”λ“œ
} catch (μ˜ˆμ™Έν΄λž˜μŠ€ e) {
// μ˜ˆμ™Έ λ°œμƒμ‹œ 처리 μ½”λ“œ
} finally {
// try μ‹€ν–‰ ν›„ 무쑰건 μ‹€ν–‰λ˜μ–΄μ•Ό ν•˜λŠ” μ½”λ“œ
}
  • λ˜μ Έμ§„ μ˜ˆμ™ΈλŠ” try~catch~finally 문으둜 μž‘μ„ 수 μžˆλ‹€
  • try λ‚΄μ—λŠ” 정상 μ½”λ“œκ°€ λ“€μ–΄κ°€ λ“€μ–΄κ°„λ‹€
  • λ§Œμ•½, try 에 μžˆλŠ” μ½”λ“œ 쀑 μ˜ˆμ™Έκ°€ λ°œμƒν–ˆκ³ , catch 에 ν•΄λ‹Ή μ˜ˆμ™Έκ°€ μ„ μ–Έλ˜μ–΄ 있으면 catch 둜 λ“€μ–΄κ°„λ‹€
  • try κ°€ μ‹€ν–‰λ˜κ³  λ‚œ ν›„ finally 에 μžˆλŠ” μ½”λ“œκ°€ μ‹€ν–‰λœλ‹€

4. 체크 / 언체크 μ˜ˆμ™Έ

4-1. 체크 μ˜ˆμ™Έ

체크 μ˜ˆμ™ΈλŠ” μœ„μ˜ μ˜ˆμ™Έ κ³„μΈ΅μ—μ„œ Exception 을 μƒμ†λ°›λŠ” μ˜ˆμ™Έλ‹€

μž‘μ•„μ„œ μ²˜λ¦¬ν•˜κ±°λ‚˜ λ°–μœΌλ‘œ λ˜μ§€λ„λ‘ μ„ μ–Έν•΄μ•Ό ν•œλ‹€

κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ 🚨 컴파일 였λ₯˜κ°€ λ°œμƒν•œλ‹€

 

체크 μ˜ˆμ™Έ λ§Œλ“€κΈ°

public class MyCheckedException extends Exception {
    public MyCheckedException(String message) {
        super(message);
    }
}
  • 체크 μ˜ˆμ™Έλ₯Ό λ§Œλ“€λ €λ©΄ Exception 을 μƒμ†λ°›μœΌλ©΄ λœλ‹€
  • super(message) 둜 μ „λ‹¬λœ λ©”μ‹œμ§€λŠ” Thrwable 의 detailMessage 에 λ³΄κ΄€λœλ‹€

 

체크 μ˜ˆμ™Έμ˜ μž₯단점

 

πŸ‘ μž₯점

  • κ°œλ°œμžκ°€ μ‹€μˆ˜λ‘œ μ˜ˆμ™Έλ₯Ό λˆ„λ½ν•˜μ§€ μ•Šλ„λ‘ 컴파일러λ₯Ό 톡해 문제λ₯Ό μž‘μ•„μ€€λ‹€
  • κ°œλ°œμžλŠ” μ–΄λ–€ 체크 μ˜ˆμ™Έκ°€ λ°œμƒν•˜λŠ”μ§€ μ‰½κ²Œ νŒŒμ•…ν•  수 μžˆλ‹€

πŸ‘Ž λ‹¨μ 

  • κ°œλ°œμžκ°€ λͺ¨λ“  체크 μ˜ˆμ™Έλ₯Ό λ°˜λ“œμ‹œ μž‘κ±°λ‚˜ λ˜μ§€λ„λ‘ μ²˜λ¦¬ν•΄μ•Ό ν•˜λ―€λ‘œ λ²ˆκ±°λ‘­λ‹€
  • 크게 μ‹ κ²½μ“°κ³  μ‹Άμ§€ μ•ŠλŠ” μ˜ˆμ™ΈκΉŒμ§€ λͺ¨λ‘ 챙겨야 ν•œλ‹€

 

4-2. 언체크 μ˜ˆμ™Έ

언체크 μ˜ˆμ™ΈλŠ” μœ„μ˜ μ˜ˆμ™Έ κ³„μΈ΅μ—μ„œ RuntimeException 을 μƒμ†λ°›λŠ” μ˜ˆμ™Έλ‹€

μ»΄νŒŒμΌλŸ¬κ°€ μ˜ˆμ™Έλ₯Ό μ²΄ν¬ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μž‘μ•„μ„œ μ²˜λ¦¬ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€

 

언체크 μ˜ˆμ™Έ 클래슀 생성

public class MyUncheckedException extends RuntimeException {
    public MyUncheckedException(String message) {
        super(message);
    }
}
  • RuntimeException 을 μƒμ†λ°›μœΌλ©΄ 언체크 μ˜ˆμ™Έ 클래슀λ₯Ό λ§Œλ“€ 수 μžˆλ‹€

 

언체크 μ˜ˆμ™Έμ˜ μž₯단점

 

πŸ‘ μž₯점

  • μ‹ κ²½μ“°κ³  μ‹Άμ§€ μ•Šμ€ 언체크 μ˜ˆμ™Έλ₯Ό λ¬΄μ‹œν•  수 μžˆλ‹€
  • 체크 μ˜ˆμ™Έμ˜ 경우 μ²˜λ¦¬ν•  수 μ—†λŠ” μ˜ˆμ™Έλ₯Ό λ°–μœΌλ‘œ λ˜μ§€λ €λ©΄ 항상 throws μ˜ˆμ™Έλ₯Ό μ„ μ–Έν•΄μ•Ό ν•˜μ§€λ§Œ, 언체크 μ˜ˆμ™ΈλŠ” μƒλž΅ν•  수 μžˆλ‹€

πŸ‘Ž λ‹¨μ 

  • κ°œλ°œμžκ°€ μ‹€μˆ˜λ‘œ μ˜ˆμ™Έλ₯Ό λˆ„λ½ν•  수 μžˆλ‹€
  • 체크 μ˜ˆμ™ΈλŠ” 컴파일러λ₯Ό 톡해 μ˜ˆμ™Έ λˆ„λ½μ„ μž‘μ•„μ€€λ‹€

5. 싀무 μ˜ˆμ™Έ 처리 λ°©μ•ˆ

μ‹€λ¬΄μ—μ„œλŠ” ν•΄κ²°ν•  수 μ—†λŠ” 였λ₯˜λ“€μ΄ 많이 λ°œμƒν•œλ‹€.

ν•˜μ§€λ§Œ, μƒλŒ€ λ„€νŠΈμ›Œν¬ μ„œλ²„μ— λ¬Έμ œκ°€ λ°œμƒν•΄μ„œ 톡신이 λΆˆκ°€λŠ₯ν•œ 경우 λ‚΄κ°€ μž¬μ‹œλ„ν•œλ‹€κ³  해도 ν•΄κ²°ν•  수 μ—†λ‹€

그리고 ν”„λ‘œκ·Έλž¨μ΄ λ³΅μž‘ν•΄μ§€λ©΄μ„œ μ—°κ²°λ˜μ–΄ μžˆλŠ” ν΄λž˜μŠ€κ°€ λ§Žλ‹€

이럴 λ•Œ 체크 μ˜ˆμ™Έμ™€ 언체크 μ˜ˆμ™Έλ₯Ό μ‚¬μš©ν•˜λŠ” 예λ₯Ό μƒκ°ν•΄λ³΄μž

 

βœ… 체크 μ˜ˆμ™Έ μ‚¬μš© μ‹œλ‚˜λ¦¬μ˜€ 

  • 수 λ§Žμ€ ν΄λž˜μŠ€κ°€ μžμ‹ λ§Œμ˜ μ˜ˆμ™Έλ₯Ό λͺ¨λ‘ 체크 μ˜ˆμ™Έλ‘œ λ§Œλ“€μ–΄μ„œ μ „λ‹¬ν•œλ‹€
  • Service λ₯Ό ν˜ΈμΆœν•˜λŠ” 곳에선 λ˜μ§€λŠ” 체크 μ˜ˆμ™Έλ“€μ„ λͺ¨λ‘ μ²˜λ¦¬ν•΄μ•Ό ν•œλ‹€
  • λ§Œμ•½ μ²˜λ¦¬ν•  수 μ—†μœΌλ©΄ λ°–μœΌλ‘œ λ˜μ§„λ‹€
class Service {
   void sendMessage(String data) throws NetworkException, DatabaseException, ...{
         ...
	} 
}
  • λͺ¨λ“  체크 μ˜ˆμ™Έλ₯Ό ν•˜λ‚˜μ”© λ°–μœΌλ‘œ λ˜μ Έμ•Ό ν•œλ‹€
  • λΌμ΄λΈŒλŸ¬λ¦¬κ°€ λŠ˜μ–΄λ‚  수둝 throws 에 μ λŠ” μ˜ˆμ™ΈλŠ” λŠ˜μ–΄λ‚œλ‹€

 

β˜‘οΈ 언체크 μ˜ˆμ™Έ μ‚¬μš© μ‹œλ‚˜λ¦¬μ˜€

  • 수 λ§Žμ€ ν΄λž˜μŠ€κ°€ μžμ‹ λ§Œμ˜ μ˜ˆμ™Έλ₯Ό λͺ¨λ‘ 언체크 μ˜ˆμ™Έλ‘œ λ§Œλ“€μ–΄μ„œ μ „λ‹¬ν•œλ‹€
  • Service λ₯Ό ν˜ΈμΆœν•˜λŠ” 곳에선 λ˜μ§€λŠ” 언체크 μ˜ˆμ™Έλ₯Ό λͺ¨λ‘ μ²˜λ¦¬ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€
class Service {
	void sendMessage(String data) {
		... 
	}
}
  • 언체크 μ˜ˆμ™Έμ΄λ―€λ‘œ throws λ₯Ό μ„ μ–Έν•˜μ§€ μ•Šμ•„λ„ λœλ‹€
  • μ‚¬μš©ν•˜λŠ” λΌμ΄λΈŒλŸ¬λ¦¬κ°€ λŠ˜μ–΄λ‚˜μ„œ 언체크 μ˜ˆμ™Έκ°€ λŠ˜μ–΄λ‚˜λŠ” 경우 본인이 ν•„μš”ν•œ μ˜ˆμ™Έλ§Œ 작으면 λœλ‹€

 

→ κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μ‹€λ¬΄μ—μ„œλŠ” β˜‘οΈ 언체크 μ˜ˆμ™Έλ₯Ό 많이 μ‚¬μš©ν•œλ‹€

그리고 μ²˜λ¦¬ν•  수 μ—†λŠ” μ˜ˆμ™Έμ˜ κ²½μš°μ—λŠ” κ³΅ν†΅μœΌλ‘œ μ²˜λ¦¬ν•œλ‹€


6. try-with-resource

  • try κ°€ λλ‚˜λ©΄ μ™ΈλΆ€ μžμ›μ„ λ°˜λ‚©ν•˜λŠ” νŒ¨ν„΄μ„ 많이 μ‚¬μš©ν•œλ‹€
  • κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μžλ°” 7λΆ€ν„° try with resource λΌλŠ” κΈ°λŠ₯이 μΆ”κ°€λ˜μ—ˆλ‹€
public class TestClass implements AutoCloseable {
...
    @Override
    public void close(){
        System.out.println("TestClass.close");
        disconnect();
    }
}

 

try-with-resource λ₯Ό μ‚¬μš©ν•˜λ €λ©΄

  1. 정상 μ½”λ“œμ— μ‚¬μš©ν•  ν΄λž˜μŠ€μ—μ„œ AutoCloseable 을 κ΅¬ν˜„
  2. close() λ©”μ†Œλ“œ μ˜€λ²„λΌμ΄λ”©
  3. close() λ©”μ†Œλ“œμ—μ„œ μ˜ˆμ™Έμ²˜λ¦¬κ°€ λλ‚˜κ³  μ‹€ν–‰ν•  μ½”λ“œ μž‘μ„±

ν•œ ν›„ 

try (TestClass test = new TestClass()) {
	// λ¦¬μ†ŒμŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” μ½”λ“œ
}
  • try ~ catch 문의 try μ—μ„œ 객체λ₯Ό 생성해 λ„£μ–΄μ€€λ‹€
  • 그러면 try λΈ”λŸ­μ΄ 끝났을 λ•Œ μžλ™μœΌλ‘œ TestClass λ‚΄λΆ€μ˜ close() λ₯Ό ν˜ΈμΆœν•œλ‹€
  • μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ try μ—μ„œ λ²—μ–΄λ‚˜λŠ” μˆœκ°„ close() κ°€ ν˜ΈμΆœλœλ‹€.
  • 즉, try κ°€ 호좜되고 catch κ°€ ν˜ΈμΆœλœλ‹€

 

try-with-resource 의 μž₯점

  1. λ¦¬μ†ŒμŠ€ λˆ„μˆ˜ λ°©μ§€ : λͺ¨λ“  λ¦¬μ†ŒμŠ€κ°€ μ œλŒ€λ‘œ λ‹«νžˆλ„λ‘ 보μž₯ν•œλ‹€
  2. μ½”λ“œ κ°„κ²°μ„± 및 가독성 ν–₯상 : λͺ…μ‹œμ μΈ close() 호좜이 ν•„μš”μ—†λ‹€
  3. μŠ€μ½”ν”„ λ²”μœ„ ν•œμ • : λ¦¬μ†ŒμŠ€λ‘œ μ‚¬μš©λ˜λŠ” client λ³€μˆ˜μ˜ μŠ€μ½”ν”„κ°€ try λΈ”λŸ­ μ•ˆμœΌλ‘œ ν•œμ •λœλ‹€
  4. 쑰금 더 λΉ λ₯Έ μžμ› ν•΄μ œ : try λΈ”λŸ­μ΄ λλ‚˜λ©΄ μ¦‰μ‹œ close() λ₯Ό ν˜ΈμΆœν•œλ‹€