[Spring][SpringMVC] Spring Boot 기본 ExceptionResolver 3종 완전 정리
·
Dev Framework/Spring
Spring Boot 기본 ExceptionResolver 3종 완전 정리Spring MVC에서 예외가 발생하면 DispatcherServlet은 내부적으로 HandlerExceptionResolverComposite를 통해예외 처리 흐름을 제어합니다. 해당 Composite에는 기본적으로 다음의 Resolver들이 등록되며, 순서대로 예외 처리를 시도합니다.등록 순서ExceptionHandlerExceptionResolverResponseStatusExceptionResolverDefaultHandlerExceptionResolver각 Resolver는 다음과 같은 상황에서 사용됩니다. 1. ExceptionHandlerExceptionResolver정의@ExceptionHandler 애노테이션이 붙은..
[Spring] ControllerAdvice + ExceptionHandler 전역 예외 처리
·
Dev Framework/Spring
@ControllerAdvice와 @ExceptionHandler 완전 정복도입 배경: 왜 전역 예외 처리가 필요한가?서비스를 운영하다 보면 예외는 피할 수 없는 현실입니다. 특히 웹 애플리케이션에서는 다음과 같은 요구가 자주 등장합니다:클라이언트에게 일관된 에러 응답 포맷을 제공해야 한다.추후에 API 스펙이 변경되면, 프론트엔드의 수정이 불가피하다.따라서 많은 부수효과가 발생한다.비즈니스 예외와 시스템 예외를 구분해서 다뤄야 한다.예외 발생 시 적절한 로그, 알람, 후속 처리를 구성해야 한다.컨트롤러마다 중복되는 try-catch를 제거하고 싶다.Spring은 이러한 요구를 해결하기 위해 전역 예외 처리 메커니즘을 제공합니다. 그 핵심은 @ControllerAdvice와 @ExceptionHandle..
[Spring][JPA] JPA QueryHint에 대해서 알아보자
·
Dev Framework/Spring
JPA QueryHint, 정말 성능에 도움이 될까?“@QueryHint 쓰면 성능이 좋아진다던데요?”반은 맞고, 반은 틀립니다. 이 글에서는 JPA Hint의 현실적 쓰임새와 한계, 그리고 실무에서 언제 써야 의미 있는지를 정리해봅니다. Hint란 무엇인가?JPA에서 제공하는 @QueryHint는 쿼리 실행 시 Hibernate나 JPA 구현체에게 특정 힌트를 전달하여 동작을 제어하는 기능입니다. 사용 예시Dirty Checking을 생략해서 flush를 방지쿼리 결과를 2차 캐시에 저장JDBC 쿼리에 타임아웃 적용@QueryHints(@QueryHint(name = "org.hibernate.readOnly", value = "true"))@Query("SELECT m FROM Member m")Li..
[Spring][JPA] N+1 문제의 발생부터 해결까지
·
Dev Framework/Spring
JPA N+1 문제, 왜 생기고 어떻게 해결할까?많은 개발자들이 JPA를 쓰면서 한 번쯤은 겪는 고질병, 바로 N+1 문제다.처음엔 성능 잘 나오다가도, 조회 건수가 많아지면 갑자기 쿼리 수가 폭증하고 응답 시간이 기하급수적으로 느려진다.그리고 로그를 보면 이렇게 되어 있다.SELECT * FROM member;SELECT * FROM team WHERE team_id = 1;SELECT * FROM team WHERE team_id = 2;SELECT * FROM team WHERE team_id = 3;...한 번의 조회로 끝날 줄 알았던 쿼리가 무려 N+1번이나 나간다. N+1 문제란 무엇인가?N+1 문제는 JPA에서 1번의 쿼리로 N개의 결과를 가져온 후, 그 결과 각각에 대해 추가 쿼리가 1번씩..
[Spring][JPA] 스프링 데이터 JPA Auditing 심화편
·
Dev Framework/Spring
🚀 Spring Data JPA Auditing 심화편– 현업에서는 이렇게까지 활용합니다 1. 실전 예제: createdBy, updatedBy를 로그인 사용자로 자동 세팅하기AuditorAware를 구현할 때, 보통 로그인 사용자 정보를 가져와야 합니다.스프링 시큐리티를 쓰는 경우 이렇게 작성합니다.import org.springframework.data.domain.AuditorAware;import org.springframework.security.core.Authentication;import org.springframework.security.core.context.SecurityContextHolder;import org.springframework.stereotype.Component;i..
[Spring][JPA] 스프링 데이터 JPA Auditing 완전 정복
·
Dev Framework/Spring
🌟 스프링 데이터 JPA Auditing 완전 정복– 데이터의 생성과 변경을 자동으로 기록하는 가장 깔끔한 방법 1. Auditing이란 무엇인가?Auditing(감사, 기록)은 쉽게 말하면,"이 데이터가 언제 생성되었는지, 언제 수정되었는지, 누가 수정했는지를 자동으로 기록하는 기능"입니다.우리가 실제 서비스를 운영하다 보면, 거의 대부분의 테이블에 이런 칼럼들이 존재합니다.칼럼명의미created_at데이터가 처음 생성된 시간updated_at데이터가 마지막으로 수정된 시간created_by데이터를 처음 만든 사용자updated_by마지막으로 데이터를 수정한 사용자처음에는 직접 setCreatedAt() 하면서 채우겠지만,규모가 커지면 매번 이런 코드를 반복하는 것은 비효율적이고, 오타, 실수도 잦아..
[Spring][JPA] Hibernate에서 FROM 절 서브쿼리를 만들 수 없는 이유
·
Dev Framework/Spring
Hibernate에서 FROM 절 서브쿼리를 만들 수 없는 이유"어? SQL에서는 FROM 절 안에 서브쿼리를 넣을 수 있는데, Hibernate는 왜 안 될까?"JPA를 처음 배우다 보면 누구나 한 번쯤 이런 의문을 품게 됩니다.오늘은 이 질문을 정확하게, 그리고 실전 관점에서 풀어보겠습니다. JPA와 Hibernate, 그리고 JPQL우선 출발점부터 바로잡아야 합니다.Hibernate는 JPA의 대표적인 구현체입니다.그리고 JPA에서는 데이터베이스를 직접 다루지 않고,JPQL이라는 "객체지향 쿼리 언어"를 사용합니다.SQL은 테이블을 대상으로 쿼리합니다.JPQL은 엔티티 객체를 대상으로 쿼리합니다.이게 둘의 본질적인 차이입니다. JPQL은 FROM 절 서브쿼리를 허용하지 않는다문제는 여기서 발생합니다..
[Spring] 트랜잭션 예외에 따른 커밋(Commit)과 롤백(Rollback)
·
Dev Framework/Spring
예외와 트랜잭션 커밋, 롤백트랜잭션에서 예외가 발생하면 항상 롤백될까요?우리는 흔히 try-catch 블록 안에서 데이터베이스 작업을 수행하고, 예외가 발생하면 롤백되겠지… 하고 생각합니다. 하지만 Spring에서는 반드시 그렇지 않습니다. 체크 예외는 롤백되지 않는다?Spring의 트랜잭션 처리 기본 정책은 다음과 같습니다:Unchecked 예외 (RuntimeException, Error 등) → 자동 롤백Checked 예외 (Exception 상속, RuntimeException 제외) → 자동 롤백 X즉, 개발자가 명시적으로 롤백을 선언하지 않으면, SQLException 같은 예외가 발생해도 트랜잭션이 커밋될 수 있습니다.@Transactionalpublic void saveData() thro..
개발자 성현
'Dev Framework/Spring' 카테고리의 글 목록