์์ธ ์ฒ๋ฆฌ์ ๋ค์ํ ๋ฐฉ๋ฒ
by JiwonDev๊ฐ๋ฐ์๊ฐ ๊ฐ์ฅ ์ ๊ฒฝ์ฐ๊ธฐ ๊ท์ฐฎ์ ์์ญ, ์์ธ์ฒ๋ฆฌ์ ๋ํด ์์๋ณด์.
# ์์ธ ์ข ๋ฅ์ ํน์ง
2021.07.07 - [Backend/Java] - #7 Exception (์์ธ์ฒ๋ฆฌ)
- Error
์๋ฐ ํ๋ก๊ทธ๋จ ๋ฐ์์ ๋ฐ์ํ ์์ธ. ํ๋ก์ธ์ค์ ์ํฅ, ๋ ์ด์ ์คํ ๋ถ๊ฐ๋ฅ
๋ณดํต ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ๊ฑฐ๋ ๊ฐ์๋จธ์ ์์ฒด์ ๋ฌธ์ ๋ก ์ฑ ์์์ ์์ธ์ฒ๋ฆฌ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค.
=> ์ ๊ฒฝ์ฐ์ง๋ง์, ๊ฐ๋ฐ์์ ์์ญ์ด ์๋๋ค - Runtime Exception (= unchecked Exception)
๋ฐํ์์์ ๋ฐ์ํ ์์ธ. ์ปดํ์ผ ๋จ๊ณ์์ ํ์ธํ ์ ์์ด unchecked๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค.
=> ์์ธ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ ํ์ง ์๋๋ค. ํผํ ์ ์์ง๋ง ๋ถ์ฃผ์๋ก ์ธํด ๋ฐ์ํ ์ ์๋ค. - Checked Exception
์ปดํ์ผ ๋จ๊ณ์์ ํ์ธ ๊ฐ๋ฅํ ์์ธ๋ค.
=> catch๋ฅผ ์ก๋ ์ง, throws๋ก ๋ค์ ๋์ง๋์ง ๋ฐ๋์ ์ก์์ ์ฒ๋ฆฌํ์!
# ์์ธ ๋ธ๋ํ
try {
...
} catch (Exception e) {
// ์๋ฌด์ผ๋ ํ์ง ์๋๋ค. ํ๋ก๊ทธ๋จ๋ง ์๋ฉ์ถ๋ฉด ๋๋๊ฑฐ์ง! ์!
}
...
}catch (SQLException e){
System.out.println(e); // ์ฝ...์?
e.printStackTrace(); // ์ด๊ฑด ์ฌ์ฉํ๋ฉด ์๋๋ ๋ฉ์๋์ด๋ค!
}
- Thread-Safetyํ์ง ์์ ์ฝ๋์ด๋ค
- ์ฝ์ IO๋ฅผ ์ด์ฉํ๋ฉด ๋จ์ํ ์คํธ, ๋ ๋ฆฝ์ ์ธ ํ ์คํธ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค.
- ์ฝ์ IO๋ ๋น์ฉ์ด ๋น์ธ๊ณ , ๋ฆฌ๋ค์ด๋ ์ ๋ ์ ์์ผ๋ฉฐ, ๋ณด์์ ์ข์ง ์๋ค.
๊ทธ๋๋ง ์ด๊ฑด ์ํธํ ํธ์ด๋ค. ์ฌํ ๊ฒฝ์ฐ throws๋ก ๋ฌด์ฑ ์ํ๊ฒ ๋ค ๋์ ธ๋ฒ๋ฆฌ๋ ์ต๊ด์ ๊ฐ์ง ๊ฐ๋ฐ์๋ ์๋ค.
// ์ ๋ชฐ๋ผ~ ๋๊ฐ ์์์ ์ฒ๋ฆฌํ์ธ์. ๋ ์์ธ ๋ฌด์ํ ๋๋ค
public void method1() throws Exception {
method2();
}
public void method2() throws Exception {
method3();
}
public void method2() throws Exception {
...
}
# ๋ค์ํ ์์ธ ์ฒ๋ฆฌ๋ฐฉ๋ฒ
- ์์ธ ๋ณต๊ตฌ
๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ ์ ์ ์ํ๋ก ๋๋ ค๋๊ธฐ - ์์ธ ์ฒ๋ฆฌ ํํผ
์์ธ๋ฅผ ์์ ์ด ๋ด๋นํ์ง ์๊ณ , ์์ ์ ํธ์ถํ ์ชฝ์ผ๋ก ๋์ ธ๋ฒ๋ฆฌ๋ ๊ฒ(throws)
- ๋ฌด์๋ฏธํ๊ฒ, ๋ฌด์ฑ ์ํ๊ฒ ๋์ง๋ ๊ฒ์ด ์๋๋ค. ์ญํ ์ ๋ฐ๋ฅธ ๋ถ๋ด์ด๋ค. - ์์ธ ์ ํ
์์ธ๋ฅผ ๋ฐ์ผ๋ก ๋์ง๋ค๋ ๊ฒ์ ํํผ์ ๋น์ทํ์ง๋ง, ๊ทธ๋๋ก ๋๊ธฐ์ง ์๊ณ ์ ์ ํ ์์ธ๋ก ์ ํํด์ ๋์ง.
- ๋ก์ฐ ๋ ๋ฒจ์์ ๋ฐ์ํ ์์ธ๋ฅผ ์๋น์ค ๊ณ์ธต์์ ์๋ฏธ๋ฅผ ๋ถ๋ช ํ๊ฒ ํ๊ธฐ ์ํด (์ถ์ํ๋ ์์ธ๋ก ๋ง๋ฌ.)
- ์์ธ ์ฒ๋ฆฌ๋ฅผ ๋จ์ํ๊ฒ ํ๊ธฐ ์ํด ํฌ์ฅ
DAO ์์ ๋ฐ์ํ SQLException์ด ์น ์ปจํธ๋กค๋ฌ ๋ฉ์๋๊น์ง ์๋ฏธ์๊ฒ ์ ๋ฌ๋๋ค ํด์ ๋ฌด์จ ์์ฉ์ด ์์๊น? ๋ฐ๋๋ก ์น ์ปจํธ๋กค๋ฌ ๋ฉ์๋์ throws SQLException์ด ๋ฌ๋ ค์์ผ๋ฉด ์ด๋ฅผ ๋๋์ฒด ์ด๋ป๊ฒ ํด์ํ๊ณ ์ฌ์ฉํด์ผํ ๊น? ์ด์ฒ๋ผ ์ค์ค๋ก ๋ณต๊ตฌ๊ฐ ๋ถ๊ฐ๋ฅํ ์์ธ๋ผ๋ฉด, ๋น ๋ฅด๊ฒ ๋ฐํ์ ์์ธ๋ก ํฌ์ฅํด์ ๋์ง๋ ๊ฒ์ด ๋ง๋ค. ๋ค๋ฅธ ๊ณ์ธต์ ๋ฉ์๋์์ ๋ถํ์ํ๊ฒ throws ์ ์ธ์ ๋ค์ด๊ฐ์ง ์๊ฒ ํด์ฃผ์.
- ์ดํ๋ฆฌ์ผ์ด์ ๋ก์ง์ ์์ธ์กฐ๊ฑด์ด ๋ฐ๊ฒฌ๋๊ฑฐ๋ ์์ธ์ํฉ์ด ๋ฐ์ํ๋ค๋ฉด ์ฒดํฌ ์์ธ๋ฅผ ์ฌ์ฉํ๋๊ฒ์ด ์ ์ ํ๋ค. ์ ์ ํ ๋์์ด๋ ๋ณต๊ตฌ ์์ ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
- ํ์ง๋ง ์ด์ฐจํผ ๋ณต๊ตฌํ์ง ๋ชปํ ์์ธ๋ผ๋ฉด ๋ฐํ์ ์์ธ๋ก ํฌ์ฅํด์ ๋์ ธ๋ฒ๋ ค์ ๊ด๋ฆฌ์(์์ธ์ฒ๋ฆฌ ์๋น์ค, ๋ก๊ทธ ๊ฐ์ฒด)์๊ฒ ์๋ฆฌ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค.
# ๋ฐํ์ ์์ธ์ ๋ณดํธํ
์๋ฐ ํ๊ฒฝ์ด ์๋ฒ๋ก ์ด๋ํ๋ฉด์, ์ฒดํฌ ์์ธ์ ํ์ฉ๋์ ๊ฐ์น๋ ์ ์ ๋จ์ด์ง๊ณ ์๋ค. ์์ ์๋ ๋ณต๊ตฌํ ๊ฐ๋ฅ์ฑ์ด ์กฐ๊ธ์ด๋ผ๋ ์๋ค๋ฉด ์ฒดํฌ ์์ธ๋ก ๋ง๋ค์๋๋ฐ, ์ง๊ธ์ 100% ๋ณต๊ตฌํ ์ ์๋ ์์ธ๊ฐ ์๋๋ผ๋ฉด ๋ฐํ์(์ธ์ฒดํฌ)์์ธ๋ก ๋ง๋๋ ๊ฒฝํฅ์ด์๋ค.
sda
์๋ฐ๊ฐ ์ฒ์ ๋ง๋ค์ด์ง ๋ ์ฌ์ฉ๋๋ ์ ํ๋ฆฟ, AWT, Swing ๊ฐ์ ๋ ๋ฆฝํ ํ๋ก๊ทธ๋จ์์๋ ํต์ ๋ถ๊ฐ๋ฅํ ์์คํ ์์ธ๋ผ๊ณ ํ ์ง๋ผ๋ ์์ ์ด ์ค๋จ๋์ง ์๊ฒ ๋ณต๊ตฌํด์ผํ๋ค. ์ง๊ธ ์คํ์ค์ธ ํ๋ก๊ทธ๋จ์ด ์ฌ์ฉ์ ํ์ผ์ ์ฐพ์ ์ ์๋ค๊ณ ์ข ๋ฃ์์ผ๋ฒ๋ฆด ์ ์์ผ๋๊น ๋ง์ด๋ค.
ํ์ง๋ง ์๋ฐ ์๋ฒํ๊ฒฝ์ ๋ค๋ฅด๋ค. ์๋ง์ ์ฌ์ฉ์๊ฐ ๋์์ ์์ฒญ์ ๋ณด๋ด๊ณ ๊ฐ ์์ฒญ์ ๋ ๋ฆฝ์ ์ธ ์์ ์ผ๋ก ์ทจ๊ธ๋๋ค. ํ๋์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์ค ์์ธ๊ฐ ๋ฐ์ํ๋ฉด, ์์ ์ ์ค๋จ์ํค๋ฉด ๊ทธ๋ง์ด๋ค. ๋ง์ฝ ํ๋ก๊ทธ๋จ ์์ฒด์ ์ค๋ฅ์ด๊ฑฐ๋ ์ธ๋ถ ํ๊ฒฝ์ผ๋ก ์ธํด ์์ธ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ๋ผ๊ณ ํ๋๋ผ๋ ์์ ์ ์ทจ์ํ๊ณ ์๋ฒ ๊ด๋ฆฌ์๋ ๊ฐ๋ฐ์์๊ฒ ํต๋ณดํด์ฃผ๋ ํธ์ด ๋ ๋ซ๋ค.
# ์ดํ๋ฆฌ์ผ์ด์ ์์ธ
๋ฐ๋ฉด์ ์์คํ ๋๋ ์ธ๋ถ์ํฉ์ด ์์ธ์ด ์๋๋ผ, ์ดํ๋ฆฌ์ผ์ด์ ๋ก์ง์ ์ํด ์๋์ ์ผ๋ก ๋ฐ์์ํค๊ณ ๋ฐ๋์ catchํด์ผํ๋ ์์ธ๋ ์๋ค. ์ด๋ฅผ ๋ณดํต ์ดํ๋ฆฌ์ผ์ด์ ์์ธ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์๋ฅผ ๋ค์ด ์ฌ์ฉ์๊ฐ ์์ฒญํ ๊ธ์ก์ ์ํ๊ณ์ข์์ ์ถ๊ธํ๋๊ธฐ๋ฅ์ ๊ฐ์ง ๋ฉ์๋๊ฐ ์๋ค๊ณ ์๊ฐํด๋ณด์. ๋ง์ฝ ํ์ฌ ์๊ณ ๋ฅผ ๋๋ ๊ธ์ก์ ์ถ๊ธํ๊ณ ์ ํ๋ค๋ฉด, ์์ ์ ์ค๋จ์ํค๊ณ ์ ์ ํ ์กฐ์น๋ฅผ ์ทจํด์ผ ํ ๊ฒ์ด๋ค.
- ์๊ณ ๋ถ์กฑ์ด ๋ฐ์ํ์ ๊ฒฝ์ฐ ๋ค๋ฅธ ๋ฆฌํด๊ฐ(-1)์ ๋ฐํํ๋ค.
- ์ผ๊ด๋ ์์ธ ์ํฉ์์, ๋ฐํ๊ฐ์ ๋ํ ์ ์ฑ ์ด ์๋ฒฝํ๊ฒ ๊ณต์ ๋์ด์ผํ๊ณ ๋ก์ง ํ๋ฆ์ด ๋ณต์กํด์ง๋ค. - ์ ์์ ์ธ ํ๋ฆ์ ๋ฐ๋ฅด๋ ์ฝ๋๋ ๊ทธ๋๋ก ๋๊ณ , ๋น์ฆ๋์ค์ ์ธ ์๋ฏธ๋ฅผ ๋ค ์์ธ๋ฅผ ๋์ง๋ค.
- ์ด๊ฒ ๋ฐ๋ก ์ดํ๋ฆฌ์ผ์ด์ ์์ธ์ด๋ค. ๊ฐ๋ฐ์์๊ฒ catch๋ฅผ ๊ฐ์ํ๋ค.
- ์๋ฅผ ๋ค์ด ์๊ณ ๋ถ์กฑ์ธ ๊ฒฝ์ฐ InsufficientBalanceException ๊ฐ์ด ์ถ์ํ ๋ ์์ธ๋ฅผ ๋์ง๋๋ก ์ค๊ณํ๋ค.
# DAO ๊ธฐ์ ์์ ์ถ์ํ๋ ์์ธ๋ฅผ ์ ๊ณตํ๋ ์ด์ ?
์์ธ ํฌ์ฅ ์์ - JdbcTemplate
SqlException( ์ฒดํฌ ์์ธ )๋ฅผ ํฌ์ฅํด์ DataAccessException( ๋ฐํ์ ์์ธ, ์ธ์ฒดํฌ )๋ก ์ถ์ํ๋ ์์ธ๋ก ํฌ์ฅํ๊ณ ์๋ค.
public<T> T execute(ConnectionCallback<T> action)throws DataAccessException{
Assert.notNull(action,"Callback object must not be null");
Connection con=DataSourceUtils.getConnection(obtainDataSource());
try{
Connection conToUse=createConnectionProxy(con);
return action.doInConnection(conToUse);
} catch(SQLException ex){ // ์ ์์ค์ด SQLException์ ํฌ์ฅ
String sql=getSql(action);
DataSourceUtils.releaseConnection(con,getDataSource());
con=null;
// ์์ธ๋ฅผ ํฌ์ฅํ ๋ ์ด๋ ๊ฒ ๊ธฐ์กด์ ์์ธ(ex)๋ฅผ ์ค์ฒฉํ๋๊ฒ ์ข๋ค.
throw translateException("ConnectionCallback",sql,ex);
} finally{
DataSourceUtils.releaseConnection(con,getDataSource());
}
}
์คํ๋ง์ด ์ ์ด๋ ๊ฒ DataAccessException ๊ฐ์ด ์ถ์ํ๋ ์์ธ๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉํ๋์ง ์๊ฐํด๋ณด์. ์์ธ๋ฅผ ํฌ์ฅํ์ฌ ์ถ์ํํจ์ผ๋ก์ ๋ฐ์ดํฐ ์์ธ์ค ๊ธฐ์ (SQLException)์ ์์กด์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ์ง ์๊ฒ ๋ง๋ค ์ ์๋ค.
public void add(User user) throws SQLException; //Jdbc api ๊ณ์ธต
public void add(User user) throws PersistentException; //JPA ๊ณ์ธต
public void add(User user) throws HibernateException; //Hibernate ๊ณ์ธต
# ์ ๋ฆฌ
- ์์ธ๋ฅผ ์ก์์ ์๋ฌด๋ฐ ์กฐ์ทจ๋ฅผ ์ทจํ์ง ์๊ฑฐ๋ ์๋ฏธ ์๋ throws ์ ์ธ์ ๋จ๋ฐํ๋ ๊ฒ์ ์ํํ๋ค.
- ์์ธ๋ ๋ณต๊ตฌํ๊ฑฐ๋, ์์ธ์ฒ๋ฆฌ ์ค๋ธ์ ํธ๋ก ์๋์ ์ผ๋ก ์ ๋ฌํ๊ฑฐ๋, ์ ์ ํ ์์ธ๋ก ์ ํํด์ผ ํ๋ค.
- ์ข ๋ ์๋ฏธ ์๋ ์์ธ๋ก ๋ณ๊ฒฝํ๊ฑฐ๋, ๋ถํ์ํ catch/throws๋ฅผ ํผํ๊ธฐ ์ํด ๋ฐํ์ ์์ธ๋ก ํฌ์ฅํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์์ธ ์ ํ์ด ์๋ค.
- ๋ณต๊ตฌํ ์ ์๋ ์์ธ๋ ๊ฐ๋ฅํ ๋นจ๋ฆฌ ๋ฐํ์ ์์ธ๋ก ์ ํํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ก์ง์ ๋ด๊ธฐ ์ํ ์์ธ๋ ์ฒดํฌ ์์ธ๋ก ๋ง๋ ๋ค.
- JDBC์ SQLException์ ๋๋ถ๋ถ ๋ณต๊ตฌํ ์ ์๋ ์์ธ์ด๋ฏ๋ก ๋ฐํ์ ์์ธ๋ก ํฌ์ฅํด์ผ ํ๋ค.
- SQLExcetion์ ์๋ฌ ์ฝ๋๋ DB์ ์ข ์๋๊ธฐ ๋๋ฌธ์ DB์ ๋ ๋ฆฝ์ ์ธ ์์ธ๋ก ์ ํ๋ ํ์๊ฐ ์๋ค.
- ์คํ๋ง์ DataAccessException์ ํตํด DB์ ๋ ๋ฆฝ์ ์ผ๋ก ์ ์ฉ ๊ฐ๋ฅํ ์ถ์ํ๋ ๋ฐํ์ ์์ธ ๊ณ์ธต์ ์ ๊ณตํ๋ค.
- DAO๋ฅผ ๋ฐ์ดํฐ ์์ธ์ค ๊ธฐ์ ์์ ๋ ๋ฆฝ์ํค๋ ค๋ฉด ์ธํฐํ์ด์ค ๋์ ๊ณผ ๋ฐํ์ ์์ธ ์ ํ, ๊ธฐ์ ์ ๋ ๋ฆฝ์ ์ธ ์ถ์ํ๋ ์์ธ๋ก ์ ํ์ด ํ์ํ๋ค.
'๐๊ธฐ๋ณธ ์ง์ > Java ๊ธฐ๋ณธ์ง์' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐ์ดํธ์ฝ๋ ์กฐ์(๋ฆฌํ๋ ์ , ๋ค์ด๋๋ฏน ํ๋ก์, ์ ๋ ธํ ์ด์ ํ๋ก์ธ์) (0) | 2021.08.17 |
---|---|
JVM์ ์๋ฆฌ์ ๋ฐ์ดํธ์ฝ๋ (0) | 2021.08.16 |
์๋ฐ์ ์ง๋ ฌํ(Serialization)๋? (0) | 2021.08.04 |
์๋ฐ ์ด๋ ธํ ์ด์ (@Annotation) (0) | 2021.08.03 |
ํ๋ก๊ทธ๋๋ฐ ์ํฐํจํด (Anti-pattern) (0) | 2021.08.02 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev