Spring์ด ์ ๊ณตํ๋ ์์ธ ์ถ์ํ, ์์ธ ๋ณํ๊ธฐ ์ฌ์ฉ
by rlaehddnd0422์์ ํฌ์คํ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ง๋ค ์ค๋ฅ์ฝ๋๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์์ธ๋ณต๊ตฌ๋ฅผ ํ ๋ ๊ฐ DB์ ๋ง๋ ์ ์ ํ ์ค๋ฅ์ฝ๋๋ฅผ ์ค์ ํด์ฃผ์ด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์์์ต๋๋ค.
์คํ๋ง์ ์์ธ ์ถ์ํ์, ์์ธ ๋ณํ๊ธฐ๋ฅผ ์ฌ์ฉํด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค!
์์ธ ์ถ์ํ
- ์คํ๋ง์ด ์ ๊ณตํ๋ ์์ธ ์ถ์ํ 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๋ฅผ ์ฃผ์ ํด์ฃผ์ด์ผ ํฉ๋๋ค. (์ธ๋ถ์์ ๋ฐ๋ก ์ฃผ์ )
- ์๋น์ค ๊ณ์ธต์์๋ ๋ฆฌํฌ์งํ ๋ฆฌ ๊ณ์ธต์์ ์์ธ ๋ณํ๊ธฐ๋ฅผ ํ๊ณ ๋์ด์จ ์์ธ ์ถ์ํ๋ฅผ ์ด์ฉํด ์์ธ ๋ณต๊ตฌ ๋ก์ง์ ๊น๋ํ๊ฒ ์งค ์ ์๊ฒ ๋์์ต๋๋ค.
- ๋ฆฌํฌ์งํ ๋ฆฌ ๊ณ์ธต์์๋ ์์ธ ๋ณํ๊ธฐ๊ฐ ์ค๋ฅ์ฝ๋๋ฅผ ์์ธ ์ถ์ํ๋ก ์๋์ผ๋ก ๋ณ๊ฒฝ์์ผ์ฃผ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ ์ ์๋ ์์ธ๋ฅผ ์ผ์ผ์ด ์ค๋ฅ์ฝ๋๋ก ์ก์์ค ํ์๊ฐ ์๊ฒ ๋์์ต๋๋ค.
- ์ถ๊ฐ์ ์ผ๋ก ์ด์ ์๋น์ค ๊ณ์ธต์ ์์ธ ์ถ์ํ๋ฅผ ๋ฐ๊ธฐ ๋๋ฌธ์ ํน์ ๊ธฐ์ ์ ์ข ์์ ์ด์ง ์๊ณ ๊น๋ํ๊ฒ ์ ์งํ ์ ์๊ฒ ๋์์ต๋๋ค.
<์ฐธ๊ณ ์๋ฃ>
'๐ Backend > DB Access' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JdbcTemplate] RowMapper์ ๋ํด (0) | 2023.04.12 |
---|---|
[JdbcTemplate] JDBC Template ์ด๋? (0) | 2023.04.07 |
ErrorCode๋ฅผ ์ด์ฉํ ํน์ ์์ธ ๋ณต๊ตฌ (0) | 2023.04.07 |
ํธ๋์ญ์ AOP + ์์ธ ์ ํ ์ ์ฉํ Service ๊ณ์ธต ๋ถ๋ฆฌ (0) | 2023.04.06 |
Spring ํธ๋์ญ์ AOP - @Transactional ์ฌ์ฉ (0) | 2023.04.05 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422