Spring/Spring DB

[์Šคํ”„๋ง DB 1ํŽธ] - 12. ์˜ˆ์™ธ(Exception)์˜ ์ดํ•ด / ์ฒดํฌ,์–ธ์ฒดํฌ ์˜ˆ์™ธ

hello_u 2023. 3. 29. 17:27

 

์˜ˆ์™ธ(Exception)

 

์ž๋ฐ”์—์„œ ์˜ˆ์™ธ(Exception)๋Š” ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ƒํ™ฉ ๋˜๋Š” ์˜ค๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ ์˜ˆ์™ธ๋Š” ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ๋„์ค‘ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฐœ์ƒ ์‹œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์˜ˆ์™ธ ๊ณ„์ธต

Throwable

์ตœ์ƒ์œ„ ์˜ˆ์™ธ , ์˜ˆ์™ธ(Exception)์™€ ์—๋Ÿฌ(Error)๋ฅผ ๋ชจ๋‘ ํฌํ•จํ•˜๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. 

 

 ์—๋Ÿฌ(Error)

 ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์ด๋‚˜ ์‹ฌ๊ฐํ•œ ์‹œ์Šคํ…œ ์˜ค๋ฅ˜์™€ ๊ฐ™์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ณต๊ตฌ ๋ถˆ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ ์˜ˆ์™ธ์ด๋‹ค.

 

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ž๋Š” ์ด ์˜ˆ์™ธ๋ฅผ ์žก์œผ๋ ค๊ณ  ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.

 

 

์˜ˆ์™ธ(Exception)

์˜ˆ์™ธ๋Š” ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜๋กœ ๋‚˜๋‰˜๋ฉฐ, ๊ฐ๊ฐ checked ์˜ˆ์™ธ์™€ unchecked ์˜ˆ์™ธ๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.

 

 

Checked ์˜ˆ์™ธ๋Š” RuntimeException ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜์ง€ ์•Š๋Š” ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ•์ œํ•˜๋ฏ€๋กœ, ํ•ด๋‹น ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐ˜๋“œ์‹œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋Œ€ํ‘œ์ ์ธ Checked ์˜ˆ์™ธ๋กœ๋Š” IOException, ClassNotFoundException ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

Unchecked ์˜ˆ์™ธ๋Š” RuntimeException ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋Š” ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค.

Checked ์˜ˆ์™ธ์™€ ๋‹ฌ๋ฆฌ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ•์ œํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋Œ€ํ‘œ์ ์ธ Unchecked ์˜ˆ์™ธ๋กœ๋Š” NullPointerException, ArrayIndexOutOfBoundsException ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

์˜ˆ์™ธ ๊ธฐ๋ณธ ๊ทœ์น™

 

์˜ˆ์™ธ๋Š” ํญํƒ„ ๋Œ๋ฆฌ๊ธฐ์™€ ๊ฐ™๋‹ค.

 

์žก์•„์„œ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜, ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์œผ๋ฉด ๋ฐ–์œผ๋กœ ๋˜์ ธ์•ผํ•œ๋‹ค.

 

์˜ˆ์™ธ ์ฒ˜๋ฆฌ catch

 Exception ์„ catch ๋กœ ์žก์Œ 

 

์˜ˆ์™ธ ๋˜์ง throws

 

 Exception ์„ throws ๋กœ ๋˜์ง 

 

 

2๊ฐ€์ง€ ๊ธฐ๋ณธ ๊ทœ์น™

1. ์˜ˆ์™ธ๋Š” ์žก์•„์„œ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ๋˜์ ธ์•ผ ํ•œ๋‹ค.


2.
์˜ˆ์™ธ๋ฅผ ์žก๊ฑฐ๋‚˜ ๋˜์งˆ ๋•Œ ์ง€์ •ํ•œ ์˜ˆ์™ธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ทธ ์˜ˆ์™ธ์˜ ์ž์‹๋“ค๋„ ํ•จ๊ป˜ ์ฒ˜๋ฆฌ๋œ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด์„œ Exception ์„ catch ๋กœ ์žก์œผ๋ฉด ๊ทธ ํ•˜์œ„ ์˜ˆ์™ธ๋“ค๋„ ๋ชจ๋‘ ์žก์„ ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด์„œ Exception ์„ throws ๋กœ ๋˜์ง€๋ฉด ๊ทธ ํ•˜์œ„ ์˜ˆ์™ธ๋“ค๋„ ๋ชจ๋‘ ๋˜์งˆ ์ˆ˜ ์žˆ๋‹ค.

 

 

์ฐธ๊ณ : ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๊ณ  ๊ณ„์† ๋˜์ง€๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?
์ž๋ฐ” main() ์“ฐ๋ ˆ๋“œ์˜ ๊ฒฝ์šฐ ์˜ˆ์™ธ ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด์„œ ์‹œ์Šคํ…œ์ด ์ข…๋ฃŒ๋œ๋‹ค.
์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ์˜ˆ์™ธ ๋•Œ๋ฌธ์— ์‹œ์Šคํ…œ์ด ์ข…๋ฃŒ๋˜๋ฉด ์•ˆ๋œ๋‹ค.

WAS๊ฐ€ ํ•ด๋‹น ์˜ˆ์™ธ๋ฅผ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ, ์ฃผ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง€์ •ํ•œ, ์˜ค๋ฅ˜ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

 

 

 

์ฒดํฌ ์˜ˆ์™ธ ๊ธฐ๋ณธ ์ดํ•ด

 

