본문 바로가기

전체 글

(109)
JPA Specification - 복잡한 검색 조건 처리하기 (vs QueryDSL) JPA Specification이란?: JPA에서 동적 쿼리를 조합할 수 있게 도와주는 WHERE 절 조건 빌더조건을 메서드 단위로 나누고, 조합할 수 있도록 함→ where 절의 조건 하나하나를 Specification 객체로 만들고, 이를 .and(), .or() 등으로 조립한다 ! 기본 사용법 1. Repository에 JPASpecificationExecutor 확장public interface UserRepository extends JpaRepository, JpaSpecificationExecutor {} 2. Specification 정의public class UserSpecification { public static Specification hasName(String name) ..
더티 체킹(Dirty Checking) - 개념 및 주의사항 / @DynamicUpdate 더티 체킹(Dirty Checking)이란?: JPA가 트랜잭션 커밋 시점에 영속성 컨텍스트에 저장된 엔티티 객체의 상태 변경 여부를 감지하여, 자동으로 DB에 반영해주는 기능 언제 발생할까? 1. 트랜잭션 안에서 2. 영속 상태(EntityManager가 관리 중)인 엔티티에 대해 3. save() 등의 메서드 없이 필드를 변경만 하고 4. 트랜잭션이 commit될 때 → JPA가 내부적으로 flush()를 수행, 이전 스냅샷과 비교해서 변경이 감지되면 UPDATE 쿼리를 날린다 !flush()란?: 영속성 컨텍스트의 변경 내용을 DB에 반영하는 동작→ 트랜잭션 commit 직전에 JPA가 자동으로 호출, 이 시점에 더티 체킹이 수행됨 예)@Transactionalpublic void updateUs..
@Transactional 이해하기 - 내부 동작 및 주의사항 포함 @Transactional이란?: spring에서 지원하는 트랜잭션을 선언적으로 처리하기 위한 어노테이션주로 DB 작업을 수행하는 Service 계층에서 사용되며, @Transactional이 적용된 메서드를 실행하면 트랜잭션이 시작되고 메서드 정상적 종료 시 commit / 예외 발생 시 rollback→ 이러한 흐름을 자동으로 처리해줌 ! 내부 동작 원리 @Transactional은 프록시 기반 AOP 기술로 동작즉, 실제 서비스 객체를 감싸는 프록시 객체가 생성되고 이 프록시가 메서드 호출을 가로채 트랜잭션을 관리 → 프록시가 메서드 실행 전후에 트랜잭션 시작 / 커밋 / 롤백 수행프록시(Proxy)란?: 객체를 감싸서 실제 객체 호출 전/후에 부가적인 처리를 하는 중간 객체Spring에서는 대표..
CustomException 처리 중 DB 저장 오류로 인한 500 에러 해결 문제 상황 잘못된 QR 코드로 출입 요청 시, INVALID_QR_CODE 예외가 발생해야 하지만 500 Internal Server Error 발생 ! 기존 QR 출입 인증 처리 실패 플로우 1. 클라이언트가 QR 코드로 출입 요청 2. processQrAccess()에서 validateQr() 호출 - 요청받은 QR 코드 검증 수행try{ identifier = qrService.validateQr(request.getQrCode());} 3. QR 유효성 검사 → 실패 시 CustomException(INVALID_QR_CODE) 발생public String validateQr(String qrCode){ try{ String storedIdentifier = redisT..
예외 발생 시 로그 누락 - REQUIRES_NEW로 롤백 방지하기 문제 상황 AccessService에서 출입 인증 시 실패 로그가 저장되지 않는 문제가 발생 !출입 인증 메서드(processFaceAccess 또는 processQrAccess) 내에서 예외 발생 시, 실패 로그 저장을 위해 LogService.saveFailLog가 호출됨→ 그러나 예외로 인해 부모 트랜잭션 전체가 롤백되면서 FailLog 저장도 함께 롤백→ AccessLog는 정상 흐름에서 예외 없이 저장되어 DB에 남지만, FailLog는 저장되지 않음 출입 인증 처리 기대 플로우 1. 클라이언트가 출입 요청을 보냄2. AccessService의 processFaceAccess/processQeAccess가 요청 처리 시작3. 출입 조건 충족 여부에 따라 AccessLog 저장4. 예외 발생 시..
Spring Security 로그인 예외 처리 - 401 대신 500에러 발생 문제 해결 문제 상황 잘못된 아이디로 로그인 요청을 보낸 경우, 401 Unauthorized 상태 코드가 반환되어야 하는데 500 Internal Server Error가 발생 !2025-04-26T04:21:15.070+09:00 ERROR ... : Exception 발생: 사용자를 찾을 수 없습니다.org.springframework.security.authentication.InternalAuthenticationServiceException: 사용자를 찾을 수 없습니다.Caused by: com.deepnyangning.capstonebe.global.exception.CustomException: 사용자를 찾을 수 없습니다. 기존 로그인 요청 처리 기대 플로우 1. 클라이언트 요청클라이언트가 /aut..
Union-Find Union-Find서로소 집합 (Disjoint-Set)을 표현할 때 사용하는 그래프 알고리즘집합을 트리 구조로 표현하여 임의의 두 노드(원소)가 서로 같은 그래프(집합)에 속하는지 판별 Disjoint-Set공통 원소가 없는 "상호 배타적인" 부분집합들로 나눠진 원소들에 대한 정보를 표현하는 자료구조  Unoin 연산과 Find 연산으로 이루어짐Union : 두 원소가 속한 집합을 하나로 합침Find : 해당 원소가 속한 집합(루트 원소)을 반환 Union-Find 사용 예시특정 두 개체가 같은 그룹에 속하는지 효율적으로 판별하기 위해 사용됨네트워크 연결 여부 판별여러 개의 컴퓨터가 서로 연결될 떄, 특정 두 컴퓨터가 같은 네트워크에 속해 있는지 확인최소 신장 트리 (MST) - 크루스칼 알고리즘최소 ..
요청 캐시 RequestCache / SavedRequest 정수원님의 **스프링 시큐리티 완전 정복** 강의 내용 기록입니다 !!    RequestCache인증 절차 문제로 로그인 페이지로 리다이렉트된 후, 이전에 했던 요청 정보를 담고 있는 'SavedRequest' 객체를 쿠키 혹은 세션에 저장하고 필요시 다시 가져와 실행하는 캐시 메커니즘RequestCache는 인터페이스, 이를 구현한 객체는 HttpSessionRequestCache SavedRequestSavedRequest는 로그인과 같은 인증 절차 후 사용자를 인증 이전의 원래 페이지로 안내함이전 요청과 관련된 여러 정보를 저장SavedRequest는 인터페이스, 이를 구현한 객체는 DefaultSavedRequestredirectUrl : 이전 요청 url  흐름도 client↓  Get  /u..