Database/DB 접근 기술(13)
-
트랜잭션과 격리수준, MVCC
몇 주 전 Real MySQL을 공부하며 정리했던 내용을 팀원들에게 공유한 적 있다. 오늘 들은 스프링 수업에서 이를 다루어서, 노션 페이지에 있는 포스팅을 블로그에 옮긴다. 트랜잭션 트랜잭션은 작업의 완전성을 보장해 준다. 논리적인 작업 셋을 모두 완벽하게 처리하거나, 처리하지 못 할 경우에는 원 상태로 복구해 작업의 일부만 적용되는 현상(Partial Update)이 발생하지 않게 만들어준다. 잠금과 트랜잭션은 비슷한 개념 같지만, 잠금은 동시성을 제어하는 기능이며 트랜잭션은 데이터 정합성을 보장 트랜잭션은 DBMS의 커넥션과 마찬가지로 최소의 코드에만 적용하는 것이 좋다. 트랜잭션의 범위를 최소화하라! 특히, 네트워크 작업 등 긴 시간이 걸리는 작업은 제외해야 한다. 메일 전송, 파일 전송 등 외부..
2022.11.12 -
[DB 접근 기술] 스프링과 문제 해결 - 예외 처리, 반복
체크 예외와 인터페이스 서비스 계층은 가급적이면 순수한 비즈니스 코드만 남겨놓는 것이 바람직하다. 하지만 DB 접근 기술이(예를 들면 JDBC의 SQLException) 리포지토리, 서비스, 컨트롤러에서 처리할 수 없는 체크예외를 던지는 경우라면 서비스, 컨트롤러는 해당 DB 접근 기술에 종속된다. 체크 예외는 메소드 선언에 throw가 필수로 선언되어야 하기 때문이다. 따라서 DB 접근 기술이 JPA로 변경되는 경우 throws SQLException을 다른 exception으로 변경해야 하는 수고가 있다. 우선 인터페이스를 도입해서 DB 접근 기술의 변경이 용이하도록 해보자. MemberRepository를 인터페이스로 지정하면, 서비스 계층은 MemberRepository 인터페이스에만 의존하면 된..
2022.07.05 -
[DB 접근 기술] 자바 예외 이해
스프링이 제공하는 예외 추상화를 알아보기 전에 자바의 기본 예외에 대해 간단히 설명한다. 예외 중 RuntimeException과 그 자손들을 언체크 예외(런타임 예외), 나머지 Exception의 자손들을 체크 예외라고 한다. 체크 예외는 컴파일러가 체크하는 예외이며, 언체크 예외는 컴파일러가 체크하지 않는 예외이다. 예외에 대해서는 2가지 기본 규칙이 존재한다. 1. 예외는 잡아서 처리하거나 던져야 한다. 2. 예외를 잡거나 던질때 지정한 예외뿐만 아니라 그 예외의 자손들도 함께 처리된다. - 예를 들어 Exception을 catch로 잡으면 그 하위 예외들도 모두 잡을 수 있다. 예외를 처리하지 못하고 계속 던지면, 자바의 main() 쓰레드는 예외 로그를 출력하면서 시스템이 종료된다. WAS는 해..
2022.05.29 -
[DB 접근 기술] 트랜잭션 (2)
트랜잭션 문제 해결 - 트랜잭션 템플릿 앞서 트랜잭션 매니저를 통해 트랜잭션 추상화, 리소스 동기화를 얻는데에는 성공했다. 그 덕에 서비스 코드는 이제 JDBC 기술에 의존하지 않으며 트랜잭션 동기화 매니저 덕분에 커넥션을 파라미터로 넘기지 않아도 된다. 하지만 트랜잭션을 사용하는 로직을 살펴보면 다음과 같은 패턴이 반복되는 것을 확인할 수 있다. 트랜잭션 사용 코드 //트랜잭션 시작 TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition()); try { //비즈니스 로직 bizLogic(fromId, toId, money); transactionManager.commit(status); /..
2022.05.28 -
[DB 접근 기술] 트랜잭션 (1)
애플리케이션 구조 여러가지 애플리케이션 구조가 있지만, 가장 단순하면서 많이 사용하는 방법은 역할에 따라 3가지 계층으로 나누는 것이다. 이 3개의 계층 중 핵심 비즈니스 로직이 들어있는 서비스 계층이 가장 중요하다고 가히 말 할 수 있다. 시간이 흘러서 UI(웹)와 관련된 부분이 변하고, 데이터 저장 기술을 다른 기술로 변경될 순 있어도, 비즈니스 로직은 최대한 변경없이 유지되어야 한다. 이렇게 하려면 서비스 계층을 특정 기술에 종속적이지 않게 개발해야 한다. --> 사실 계층을 나눈 이유도 서비스 계층을 순수하게 유지하기 위한 목적이 크다. 기술에 종속적인 부분은 프레젠테이션 계층, 데이터 접근 계층에서 가지고 간다. --> 예를 들어서 HTTP API 를 사용하다가 GRPC 같은 기술로 변경해도 프..
2022.05.28 -
[DB 접근 기술] DB 락
DB 락 - 개념 이해 세션1이 트랜잭션을 시작하고 데이터를 수정하는 동안 아직 커밋을 수행하지 않았는데, 세션2에서 동시에 같은 데이터를 수정하게 되면 여러가지 문제가 발생한다. 바로 트랜잭션의 원자성이 깨지는 것이다. 여기에 더해서 세션1이 중간에 롤백을 하게 되면 세션2는 잘못된 데이터를 수정하는 문제가 발생한다. 이런 문제를 방지하려면, 세션이 트랜잭션을 시작하고 데이터를 수정하는 동안에는 커밋이나 롤백 전까지 다른 세션에서 해당 데이터를 수정할 수 없게 막아야 한다. 데이터베이스는 이런 문제를 해결하기 위해 락(Lock)이라는 개념을 제공한다. 세션1은 트랜잭션을 시작한다. 세션1은 memberA 의 money 를 500으로 변경을 시도한다. 이때 해당 로우의 락을 먼저 획득해야 한다. 락이 남..
2022.05.27