• 티스토리 홈
starryeye
  • 프로필사진
    starryeye
    • 분류 전체보기 (189)
      • C++ (17)
      • Java (24)
      • OOP (5)
      • Spring Reactive Stack (12)
        • Reactive Streams (3)
        • Netty (4)
        • Reactor (1)
        • Webflux (3)
        • DB, Cache 연동 (1)
      • Spring (90)
        • Core (17)
        • MVC (33)
        • Client (2)
        • Security (4)
        • DB, Cache 연동 (33)
      • DataBase (12)
        • RDBMS (2)
        • NoSQL (10)
      • Message Broker (6)
      • Web (4)
      • Network (4)
      • 대규모 시스템 설계 (15)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • JDBC 9
        2022년 07월 16일
        • starryeye
        • 작성자
        • 2022.07.16.오전01:51
        반응형

        직전 포스팅에서 repository layer에 특정 DB에 종속적인 코드가 들어가 버렸다.

        e.getErrorCode() == 23505

        해당 코드는 H2 한정이다..

         

        지금까지 특정 DB에 따른 코드 분리는 필요 없었지만..

        DataSource가 라이브러리에 등록된 DB 드라이버, DB접근 URL 및 부가정보(이름, 비밀번호 등)로

        알아서 커넥션 획득해줬기 때문..

         

        예외처리 때문에 코드 분리를 하거나.. 코드가 지저분해질 위기에 처했다.

         

        해결..

        스프링은 이미 모든 DB에러 상황에 맞는 예외를 만들어 놨으며..

        -> 스프링 데이터 접근 예외(DataAccessException) 계층

        DB에 따른 error code들을 매핑하여, 동일한 원인일 경우 일관된 예외로 변환 가능하다.

        -> 스프링 예외 변환기(SQLExceptionTranslator)

        (DB에 따른 종속성을 피했지만.. 스프링 종속성은 생긴다..)

         

        스프링 데이터 접근 예외 추상화

        어떤 DB와 접근 기술(순수JDBC, JPA 등)에 에 종속적이지 않게 설계 되어있다.

        따라서 서비스 계층에도 사용 가능하다.

        -> 처리 가능한 예외 라면 서비스 계층에서 스프링이 제공하는 예외를 받아서 처리 하면 된다.

         

        스프링에서 제공하는 데이터 접근 예외 계층이다.

        데이터 접근 예외의 최상위 예외는 DataAccessException이다.

        모두 RuntimeException인 것을 알 수 있다.

        참고로..

        Transient : 재시도하면 성공 가능성이 있는 예외이다. (쿼리 타임아웃, 락 관련 오류)

        NonTransient : 재시도해도 성공할 수 없다. (문법 오류 등)

         

         

        sql-error-codes.xml 내용 중 일부이다.

        MySQL DB와 Oracle DB에서 동일하게 중복 키가 원인인 에러이지만,

        error code는  1062, 1로 상이하며,

        하지만.. duplicateKeyCodes로 동일한 프로퍼티로 처리 되며

        이는 DuplicateKeyCodes라는 예외로 일관성 있게 변환해 줄 수 있다.

        (변환기 인터페이스 : SQLExceptionTranslator )

         

        사용 예시..

        SQLExceptionTranslator의 구현체인

        SQLErrorCodeSQLExceptionTranslator를 생성자에서 만들고있다.

        어떤 DB를 사용하는지 알기 위해 dataSource를 생성자 파라미터로 들어간다.

         

        catch 구문에서

        SQLException을 잡아서 처리하는데..

        예외 변환기로 다른 DB가 적용되더라도 일관된 예외를 생성할 수 있도록 하였다.

        파라미터로는..

        1번 : 현재 어떤 작업인지..

        2번 : 수행한 sql

        3번 : 원본 예외

        가 들어간다.

         

         

        반응형

        'Spring > DB, Cache 연동' 카테고리의 다른 글

        JdbcTemplate 1  (0) 2022.08.09
        JDBC 10  (0) 2022.07.16
        JDBC 8  (0) 2022.07.16
        JDBC 7  (0) 2022.07.16
        JDBC 6  (0) 2022.07.13
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바

        개인정보

        • 티스토리 홈
        • 포럼
        • 로그인

        단축키

        내 블로그

        내 블로그 - 관리자 홈 전환
        Q
        Q
        새 글 쓰기
        W
        W

        블로그 게시글

        글 수정 (권한 있는 경우)
        E
        E
        댓글 영역으로 이동
        C
        C

        모든 영역

        이 페이지의 URL 복사
        S
        S
        맨 위로 이동
        T
        T
        티스토리 홈 이동
        H
        H
        단축키 안내
        Shift + /
        ⇧ + /

        * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.