Chapter 4 - KOO-YS/toby-spring GitHub Wiki


์˜ˆ์™ธ


Goals

  • JdbcTemplate์„ ๋Œ€ํ‘œ๋กœ ํ•˜๋Š” ์Šคํ”„๋ง์˜ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ธฐ๋Šฅ์— ๋‹ด๊ฒจ ์žˆ๋Š” ์˜ˆ์™ธ์ฒ˜๋ฆฌ์™€ ๊ด€๋ จ๋œ ์ ‘๊ทผ๋ฐฉ๋ฒ• ์•Œ๊ธฐ

๐ŸŒฑ Branch chapter04/refactor ์‚ฌ์šฉ

chapter 04๋Š” ์‹ค์Šต ์ฝ”๋“œ๊ฐ€ ๋งŽ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์†Œ๋ถ„๋ฅ˜ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค ! 


4.1 ์‚ฌ๋ผ์ง„ SQLException


์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ ์ง€์ผœ์•ผ ํ•  ํ•ต์‹ฌ์›์น™

๋ชจ๋“  ์˜ˆ์™ธ๋Š” ์ ์ ˆํ•˜๊ฒŒ ๋ณต๊ตฌ๋˜๋“ ์ง€, ์ž‘์—…์„ ์ค‘๋‹จ์‹œํ‚ค๊ณ  ์šด์˜์ž ๋˜๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ถ„๋ช…ํ•˜๊ฒŒ ํ†ต๋ณด๋ผ์•ผ ํ•œ๋‹ค


์˜ˆ์™ธ์˜ ์ข…๋ฅ˜์™€ ํŠน์ง•

  • java.lang.Error ํด๋ž˜์Šค์˜ ์„œ๋ธŒ ํด๋ž˜์Šค๋“ค
    • ์‹œ์Šคํ…œ์— ๋น„์ •์ƒ์ ์ธ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ์„ ๊ฒฝ์šฐ ์‚ฌ์šฉ
    • ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์—์„œ ๋Œ€์‘ํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค
  • java.lang.Exception ํด๋ž˜์Šค์˜ ์„œ๋ธŒ ํด๋ž˜์Šค๋“ค๊ณผ ์ฒดํฌ ์˜ˆ์™ธ
    • ๊ฐœ๋ฐœ์ž๋“ค์ด ๋งŒ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์˜ ์ž‘์—…์ค‘์— ์˜ˆ์™ธ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ์„ ๊ฒฝ์šฐ

      ์ฒดํฌ ์˜ˆ์™ธ (:compile Error ๋ฐœ์ƒ)

      Exception ํด๋ž˜์Šค์˜ ์„œ๋ธŒ ํด๋ž˜์Šค์ด๋ฉด์„œ RuntimeException ํด๋ž˜์Šค๋ฅผ ์ƒ์†กํ•˜์ง€ ์•Š์€ ๊ฒƒ๋“ค

      ๋ฐ˜๋“œ์‹œ ์ฒ˜๋ฆฌํ•ด์•ผํ•  ์˜ˆ์™ธ โ–ถ catch ๋˜๋Š” throws๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•ด์•ผํ•œ๋‹ค

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

      RuntimeException ๋ฅผ ์ƒ์†ํ•œ ํด๋ž˜์Šค๋“ค

      ๊ฐœ๋ฐœ์ž์˜ ๋ถ€์ฃผ์˜๋กœ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋Ÿฐํƒ€์ž„ ์˜ˆ์™ธ

      ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ•์ œํ•˜์ง€ ์•Š๋Š”๋‹ค


