Data Base
-
스프링 DB - 스프링과 문제 해결(트랜잭션)Data Base/스프링 DB 2023. 11. 27. 12:39
문제점들 어플리케이션 구조 여러가지 애플리케이션 구조가 있지만, 가장 단순하면서 많이 사용하는 방법은 역할에 따라 3가지 계층으로 나누는 것이다. 프레젠테이션 계층 UI와 관련된 처리 담당 웹 요청과 응답 사용자 요청을 검증 주 사용 기술 서블릿과 HTTP같은 웹기술, 스프링 MVC 서비스 계층 비지니스 로직을 담당 주 사용 기술: 가급적 특정 기술에 의존하지 않고, 순수 자바 코드로 작성 데이터 접근 계층 실제 데이터베이스에 접근하는 코드 주 사용 기술: JDBC, JPA, File, Redis, Mongo ... 순수한 서비스 계층 여기서 가장 중요한 곳은 어디일까? 바로 핵심 로직이 들어있는 서비스 계층이다. 시간이 흘러서 UI(웹)와 관련된 부분이 변하고, 데이터 저장 기술은 다른 기술로 변경해도..
-
스프링 DB - 트랜잭션 적용2Data Base/스프링 DB 2023. 11. 27. 11:06
트랜잭션 - 적용 이번에는 DB트랜잭션을 사용해서 앞서 발생한 문제점을 해결해보자 애플리케이션에서 트랜잭션을 어떤 계층에 걸어야 할까? 쉽게 이야기해서 트랜잭션을 어디에서 시작하고, 어디서에 커밋해야할까? 비지니스 로직과 트랜잭션 트랜잭션은 비지니스 로직이 있는 서비스 계층에서 시작해야 한다. 비지니스 로직이 잘못되면 해당 비지니스 로직으로 인해 문제가 되는 부분을 함께 롤백해야 하기 때문이다. 그런데 트랜잭션을 시작(set autocommit false)하려면 커넥션이 필요하다. 결국 서비스 계층에서 커넥션을 만들고, 트랜잭션 커밋 이후에 커넥션을 종료해야 한다. 애플리케이션에서 DB 트랜잭션을 사용하려면 *트랜잭션을 사용하는 동안 같은 커넥션을 유지*해야한다. 그래야 같은 세션을 사용할 수 있다. p..
-
스프링 DB - 트랜잭션 적용1Data Base/스프링 DB 2023. 11. 24. 17:23
트랜잭션 적용1 실제 애플리케이션에서 DB 트랜잭션을 사용해서 계좌이체 같이 원자성이 중요한 비지니스 로직을 어떻게 구현하는지 알아보자 먼저 트랜잭션 없이 단순하게 계좌이체 비지니스 로직만 구현해보자. MemberServiceV1 package hello.jdbc.service; import hello.jdbc.domain.Member; import hello.jdbc.repository.MemberRepositoryV1; import lombok.RequiredArgsConstructor; import java.sql.SQLException; @RequiredArgsConstructor public class MemberServiceV1 { private final MemberRepositoryV1 m..
-
스프링 DB - DB락 조회Data Base/스프링 DB 2023. 11. 24. 15:46
DB락 - 조회 일반적인 조회는 락을 사용하지 않는다. 데이터베이스마다 다르지만, 보통 데이터를 조회할 때는 락을 획득하지 않고 바로 데이터를 조회할 수 있다. 예를 들어 서 세션1이 락을 획득하고 데이터를 변경하고 있어도, 세션2에서 데이터를 조회 할 수 있다. 물론 세션2에서 조회가 아니라 데이터를 변경하려면 락이 필요하기 때문에 락이 돌아 올 때 까지 대기해야 한다. 조회와 락 데이터를 조회할 때도 락을 획득하고 싶을 때가 있다. 이럴 때는 select for update 구문을 사용하면 된다. 이렇게 하면 세션1이 조회 시점에 락을 가져가 버리기 때문에 다른 세션에서 해당 데이터를 변경할 수 없다. 물론 이경우도 커밋 명령어를 통해 트랜잭션을 끝내고 락을 반납한다. 조회 시점에 락이 필요한 경우는..
-
스프링 DB - DB락 개념 이해&실습Data Base/스프링 DB 2023. 11. 24. 14:31
DB락 - 개념 이해 세션1이 트랜잭션을 시작하고 데이터를 수정하는 동안 아직 커밋을 수행하지 않았는데, 세션2에서 동시에 같은 데이터를 수정하게 되면 여러가지 문제가 발생한다. 바로 트랜잭션의 원자성이 깨지는 것이다. 여기에 더해 세션1이 중간에 롤백을 하게 되면 세션2는 잘못된 데이터를 수정하는 문제가 발생한다. 이런 문제를 방지하려면 세션이 트랜잭션을 시작하고 데이터를 수정하는 동안에는 밋이나 롤백 전까지 다른 세션에서 해당 데이터를 수정할 수 없게 막아야한다. 기본 데이터 이력 - SQL set autocommit true; delete from member; insert into member(member_id, money) values('memberA',10000); 락0 세션1은 memberA..
-
스프링 DB - 트랜잭션 DB 예제(트랜잭션 실습)Data Base/스프링 DB 2023. 11. 24. 13:00
트랜잭션 - DB 예제(트랜잭션 실습) 1. 기본 데이터 입력 지금까지 설명한 예시를 직접 확인해보자. 먼저 H2 데이터베이스 웹 콘솔 창을 2개 열러두자. ❗주의 H2 데이터베이스 앱 콘솔 창을 2개 열때는 기존 URL을 복사하면 안된다. http://localhost:8002를 직접 입력해서 완전히 새로운 세션에서 연결하도록 하자. URL을 복사하면 같은 세션(jsessionId)에서 실행되어서 원하는 결과가 나오지 않을 수 있다. 예: http://localhost:8082 에 접근했을 때 다음과 같이 jessionid 값이 서로 달라야 한다. jsession값이 같으면 같은 세션에 접근하게 된다. 먼저 기본 데이터를 다음과 같이 맞추어 둔다. 데이터 초기화 SQL -- 데이터 초기화 set aut..
-
스프링 DB - 트랜잭션 DB 예제2(자동커밋, 수동커밋)Data Base/스프링 DB 2023. 11. 23. 16:46
트랜잭션 - DB예제 2 - 자동커밋, 수동 커밋 이전에 설명한 예제를 돌려보기 전에 먼저 자동 커밋, 수동 커밋에 대해 알아보자 예제에 사용되는 스키마는 다음과 같다. drop table member if exists cascade; create table member( member_id varchar(10), money integer not null default 0, primary key (member_id) ); 자동 커밋 트랜재션을 사용하려면 먼저 자동 커밋과 수동 커밋을 이해해야한다. 자동 커밋으로 설정하면 각각의 쿼리 실행 직후에 자동으로 커밋을 호출한다. 따라서 커밋이나 롤백을 직접 호출하지 않아도 되는 편리함이 있다. 하지만 쿼리를 하나하나 실행할 대 마다 자동으로 커밋이 되어버리기 때문..
-
스프링 DB - 데이터 페이스 연결 구조와 DB세션Data Base/스프링 DB 2023. 11. 23. 16:11
데이터베이스 연결 구조와 DB 세션 트랜잭션을 더 자세히 이해하기 위해 데이터베이스 서버 연결 구조와 DB세션에 대해 알아보자 데이터베이스 연결 구조1 사용자는 웹 어플리케이션 서버(WAS)나 DB접근 툴 같은 클라이언트를 사용해서 데이터베이스 서버에 접근할 수 있다. 클라이언트는 데이터베이스 서버에 연결을 요청하고 커넥션을 맺게 된다. 이때 데이터베이스 서버는 내부에 세션이라는 것을 만든다. 그리고 앞으로 해당 커넥션을 통한 요청은 이 세션을 통해서 실행하게 된다. 쉽게 이야기해서 개발자가 클라이언트를 통해 SQL을 전달하면 현재 커넥션에 연결된 세션이 SQL을 실행한다. 세션은 트랜잭션을 시작하고, 커밋 또는 롤백을 통해 트랜잭션을 종료한다. 그리고 이후에 새로운 트랜잭션을 다시 시작할 수 있다. 사..