Spring Framework/Spring (8) 썸네일형 리스트형 [Spring] Spring AOP — Advice 종류와 실행 순서 1. Advice란메서드 실행의 어느 시점에 끼워 넣을 부가 기능 로직이다. 적용 시점에 따라 다섯 가지 종류가 있다.종류시점@Before메서드 실행 전@After메서드 실행 후 (정상/예외 무관)@AfterReturning정상 반환 후@AfterThrowing예외 발생 후@Around전후 모두 감쌈 (가장 강력) 2. @Before메서드 실행 전에 동작한다. 메서드 호출을 막거나 파라미터를 바꿀 수는 없다. 그런 제어가 필요하다면 @Around를 써야 한다.@Aspect@Componentpublic class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBefore(JoinPoint jp).. [Spring] Spring AOP - Pointcut 지시자 완전 정복 1. 지시자란Pointcut 표현식에서 "어떤 기준으로 메서드를 선별할지" 를 지정하는 키워드다.@Pointcut("execution(* com.example.service.*.*(..))")// ↑// 지시자지시자는 선별 기준에 따라 네 가지로 분류된다. 2. execution — 가장 범용적인 지시자메서드 시그니처 전체를 기준으로 선별한다. 리턴 타입, 패키지, 클래스, 메서드 이름, 파라미터까지 세밀하게 제어할 수 있어 가장 많이 쓰인다. 문법 구조execution( [접근제어자]? 리턴타입 [패키지.클래스.]메서드(파라미터) [throws 예외]? ) ↑ 생략 가능 ↑ 필수 ↑ 생략 가능 ↑ 필수 ↑ 생략 가능필수 요.. [Spring] Spring AOP — 개념과 구조 1. AOP가 왜 필요한가서비스 레이어를 작성하다 보면 이런 패턴이 반복된다.public class UserService { public void save(User user) { // 로깅 log.info("save 호출: {}", user); // 트랜잭션 시작 transaction.begin(); // 인증 확인 checkAuth(); // ─── 핵심 비즈니스 로직 ─── userRepository.save(user); // ────────────────────────── // 트랜잭션 커밋 transaction.commit(); log.info.. [Spring] 트랜잭션 완전 정리 - @Transactional의 내부 동작과 함정들 Spring Boot 3.x 기준으로 작성하였습니다.1. PlatformTransactionManagerSpring의 트랜잭션 추상화 계층 최상단에는 PlatformTransactionManager 인터페이스가 있습니다.public interface PlatformTransactionManager { TransactionStatus getTransaction(TransactionDefinition definition); void commit(TransactionStatus status); void rollback(TransactionStatus status);}이 인터페이스 덕분에 @Transactional은 특정 기술에 종속되지 않습니다. JPA를 쓰든 MyBatis를 쓰든 @Trans.. [Spring] Spring은 DB 예외를 어떻게 바꾸는가 SQLException이 DataIntegrityViolationException이 되기까지 왜 예외 변환이 필요한가JPA를 쓰든 JDBC를 쓰든, 결국 DB와 통신하다 보면 예외가 발생한다. 유니크 제약 위반, 락 충돌, 연결 실패 등 다양한 상황이 있다. 문제는 이 예외들이 DB 벤더마다 형태가 다르다는 것이다.유니크 제약 위반 에러코드 MySQL → 1062 PostgreSQL → 23505 Oracle → 1 Hibernate나 JPA도 나름의 예외 계층을 갖고 있지만, DB 에러코드 수준의 세밀한 구분까지는 해주지 않는다. 결국 개발자가 PersistenceException을 잡아서 getCause()를 타고 내려가며 에러코드를 직접 파싱해야 하는 상황이 생긴다.Spr.. [Spring] Spring의 비동기 처리 — @Async부터 Virtual Thread 통합까지 들어가며이전 포스트에서 자바의 네 가지 동시성 구현 메커니즘(Thread, Executor, Fork/Join, Virtual Thread)을 살펴보았습니다. 이번 포스트에서는 Spring Framework가 이 위에서 비동기 처리를 어떻게 추상화하는지 정리합니다. Spring은 @Async 어노테이션 하나로 메서드를 비동기로 실행할 수 있게 해줍니다. 편리하지만, 내부 동작 원리를 이해하지 못하면 "분명히 @Async를 붙였는데 동기로 실행된다"는 문제를 마주치게 됩니다. 이 포스트에서는 설정부터 동작 원리, 흔한 함정, 그리고 Spring Boot 3.2+에서의 Virtual Thread 통합까지 다룹니다. 1. @Async와 ThreadPoolTaskExecutor 설정1-1. @EnableAsyn.. [Spring] Spring MVC + Tomcat vs Spring WebFlux + Netty, 그리고 Virtual Thread까지 Spring 기반 웹 애플리케이션의 동시성 모델을 비교하고, JDK 21의 Virtual Thread가 가져온 패러다임 변화를 정리합니다.1. 두 가지 동시성 모델Spring MVC + Tomcat: Thread-per-RequestSpring MVC는 thread-per-request 모델을 사용한다. 요청이 들어오면 Tomcat의 스레드 풀(기본 200개)에서 스레드 하나를 할당하고, 해당 스레드가 컨트롤러 → 서비스 → DB 호출까지 전부 담당한다. DB I/O 같은 블로킹 작업이 발생하면 해당 스레드는 응답이 올 때까지 대기(blocking) 상태에 놓인다. Spring WebFlux + Netty: Event LoopSpring WebFlux는 Event Loop 모델을 사용한다. Netty의 .. [Spring] Spring 캐시(Cache) 핵심정리 개요채팅 시스템을 프로젝트에서 구현하면서 Redis를 프로젝트에 도입하게 되었다.Redis는 채팅방 구독 정보를 관리하기 위해 도입했지만, 캐싱도 가능하다고 글을 읽은 적이 있다. 캐싱을 적용한 곳은 채팅방 목록에서 마지막 메시지 조회 로직이었고,직렬화, 역직렬화 문제로 나름 애를 먹었지만 잘 도입할 수 있었다! 1. 캐시 어노테이션 3종 세트@Cacheable - 조회 시 캐싱@Cacheable(value = "userCache", key = "#userId")public User getUser(Long userId) { return userRepository.findById(userId); // 첫 번째만 실행, 이후 캐시 반환} @CachePut - 업데이트하면서 캐시 동기화@CachePut.. 이전 1 다음