Backend/JAVA

์ž๋ฐ”(Spring) ๊ธฐ๋ณธ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

dddzr 2025. 2. 23. 18:02

๐Ÿ“Œ1.  try-catch ๋ฌธ๊ณผ throws Exception ์‚ฌ์šฉ๋ฒ•

๊ธฐ๋ณธ์ ์ธ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋Š” ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ… 1-1. try-catch ๋ฌธ

try-catch ๋ฌธ์€ ์ฝ”๋“œ ์‹คํ–‰ ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ์‹์ด๋‹ค.

  • ๋กœ์ง์„ ์ค‘๋‹จํ•˜์ง€ ์•Š๊ณ  ์ฆ‰๊ฐ์ ์ธ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ.
  • Spring MVC์—์„œ ์ฃผ๋กœ Controller

 

๐Ÿ“– try-catch ์˜ˆ์‹œ

try {
    int result = 10 / 0; // ์˜ˆ์™ธ ๋ฐœ์ƒ (ArithmeticException)

} catch (ArithmeticException e) {
    System.out.println("์˜ˆ์™ธ ๋ฐœ์ƒ: " + e.getMessage()); // ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ
    e.printStackTrace();  // ์Šคํƒ ํŠธ๋ ˆ์ด์Šค ์ถœ๋ ฅ
    
} catch (NullPointerException | ArithmeticException e) { // ๋‹ค์ค‘ catch ๋ธ”๋ก
   // …
} finally { // finally ๋ธ”๋Ÿญ
    // ํ•ญ์ƒ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ (๋ฆฌ์†Œ์Šค ๋ฐ˜ํ™˜ ๋“ฑ)
}

โœ… 1-2.  throws Exception

throws ํ‚ค์›Œ๋“œ๋Š” ๋ฉ”์„œ๋“œ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ๋ฅผ ํ˜ธ์ถœํ•œ ๊ณณ์—์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์œ„์ž„ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

  • ์˜ˆ์™ธ๋ฅผ ์ƒ์œ„ ๋ฉ”์„œ๋“œ๋กœ ์ „ํŒŒํ•˜์—ฌ ๊นจ๋—ํ•œ ์ฝ”๋“œ ๋ฐ ์œ ์—ฐ์„ฑ ๊ฐ€์ง(ํ˜ธ์ถœ ๋ถ€ ๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ).
  • Spring MVC์—์„œ ์ฃผ๋กœ Service

 

๐Ÿ“– throws Exception ์˜ˆ์‹œ

public void readFile(String fileName) throws IOException {
    FileReader file = new FileReader(fileName); // IOException ๋ฐœ์ƒ ๊ฐ€๋Šฅ
}

 

๐Ÿ”๋งŒ์•ฝ controller์—์„œ๋„ throws ํ•˜๋ฉด?

Spring์—์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค!! -> ๐Ÿ“Œ3๋ฒˆ ์ฐธ๊ณ !!

 

๐Ÿ“Œ 2. ์˜ˆ์™ธ์˜ ์ข…๋ฅ˜

์ž๋ฐ”์—์„œ ์˜ˆ์™ธ(Exception)๋Š” ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜ ์ƒํ™ฉ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. 

โœ… 2-1. Exception ๊ณ„์ธต - exception์— ์•ˆ ๊ฑธ๋ฆฌ๋Š” ์—๋Ÿฌ

์™ธ๋ถ€ api ์—๋Ÿฌ ์ค‘ Exception์— ๊ฑธ๋ฆฌ์ง€ ์•Š๋Š” ์—๋Ÿฌ๊ฐ€ ์žˆ์—ˆ๋‹ค!! ์ด๋•Œ๋„ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ์ฐพ๋‹ค๊ฐ€ catch (Throwable t)๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์–ด์„œ ๊ณ„์ธต์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค.

๐Ÿ”น ์˜ˆ์™ธ ๊ณ„์ธต ๊ตฌ์กฐ

  • ์ž๋ฐ”์˜ ์˜ˆ์™ธ๋Š” Throwable ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฅธ๋‹ค. Throwable ํด๋ž˜์Šค๋Š” ์ตœ์ƒ์œ„ ํด๋ž˜์Šค๋กœ, Error์™€ Exception์„ ํฌํ•จํ•œ๋‹ค.
