스프링 DB 2편 - 섹션 10~11
·
Spring
외부 트랜잭션과 내부 트랜잭션트랜잭션 전파란, 이미 진행 중인 트랜잭션이 존재할 때 추가로 트랜잭션을 수행하려는 상황에서 어떻게 동작할 지 결정하는 것을 트랜잭션 전파(propagation)이라고 한다. 트랜잭션 전파에는 여러가지 옵션이 존재하지만, 기본 옵션이 REQUIRED를 기준으로 설명하겠다.외부 트랜잭션이란 쉽게 말해서 가장 먼저 시작된 트랜잭션이다. 그리고 내부 트랜잭션은 그 이후에 호출된 트랜잭션으로 외부에 트랜잭션이 수행되고 있는 도중에 호출되기 때문에 마치 내부에 있는 것처럼 보여서 내부 트랜잭션이라 한다.흐름내부 트랜잭션을 시작하는 시점에는 이미 외부 트랜잭션이 진행중인 상태이다. 이 경우 내부 트랜잭션은 외부 트랜잭션에 참여한다. 즉, 내부 트랜잭션은 외부 트랜잭션을 기대로 이어 받아..
스프링 DB 2편 - 섹션 9
·
Spring
선언적 트랜잭션과 AOP@Transactional이라는 애노테이션을 사용하여 매우 편리하게 트랜잭션을 적용하는 것을 선언적 트랜잭션 관리라고 한다. 이 방식은 기본적으로 프록시 방식의 AOP가 적용된다.AOP의 핵심은, 실제 객체 대신 트랜잭션을 처리해주는 프록시 객체가 스프링 빈에 등록된다는 것이다. 또한 주입을 받을 때도 실제 객체 대신에 프록시 객체가 주입된다. 즉, 선언적 트랜잭션을 사용하면 항상 프록시를 통해서 대상 객체를 호출한다는 것이다.프록시 내부 호출만약, 프록시를 거치지 않고 대상 객체를 직접 호출하게 되면 어떻게 될까? 2가지 상황에 대해 알아보자.상황 1트랜잭션이 적용된 Internal() 메서드가 내부 호출로 External() 메서드를 호출하는 상황이다. Internal() 메서..
스프링 DB 1편 - 섹션 3~4
·
Spring
트랜잭션트랜잭션은 작업의 완전성을 보장해 준다. 즉, 논리적인 작업 셋을 모두 완벽하게 처리하거나, 처리하지 못할 경우에는 원 상태로 복구하여 작업의 일부만 적용되는 현상(Partial update)이 발생하지 않도록 해준다.ACID원자성(Atomicity)트랜잭션 내에서 실행한 작업들은 모두 성공하거나 모두 실패해야 한다.일관성(Consistency)모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. 예를 들어 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다.격리성(Isolation)동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다. 예를 들어 동시에 같은 데이터를 수정하지 못하도록 해야 한다. → 격리성은 동시성과 관련된 성능 이슈로 인해, 트랜잭션 격리 수..
스프링 DB 1편 - 섹션 1~2
·
Spring
JDBC 이해애플리케이션 서버는 DB를 사용하기 위해 커넥션을 연결해야 한다. 문제는 각각의 데이터베이스마다 커넥션을 연결하는 방법, SQL을 전달하는 방법 그리고 그 결과를 응답받는 방법이 모두 다르다는 점이다. 즉, 데이터베이스를 다른 종류의 데이터베이스로 변경하면 애플리케이션 서버에 개발된 데이터베이스 사용 코드도 함께 변경해야 한다는 문제가 발생한다.JDBC 표준 인터페이스JDBC는 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API이다. 이 JDBC 인터페이스를 각각의 DB 벤더에서 자신의 DB에 맞도록 구현해서 라이브러리로 제공하는데, 이것을 JDBC 드라이버라 한다. 이렇게 JDBC 표준 인터페이스를 정의함으로써 데이터베이스를 변경했을 때 사용 코드도 함께 변경해야 하는 문제를 해결할..
스프링 핵심 원리 고급편 섹션2
·
Spring
쓰레드 로컬동시성 문제여러개의 쓰레드나 프로세스가 동일한 데이터(공유 자원)에 접근할 때, 데이터 일관성을 해치는 문제(Inconsistency)를 동시성 문제라고 한다. 스프링은 기본적으로 모든 빈들을 싱글톤 스코프로 관리한다. 즉, 한 번 생성된 객체를 스프링 컨테이너가 재사용하도록 설계되는데, 이는 곧 해당 객체의 인스턴스가 애플리케이션에 단 1개 존재한다는 뜻이다. 때문에 인스턴스의 필드를 여러 쓰레드가 동시에 접근하게 될 경우, 동시성 문제가 발생하게 된다. 스프링 빈처럼 싱글톤 객체의 필드를 변경하며 사용할 때는 특히, 이러한 동시성 문제를 조심해야 한다.→ 이러한 문제를 해결하기 위해 사용하는 것이 쓰레드 로컬이다.+ 더 알아보기이런 동시성 문제는 지역 변수에서는 발생하지 않는다. 지역 변수..
빈으로 등록된 필터가 WebSecurity의 ignoring에 의해 무시되지 않는 이유
·
Spring
커스텀 필터를 만들었을 때, @Componenet 어노테이션을 통해 해당 필터를 bean으로 등록했는지의 여부에 따라 filter가 web ignoring에 의해 무시되지 않는 상황이 발생했다.첫번째는 @component로 빈을 등록했을 때이고, 두번째는 빈으로 등록하지 않았을 때이다.왜 이런 상황이 발생했는지 차근차근 알아보자.Spring Security🌱 Spring SecuritySpring 기반의 애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는 스프링 하위 프레임워크Spring Security 구조먼저 Spring Security의 구조를 먼저 이해할 필요가 있다.Security 의존성이 없는 경우클라이언트 요청은 서버 컴퓨터의 WAS(톰캣)의 필터들을 통과한 뒤 스프링 컨테이너의 컨트롤..
스프링 MVC 2편 - 섹션 10~11
·
Spring
Converter스프링 타입 컨버터(converter)란, 서로 다른 타입 간의 변환을 쉽게 처리할 수 있도록 돕는 도구이다. HTTP 요청 파라미터는 모두 문자로 처리된다. 때문에 요청 파리미터를 자바에서 다른 타입으로 변환해서 사용하고 싶으면 원하는 타입으로 변환하는 과정을 거쳐야한다. 실제로, 스프링 MVC가 제공하는 @RequestParam을 사용해보면, 스프링이 자동으로 타입을 변환해주는데 어떻게 이것이 가능한걸까? 이때, 사용하는 것이 바로 스프링 타입 컨버터이다.컨버터 인터페이스package org.springframework.core.convert.converter;public interface Converter { T convert(S source);}스프링은 확장 가능한 컨버터 인터페..
스프링 MVC 2편 - 섹션 7~9
·
Spring
서블릿 필터필터(Filter)는 J2EE 표준 스펙 기능으로 디스패처 서블릿(Dispatcher Servlet)에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공한다.필터 흐름디스패처 서블릿은 스프링의 가장 앞단에 존재하는 프론트 컨트롤러이므로, 필터는 스프링 범위 밖에서 처리가 되는 것이다. 즉, 스프링 컨테이너가 아닌 톰캣과 같은 웹 컨테이너(서블릿 컨테이너)에 의해 관리가 되는 것이고, 디스패처 서블릿 전/후에 처리하는 것이다. 흐름을 간단하게 정리하면 아래와 같다.HTTP 요청 → WAS → 필터1 → …. → 필터5 → 서블릿 → 컨트롤러 필터는 체인으로 구성되는데, 중간에 자유롭게 추가할 수 있다.필터 인터페이스와 메서드public inte..
스프링 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..
스프링 MVC 1편 - 섹션 4~7
·
Spring
MVC 프레임워크Spring MVC 구조Dispatcher Servlet은 Front Controller와 비슷한 역할을 한다. Dispatcher Servlet은 우선적으로 클라이언트로부터 모든 요청을 받게 되며, 각각의 요청에 따른 처리는 개별 컨트롤러 클래스로 위임 한다. 이러한 개별 컨트롤러 클래스를 핸들러(Handler)라고도 한다. 쉽게 말해서 디스패처 서블릿은 Spring의 가장 앞단에서 요청을 처리할 컨트롤러를 찾아서 위임하고, 그 결과를 받아오는 역할을 한다.동작 과정Dispatcher Servlet이 실제 요청 처리를 핸들러에게 위임하기 위해서는 해당 요청을 어떤 컨트롤러에 보내야할 지 판단해야 한다. 이를 판단하기 위해, 다음과 같은 과정을 거친다.1. 핸들러 조회 Dispatcher..