์ฒดํฌ ์์ธ ํ์ฉ
๊ธฐ๋ณธ ์์น์ ๋ค์ 2๊ฐ์ง๋ฅผ ๊ธฐ์ตํ์.
1. ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ์ฒดํฌ(๋ฐํ์) ์์ธ๋ฅผ ์ฌ์ฉํ์.
2. ์ฒดํฌ ์์ธ๋ ๋น์ฆ๋์ค ๋ก์ง์ ์๋์ ์ผ๋ก ๋์ง๋ ์์ธ์๋ง ์ฌ์ฉํ์.
์ด ๊ฒฝ์ฐ ํด๋น ์์ธ๋ฅผ ์ก์์ ๋ฐ๋์ ์ฒ๋ฆฌํด์ผ ํ๋ ๋ฌธ์ ์ผ ๋๋ง ์ฒดํฌ ์์ธ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
์๋ฅผ ๋ค์ด์ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ๊ฐ ์๋ค.
์ฒดํฌ ์์ธ ์)
- ๊ณ์ข ์ด์ฒด ์คํจ ์์ธ
๊ฒฐ์ ์ ํฌ์ธํธ ๋ถ์กฑ ์์ธ - ๋ก๊ทธ์ธ ID, PW ๋ถ์ผ์น ์์ธ
๋ฌผ๋ก ์ด ๊ฒฝ์ฐ์๋ 100% ์ฒดํฌ ์์ธ๋ก ๋ง๋ค์ด์ผ ํ๋ ๊ฒ์ ์๋๋ค.
๋ค๋ง ๊ณ์ข ์ด์ฒด ์คํจ์ฒ๋ผ ๋งค์ฐ ์ฌ๊ฐํ ๋ฌธ์ ๋ ๊ฐ๋ฐ์๊ฐ ์ค์๋ก ์์ธ๋ฅผ ๋์น๋ฉด ์๋๋ค๊ณ ํ๋จํ ์ ์๋ค.
์ด ๊ฒฝ์ฐ ์ฒดํฌ ์์ธ๋ก ๋ง๋ค์ด ๋๋ฉด ์ปดํ์ผ๋ฌ๋ฅผ ํตํด ๋์น ์์ธ๋ฅผ ์ธ์งํ ์ ์๋ค.
์ฒดํฌ ์์ธ์ ๋ฌธ์ ์
์ฒดํฌ ์์ธ๋ ์ปดํ์ผ๋ฌ๊ฐ ์์ธ ๋๋ฝ์ ์ฒดํฌํด์ฃผ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๊ฐ ์ค์๋ก ์์ธ๋ฅผ ๋์น๋ ๊ฒ์ ๋ง์์ค๋ค.
์ฒดํฌ ์์ธ๊ฐ ๋ฐํ์ ์์ธ๋ณด๋ค ๋ ์์ ํ๊ณ ์ข์๋ณด์ด๋๋ฐ, ์ ์ฒดํฌ ์์ธ๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฌธ์ ๊ฐ ๋ ๊น?

