[Spring] @Transactional이 동작하지 않는 이유 - 프록시 자기 호출
·
Web Backend/Spring
스프링과 JPA를 개념 순서대로 정리하는 시리즈입니다. 1부 스프링 컨테이너 (5/5)@Transactional과 프록시이번에는 @Transactional을 분명히 붙였는데도 트랜잭션이 걸리지 않는 상황에 대해 알아보겠습니다.앞선 글에서 스프링 AOP가 프록시로 동작하며, 프록시를 거치지 않는 호출에는 적용되지 않는다는 점을 살펴봤습니다.트랜잭션 역시 AOP로 동작하기 때문에 같은 문제가 그대로 나타납니다.차이가 있다면 실행 시간 측정은 빠져도 큰 문제가 없지만, 트랜잭션이 빠지면 롤백되어야 할 데이터가 그대로 남는다는 점입니다.이번에는 실제로 데이터가 남는 상황을 재현해 보겠습니다.예제 코드는 Java 21, Spring Boot 3.5, Hibernate 6 환경에서 작성했습니다.1. @Transac..
[Spring] AOP - 관점 지향 프로그래밍과 프록시
·
Web Backend/Spring
스프링과 JPA를 개념 순서대로 정리하는 시리즈입니다. 1부 스프링 컨테이너 (4/5)스프링 AOP와 프록시이번에는 AOP(Aspect Oriented Programming, 관점 지향 프로그래밍)의 개념과 스프링이 이를 구현하는 방식인 프록시에 대해 알아보겠습니다.앞선 글들에서 빈 목록을 출력할 때마다 $$SpringCGLIB$$나 $Proxy가 붙은 클래스가 보였습니다.컨테이너가 빈을 그대로 보관하지 않고 무언가로 감싼다는 것까지는 확인했습니다.이번에는 그 감싸는 일이 무엇을 위한 것인지, 그리고 어떤 방식으로 이루어지는지 정리하겠습니다.예제 코드는 Java 21, Spring Boot 3.5, Hibernate 6 환경에서 작성했습니다.1. 횡단 관심사란?운동 세션을 저장하는 메서드에 실행 시간을 ..
[Spring] 의존성 주입 - 생성자 주입을 권장하는 이유
·
Web Backend/Spring
스프링과 JPA를 개념 순서대로 정리하는 시리즈입니다. 1부 스프링 컨테이너 (3/5)스프링의 의존성 주입 방법이번에는 스프링이 의존성을 주입하는 세 가지 방법을 비교하고, 그중 생성자 주입을 권장하는 이유에 대해 알아보겠습니다.앞에서 살펴본 것처럼 객체를 연결하는 일은 스프링 컨테이너가 담당합니다.그런데 컨테이너가 객체를 넣어주는 통로는 하나가 아닙니다.생성자로 넣을 수도 있고, 세터 메서드로 넣을 수도 있고, 필드에 직접 꽂을 수도 있습니다.세 가지 모두 동작하지만 스프링은 그중 하나만 권장합니다.이번에는 나머지 두 방법의 문제가 무엇인지 살펴보고, 순환 참조를 직접 만들어 어떤 차이가 생기는지 확인해 보겠습니다.예제 코드는 Java 21, Spring Boot 3.5, Hibernate 6 환경에서..
[Spring] 빈 등록과 생명주기 - @Component, @Bean, @Configuration
·
Web Backend/Spring
스프링과 JPA를 개념 순서대로 정리하는 시리즈입니다. 1부 스프링 컨테이너 (2/5)스프링 빈 등록과 생명주기이번에는 스프링 컨테이너에 빈(Bean)을 등록하는 방법과 등록된 빈이 거치는 생명주기에 대해 알아보겠습니다.앞에서 살펴본 것처럼 객체를 생성하고 연결하는 일은 스프링 컨테이너가 담당합니다.그렇다면 컨테이너는 어떤 객체를 관리할지 어떻게 알 수 있을까요.등록 방법은 크게 두 가지입니다.하나는 클래스에 애노테이션을 붙여 자동으로 등록하는 방법이고, 다른 하나는 설정 클래스에서 직접 반환하는 방법입니다.이번에는 두 방법의 차이와 각각을 언제 사용해야 하는지 정리하겠습니다.예제 코드는 Java 21, Spring Boot 3.5, Hibernate 6 환경에서 작성했습니다.1. 스프링 빈이란?스프링 ..
[Spring] IoC와 DI - 제어의 역전이란 무엇인가
·
Web Backend/Spring
스프링과 JPA를 개념 순서대로 정리하는 시리즈입니다. 1부 스프링 컨테이너 (1/5)스프링의 IoC와 DI이번에는 스프링의 가장 기본이 되는 개념인 IoC(Inversion of Control, 제어의 역전)와 DI(Dependency Injection, 의존성 주입)에 대해 알아보겠습니다.스프링을 공부하면 가장 먼저 만나게 되는 개념입니다.하지만 "제어의 역전"이라는 말이 추상적이라 무엇이 무엇으로부터 뒤집히는 것인지 잘 와닿지 않습니다.따라서 이번에는 운동 기록 앱을 예제로 new 키워드 하나를 걷어냈을 때 실제로 무엇이 달라지는지 살펴보겠습니다.예제 코드는 Java 21, Spring Boot 3.5, Hibernate 6 환경에서 작성했습니다.1. 객체를 직접 생성하면 생기는 문제운동 세션을 저..