java.lang.Throwable
 โ”œโ”€โ”€ Error (์˜ˆ: OutOfMemoryError)
 โ”œโ”€โ”€ Exception
      โ”œโ”€โ”€ ์ฒดํฌ ์˜ˆ์™ธ (Checked Exception): IOException, SQLException ๋“ฑ
      โ”œโ”€โ”€ ์–ธ์ฒดํฌ ์˜ˆ์™ธ (Unchecked Exception): RuntimeException, NullPointerException ๋“ฑ

 

๐Ÿ”น  Error์™€ Exception

  • Error: ์ฃผ๋กœ ์‹œ์Šคํ…œ ์ˆ˜์ค€์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ(์˜ˆ: OutOfMemoryError, StackOverflowError ๋“ฑ)๋กœ, ๋ณต๊ตฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ ์—๋Ÿฌ์ด๋‹ค.
  • Exception: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆ˜์ค€์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ์ด๋‹ค. ์ด ํด๋ž˜์Šค๋Š” Throwable์„ ์ƒ์†ํ•˜๋ฉฐ, ์ฒดํฌ ์˜ˆ์™ธ(Checked Exception)์™€ ์–ธ์ฒดํฌ ์˜ˆ์™ธ(Unchecked Exception)๋กœ ๋‚˜๋‰œ๋‹ค.

 

๐Ÿ”น ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

  • ์ผ๋ฐ˜์ ์œผ๋กœ catch (Exception e)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉฐ,
  • catch (Throwable t)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ์Šคํ…œ ์˜ค๋ฅ˜๊นŒ์ง€ ํฌ๊ด„์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•˜์ง€๋งŒ Error๋Š” ๋ณต๊ตฌํ•  ์ˆ˜ ์—†๋Š” ์‹œ์Šคํ…œ ์˜ค๋ฅ˜์ด๋ฏ€๋กœ, ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ Exception๋งŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.

 

โœ… 2-2. ์ฒดํฌ ์˜ˆ์™ธ vs ์–ธ์ฒดํฌ ์˜ˆ์™ธ - ์™œ ํŠน์ • ์—๋Ÿฌ๋งŒ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋‚ ๊นŒ?

์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์•˜์„ ๋•Œ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ๊ฒฝ์šฐ๋Š” ๋ญ˜๊นŒ? -> ์ฒดํฌ ์˜ˆ์™ธ!!

์ž๋ฐ”์—์„œ๋Š” ์˜ˆ์™ธ๋ฅผ ํฌ๊ฒŒ ์ฒดํฌ ์˜ˆ์™ธ(Checked Exception) ์™€ ์–ธ์ฒดํฌ ์˜ˆ์™ธ(Unchecked Exception) ๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค.

๐Ÿ”น ์ฒดํฌ ์˜ˆ์™ธ (Checked Exception)

  • ์ปดํŒŒ์ผ ์‹œ์ ์— ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ•์ œํ•˜๋Š” ์˜ˆ์™ธ (์ฒ˜๋ฆฌ ์•ˆ ํ•˜๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ ๋‚œ๋‹ค!)
  • ๋ฐ˜๋“œ์‹œ try-catch๋กœ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ throws๋กœ ์œ„์ž„ํ•ด์•ผ ํ•จ
  • ๋Œ€ํ‘œ์ ์ธ ์˜ˆ: IOException, SQLException, FileNotFoundException
  • Exception ํด๋ž˜์Šค ์ƒ์†