static class NetworkClient {
public void call() throws ConnectException {
throw new ConnectException("์ฐ๊ฒฐ ์คํจ");
}
}
static class Repository {
public void call() throws SQLException {
throw new SQLException("ex");
}
}
๋ ๊ณณ์์ ์ฌ๋ผ์ค๋ ์ฒดํฌ ์์ธ์ธ SQLException ๊ณผ ConnectException ์ ์ฒ๋ฆฌํด์ผ ํ๋ค.
static class Service {
Repository repository = new Repository();
NetworkClient networkClient = new NetworkClient();
public void logic() throws SQLException, ConnectException {
repository.call();
networkClient.call();
}
}
์๋น์ค๋ SQLException ๊ณผ ConnectException ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ผ๋ฏ๋ก ๋๋ค ๋ฐ์ผ๋ก ๋์ง๋ค.
static class controller {
Service service = new Service();
public void request() throws SQLException, ConnectException {
service.logic();
}
}
์ปจํธ๋กค๋ฌ๋ ๋ ์์ธ๋ฅผ ์ฒ๋ฆฌํ ๋ฐฉ๋ฒ์ด ์๋ค.
์น ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ผ๋ฉด ์๋ธ๋ฆฟ์ ์ค๋ฅ ํ์ด์ง๋,
๋๋ ์คํ๋ง MVC๊ฐ ์ ๊ณตํ๋ ControllerAdvice ์์ ์ด๋ฐ ์์ธ๋ฅผ ๊ณตํต์ผ๋ก ์ฒ๋ฆฌํ๋ค.
์ง๊ธ๊น์ง ์ค๋ช ํ ์์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ํฌ๊ฒ 2๊ฐ์ง ๋ฌธ์ ๋ฅผ ์ ์ ์๋ค.
1. ๋ณต๊ตฌ ๋ถ๊ฐ๋ฅํ ์์ธ
๋๋ถ๋ถ์ ์์ธ๋ ๋ณต๊ตฌ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค. ์ผ๋ถ ๋ณต๊ตฌ๊ฐ ๊ฐ๋ฅํ ์์ธ๋ ์์ง๋ง ์์ฃผ ์ ๋ค.
๋ฐ๋ผ์ ์ด๋ฐ ๋ฌธ์ ๋ค์ ์ผ๊ด์ฑ ์๊ฒ ๊ณตํต์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค
์คํ๋ง์ ControllerAdvice ๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฐ ๋ถ๋ถ์ ๊น๋ํ๊ฒ ๊ณตํต์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
2. ์์กด ๊ด๊ณ์ ๋ํ ๋ฌธ์
์ฒดํฌ ์์ธ์ ๋ ๋ค๋ฅธ ์ฌ๊ฐํ ๋ฌธ์ ๋ ์์ธ์ ๋ํ ์์กด ๊ด๊ณ ๋ฌธ์ ์ด๋ค.

์๋น์ค, ์ปจํธ๋กค๋ฌ์์ java.sql.SQLException ์ ์์กด
ํฅํ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ JDBC ๊ธฐ์ ์ด ์๋ ๋ค๋ฅธ ๊ธฐ์ ๋ก ๋ณ๊ฒฝํ๋ค๋ฉด ์์ธ๋ ํจ๊ป ๋ณ๊ฒฝํด์ผํ๋ค.
SQLException ์ ์์กดํ๋ ๋ชจ๋ ์๋น์ค, ์ปจํธ๋กค๋ฌ์ ์ฝ๋๋ฅผ JPAException ์ ์์กดํ๋๋ก ๊ณ ์ณ์ผ ํ๋ค.
์ธ์ฒดํฌ ์์ธ ํ์ฉ

