# Spring์ด ์ œ๊ณตํ•˜๋Š” ์˜ˆ์™ธ ์ถ”์ƒํ™”, ์˜ˆ์™ธ ๋ณ€ํ™˜๊ธฐ ์‚ฌ์šฉ
Study Repository

Spring์ด ์ œ๊ณตํ•˜๋Š” ์˜ˆ์™ธ ์ถ”์ƒํ™”, ์˜ˆ์™ธ ๋ณ€ํ™˜๊ธฐ ์‚ฌ์šฉ

by rlaehddnd0422

์•ž์„  ํฌ์ŠคํŒ…์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋งˆ๋‹ค ์˜ค๋ฅ˜์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์™ธ๋ณต๊ตฌ๋ฅผ ํ•  ๋•Œ ๊ฐ DB์— ๋งž๋Š” ์ ์ ˆํ•œ ์˜ค๋ฅ˜์ฝ”๋“œ๋ฅผ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

ErrorCode๋ฅผ ์ด์šฉํ•œ ํŠน์ • ์˜ˆ์™ธ ๋ณต๊ตฌ

์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์—๋Š” 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. 1. ์˜ˆ์™ธ ๋‚ด๋˜์ง€๊ธฐ : ์ž์‹ ์ด ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋Š” ์˜ˆ์™ธ๋ฅผ ์ž์‹ ์„ ํ˜ธ์ถœํ•œ ๋ฉ”์†Œ๋“œ์—๊ฒŒ throws ํ‚ค์›Œ๋“œ๋กœ ๋‚ด๋˜์ง€๋Š” ๋ฐฉ๋ฒ• ( main()์—์„œ๋„ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋ฉด ์˜ค๋ฅ˜ ์ถœ

rlaehddnd0422.tistory.com

์Šคํ”„๋ง์˜ ์˜ˆ์™ธ ์ถ”์ƒํ™”์™€, ์˜ˆ์™ธ ๋ณ€ํ™˜๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! 


์˜ˆ์™ธ ์ถ”์ƒํ™”

  • ์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ์˜ˆ์™ธ ์ถ”์ƒํ™” DataAccessException์€ RuntimeException์˜ ์ƒ์† ํด๋ž˜์Šค์ด๋ฏ€๋กœ ์„œ๋น„์Šค ๊ณ„์ธต์—์„œ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. 
  • ๊ฐ๊ฐ์˜ ์˜ˆ์™ธ๋Š” ํŠน์ • ๊ธฐ์ˆ (JDBC, JPA ๋“ฑ)์— ์ข…์†์ ์ด์ง€ ์•Š๊ฒŒ ์„ค๊ณ„๋˜์–ด ์„œ๋น„์Šค ๊ณ„์ธต์—์„œ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • ์‰ฝ๊ฒŒ ๋งํ•ด JPA์—์„œ ๋ฐœ์ƒํ•˜๋Š” ํ‚ค ์ค‘๋ณต ์˜ค๋ฅ˜์™€ JDBC์—์„œ ๋ฐœ์ƒํ•˜๋Š” ํ‚ค ์ค‘๋ณต ์˜ค๋ฅ˜๋ฅผ ๋™์ผํ•œ ์˜ˆ์™ธ ํด๋ž˜์Šค๋กœ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋น„์Šค ๊ณ„์ธต์—์„œ๋Š” ๊ธฐ์ˆ ์˜ ๋ณ€๊ฒฝ๋จ์— ๋”ฐ๋ผ ์˜ˆ์™ธ ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•ด์ค„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ์™ธ ์ถ”์ƒํ™” DataAccessException์€ ํฌ๊ฒŒ Trasient(์ผ์‹œ์ ์ธ) ์˜ˆ์™ธ์™€ NonTransient(์ผ์‹œ์ ์ด์ง€ ์•Š์€) ์˜ˆ์™ธ๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.
    • Transient Exception : ์ฟผ๋ฆฌ ํƒ€์ž„์•„์›ƒ, ๋ฝ๊ณผ ๊ด€๋ จ๋œ ์˜ค๋ฅ˜๋กœ ๋‹ค์‹œ ์‹œ๋„ํ•˜๋ฉด ์„ฑ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ๋“ค
    • Non-Transient Exception : SQL ๋ฌธ๋ฒ• ์˜ค๋ฅ˜, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ œ์•ฝ์กฐ๊ฑด ์œ„๋ฐฐ์™€ ๊ฐ™์ด ๋‹ค์‹œ ์‹œ๋„ํ•ด๋„ ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ•˜๋Š” ์˜ˆ์™ธ๋“ค

 

์Šคํ”„๋ง์€ DB์—์„œ ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜์ฝ”๋“œ๋ฅผ ์˜ˆ์™ธ ์ถ”์ƒํ™”๋กœ ๋ณ€๊ฒฝํ•˜๋„๋ก ๋„์™€์ฃผ๋Š” ์˜ˆ์™ธ ๋ณ€ํ™˜๊ธฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


์˜ˆ์™ธ ๋ณ€ํ™˜๊ธฐ(SQLExceptionTranslator) 

์‚ฌ์šฉ๋ฒ• 

1. ์„ ์–ธ 

  SQLExceptionTranslator exTranslator = new SQLErrorCodeSQLExceptionTranslator(dataSource);

2. translate()๋ฅผ ์‚ฌ์šฉํ•ด Exception Code โ–ถ๏ธŽ ์˜ˆ์™ธ ์ถ”์ƒํ™” ๋ณ€๊ฒฝ

  DataAccessException resultEx = exTranslator.translate("select", sql, e);
translate()
1. ์ฒซ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ : ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์„ค๋ช…
2. ๋‘๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ : ์‹คํ–‰ํ•œ SQL
3. ์„ธ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ : ๋ฐœ์ƒ๋œ Exception

์ ์šฉ

@Slf4j
@RequiredArgsConstructor
public class MemberRepositoryV4_2 implements MemberRepository {
    private final DataSource dataSource;
    private final SQLExceptionTranslator exTranslator;

    public MemberRepositoryV4_2(DataSource dataSource)
    {
        this.dataSource = dataSource;
        this.exTranslator = new SQLErrorCodeSQLExceptionTranslator(dataSource);
    }

    public Member save(Member member)
    {
        String sql = "insert into member(member_id, money) values(?,?)";

        Connection con = null;
        PreparedStatement pstmt = null;

        try
        {
            con = getConnection();
            pstmt = con.prepareStatement(sql);
            pstmt.setString(1,member.getMemberId());
            pstmt.setInt(2, member.getMoney());
            pstmt.executeUpdate();
            return member;
        } catch (SQLException e) {
            DataAccessException Translated_ex = exTranslator.translate("save", sql, e);
            log.info("๋ณ€ํ™˜๋œ ์˜ˆ์™ธ : {}", exTranslator.getClass());
            throw Translated_ex;
        }finally {
            close(con, pstmt, null);
        }
    }
    
    
    
    ...
}
  • Interface SQLExceptionTransaltor์˜ implements SQLErrorCodeSQLExceptionTranslator ์‚ฌ์šฉ
    • DataSource๋ฅผ ์ฃผ์ž…ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (์™ธ๋ถ€์—์„œ ๋”ฐ๋กœ ์ฃผ์ž…)

Service                                                                                                              Repository 

  • ์„œ๋น„์Šค ๊ณ„์ธต์—์„œ๋Š” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ณ„์ธต์—์„œ ์˜ˆ์™ธ ๋ณ€ํ™˜๊ธฐ๋ฅผ ํƒ€๊ณ  ๋„˜์–ด์˜จ ์˜ˆ์™ธ ์ถ”์ƒํ™”๋ฅผ ์ด์šฉํ•ด ์˜ˆ์™ธ ๋ณต๊ตฌ ๋กœ์ง์„ ๊น”๋”ํ•˜๊ฒŒ ์งค ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 
  • ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ณ„์ธต์—์„œ๋Š” ์˜ˆ์™ธ ๋ณ€ํ™˜๊ธฐ๊ฐ€ ์˜ค๋ฅ˜์ฝ”๋“œ๋ฅผ ์˜ˆ์™ธ ์ถ”์ƒํ™”๋กœ ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝ์‹œ์ผœ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ๋ฅผ ์ผ์ผ์ด ์˜ค๋ฅ˜์ฝ”๋“œ๋กœ ์žก์•„์ค„ ํ•„์š”๊ฐ€ ์—†๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 
  • ์ถ”๊ฐ€์ ์œผ๋กœ ์ด์ œ ์„œ๋น„์Šค ๊ณ„์ธต์€ ์˜ˆ์™ธ ์ถ”์ƒํ™”๋ฅผ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ํŠน์ • ๊ธฐ์ˆ ์— ์ข…์†์ ์ด์ง€ ์•Š๊ณ  ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

<์ฐธ๊ณ ์ž๋ฃŒ>

 

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

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

www.inflearn.com

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Study Repository

rlaehddnd0422

ํ™œ๋™ํ•˜๊ธฐ