Spring/스프링 DB 1편 - 데이터 접근 핵심 원리
-
[김영한 스프링] 25. 자바 예외 이해 - JDBC 반복 문제 해결(JdbcTemplate)Spring/스프링 DB 1편 - 데이터 접근 핵심 원리 2024. 1. 3. 04:39
JDBC 반복 문제 해결 - JdbcTemplate 지금까지 서비스 계층의 순수함을 유지하기 위해 수많은 노력을 했고, 덕분에 서비스 계층의 순수함을 유지하게 되었다. 이번에는 리포지토리에서 JDBC를 사용하기 때문에 발생하는 반복 문제를 해결해 보자. JDBC 반복 문제 커넥션 조회, 커넥션 동기화 PreparedStatement 생성 및 파라미터 바인딩 쿼리 실행 결과 바인딩 예외 발생 시 스프링 예외 변환기 실행 리소스 종료 리포지토리의 각각의 메서드를 살펴보면 상당히 많은 부분이 반복된다. 이런 반복을 효과적으로 처리하는 방법이 바로 템플릿 콜백 패턴이다. 스프링은 JDBC의 반복 문제를 해결하기 위해 JdbcTemplate이라는 템플릿을 제공한다. JdbcTemplate에 대한 자세한 사용법은 ..
-
[김영한 스프링] 24. 자바 예외 이해 - 스프링 예외 추상화Spring/스프링 DB 1편 - 데이터 접근 핵심 원리 2024. 1. 3. 04:20
스프링 예외 추상화 이해 스프링은 앞서 설명한 문제들을 해결하기 위해 데이터 접근과 관련된 예외를 추상화해서 제공한다. 스프링 데이터 접근 예외 계층 스프링은 데이터 접근 계층에 대한 수십 가지 예외를 정리해서 일관된 예외 계층을 제공한다. 각각의 예외는 특정 기술에 종속적이지 않게 설계되어 있다. 따라서 서비스 계층에서도 스프링이 제공하는 예외를 사용하면 된다. 예를 들어서 JDBC 기술을 사용하든, JPA 기술을 사용하든 스프링이 제공하는 예외를 사용하면 된다. JDBC나 JPA를 사용할 때 발생하는 예외를 스프링이 제공하는 예외로 변환해 주는 역할도 스프링이 제공한다. 참고로 그림을 단순화하기 위해 일부 계층을 생략했다. 예외의 최고 상위는 org.springframework.dao.DataAcce..
-
[김영한 스프링] 23. 자바 예외 이해 - 데이터 접근 예외 직접 만들기Spring/스프링 DB 1편 - 데이터 접근 핵심 원리 2024. 1. 2. 22:14
데이터 접근 예외 직접 만들기 데이터베이스 오류에 따라서 특정 예외는 복구하고 싶을 수 있다. 예를 들어서 회원 가입 시 DB에 이미 같은 ID가 있으면 ID 뒤에 숫자를 붙여서 새로운 ID를 만들어야 한다고 가정해 보자. ID를 hello라고 가입 시도 했는데, 이미 같은 아이디가 있으면 hello12345와 같이 뒤에 임의의 숫자를 붙여서 가입하는 것이다. 데이터를 DB에 저장할 때 같은 ID가 이미 데이터베이스에 저장되어 있다면, 데이터베이스는 오류 코드를 반환하고, 이 오류 코드를 받은 JDBC 드라이버는 SQLException을 던진다. 그리고 SQLException에는 데이터베이스가 제공하는 errorCode라는 것이 들어있다. 데이터베이스 오류 코드 그림 H2 데이터베이스의 키 중복 오류 코..
-
[김영한 스프링] 22. 자바 예외 이해 - 체크 예외와 인터페이스 & 런타임 예외 적용Spring/스프링 DB 1편 - 데이터 접근 핵심 원리 2024. 1. 2. 19:34
체크 예외와 인터페이스 서비스 계층은 가급적 특정 구현 기술에 의존하지 않고, 순수하게 유지하는 것이 좋다. 이렇게 하려면 예외에 대한 의존도 함께 해결해야 한다. 예를 들어서 서비스가 처리할 수 없는 SQLException에 대한 의존을 제거하려면 어떻게 해야 할까? 서비스가 처리할 수 없으므로 리포지토리가 던지는 SQLException 체크 예외를 런타임 예외로 전환해서 서비스 계층에 던지자. 이렇게 하면 서비스 계층이 해당 예외를 무시할 수 있기 때문에, 특정 구현 기술에 의존하는 부분을 제거하고 서비스 계층을 순수하게 유지할 수 있다. 지금부터 코드로 이 방법을 적용해 보자. 인터페이스 도입 먼저 MemberRepository 인터페이스도 도입해서 구현 기술을 쉽게 변경할 수 있게 해보자. 인터페..
-
[김영한 스프링] 21. 자바 예외 이해 - 예외 포함과 스택 트레이스Spring/스프링 DB 1편 - 데이터 접근 핵심 원리 2024. 1. 1. 03:31
예외 포함과 스택 트레이스 예외를 전환할 때는 꼭! 기존 예외를 포함해야 한다. 그렇지 않으면 스택 트레이스를 확인할 때 심각한 문제가 발생한다. package hello.jdbc.exception.basic; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import java.sql.SQLException; import static org.assertj.core.api.Assertions.assertThatThrownBy; @Slf4j public class UnCheckedAppTest { @Test void printEx() { Controller controller = new Controller(); try { contr..
-
[김영한 스프링] 20. 자바 예외 이해 - 체크, 언체크 예외 활용Spring/스프링 DB 1편 - 데이터 접근 핵심 원리 2024. 1. 1. 03:18
체크 예외 활용 그렇다면 언제 체크 예외를 사용하고 언제 언체크(런타임) 예외를 사용하면 좋을까? 기본 원칙은 다음 2가지를 기억하자. 기본적으로 언체크(런타임) 예외를 사용하자. 체크 예외는 비즈니스 로직상 의도적으로 던지는 예외에만 사용하자. 이 경우 해당 예외를 잡아서 반드시 처리해야 하는 문제일 때만 체크 예외를 사용해야 한다. 예를 들어서 다음과 같은 경우가 있다. 체크 예외 예) 계좌 이체 실패 예외 결제 시 포인트 부족 예외 로그인 ID, PW 불일치 예외 물론 이 경우에도 100% 체크 예외로 만들어야 하는 것은 아니다. 다만 계좌 이체 실패처럼 매우 심각한 문제는 개발자가 실수로 예외를 놓치면 안 된다고 판단할 수 있다. 이 경우 체크 예외로 만들어 두면 컴파일러를 통해 놓친 예외를 인지..
-
[김영한 스프링] 19. 자바 예외 이해 - 체크, 언체크 예외 기본 이해Spring/스프링 DB 1편 - 데이터 접근 핵심 원리 2023. 12. 30. 02:37
체크 예외 기본 이해 Exception과 그 하위 예외는 모두 컴파일러가 체크하는 체크 예외이다. 단 RuntimeException은 예외로 한다. 체크 예외는 잡아서 처리하거나, 또는 밖으로 던지도록 선언해야 한다. 그렇지 않으면 컴파일 오류가 발생한다. 체크 예외 전체 코드 - CheckedTest test/java/hello/jdbc/exception/basic/CheckedTest 생성 package hello.jdbc.exception.basic; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.*; @Slf4j public class Ch..
-
[김영한 스프링] 18. 자바 예외 이해 - 예외 계층 & 예외 기본 규칙Spring/스프링 DB 1편 - 데이터 접근 핵심 원리 2023. 12. 29. 16:01
예외 계층 스프링이 제공하는 예외 추상화를 이해하기 위해서는 먼저 자바 기본 예외에 대한 이해가 필요하다. 예외는 자바 언어의 기본 문법에 들어가기 때문에 대부분 아는 내용일 것이다. 예외의 기본 내용을 간단히 복습하고, 실무에 필요한 체크 예외와 언체크 예외의 차이와 활용 방안에 대해서도 알아보자. 예외 계층 예외 계층 그림 Object : 예외도 객체이다. 모든 객체의 최상위 부모는 Object이므로 예외의 최상위 부모도 Object이다. Throwable : 최상위 예외이다. 하위에 Exception과 Error가 있다. Error : 메모리 부족이나 심각한 시스템 오류와 같이 애플리케이션에서 복구 불가능한 시스템 예외이다. 애플리케이션 개발자는 이 예외를 잡으려고 해서는 안된다. 상위 예외를 ca..