SQLException ์ ๋ฐํ์ ์์ธ์ธ RuntimeSQLException ์ผ๋ก ๋ณํํ๋ค.
๋ฐํ์ ์์ธ์ด๊ธฐ ๋๋ฌธ์ ์๋น์ค, ์ปจํธ๋กค๋ฌ๋ ํด๋น ์์ธ๋ค์ ์ฒ๋ฆฌํ ์ ์๋ค๋ฉด ๋ณ๋์ ์ ์ธ ์์ด ๊ทธ๋ฅ ๋๋ฉด ๋๋ค
public void runSQL() throws SQLException {
throw new SQLException("ex");
}
๋ฆฌํฌ์งํ ๋ฆฌ์์ ์ฒดํฌ ์์ธ์ธ SQLException ์ด ๋ฐ์
static class Repository {
public void call(){
try {
runSQL();
} catch (SQLException e) {
throw new RuntimeSQLException(e);
}
}
๋ฐํ์ ์์ธ์ธ RuntimeSQLException ์ผ๋ก ์ ํํด์ ์์ธ๋ฅผ ๋์ง๋ค.
public void request() {
service.logic();
}
public void logic() {
repository.call();
networkClient.call();
}
๋ฐํ์ ์์ธ์ด๊ธฐ ๋๋ฌธ์ ์ปจํธ๋กค๋ฌ๋ ์๋น์ค๊ฐ ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค๋ฉด
throws RuntimeSQLException, RuntimeConnectException ์๋ตํ ์ ์๋ค.
๋ฐ๋ผ์ ์ปจํธ๋กค๋ฌ์ ์๋น์ค์์ ํด๋น ์์ธ์ ๋ํ ์์กด ๊ด๊ณ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
๋ฐํ์ ์์ธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๊ฐ์ ๊ธฐ์ ์ด ๋ณ๊ฒฝ๋์ด๋
ํด๋น ์์ธ๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ปจํธ๋กค๋ฌ, ์๋น์ค์์๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์์๋ ๋๋ค.
๊ตฌํ ๊ธฐ์ ์ด ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ, ์์ธ๋ฅผ ๊ณตํต์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ณณ์์๋ ์์ธ์ ๋ฐ๋ฅธ ๋ค๋ฅธ ์ฒ๋ฆฌ๊ฐ ํ์ํ ์ ์๋ค.
ํ์ง๋ง ๊ณตํต ์ฒ๋ฆฌํ๋ ํ๊ณณ๋ง ๋ณ๊ฒฝํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ๋ณ๊ฒฝ์ ์ํฅ ๋ฒ์๋ ์ต์ํ ๋๋ค.
์ ๋ฆฌ
๋ฐํ์ ์์ธ๋ ๋์น ์ ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ํ๊ฐ ์ค์ํ๋ค.
๋๋ ์ฝ๋์ throws ๋ฐํ์์์ธ ์ ๋จ๊ฒจ์ ์ค์ํ ์์ธ๋ฅผ ์ธ์งํ ์ ์๊ฒ ํด์ค๋ค.
๋ฐํ์ ์์ธ๋ throws ์ ์ ์ธํ ์ ์๋ค.
๋ฌผ๋ก ์ปจํธ๋กค๋ฌ๋ ์๋น์ค์์ RuntimeException์ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ๋ฌด์ํด๋ ๋๋ค.
์์ธ ํฌํจ๊ณผ ์คํ ํธ๋ ์ด์ค
์์ธ๋ฅผ ์ ํํ ๋๋ ๊ผญ! ๊ธฐ์กด ์์ธ๋ฅผ ํฌํจํด์ผ ํ๋ค.
๊ทธ๋ ์ง ์์ผ๋ฉด ์คํ ํธ๋ ์ด์ค๋ฅผ ํ์ธํ ๋ ์ฌ๊ฐํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
@Test
void printEx() {
controller controller = new controller();
try {
controller.request();
} catch (Exception e) {
log.info("ex", e);
}
}
๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ ๋ ๋ง์ง๋ง ํ๋ผ๋ฏธํฐ์ ์์ธ๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋ก๊ทธ์ ์คํ ํธ๋ ์ด์ค๋ฅผ ์ถ๋ ฅํ ์ ์๋ค.
cf) ์คํ ํธ๋ ์ด์ค(stack trace)
์คํ ํธ๋ ์ด์ค(stack trace)๋ ํ๋ก๊ทธ๋จ์์ ์์ธ(exception)๊ฐ ๋ฐ์ํ์ ๋,
ํด๋น ์์ธ๊ฐ ๋ฐ์ํ ์ง์ ๋ถํฐ ํธ์ถ๋ ๋ฉ์๋๋ค์ ํธ์ถ ์คํ(call stack) ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก, ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ํด๋น ์์ธ๋ฅผ ์ฒ๋ฆฌํ catch ๋ฌธ์ด ์๋ ๊ณณ์ผ๋ก ์์ธ๊ฐ ์ ๋ฌ๋ฉ๋๋ค.
์ด๋ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฉ์๋์ ํธ์ถ ์คํ๊ณผ ํจ๊ป ์์ธ ๊ฐ์ฒด์ ๋ํ ์ ๋ณด๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
์คํ ํธ๋ ์ด์ค๋ ํ๋ก๊ทธ๋จ์ ๋๋ฒ๊น ์ด๋ ์์ธ ์ฒ๋ฆฌ์ ์ ์ฉํฉ๋๋ค.
์์ธ๊ฐ ๋ฐ์ํ ์ง์ ๊ณผ ํธ์ถ๋ ๋ฉ์๋๋ค์ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ฌ, ์์ธ๊ฐ ๋ฐ์ํ ์์ธ์ ํ์ ํ๋๋ฐ ๋์์ด ๋ฉ๋๋ค.
๋ํ, ์คํ ํธ๋ ์ด์ค๋ฅผ ๋ก๊ทธ์ ๋จ๊ฒจ๋๋ฉด, ํ๋ก๊ทธ๋จ ์ฌ์ฉ์๋ค์ด ๋ฐ์ํ ์์ธ๋ฅผ ๋ณด๊ณ ๊ฐ๋ฐ์์๊ฒ ๋ณด๊ณ ํ๊ธฐ ์ฌ์์ง๊ธฐ๋ ํฉ๋๋ค.
๊ธฐ์กด ์์ธ๋ฅผ ํฌํจํ๋ ๊ฒฝ์ฐ
public void call() {
try {
runSQL();
} catch (SQLException e) {
throw new RuntimeSQLException(e); // ๊ธฐ์กด ์์ธ(e) ํฌํจ
}
}
์์ธ๋ฅผ ํฌํจํด์ ๊ธฐ์กด์ ๋ฐ์ํ java.sql.SQLException ๊ณผ ์คํ ํธ๋ ์ด์ค๋ฅผ ํ์ธํ ์ ์๋ค.
๊ธฐ์กด ์์ธ๋ฅผ ํฌํจํ์ง ์๋ ๊ฒฝ์ฐ
public void call() {
try {
runSQL();
} catch (SQLException e) {
throw new RuntimeSQLException(); // ๊ธฐ์กด ์์ธ(e) ์ ์ธ
}
}
์์ธ๋ฅผ ํฌํจํ์ง ์์์ ๊ธฐ์กด์ ๋ฐ์ํ java.sql.SQLException ๊ณผ ์คํ ํธ๋ ์ด์ค๋ฅผ ํ์ธํ ์ ์๋ค.
๋ณํํ RuntimeSQLException ๋ถํฐ ์์ธ๋ฅผ ํ์ธํ ์ ์๋ค.
๋ง์ฝ ์ค์ DB์ ์ฐ๋ํ๋ค๋ฉด DB์์ ๋ฐ์ํ ์์ธ๋ฅผ ํ์ธํ ์ ์๋ ์ฌ๊ฐํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
์์ธ๋ฅผ ์ ํํ ๋๋ ๊ผญ! ๊ธฐ์กด ์์ธ๋ฅผ ํฌํจํ์
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1/dashboard
์คํ๋ง DB 1ํธ - ๋ฐ์ดํฐ ์ ๊ทผ ํต์ฌ ์๋ฆฌ - ์ธํ๋ฐ | ๊ฐ์
๋ฐฑ์๋ ๊ฐ๋ฐ์ ํ์ํ DB ๋ฐ์ดํฐ ์ ๊ทผ ๊ธฐ์ ์ ๊ธฐ์ด๋ถํฐ ์ดํดํ๊ณ , ์์ฑํ ์ ์์ต๋๋ค. ์คํ๋ง DB ์ ๊ทผ ๊ธฐ์ ์ ์๋ฆฌ์ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ณ , ๋ ๊น์ด์๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์๋ก ์ฑ์ฅํ ์ ์์ต๋๋ค., - ๊ฐ์
www.inflearn.com
'Spring > Spring DB' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์คํ๋ง DB 1ํธ] - 15. ์คํ๋ง ์์ธ ์ถ์ํ ์ดํด (0) | 2023.03.31 |
---|---|
[์คํ๋ง DB 1ํธ] - 14. ์คํ๋ง ์์ธ ์ฒ๋ฆฌ (0) | 2023.03.30 |
[์คํ๋ง DB 1ํธ] - 12. ์์ธ(Exception)์ ์ดํด / ์ฒดํฌ,์ธ์ฒดํฌ ์์ธ (0) | 2023.03.29 |
[์คํ๋ง DB 1ํธ] - 11. ์คํ๋ง ๋ถํธ์ ์๋ ๋ฆฌ์์ค ๋ฑ๋ก (0) | 2023.03.25 |
[์คํ๋ง DB 1ํธ] - 10. ํธ๋์ญ์ AOP / @Transactional (0) | 2023.03.25 |