Spring 81

[📘 심화 Spring] 3-4. N+1 문제

📘 목차N + 1 문제Fetch Join @BatchSize 어노테이션정리1. N + 1 문제 N + 1 문제 ORM 프레임워크(특히 JPA, Hibernate)를 사용할 때 가장 빈번하게 발생하는 성능 병목 현상이다.N + 11번의 쿼리로 기본 데이터(부모 엔티티)를 조회하고,이후에 N번의 쿼리로 연관된 데이터(자식 엔티티)를 각각 조회하는 상황을 의미한다.즉, 전체적으로는 N + 1번의 쿼리가 발생하여, 쿼리 수가 기하급수적으로 늘어나서 성능 저하를 유발한다. N + 1 문제 발생 원리와 과정부모 엔티티 한 번 조회 (1번 쿼리)예: 게시글 10개를 조회한다.쿼리 1번 실행 → select * from post자식 엔티티를 지연로딩 방식으로 각각 조회 (N번 쿼리)각 게시글마다 작성자(Memb..

Spring/강의 2025.06.09

[📘 심화 Spring] 3-3. JPQL (Java Persistence Query Language)

📘 목차JPQL 등장 배경과 한계기본 문법 반환 타입 및 결과 파라미터 바인딩 Embedded Type 프로젝션 (Projection) 페이징 (Paging) JOIN CASE 식함수1. JPQL 등장 배경과 한계 객체 중심 설계와 JPA 의 한계JPA는 객체(Entity) 중심의 데이터베이스 접근을 지향한다.단순 조회는 em.find() 또는 객체 간 참조 탐색으로 가능하다.모든 데이터를 객체로 불러올 수는 없음특정 조건 기반의 복잡한 검색은 불가능→ 조건 기반 조회가 필요한 상황에서는 SQL 같은 쿼리가 필요해짐 JPQL의 등장JPQL(Java Persistence Query Language)은 객체(Entity)를 대상으로 SQL과 유사한 문법으로 작성된 객체지향 쿼리 언어이다.특징Entity..

Spring/강의 2025.06.09

[📘 심화 Spring] 3-2. API 예외 처리

📘 목차@ExceptionHandler@ControllerAdvice@RestControllerAdvice정리1. @ExceptionHandler특정 컨트롤러 또는 컨트롤러 메서드 내에서 발생하는 예외를 처리하기 위해 사용한다.메서드에 붙이며, 처리할 예외 타입을 지정한다.특징해당 컨트롤러 내에서만 적용됨여러 예외를 하나의 메서드로 처리 가능 (파라미터에 여러 예외 타입 지정)@RestControllerpublic class UserController { @GetMapping("/users/{id}") public User getUser(@PathVariable Long id) { // 예외 발생 가능 return userService.findById(id); ..

Spring/강의 2025.06.09

[📘 심화 Spring] 3-1. Spring Bean 생명주기

📘 목차Bean 생명주기생명주기 콜백 종류Bean Scope와 생명주기1. Bean 생명주기Spring이 Bean을 생성하고 의존성을 주입한 뒤, 초기화 작업을 수행하고, 필요 시 종료 메서드를 호출하는 일련의 과정을 의미한다. 생명주기 요약 Spring Container 초기화Bean 인스턴스 생성의존성 주입 (DI)초기화 메서드 호출 (@PostConstruct, afterPropertiesSet())Bean 생성 및 의존관계 설정이 완료된 후 호출Bean 사용소멸 메서드 호출 (@PreDestroy, destroy())Bean이 소멸되기 직전에 호출Bean 소멸2. 생명주기 콜백 종류Spring은 Bean의 초기화와 소멸 시점에 사용자 정의 로직을 삽입할 수 있도록 다양한 콜백 수단을 제공한다. ..

Spring/강의 2025.06.09

[📘 심화 Spring] 2-2. JPA 고급 매핑

📘 목차프록시 (Proxy)지연 로딩 (Lazy) vs 즉시 로딩 (Eager)영속성 전이 (Cascade)고아 객체 (Orphan Removal)1. 프록시 (Proxy)JPA는 엔티티를 실제로 조회하지 않고도 프록시 객체를 통해 지연 조회(Lazy Loading)를 가능하게 한다. Entity 조회 방식 em.find(): 실제 객체를 즉시 조회한다.em.getReference(): 프록시 객체를 반환하며, 실제 객체는 필요 시 조회한다. (지연 로딩)Item item = em.getReference(Item.class, 1L); // 프록시 반환 프록시 특징실제 클래스를 상속받은 가짜 객체실제 데이터를 사용하는 시점에 쿼리 실행instanceof는 사용할 수 있으나, 프록시 초기화 여부는 주..

Spring/강의 2025.06.09

[📘 심화 Spring] 2-1. JPA 연관관계 매핑

📘 목차연관관계 매핑1 : N 연관관계1 : 1 연관관계N : M 연관관계상속관계 매핑1. 연관관계 매핑 연관관계의 종류 관계 타입N:1 (ManyToOne)1:N (OneToMany)1:1 (OneToOne)N:M (ManyToMany)방향성단방향: 한쪽 엔티티만 상대 엔티티를 참조양방향: 양쪽 엔티티가 서로를 참조 주요 어노테이션 관계 타입 어노테이션 비고 N : 1@ManyToOne가장 많이 사용됨1 : N@OneToMany 1 : 1@OneToOne N : M@ManyToMany신중하게 사용 권장 단방향과 양방향 연관관계테이블 관점외래 키(FK) 하나로 두 테이블 간 JOIN 가능객체 관점단방향: 외래키가 있는 쪽 엔티티만 상대 엔티티를 참조 가능양방향: 두 엔티티 모두 서로를 참조..

Spring/강의 2025.06.09

[📘 심화 Spring] 1. Converter, Formatter

📘 목차HttpMessageConverterArgumentResolverReturnValueHandlerTypeConverterConverterConversionServiceConverter 적용 (실습)FormatterSpring Formatter1. HttpMessageConverter HttpMessageConverterHTTP 요청(Request) 또는 응답(Response)의 바디(body)를 자바 객체로 변환하거나, 자바 객체를 HTTP 메시지 바디로 변환하는 역할을 한다.JSON, XML, 바이너리 데이터 ↔ 자바 객체 역할컨트롤러 메서드의 @RequestBody, @ResponseBody 처리를 담당클라이언트와 서버 간 데이터 직렬화/역직렬화 담당 주요 구현체 MappingJackso..

Spring/강의 2025.06.09

@ControllerAdvice가 Filter 예외를 잡지 못하는 문제 해결

문제 상황JWT 인증을 위한 커스텀 필터(JwtFilter)에서 토큰 유효성을 검사할 때, 아래와 같이 JwtValidationException이라는 커스텀 예외를 던지도록 구현하였다 catch (SecurityException | MalformedJwtException e) { throw new JwtValidationException("유효하지 않는 JWT 서명입니다.", HttpServletResponse.SC_UNAUTHORIZED);} catch (ExpiredJwtException e) { throw new JwtValidationException("만료된 JWT 토큰입니다.", HttpServletResponse.SC_UNAUTHORIZED);} catch (UnsupportedJ..

Spring Boot 프로젝트에서 Redis 연동 하기

1. 왜 Redis를 도입했는가?JWT 로그아웃 기능을 구현하기 위해 Redis를 도입하게 됐다. JWT는 기본적으로 서버 상태를 저장하지 않는 Stateless 방식이기 때문에, 발급된 토큰을 서버에서 직접 "무효화"하는 것이 어렵다. 이로 인해 사용자가 로그아웃을 해도 기존 토큰은 만료되기 전까지 유효하게 동작한다. 이를 해결하기 위해 로그아웃 시 사용한 JWT를 Redis에 저장하고,이후 요청마다 해당 토큰이 Redis에 존재하는지를 확인하는 방식으로 블랙리스트를 관리했다. * 블랙리스트 관리에 Redis 를 사용한 이유 In-memory 기반으로 빠르게 블랙리스트 조회 가능TTL(Time To Live) 기능을 활용해 JWT 만료 시점과 동일하게 자동 제거 가능간단한 Key-Value 저장 구조..

Spring/응용 2025.06.04

Spring Security 에러 핸들링 오류 해결, /error 접근 권한 문제

문제 상황jwt Filter 와 Spring Security 를 문제 없이 통과함컨트롤러와 서비스에 잘 도달서비스의 비즈니스 로직에서 예외 발생 (비밀번호 오류 시 예외 처리)응답 메시지에 Spring Security의 exceptionHandling - authenticationEntryPoint 예외가 출력됨 [디버깅]1. Postman 으로 요청을 보냄 2. jwt 검증과 security 를 통과 후 컨트롤러에 도달한 것을 확인 3. 발생한 예외는 security - authenticationEntryPoint 예외 !!!{ "error": "인증 실패: Full authentication is required to access this resource"} * SecurityConfig 의..