분류 전체보기 139

스프링 트랜잭션 전파 - 커밋, 롤백

스프링 트랜잭션 전파 1 - 커밋, 롤백트랜잭션이 둘 이상 있을 때 어떻게 동작하는지 자세히 알아보고, 스프링이 제공하는 트랜잭션 전파(propagation) 라는 개념도 알아보자.트랜잭션 전파를 이해하는 과정에서 스프링 트랜잭션의 동작원리도 더 깊이있게 이해할 수 있다. 트랜잭션 코드를 기본 원리를 알아보자 간단한 스프링 트랜잭션 예제 코드 커밋package study.springtx.propagation;import lombok.extern.slf4j.Slf4j;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.c..

Spring 2026.01.17

스프링 트랜잭션 rollbackFor

트랜잭션 옵션 - rollbackFor예외 발생시 스프링 트랜잭션의 기본 정책은 다음과 같다.언체크 예외인 `RuntimeException` , 'Error' 와 그 하위 예외가 발생하면 롤백한다.체크 예외인 Exception과 그 하위 예외들은 커밋한다.이 옵션을 사용하면 기본 정책에 추가로 어떤 예외가 발생할 때 롤백할 지 지정할 수 있다.@Transactional(rollbackFor = Exception.class) 예를 들어서 이렇게 지정하면 체크 예외인 Exception 이 발생해도 롤백하게 된다.(하위 예외들도 대상에 포함된다.) 예외와 트랜잭션 커밋, 롤백 기본 예외가 발생했는데, 내부에서 예외를 처리하지 못하고, 트랜잭션 범위(@Transactional가 적용된 AOP) 밖으로 예외를 ..

Spring 2026.01.08

스프링 데이터 JPA는 인터페이스만 정의했는데 어떻게 동작할까?

인터페이스만 정의했는데 어떻게 동작하지? 다이나믹 프록시의 핵심 클래스는 java.lang.reflect.Proxy이다.import org.springframework.data.jpa.repository.JpaRepository;public interface BookRepository extends JpaRepository {} 인터페이스만 정의했을 뿐인데, save(), findById() 같은 메서드가 마법처럼 동작한다. 여기서 일어나는 일:BookRepository 의 객체가 만들어짐그 객체가 스프링 빈으로 등록됨빈 등록 작업도 spring-data-jpa가 자동으로 처리도대체 이 인터페이스를 어떻게 인스턴스로 만들어준 걸까? 실제로 동작하는지 확인해보기 테스트 코드package hello.diex..

JAVA 2025.10.07

Java 리플렉션과 스프링 DI 동작 원리 정리 : 직접 만들어보며 이해하기

스프링의 @Autowired는 어떻게 동작할까?이 궁금증에서 시작된 리플렉션 탐험기.단순 사용법을 익히는 것이 아니라, 직접 DI 컨테이너를 만들어 프레임워크 내부 원리를 깊이 이해해보자.리플렉션 기초리플렉션이란?리플렉션은 런타임에 클래스의 메타데이터 (필드, 메서드, 생성자 등) 에 접근할 수 있게 해주는 Java API이다. Class API를 통해 클래스의 정보를 동적으로 분석하고 조작할 수 있다. 런타임의 객체정보를 컴파일 타입에 접근할 수 있다. Java Platform SE 8 - Class Documentation Class 문서를 살펴보면, 메서드를 살펴보면 메서드를 통해 필드, 또는 상위 클래스 , 클래스가 구현하고 있는 인터페이스 ,메소드 목록들에 접근할 수 있다는 사실을 알 수 있다...

Spring 2025.09.27

프록시와 내부 호출 문제 (@Transactional self-invocation)

스프링에서 @Transactional을 사용하다 보면 내부 호출(self) 때문에 트랜잭션이 적용되지 않는 문제가 발생한다. "self-invocation does not lead to an actual transaction at runtime"(자기 자신 안에서 자기 자신의 트랜잭션 메서드를 호출하면 실제 트랜잭션이 동작하지 않는다)문제의 원인: Spring AOP의 프록시 방식Spring은 프록시 방식의 AOP를 사용한다. 이는 다음과 같은 특징이 있다.AOP를 적용하려면 항상 프록시를 통해서 대상 객체를 호출해야 한다.프록시에서 먼저 어드바이스를 호출하고, 이후에 대상 객체 호출프록시를 거치지 않고 대상 객체를 직접 호출하면 AOP가 적용되지 않음 정상적인 경우외부 호출 → 프록시 객체 → 어드바이..

