Spring Framework/Spring (4) 썸네일형 리스트형 [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 다음