์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•

  • ์˜ˆ์™ธ ๋ณต๊ตฌ
    • ์˜ˆ์™ธ ์ƒํ™ฉ์„ ํŒŒ์•…ํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์„œ ์ •์ƒ ์ƒํƒœ๋กœ ๋Œ๋ ค๋†“๋Š” ๊ฒƒ
  • ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํšŒํ”ผ
    • ์˜ˆ์™ธ๋ฅผ ์ž์‹ ์ด ๋‹ด๋‹นํ•˜์ง€ ์•Š๊ณ  ์ž์‹ ์„ ํ˜ธ์ถœํ•œ ์ชฝ์œผ๋กœ ๋˜์ ธ๋ฒ„๋ฆฌ๋Š” ๋ฐฉ๋ฒ•
    • throws๋ฌธ์œผ๋กœ ์„ ์–ธํ•ด์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ˜ธ์ถœ ์ชฝ์œผ๋กœ ๋˜์ ธ์ง€๊ฒŒ ํ•จ
    • catch๋ฌธ์œผ๋กœ ์ผ๋‹จ ์˜ˆ์™ธ๋ฅผ ์žก์€ ํ›„์— ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๊ณ  ๋‹ค์‹œ ์˜ˆ์™ธ ๋˜์ง€๋Š” ๊ฒƒ(rethrow)
    • ํšŒํ”ผ์˜ ์˜๋„๊ฐ€ ๋ถ„๋ช…ํ•ด์•ผ ํ•œ๋‹ค
  • ์˜ˆ์™ธ ์ „ํ™˜ (exception translation)
    • ์˜ˆ์™ธ๋ฅผ ๋ณต๊ตฌํ•ด์„œ ์ •์ƒ์ ์ธ ์ƒํƒœ๋กœ๋Š” ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์™ธ๋ฅผ ๋ฉ”์†Œ๋“œ ๋ฐ–์œผ๋กœ ๋˜์ง
    • ์˜ˆ์™ธ๋ฅผ ๊ทธ๋Œ€๋กœ ๋„˜๊ธฐ๋Š” ๊ฒŒ ์•„๋‹Œ ์ ์ ˆํ•œ ์˜ˆ์™ธ๋กœ ์ „ํ™˜ํ•ด์„œ ๋˜์ง„๋‹ค
    ์˜ˆ์™ธ ์ „ํ™˜์ด ์‚ฌ์šฉ๋˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ชฉ์ 
    1. ๋กœ์šฐ ๋ ˆ๋ฒจ์˜ ์˜ˆ์™ธ๋ฅผ ์ข€ ๋” ์˜๋ฏธ์žˆ๊ณ  ์ถ”์ƒํ™”๋œ ์˜ˆ์™ธ๋กœ ๋ฐ”๊ฟ”์„œ ๋˜์ง€๋Š” ๊ฒƒ

      ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋ฅผ ๊ทธ๋Œ€๋กœ ๋˜์ง€๋Š” ๊ฒƒ์ด ์ ์ ˆํ•œ ์˜๋ฏธ ๋ถ€์—ฌ๊ฐ€ ์–ด๋ ค์šธ ๊ฒฝ์šฐ, ์˜๋ฏธ๋ฅผ ๋ถ„๋ช…ํ•˜๊ฒŒ ํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด์„œ

    2. ๋Ÿฐํƒ€์ž„ ์˜ˆ์™ธ๋กœ ํฌ์žฅํ•ด์„œ ๊ตณ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ catch/throws๋ฅผ ์ค„์—ฌ์ฃผ๋Š” ๊ฒƒ

      ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์‰ฝ๊ณ  ๋‹จ์ˆœํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํฌ์žฅ(์˜๋ฏธ ์žˆ๋Š”, ๋ณต๊ตฌ ๊ฐ€๋Šฅํ•œ ์˜ˆ์™ธ๊ฐ€ ์•„๋‹ ๋•Œ, ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋กœ ํฌ์žฅํ•ด์„œ ๋˜์ง„๋‹ค)


์ค‘์ฒฉ ์˜ˆ์™ธ (nested exception)