try {
    FileReader file = new FileReader("test.txt");
} catch (FileNotFoundException e) {
    System.out.println("ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
}

 

๐Ÿ”น ์–ธ์ฒดํฌ ์˜ˆ์™ธ (Unchecked Exception)

  • ์‹คํ–‰(Runtime) ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ๋กœ, ๋ช…์‹œ์ ์ธ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ•์ œ๋˜์ง€ ์•Š์Œ
  • ๋Œ€ํ‘œ์ ์ธ ์˜ˆ: NullPointerException, ArrayIndexOutOfBoundsException, ArithmeticException
  • RuntimeException ํด๋ž˜์Šค ์ƒ์†
String str = null;
System.out.println(str.length()); // NullPointerException ๋ฐœ์ƒ

 

โœ… 2-3. ์ฃผ์š” ์˜ˆ์™ธ ์ข…๋ฅ˜

์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ์˜ ์ข…๋ฅ˜์ด๋‹ค!

์˜ˆ์™ธ ํด๋ž˜์Šค ์„ค๋ช…
IOException ํŒŒ์ผ ์ž…์ถœ๋ ฅ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ
SQLException ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ์‚ฐ ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ
NullPointerException ๊ฐ์ฒด๊ฐ€ null์ผ ๋•Œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ ๋ฐœ์ƒ
ArrayIndexOutOfBoundsException ๋ฐฐ์—ด์˜ ์œ ํšจ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๊ฒฝ์šฐ ๋ฐœ์ƒ
ArithmeticException 0์œผ๋กœ ๋‚˜๋ˆ„๋Š” ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋ฐœ์ƒ

 

๐Ÿ“Œ 3. ์Šคํ”„๋ง์—์„œ์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ๋ฆ„ - ๋งŒ์•ฝ controller์—์„œ๋„ throws ํ•˜๋ฉด?

1-3์—์„œ์˜ ์˜๋ฌธ์„ ํ’€๊ธฐ์œ„ํ•ด ์•Œ์•„๋ณธ ๋‚ด์šฉ์ด๋‹ค!!

โœ… 3-1. ๊ธฐ๋ณธ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐฉ์‹ (DispatcherServlet์˜ ์—ญํ• )

์Šคํ”„๋ง์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ DispatcherServlet์ด ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด DispatcherServlet์ด ์ด๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์ ์ ˆํ•œ HTTP ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • Exception ๋˜๋Š” RuntimeException์ด ๋ฐœ์ƒํ•˜๋ฉด 500 Internal Server Error๋ฅผ ๋ฐ˜ํ™˜
  • ํŠน์ • ์˜ˆ์™ธ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ์—†์œผ๋ฉด ๊ธฐ๋ณธ์ ์ธ ์˜ˆ์™ธ ์‘๋‹ต์„ ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌ

 

โœ… 3-2. @ExceptionHandler์™€ @ControllerAdvice

์Šคํ”„๋ง์—์„œ๋Š” @ExceptionHandler์™€ @ControllerAdvice๋ฅผ ์‚ฌ์šฉํ•ด ์ „์—ญ ๋˜๋Š” ๊ฐœ๋ณ„ ์ปจํŠธ๋กค๋Ÿฌ ๋‹จ์œ„์—์„œ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ“– @ExceptionHandler (๊ฐœ๋ณ„ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ)

@RestController
public class SampleController {
    @GetMapping("/divide")
    public int divide(@RequestParam int a, @RequestParam int b) {
        return a / b; // b๊ฐ€ 0์ด๋ฉด ArithmeticException ๋ฐœ์ƒ
    }

    @ExceptionHandler(ArithmeticException.class)
    public ResponseEntity<String> handleArithmeticException(ArithmeticException e) {
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("์ž˜๋ชป๋œ ๊ณ„์‚ฐ์ž…๋‹ˆ๋‹ค: " + e.getMessage());
    }

}

 

๐Ÿ“– @ControllerAdvice (์ „์—ญ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ)

@ControllerAdvice๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ๋ฅผ ํ•œ ๊ณณ์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(NullPointerException.class)
    public ResponseEntity<String> handleNullPointerException(NullPointerException e) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Null ๊ฐ’์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค");
    }
}



'Backend > JAVA' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

static ํ‚ค์›Œ๋“œ  (0) 2025.02.26
JNDI๋ž€?  (0) 2025.02.26
[Java] ๋น„๋™๊ธฐ ์ž‘์—… ์ฒ˜๋ฆฌ (ExecutorService VS CompletableFuture)  (0) 2025.02.23
HttpURLConnection  (0) 2024.06.07
๋ธ”๋กํ‚นํ(Blocking Queue)  (0) 2024.06.05