Spring 2025.09.21

로그인 처리1 - 쿠키, 세션

패키지 구조 설계 package 구조hello.logindomainitemmemberloginwebitemmemberlogin도메인 = 화면, UI, 기술 인프라 등등의 영역은 제외한 시스템이 구현해야하는 핵심 비즈니스 업무 영역을 말함. 향후 web 을 다른 기술로 바꾸어도 도메인은 그대로 유지할 수 있어야 한다.이렇게 하려면 web 은 domain을 알고 있지만 domain 은 web 을 모르도록 설계해야한다. 이것을 web 은 domain을 의존하지만 domain 은 web 을 의존하지 않는다고 표현한다. 예를 들어 web 패키지를 모두 삭제해도 domain 에는 전혀 영향이 없도록 의존관계를 설계하는 것을 중요하다. 반대로 이야기하면 domain 은 web 을 참조하면 안된다.로그인 처리하기 - ..

Spring 2025.08.16

Git처럼 SVN에서도 target/ 디렉토리를 무시하려면?

# 1. target 디렉토리를 SVN 추적 대상에서 제거하되, 실제 파일은 삭제하지 않음 svn delete --keep-local target/ # 2. 현재 디렉토리에 svn:ignore 속성을 설정하여, target 디렉토리를 앞으로 무시하도록 지정 svn propset svn:ignore target . # 3. 위의 변경 사항(삭제 + 무시 속성 추가)을 커밋 svn commit -m "Ignore target directory" 확인 # 현재 디렉토리에 설정된 SVN 속성 목록을 조회 # (예: svn:ignore, svn:externals 등 설정 여부 확인 가능) svn proplist # 현재 디렉토리에 설정된 svn:ignore 속성의 실제 값을 확인 # 출력이 'target'이면, ..

카테고리 없음 2025.08.07

외부 연동 방식 변경과 어댑터 패턴 적용

외부 연동 방식 변경과 어댑터 패턴 적용최근 회사에서 외부 시스템과의 연동 방식이 변경되었다.기존에는 DB를 직접 조회해서 데이터를 받아오는 방식이었지만, 변경 이후에는 REST API를 통해 외부 데이터를 호출하도록 요구사항이 바뀌었다.이런 구조 변경은 일반적으로 기존 코드에 많은 영향을 줄 수 있다.하지만 나는 이 상황에서 기존 비즈니스 로직을 전혀 수정하지 않고도 외부 연동 방식만 바꿔치기할 수 있도록 어댑터 패턴(Adapter Pattern) 을 적용해보았다.어댑터 패턴이란?어댑터 패턴은 호환되지 않는 인터페이스를 가진 클래스를 함께 동작하게 해주는 구조 패턴이다. 기존 인터페이스를 클라이언트가 기대하는 형태로 변환해줌으로써, 서로 다른 클래스들이 함께 동작할 수 있도록 도와준다.실생활 예를 들면..

JAVA 2025.08.03

MongoDB vs MySQL 쿼리 비교하기

MySQL과 MongoDB는 데이터를 조작하는 방식에서 근본적인 차이를 보인다.MySQL 은 전통적인 SQL 쿼리 언어를 사용하는 반면, MongoDB는 API 호출 방식의 접근법을 취한다.이 글에서 실제 개발에서 자주 사용되는 쿼리를 비교하며 각각의 특징과 장단점을 살펴본다.1. 데이터 삽입 (INSERT)MySQL 방식INSERT INTO users(id, name, department) VALUES(1001, '김철수', '컴퓨터'); MongoDB 방식db.users.insertOne({ id: 1001, name: "김철수", department: "컴퓨터"}); 핵심 차이점MySQL : 구조화된 쿼리 언어전통적인 SQL 문법 사용테이블과 컬럼 구조가 명확히 정의됨INSERT, VALUES..

mongoDB 2025.07.07