์˜๋ฏธ๊ฐ€ ๋ถ„๋ช…ํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•˜๋Š” ์˜ˆ์™ธ์— ์›๋ž˜ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋ฅผ ๋‹ด์•„ ์‚ฌ์šฉ

} catch (SQLException e){
    	// ์ „ํ™˜ํ•  ์˜ˆ์™ธ(์›๋ž˜ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ); 
    throw DuplicateUserIdException(e);
}
} catch (SQLException e){
    	// ์ „ํ™˜ํ•  ์˜ˆ์™ธ().initCause(๋ฐœ์ƒํ•œ ๊ทผ๋ณธ ์˜ˆ์™ธ);  
    throw DuplicateUserIdException().initCause(e);
}

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์˜ˆ์™ธ

์‹œ์Šคํ…œ ๋˜๋Š” ์™ธ๋ถ€์˜ ์˜ˆ์™ธ์ƒํ™ฉ์ด ์›์ธ์ด ์•„๋‹ˆ๋ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž์ฒด์˜ ๋กœ์ง์— ์˜ํ•ด ์˜๋„์ ์œผ๋กœ ๋ฐœ์ƒ์‹œํ‚ค๊ณ , ๋ฐ˜๋“œ์‹œ catchํ•ด์„œ ๋ฌด์—‡์ธ๊ฐ€ ์กฐ์น˜๋ฅผ ์ทจํ•˜๋„๋ก ์š”๊ตฌํ•˜๋Š” ์˜ˆ์™ธ๋“ค




โš  JdbcTemplate์˜ throws SQLException์€ ์™œ ์‚ฌ๋ผ์กŒ๋Š”๊ฐ€?

SQLException์€ ๋Œ€๋ถ€๋ถ„์ด ๋ณต๊ตฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ ์˜ˆ์™ธ์ด๋‹ค.

์‹œ์Šคํ…œ์˜ ์˜ˆ์™ธ์ด๊ธฐ์— ๋‹น์—ฐํžˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ ๋ณต๊ตฌํ•  ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— Spring์˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์ „๋žต์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

ํ•„์š”๋„ ์—†๋Š” ๊ธฐ๊ณ„์ ์ธ throws ์„ ์–ธ์„ ๋ฐฉ์น˜ํ•˜์ง€ ์•Š๊ณ  ์–ธ์ฒดํฌ/๋Ÿฐํƒ€์ž„ ์˜ˆ์™ธ๋กœ ์ „ํ™˜ํ•ด์คŒ

์Šคํ”„๋ง์˜ JdbcTemplate ํ…œํ”Œ๋ฆฟ๊ณผ ์ฝœ๋ฐฑ ์•ˆ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  SQLException์„ ๋Ÿฐํƒ€์ž„ ์˜ˆ์™ธ์ธ **DataAccessException**์œผ๋กœ ํฌ์žฅํ•ด์„œ ๋˜์ ธ์ค€๋‹ค

โ–ถ

JdbcTemplate์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ์—์„  ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ๋Ÿฐํƒ€์ž„ ์˜ˆ์™ธ **DataAccessException**๋ฅผ ์žก์•„์„œ ์ฒ˜๋ฆฌํ•ด์ฃผ๋ฉด ๋˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๋ฌด์‹œํ•˜๋ฉด ๋œ๋‹ค

// JdbcTemplate ๋‚ด๋ถ€ ๋ฉ”์†Œ๋“œ๋“ค์„ ์‚ดํŽด๋ณด๋ฉด ๋ชจ๋‘ throws DataAccessException์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋‹ค
@Override
public int update(final String sql) throws DataAccessException {...}



4.2 ์˜ˆ์™ธ ์ „ํ™˜


์Šคํ”„๋ง์€ DataAccessException์ด๋ผ๋Š” SQLException์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ๋Ÿฐํƒ€์ž„ ์˜ˆ์™ธ๋ฅผ ์ •์˜ํ•˜๊ณ  ์žˆ์„ ๋ฟ ์•„๋‹ˆ๋ผ, DataAccessException์˜ ์„œ๋ธŒํด๋ž˜์Šค๋กœ ์„ธ๋ถ„ํ™”๋œ ์˜ˆ์™ธ ํด๋ž˜์Šค๋“ค์„ ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค

