[Spring] 스프링 DB 2편 - 섹션 10~11
·
Spring
외부 트랜잭션과 내부 트랜잭션트랜잭션 전파란, 이미 진행 중인 트랜잭션이 존재할 때 추가로 트랜잭션을 수행하려는 상황에서 어떻게 동작할 지 결정하는 것을 트랜잭션 전파(propagation)이라고 한다. 트랜잭션 전파에는 여러가지 옵션이 존재하지만, 기본 옵션이 REQUIRED를 기준으로 설명하겠다.외부 트랜잭션이란 쉽게 말해서 가장 먼저 시작된 트랜잭션이다. 그리고 내부 트랜잭션은 그 이후에 호출된 트랜잭션으로 외부에 트랜잭션이 수행되고 있는 도중에 호출되기 때문에 마치 내부에 있는 것처럼 보여서 내부 트랜잭션이라 한다.흐름내부 트랜잭션을 시작하는 시점에는 이미 외부 트랜잭션이 진행중인 상태이다. 이 경우 내부 트랜잭션은 외부 트랜잭션에 참여한다. 즉, 내부 트랜잭션은 외부 트랜잭션을 기대로 이어 받아..
[Spring] 스프링 DB 2편 - 섹션 9
·
Spring
선언적 트랜잭션과 AOP@Transactional이라는 애노테이션을 사용하여 매우 편리하게 트랜잭션을 적용하는 것을 선언적 트랜잭션 관리라고 한다. 이 방식은 기본적으로 프록시 방식의 AOP가 적용된다.AOP의 핵심은, 실제 객체 대신 트랜잭션을 처리해주는 프록시 객체가 스프링 빈에 등록된다는 것이다. 또한 주입을 받을 때도 실제 객체 대신에 프록시 객체가 주입된다. 즉, 선언적 트랜잭션을 사용하면 항상 프록시를 통해서 대상 객체를 호출한다는 것이다.프록시 내부 호출만약, 프록시를 거치지 않고 대상 객체를 직접 호출하게 되면 어떻게 될까? 2가지 상황에 대해 알아보자.상황 1트랜잭션이 적용된 Internal() 메서드가 내부 호출로 External() 메서드를 호출하는 상황이다. Internal() 메서..
[Spring] 스프링 DB 1편 - 섹션 3~4
·
Spring
트랜잭션트랜잭션은 작업의 완전성을 보장해 준다. 즉, 논리적인 작업 셋을 모두 완벽하게 처리하거나, 처리하지 못할 경우에는 원 상태로 복구하여 작업의 일부만 적용되는 현상(Partial update)이 발생하지 않도록 해준다.ACID원자성(Atomicity)트랜잭션 내에서 실행한 작업들은 모두 성공하거나 모두 실패해야 한다.일관성(Consistency)모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. 예를 들어 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다.격리성(Isolation)동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다. 예를 들어 동시에 같은 데이터를 수정하지 못하도록 해야 한다. → 격리성은 동시성과 관련된 성능 이슈로 인해, 트랜잭션 격리 수..
[Spring] 스프링 DB 1편 - 섹션 1~2
·
Spring
JDBC 이해애플리케이션 서버는 DB를 사용하기 위해 커넥션을 연결해야 한다. 문제는 각각의 데이터베이스마다 커넥션을 연결하는 방법, SQL을 전달하는 방법 그리고 그 결과를 응답받는 방법이 모두 다르다는 점이다. 즉, 데이터베이스를 다른 종류의 데이터베이스로 변경하면 애플리케이션 서버에 개발된 데이터베이스 사용 코드도 함께 변경해야 한다는 문제가 발생한다.JDBC 표준 인터페이스JDBC는 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API이다. 이 JDBC 인터페이스를 각각의 DB 벤더에서 자신의 DB에 맞도록 구현해서 라이브러리로 제공하는데, 이것을 JDBC 드라이버라 한다. 이렇게 JDBC 표준 인터페이스를 정의함으로써 데이터베이스를 변경했을 때 사용 코드도 함께 변경해야 하는 문제를 해결할..
[Spring] 스프링 핵심 원리 고급편 섹션2
·
Spring
쓰레드 로컬동시성 문제여러개의 쓰레드나 프로세스가 동일한 데이터(공유 자원)에 접근할 때, 데이터 일관성을 해치는 문제(Inconsistency)를 동시성 문제라고 한다. 스프링은 기본적으로 모든 빈들을 싱글톤 스코프로 관리한다. 즉, 한 번 생성된 객체를 스프링 컨테이너가 재사용하도록 설계되는데, 이는 곧 해당 객체의 인스턴스가 애플리케이션에 단 1개 존재한다는 뜻이다. 때문에 인스턴스의 필드를 여러 쓰레드가 동시에 접근하게 될 경우, 동시성 문제가 발생하게 된다. 스프링 빈처럼 싱글톤 객체의 필드를 변경하며 사용할 때는 특히, 이러한 동시성 문제를 조심해야 한다.→ 이러한 문제를 해결하기 위해 사용하는 것이 쓰레드 로컬이다.+ 더 알아보기이런 동시성 문제는 지역 변수에서는 발생하지 않는다. 지역 변수..
[Spring] 스프링 MVC 2편 - 섹션 10~11
·
Spring
Converter스프링 타입 컨버터(converter)란, 서로 다른 타입 간의 변환을 쉽게 처리할 수 있도록 돕는 도구이다. HTTP 요청 파라미터는 모두 문자로 처리된다. 때문에 요청 파리미터를 자바에서 다른 타입으로 변환해서 사용하고 싶으면 원하는 타입으로 변환하는 과정을 거쳐야한다. 실제로, 스프링 MVC가 제공하는 @RequestParam을 사용해보면, 스프링이 자동으로 타입을 변환해주는데 어떻게 이것이 가능한걸까? 이때, 사용하는 것이 바로 스프링 타입 컨버터이다.컨버터 인터페이스package org.springframework.core.convert.converter;public interface Converter { T convert(S source);}스프링은 확장 가능한 컨버터 인터페..
[Spring] 스프링 MVC 2편 - 섹션 7~9
·
Spring
서블릿 필터필터(Filter)는 J2EE 표준 스펙 기능으로 디스패처 서블릿(Dispatcher Servlet)에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공한다.필터 흐름디스패처 서블릿은 스프링의 가장 앞단에 존재하는 프론트 컨트롤러이므로, 필터는 스프링 범위 밖에서 처리가 되는 것이다. 즉, 스프링 컨테이너가 아닌 톰캣과 같은 웹 컨테이너(서블릿 컨테이너)에 의해 관리가 되는 것이고, 디스패처 서블릿 전/후에 처리하는 것이다. 흐름을 간단하게 정리하면 아래와 같다.HTTP 요청 → WAS → 필터1 → …. → 필터5 → 서블릿 → 컨트롤러 필터는 체인으로 구성되는데, 중간에 자유롭게 추가할 수 있다.필터 인터페이스와 메서드public inte..
[Spring] 스프링 MVC 2편 - 섹션 4~5
·
Spring
Bean ValidationBean Validation은 JSR 기술 표준으로, 검증 애노테이션과 여러 인터페이스의 모음이다.Validator (검증기)스프링이 제공하는 검증용 객체이다. 개발자는 해당 인터페이스를 구현하여 클래스로 사용하면 되기 때문에 검증 로직과 비즈니스 로직을 구분할 수 있게 되고 체계적으로 검증 기능을 도입할 수 있게 된다.public interface Validator { boolean supports(Class clazz); void validate(Object target, Errors errors);}해당 인터페이스를 구현한 구현체 즉, 검증기를 WebDataBinder에 추가하면 컨트롤러에서 검증기를 자동으로 적용할 수 있게 된다. WebDataBinder는 Sprin..
[Spring] 스프링 MVC 1편 - 섹션 1~3
·
Spring
WAS와 Web ServerWeb ServerWeb Server는 웹 브라우저(클라이언트)로부터 HTTP 요청을 받아 HTML 문서와 같은 정적 컨텐츠를 제공하는 프로그램을 말한다.정적 컨텐츠란, 요청 인자 값에 상관없이 달라지지 않는 컨텐츠(html, css, image 등) 즉, 어느 사용자의 요청이든 항상 동일한 컨텐츠를 일컫는다. 대표적인 Web Server로는 Apache와 Nginx가 있다. 하지만 클라이언트로부터 동적 컨텐츠를 보여주어야 한다면 어떨까? 이때, 필요한 것이 바로 WAS다.WASWAS는 Web Application Server의 약자로 DB 조회나 다양한 로직 처리를 요구하는 동적인 컨텐츠를 제공하기 위해 만들어진 프로그램이다. 동적 컨텐츠란, 정적 컨텐츠와 반대로 요청 인자에..
[Spring] 스프링 핵심 원리 기본편 - 섹션 9~10
·
Spring
빈 생명주기 콜백스프링 빈은 다음과 같은 라이프 사이클을 가진다.스프링 컨테이너 생성 → 스프링 빈 생성 → 의존관계 주입 → 초기화 콜백 → 사용 → 소멸 전 콜백 → 스프링 종료 스프링 빈은 객체를 생성하고, 의존관계 주입이 모두 끝난 후에야 필요한 데이터를 사용할 수 있는 준비가 완료된다. 때문에 초기화 작업은 의존관계 주입이 모두 완료된 후에 호출되어야 한다. 이를 위해 스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해서 초기화 시점을 알려주는 기능을 제공한다. 또한 소멸 콜백도 제공한다. 싱글톤 빈들의 경우, 스프링 컨테이너가 종료될 때, 싱글톤 빈들도 함께 종료되기 때문에 스프링 컨테이너가 종료되기 직전에 소멸 전 콜백이 일어난다.객체의 생성과 초기화를 분리하자! 생성자 안에..