관계형 데이터 베이스에서 항상 고민해줘야 하는 부분들에 대해 알아보자.. 조회와 쓰기는 성능 관점에서 모두가 좋아지도록 만들 수 없다.. 지금부터 하나 씩 알아보도록 하겠다. 1. 데이터베이스 정규화/비정규화 중복을 최소화하게 데이터를 구조화하는 프로세스를 정규화(Normalization)라고 한다. 비유를 통해 알아보겠다. 우리가 소설을 쓴다고 생각해보자.. [A 상황] 1. 주인공의 이름이 김찬호인 300 Page 에 달하는 소설을 다 썻다. 2. 그런데 갑자기 주인공 이름을 손인욱이라는 이름으로 변경해야 할 상황이 생겼다. 3. 그러면 우리는 하나하나 모든 주인공 이름이 적힌 곳을 찾아가서 변경해줘야 할 것이다. (툴의 도움을 받지 않는다고 가정) 이번엔 두번째 상황을 보자 [B 상황] 1. 주인공..
지금까지 내용으로는.. service 계층의 순수함이 유지 하게 되었고.. repository 계층에서는.. JDBC를 사용하기에.. 다른 메서드 임에도.. 동일한 반복코드가 많다.. 이를 해결해보자. 반복코드 1. 커넥션 조회, 커넥션 동기화 2. preparedStatement 생성 및 파라미터 바인딩 3. 쿼리 실행 4. 결과 바인딩 5. 예외 발생 시, 스프링 예외 변환기 실행 6. 리소스 종료 템플릿 콜백 패턴으로 해결 JdbcTemplate JdbcTemplate을 사용하면.. 위 반복코드가 대부분 사라지며, 커넥션 동기화, 스프링 예외 변환기도 자동으로 실행 해준다. 기본적으로 SQL Mapper 방식이다.
직전 포스팅에서 repository layer에 특정 DB에 종속적인 코드가 들어가 버렸다. e.getErrorCode() == 23505 해당 코드는 H2 한정이다.. 지금까지 특정 DB에 따른 코드 분리는 필요 없었지만.. DataSource가 라이브러리에 등록된 DB 드라이버, DB접근 URL 및 부가정보(이름, 비밀번호 등)로 알아서 커넥션 획득해줬기 때문.. 예외처리 때문에 코드 분리를 하거나.. 코드가 지저분해질 위기에 처했다. 해결.. 스프링은 이미 모든 DB에러 상황에 맞는 예외를 만들어 놨으며.. -> 스프링 데이터 접근 예외(DataAccessException) 계층 DB에 따른 error code들을 매핑하여, 동일한 원인일 경우 일관된 예외로 변환 가능하다. -> 스프링 예외 변환기..
복구가 가능한 예외는 어떻게 처리하면 좋을까.. 예를 들어서.. 키값이 중복이라 DB에서 예외를 던지는 경우를 생각해보자.. 개발자는 이를 애플리케이션 로직상 해결할 수 있다. (기존 키값에서 +1 정도로 해결하는 사양일 경우) DB에서는 SQLException을 발생시키고 던진다. 개발자는 중복 키에 의한 예외인 것을.. e.getErrorCode() 로 알 수 있다. 중복 키 처리에 대한 로직은 서비스 계층에 들어가야 하는데... 이를 처리하는 조건문을 위해 서비스 계층에 SQLException을 던지면 .. 또.. OCP 위반이다. 아래 방법을 참고 하자. repository에서 해결해보자.. repository 구현체 코드 중 일부이다. DB에서 발생된 SQLException 예외 중, 중복 ke..
https://starryeye.tistory.com/52 [Java 정리] 예외 Java의 예외에 대해 알아보자. java의 예외도 객체이다. 따라서 상속 구조를 가지며, 계층이 존재한다. Java 예외 계층 Throwable 최상위 예외이며 Object를 상속 받고있다. 개발자는 Throwable 예외를 catch starryeye.tistory.com 위 포스팅을 읽고 시작하자.. 지금까지의 포스팅에서 repository 구현체 layer 에서 사용할 DB를 연동하고.. 의존성을 가지는 것으로 볼 수 있다. 다음 두가지 문제에 대해 포스팅 하겠다. 1. 복구 불가능한 예외 2. 의존 관계에 대한 문제 복구 불가능한 예외 DB에서 발생하는 대부분의 예외는 처리가 불가능하다. SQLException을 ..
TransactionTemplate 템플릿 콜백 패턴을 사용하여 서비스 계층에서 Transaction을 사용함에 있어서 메서드마다 등장하는 코드를 줄일 수 있다. (repository 계층의 메서드 성공여부 try-catch에 따른 commit, rollback 코드가 없어짐) 하지만.. 서비스 계층에 비즈니스 로직만 순수하게 있는 상황은 아니다. 트랜잭션 AOP (선언적 트랜잭션 관리) 서비스 계층에 순수 비즈니스 로직만 남길 수 있다. @Transactional 어노테이션만 써주고.. 해당 비즈니스 로직만 구현하면 된다.. (스프링 부트에서 제공하기에.. 스프링 부트 종속성이 생김) 아래는 스프링이 트랜잭션 AOP를 적용하기 위해 스프링 컨테이너에 자동으로 등록하는 빈이다. 어드바이저 : BeanFa..
DataBase/RDBMS 2023. 4. 29. 20:41
관계형 데이터 베이스에서 항상 고민해줘야 하는 부분들에 대해 알아보자.. 조회와 쓰기는 성능 관점에서 모두가 좋아지도록 만들 수 없다.. 지금부터 하나 씩 알아보도록 하겠다. 1. 데이터베이스 정규화/비정규화 중복을 최소화하게 데이터를 구조화하는 프로세스를 정규화(Normalization)라고 한다. 비유를 통해 알아보겠다. 우리가 소설을 쓴다고 생각해보자.. [A 상황] 1. 주인공의 이름이 김찬호인 300 Page 에 달하는 소설을 다 썻다. 2. 그런데 갑자기 주인공 이름을 손인욱이라는 이름으로 변경해야 할 상황이 생겼다. 3. 그러면 우리는 하나하나 모든 주인공 이름이 적힌 곳을 찾아가서 변경해줘야 할 것이다. (툴의 도움을 받지 않는다고 가정) 이번엔 두번째 상황을 보자 [B 상황] 1. 주인공..
Spring/DB, Cache 연동 2022. 7. 16. 01:58
지금까지 내용으로는.. service 계층의 순수함이 유지 하게 되었고.. repository 계층에서는.. JDBC를 사용하기에.. 다른 메서드 임에도.. 동일한 반복코드가 많다.. 이를 해결해보자. 반복코드 1. 커넥션 조회, 커넥션 동기화 2. preparedStatement 생성 및 파라미터 바인딩 3. 쿼리 실행 4. 결과 바인딩 5. 예외 발생 시, 스프링 예외 변환기 실행 6. 리소스 종료 템플릿 콜백 패턴으로 해결 JdbcTemplate JdbcTemplate을 사용하면.. 위 반복코드가 대부분 사라지며, 커넥션 동기화, 스프링 예외 변환기도 자동으로 실행 해준다. 기본적으로 SQL Mapper 방식이다.
Spring/DB, Cache 연동 2022. 7. 16. 01:51
직전 포스팅에서 repository layer에 특정 DB에 종속적인 코드가 들어가 버렸다. e.getErrorCode() == 23505 해당 코드는 H2 한정이다.. 지금까지 특정 DB에 따른 코드 분리는 필요 없었지만.. DataSource가 라이브러리에 등록된 DB 드라이버, DB접근 URL 및 부가정보(이름, 비밀번호 등)로 알아서 커넥션 획득해줬기 때문.. 예외처리 때문에 코드 분리를 하거나.. 코드가 지저분해질 위기에 처했다. 해결.. 스프링은 이미 모든 DB에러 상황에 맞는 예외를 만들어 놨으며.. -> 스프링 데이터 접근 예외(DataAccessException) 계층 DB에 따른 error code들을 매핑하여, 동일한 원인일 경우 일관된 예외로 변환 가능하다. -> 스프링 예외 변환기..
Spring/DB, Cache 연동 2022. 7. 16. 00:41
복구가 가능한 예외는 어떻게 처리하면 좋을까.. 예를 들어서.. 키값이 중복이라 DB에서 예외를 던지는 경우를 생각해보자.. 개발자는 이를 애플리케이션 로직상 해결할 수 있다. (기존 키값에서 +1 정도로 해결하는 사양일 경우) DB에서는 SQLException을 발생시키고 던진다. 개발자는 중복 키에 의한 예외인 것을.. e.getErrorCode() 로 알 수 있다. 중복 키 처리에 대한 로직은 서비스 계층에 들어가야 하는데... 이를 처리하는 조건문을 위해 서비스 계층에 SQLException을 던지면 .. 또.. OCP 위반이다. 아래 방법을 참고 하자. repository에서 해결해보자.. repository 구현체 코드 중 일부이다. DB에서 발생된 SQLException 예외 중, 중복 ke..
Spring/DB, Cache 연동 2022. 7. 16. 00:11
https://starryeye.tistory.com/52 [Java 정리] 예외 Java의 예외에 대해 알아보자. java의 예외도 객체이다. 따라서 상속 구조를 가지며, 계층이 존재한다. Java 예외 계층 Throwable 최상위 예외이며 Object를 상속 받고있다. 개발자는 Throwable 예외를 catch starryeye.tistory.com 위 포스팅을 읽고 시작하자.. 지금까지의 포스팅에서 repository 구현체 layer 에서 사용할 DB를 연동하고.. 의존성을 가지는 것으로 볼 수 있다. 다음 두가지 문제에 대해 포스팅 하겠다. 1. 복구 불가능한 예외 2. 의존 관계에 대한 문제 복구 불가능한 예외 DB에서 발생하는 대부분의 예외는 처리가 불가능하다. SQLException을 ..
Spring/DB, Cache 연동 2022. 7. 13. 01:54
TransactionTemplate 템플릿 콜백 패턴을 사용하여 서비스 계층에서 Transaction을 사용함에 있어서 메서드마다 등장하는 코드를 줄일 수 있다. (repository 계층의 메서드 성공여부 try-catch에 따른 commit, rollback 코드가 없어짐) 하지만.. 서비스 계층에 비즈니스 로직만 순수하게 있는 상황은 아니다. 트랜잭션 AOP (선언적 트랜잭션 관리) 서비스 계층에 순수 비즈니스 로직만 남길 수 있다. @Transactional 어노테이션만 써주고.. 해당 비즈니스 로직만 구현하면 된다.. (스프링 부트에서 제공하기에.. 스프링 부트 종속성이 생김) 아래는 스프링이 트랜잭션 AOP를 적용하기 위해 스프링 컨테이너에 자동으로 등록하는 빈이다. 어드바이저 : BeanFa..