โ–ถ

๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ์ž‘์—… ์ค‘์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ ์ƒํ™ฉ์„ ์ˆ˜์‹ญ ๊ฐ€์ง€ ์˜ˆ์™ธ๋กœ ๋ถ„๋ฅ˜ํ•˜๊ณ  ์ด๋ฅผ ์ถ”์ƒํ™”ํ•ด ์ •์˜ํ•œ ๋‹ค์–‘ํ•œ ์˜ˆ์™ธ ํด๋ž˜์Šค๋ฅผ ์ œ๊ณต


โš  SQLException์˜ ๋น„ํ‘œ์ค€ ์—๋Ÿฌ์ฝ”๋“œ์™€ SQL ์ƒํƒœ์ •๋ณด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ… ํ•„์š”

โš  ์ผ์ผ์ด DB๋ณ„๋กœ ์—๋Ÿฌ ์ฝ”๋“œ์˜ ์ข…๋ฅ˜๋ฅผ ํ™•์ธํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๋ถ€๋‹ด์Šค๋Ÿฝ๋‹ค

โ–ถ ์Šคํ”„๋ง์€ DB๋ณ„ ์—๋Ÿฌ ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฅ˜ํ•ด์„œ ์Šคํ”„๋ง์ด ์ •์˜ํ•œ ์˜ˆ์™ธ ํด๋ž˜์Šค์™€ ๋งคํ•‘ํ•ด๋†“์€ ์—๋Ÿฌ ์ฝ”๋“œ ๋งคํ•‘ ์ •๋ณด ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์–ด๋‘๊ณ  ์ด๋ฅผ ์ด์šฉํ•œ๋‹ค

โ–ถ JdbcTemplate์€ SQLException์„ ๋‹จ์ง€ ๋Ÿฐํƒ€์ž„ ์˜ˆ์™ธ์ธ DataAccessException์œผ๋กœ ํฌ์žฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, DB์˜ ์—๋Ÿฌ ์ฝ”๋“œ๋ฅผ DataAccessException ๊ณ„์ธต๊ตฌ์กฐ์˜ ํด๋ž˜์Šค ์ค‘ ํ•˜๋‚˜๋กœ ๋งคํ•‘ํ•ด์ค€๋‹ค

DB ์ข…๋ฅ˜๋ฅผ ํ™•์ธํ•˜๊ณ  ๋“œ๋ผ์ด๋ฒ„๋‚˜ DB ๋ฉ”ํƒ€์ •๋ณด๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ์ ์ ˆํ•œ ์˜ˆ์™ธ ํด๋ž˜์Šค๋ฅผ ์„ ์ฑ…ํ•˜๊ธฐ ๋•Œ๋ฌธ์— DB๊ฐ€ ๋‹ฌ๋ผ์ ธ๋„ ๊ฐ™์€ ์ข…๋ฅ˜์˜ ์—๋Ÿฌ๋ผ๋ฉด ๋™์ผํ•œ ์˜ˆ์™ธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค

๊ธฐ์ˆ ์— ๋…๋ฆฝ์ ์ธ UserDao ๋งŒ๋“ค๊ธฐ

DAO ์ž๋ฐ” ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ธฐ์ˆ ์—์„œ ๋…๋ฆฝ์‹œํ‚ค๋ ค๋ฉด ์ธํ„ฐํŽ˜์ด์Šค ๋„์ž…๊ณผ ๋Ÿฐํƒ€์ž„ ์˜ˆ์™ธ ์ „ํ™˜, ๊ธฐ์ˆ ์— ๋…๋ฆฝ์ ์ธ ์ถ”์ƒํ™”๋œ ์˜ˆ์™ธ๋กœ ์ „ํ™˜์ด ํ•„์š”ํ•˜๋‹ค




์ฐธ๊ณ  ๋ธ”๋กœ๊ทธ
โš ๏ธ **GitHub.com Fallback** โš ๏ธ