Exception ๊ณผ ๊ทธ ํ•˜์œ„ ์˜ˆ์™ธ๋Š” ๋ชจ๋‘ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฒดํฌํ•˜๋Š” ์ฒดํฌ ์˜ˆ์™ธ์ด๋‹ค.

public class CheckedTest {
    static class MyCheckedException extends Exception {
        public MyCheckedException(String message) {
            super(message);
        }
    }

 

MyCheckedException ๋Š” Exception ์„ ์ƒ์†๋ฐ›์•˜๋‹ค.

 

Exception ์„ ์ƒ์†๋ฐ›์œผ๋ฉด ์ฒดํฌ ์˜ˆ์™ธ๊ฐ€ ๋œ๋‹ค.

 

 

 

throws

์˜ˆ์™ธ๋ฅผ ๋ฐ–์œผ๋กœ ๋˜์ง

 

์˜ˆ์™ธ๋Š” ์žก๊ฑฐ๋‚˜ ๋˜์ ธ์•ผ ํ•œ๋‹ค. 

 

์ฒดํฌ ์˜ˆ์™ธ์˜ ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ์žก์•„์„œ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ๋˜๋Š” throws ๋ฅผ ์ง€์ •ํ•ด์„œ ์˜ˆ์™ธ๋ฅผ ๋ฐ–์œผ๋กœ ๋˜์ง„๋‹ค๋Š” ์„ ์–ธ์„ ํ•„์ˆ˜๋กœ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

์ฒดํฌ ์˜ˆ์™ธ๋ฅผ ๋ฐ–์œผ๋กœ ๋˜์ง€์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜ ๋ฐœ์ƒ

 

static class Repository {
    public void call() throws MyCheckedException {
        throw new MyCheckedException("ex");
    }
}

 

์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋Š” ๊ฒƒ์„ " throws MyCheckedException " ์„ ์„ ์–ธ ํ•ด์ค˜์•ผํ•œ๋‹ค.

 

throws ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

 

catch

์˜ˆ์™ธ๋ฅผ ์žก์•„์„œ ์ฒ˜๋ฆฌ

/**
 * ์˜ˆ์™ธ๋ฅผ ์žก์•„์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ
 */
public void callCatch() {
    try {
        repository.call();
    } catch (MyCheckedException e) {
        //์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋กœ์ง
        log.info("์˜ˆ์™ธ ์ฒ˜๋ฆฌ, message={}", e.getMessage(), e);
    }
}

 

Repository.call() ์—์„œ MycheckedException ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ ,

 

๊ทธ ์˜ˆ์™ธ๋ฅผ Service.callCatch() ์—์„œ ์žก๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

Test ์ฝ”๋“œ

 

catch

@Test
void checked_catch() {
    Service service = new Service();
    service.callCatch();
}

 

throws

@Test
void checked_throw() {
    Service service = new Service();
    Assertions.assertThrows(MyCheckedException.class , () -> {
        service.callThrow();
    });
}

 

 

junit5์˜ assertThrows ์‚ฌ์šฉ

 

@Test
void checked_throw() {
    Service service = new Service();
    assertThatThrownBy(() -> service.callThrow())
            .isInstanceOf(MyCheckedException.class);
}

 

assertj์˜ assertThatThrownBy ์‚ฌ์šฉ

 

 

 

์–ธ์ฒดํฌ ์˜ˆ์™ธ ๊ธฐ๋ณธ ์ดํ•ด

 

RuntimeException ๊ณผ ๊ทธ ํ•˜์œ„ ์˜ˆ์™ธ๋Š” ์–ธ์ฒดํฌ ์˜ˆ์™ธ๋กœ ๋ถ„๋ฅ˜๋œ๋‹ค.

 

/**
 * RuntimeException ์„ ์ƒ์†๋ฐ›์€ ์˜ˆ์™ธ๋Š” ์–ธ์ฒดํฌ ์˜ˆ์™ธ๊ฐ€ ๋œ๋‹ค.
 */
static class MyUncheckedException extends RuntimeException {
    public MyUncheckedException(String message) {
        super(message);
    }
}


์–ธ์ฒดํฌ ์˜ˆ์™ธ๋Š” ๋ง ๊ทธ๋Œ€๋กœ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์˜ˆ์™ธ๋ฅผ ์ฒดํฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋œป์ด๋‹ค.

 

์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋Š” throws ๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š๊ณ , ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ์˜ˆ์™ธ๋ฅผ ๋˜์ง„๋‹ค.

 

 

์ฒดํฌ ์˜ˆ์™ธ

 

์ฒดํฌ ์˜ˆ์™ธ์—์„œ๋Š” throws ๋ฅผ ์ง€์ •ํ•ด์„œ ์˜ˆ์™ธ๋ฅผ ๋ฐ–์œผ๋กœ ๋˜์ง„๋‹ค๋Š” ์„ ์–ธ์„ ํ•„์ˆ˜๋กœ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

 

์–ธ์ฒดํฌ ์˜ˆ์™ธ

 

์–ธ์ฒดํฌ ์˜ˆ์™ธ๋Š” ์ฒดํฌ ์˜ˆ์™ธ์™€ ๋‹ค๋ฅด๊ฒŒ throws ์˜ˆ์™ธ ๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

 

 

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1/dashboard

 

์Šคํ”„๋ง DB 1ํŽธ - ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ํ•ต์‹ฌ ์›๋ฆฌ - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ DB ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ธฐ์ˆ ์„ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์ดํ•ดํ•˜๊ณ , ์™„์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง DB ์ ‘๊ทผ ๊ธฐ์ˆ ์˜ ์›๋ฆฌ์™€ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ , ๋” ๊นŠ์ด์žˆ๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., - ๊ฐ•์˜

www.inflearn.com