[Basic-4] 스프링과 문제 해결 - 트랜잭션
·
Spring/DB
서론 데이터베이스 트랜잭션은 현대 애플리케이션 개발에서 핵심적인 개념이다. 여러 데이터베이스 작업을 하나의 논리적 단위로 묶어서, 모두 성공하거나 모두 실패하도록 보장하는 기능이다. 그러나 실제로 트랜잭션을 제대로 구현하고 관리하는 것은 생각보다 복잡한 문제를 내포하고 있다. 이 글에서는 순수 JDBC를 사용할 때 발생하는 트랜잭션 관련 문제점들을 살펴보고, 스프링이 어떻게 이러한 문제들을 우아하게 해결하는지 단계별로 탐구해본다. 처음 스프링을 접하는 개발자도 이해할 수 있도록 매우 자세히 설명하겠다.1. 애플리케이션 구조와 문제점들1.1. 계층형 아키텍처의 중요성대부분의 현대 애플리케이션은 관심사의 분리(Seperation of Concerns) 원칙에 따라 계층형 구조로 설계된다. 가장 일반적인 3계..
[Basic-3] 트랜잭션 이해
·
Spring/DB
1. 트랜잭션이란? [Lock-1][Optimization] 트랜잭션의 정의와 ACID 원칙1. 들어가며: 왜 Lock을 배우기 전에 트랜잭션을 알아야 하는가? 데이터베이스에서 Lock(잠금)은 특정 자원에 대해 여러 요청이 동시에 들어올 때 데이터의 일관성을 지키기 위한 장치이다. 하지만receiver40.tistory.com 2. Lock이란? [Lock-3][Optimization] Lock: 격리성 수준(Isolation Level) 심층 분석 및 실습1. 들어가며: 격리 수준은 왜 필요한가? 이전 포스팅에서 다중 트랜잭션 환경에서 데이터베이스의 가장 큰 숙제는 데이터의 정합성(Consistency) 유지와 시스템 성능(Performance)의 최적화 사이에서 균receiver40.tistory...
[Basic-2] 커넥션풀과 데이터소스 이해
·
Spring/DB
1. 커넥션 풀 이해1.1. 데이터베이스 커넥션을 매번 획득데이터베이스 커넥션을 획득할 때는 다음과 같은 복잡한 과정을 거친다:애플리케이션 로직은 DB 드라이버를 통해 커넥션을 조회한다.DB 드라이버는 DB와 TCP/IP 커넥션을 연결한다. 물론 이 과정에서 3 way handshake 같은 TCP/IP 연결을 위한 네트워크 동작이 발생한다.DB 드라이버는 TCP/IP 커넥션이 연결되면 ID, PW와 기타 부가정보를 DB에 전달한다.DB는 ID, PW를 통해 내부 인증을 완료하고, 내부에 DB 세션을 생성한다.DB는 커넥션 생성이 완료되었다는 응답을 보낸다.DB 드라이버는 커넥션 객체를 생성해서 클라이언트에 반환한다. 이렇게 커넥션을 새로 만드는 것은 과정도 복잡하고 시간도 많이 소모되는 일이다. DB는..
[Basic-1] JDBC 이해
·
Spring/DB
1. 프로젝트 생성1.1. 사전 준비물Java 17 이상 설치IDE: IntelliJ 또는 Eclipse 설치스프링 부트 스타터 사이트로 이동해서 스프링 프로젝트 생성: https://start.spring.io1.2. 프로젝트 설정프로젝트 선택Project: Gradle - Groovy ProjectLanguage: JavaSpring Boot: 3.x.xProject MetadataGroup: helloArtifact: jdbcName: jdbcPackage name: hello.jdbcPackaging: JarJava: 17 또는 21Dependencies: JDBC API, H2 Database, Lombok1.3. 주의사항 - 스프링 부트 3.x 버전 선택 필수start.spring.io 사이트..
[Advanced-4] 프록시 패턴과 데코레이터 패턴
·
Spring/Core
1. 프로젝트 생성이전 프로젝트를 일부 수정해서 proxy-start 라는 프로젝트에 넣어두었다.1.1. 프로젝트 설정 순서proxy-start의 폴더 이름을 proxy로 변경하자.프로젝트 임포트File → Open 해당 프로젝트의 build.gradle을 선택하자.그 다음에 선택창이 뜨는데, Open as Project를 선택하자.동작 확인기본 메인 클래스 실행(ProxyApplication())http://localhost:8080 호출해서 Whitelabel Error Page가 나오면 정상 동작2. 예제 프로젝트 만들기2.1. 예제 프로젝트 만들기 v1예제는 크게 3가지 상황으로 만든다:v1 - 인터페이스와 구현 클래스 - 스프링 빈으로 수동 등록v2 - 인터페이스 없는 구체 클래스 - 스프링 빈..
[Advanced-3] 템플릿 메서드 패턴과 콜백 패턴
·
Spring/Core
1. 템플릿 메서드 패턴 - 시작1.1. 문제 상황 지금까지 로그 추적기를 성공적으로 개발하였다. 요구사항을 만족함은 물론, 파라미터 전송의 불편함을 해결하기 위해 쓰레드 로컬(ThreadLocal)까지 도입하였다. 하지만 실제 프로젝트에 적용하려는 단계에서 개발자들의 강한 반대에 부딪혔다. 가장 큰 이유는 본연의 비즈니스 로직보다 부가적인 로그 코드가 더 비대해졌기 때문이다.1.2. 로그 추적기 도입 전 vs 후 비교1.2.1. 도입 전 - V0 코드 // OrderControllerV0 코드@GetMapping("/v0/request")public String request(String itemId) { orderService.orderItem(itemId); return "ok";}// ..
[Advanced-2] 스레드 로컬 - ThreadLocal
·
Spring/Core
1. 필드 동기화 - 개발 앞서 로그 추적기를 만들면서 다음 로그를 출력할 때 트랜잭션ID와 level을 동기화하는 문제가 있었다. 이 문제를 해결하기 위해 TraceId를 파라미터로 넘기도록 구현했다. 이렇게 해서 동기화는 성공했지만, 로그를 출력하는 모든 메서드에 TraceId 파라미터를 추가해야 하는 문제가 발생했다. TraceId를 파라미터로 넘기지 않고 이 문제를 해결할 수 있는 방법은 없을까? 이런 문제를 해결할 목적으로 새로운 로그 추적기를 만들어보자. 이제 프로토타입 버전이 아닌 정식 버전으로 제대로 개발해보자. 향후 다양한 구현체로 변경할 수 있도록 LogTrace 인터페이스를 먼저 만들고, 구현해보자.1.1. LogTrace 인터페이스package hello.advanced.trace..
[Advanced-1] 예제 만들기
·
Spring/Core
1. 프로젝트 생성1.1. 사전 준비물Java 17 이상 설치IDE: IntelliJ 또는 Eclipse 설치스프링 부트 스타터 사이트를 통해 스프링 프로젝트 생성1.2. 프로젝트 설정start.spring.io에서 다음 설정으로 프로젝트 생성:1.2.1. 프로젝트 선택Project: Gradle - Groovy ProjectLanguage: JavaSpring Boot: 3.x.x1.2.2. Project MetadataGroup: helloArtifact: advancedName: advancedPackage name: hello.advancedPackaging: JarJava: 17 또는 21Dependencies: Spring Web, Lombok1.2.3. 주의사항 - 스프링 부트 3.x 버전 ..