전체 글
-
[김영한 스프링] 14. 스프링과 문제 해결(트랜잭션) - 트랜잭션 매니저Spring/스프링 DB 1편 - 데이터 접근 핵심 원리 2023. 12. 29. 03:14
트랜잭션 문제 해결 - 트랜잭션 매니저1 MemberRepositoryV3 package hello.jdbc.repository; import hello.jdbc.domain.Member; import lombok.extern.slf4j.Slf4j; import org.springframework.jdbc.datasource.DataSourceUtils; import org.springframework.jdbc.support.JdbcUtils; import javax.sql.DataSource; import java.sql.*; import java.util.NoSuchElementException; /** * 트랜잭션 - 트랜잭션 매니저 * DataSourceUtils.getConnection() * ..
-
[김영한 스프링] 13. 스프링과 문제 해결(트랜잭션) - 문제점들 & 추상화 & 동기화Spring/스프링 DB 1편 - 데이터 접근 핵심 원리 2023. 12. 29. 00:42
문제점들 애플리케이션 구조 여러 가지 애플리케이션 구조가 있지만, 가장 단순하면서 많이 사용하는 방법은 역할에 따라 3가지 계층으로 나누는 것이다. 프레젠테이션 계층 UI와 관련된 처리 담당 웹 요청과 응답 사용자 요청을 검증 주 사용 기술: 서블릿과 HTTP 같은 웹 기술, 스프링 MVC 서비스 계층 비즈니스 로직을 담당 주 사용 기술: 가급적 특정 기술에 의존하지 않고, 순수 자바 코드로 작성 데이터 접근 계층 실제 데이터베이스에 접근하는 코드 주 사용 기술: JDBC, JPA, File, Redis, Mongo ... 순수한 서비스 계층 여기서 가장 중요한 곳은 어디일까? 바로 핵심 비즈니스 로직이 들어있는 서비스 계층이다. 시간이 흘러서 UI(웹)와 관련된 부분이 변하고, 데이터 저장 기술을 다른..
-
[김영한 스프링] 12. 트랜잭션 이해 - 트랜잭션 적용Spring/스프링 DB 1편 - 데이터 접근 핵심 원리 2023. 12. 28. 23:23
트랜잭션 - 적용1 실제 애플리케이션에서 DB 트랜잭션을 사용해서 계좌이체 같이 원자성이 중요한 비즈니스 로직을 어떻게 구현하는지 알아보자. 먼저 트랜잭션 없이 단순하게 계좌이체 비즈니스 로직만 구현해보자. MemberServiceV1 main/java/hello/jdbc/service/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 M..
-
[김영한 스프링] 11. 트랜잭션 이해 - DB 락Spring/스프링 DB 1편 - 데이터 접근 핵심 원리 2023. 10. 19. 05:06
DB 락 - 개념 이해 세션1이 트랜잭션을 시작하고 데이터를 수정하는 동안 아직 커밋을 수행하지 않았는데, 세션2에서 동시에 같은 데이터를 수정하게 되면 여러 가지 문제가 발생한다. 바로 트랜잭션의 원자성이 깨지는 것이다. 여기에 더해서 세션1이 중간에 롤백을 하게 되면 세션2는 잘못된 데이터를 수정하는 문제가 발생한다. 이런 문제를 방지하려면, 세션이 트랜잭션을 시작하고 데이터를 수정하는 동안에는 커밋이나 롤백 전까지 다른 세션에서 해당 데이터를 수정할 수 없게 막아야 한다. 락0 세션1은 memberA의 금액을 500원으로 변경하고 싶고, 세션2는 같은 memberA의 금액을 1000원으로 변경하고 싶다. 데이터베이스는 이런 문제를 해결하기 위해 락(Lock)이라는 개념을 제공한다. 다음 예시를 통해..
-
[김영한 스프링] 10. 트랜잭션 이해 - 트랜잭션 DB 예제Spring/스프링 DB 1편 - 데이터 접근 핵심 원리 2023. 10. 19. 04:19
트랜잭션 - DB 예제1 - 개념 이해 트랜잭션 동작을 예제를 통해 확인해 보자. 이번 시간에는 먼저 트랜잭션의 동작 개념의 전체 그림을 이해하는데 집중하자. 다음 시간에는 실제 SQL을 실행하면서 실습해 보겠다. 참고로 지금부터 설명하는 내용은 트랜잭션 개념의 이해를 돕기 위해 예시로 설명하는 것이다. 구체적인 실제 구현 방식은 데이터베이스마다 다르다. 트랜잭션 사용법 데이터 변경 쿼리를 실행하고 데이터베이스에 그 결과를 반영하려면 커밋 명령어인 commit을 호출하고, 결과를 반영하고 싶지 않으면 롤백 명령어인 rollback을 호출하면 된다. 커밋을 호출하기 전까지는 임시로 데이터를 저장하는 것이다. 따라서 해당 트랜잭션을 시작한 세션(사용자)에게만 변경 데이터가 보이고 다른 세션(사용자)에게는 변..
-
[김영한 스프링] 09. 트랜잭션 이해 - 개념 이해 & 데이터베이스 연결 구조와 DB 세션Spring/스프링 DB 1편 - 데이터 접근 핵심 원리 2023. 10. 19. 02:14
트랜잭션 - 개념 이해 데이터를 저장할 때 단순히 파일에 저장해도 되는데, 데이터베이스에 저장하는 이유는 무엇일까? 여러 가지 이유가 있지만, 가장 대표적인 이유는 바로 데이터베이스는 트랜잭션이라는 개념을 지원하기 때문이다. 트랜잭션을 이름 그대로 번역하면 거래라는 뜻이다. 이것을 쉽게 풀어서 이야기하면, 데이터베이스에서 트랜잭션은 하나의 거래를 안전하게 처리하도록 보장해 주는 것을 뜻한다. 그런데 하나의 거래를 안전하게 처리하려면 생각보다 고려해야 할 점이 많다. 예를 들어서 A의 5000원을 B에게 계좌이체한다고 생각해 보자. A의 잔고를 5000원 감소하고, B의 잔고를 5000원 증가해야 한다. 5000원 계좌이체 A의 잔고를 5000원 감소 B의 잔고를 5000원 증가 계좌이체라는 거래는 이렇게..
-
[김영한 스프링] 08. 커넥션풀과 데이터소스 이해 - DataSource 적용Spring/스프링 DB 1편 - 데이터 접근 핵심 원리 2023. 10. 18. 03:30
DataSource 적용 기존 코드를 유지하기 위해 기존 코드를 복사해서 새로 만들자. MemberRepositoryV0 -> MemberRepositoryV1 MemberRepositoryV0Test -> MemberRepositoryV1Test MemberRepositoryV1 package hello.jdbc.repository; import hello.jdbc.connection.DBConnectionUtil; import hello.jdbc.domain.Member; import lombok.extern.slf4j.Slf4j; import org.springframework.jdbc.support.JdbcUtils; import javax.sql.DataSource; import java.sql..
-
[김영한 스프링] 07. 커넥션풀과 데이터소스 이해 - DataSource 예제Spring/스프링 DB 1편 - 데이터 접근 핵심 원리 2023. 10. 18. 03:06
DataSource 예제1 - DriverManager 기존에 개발했던 DriverManager를 통해서 커넥션을 획득하는 방법을 확인해 보자. ConnectionTest - 드라이버 매니저 package hello.jdbc.connection; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import static hello.jdbc.connection.ConnectionConst.*; @Slf4j public class ConnectionTest { @Test void..