SpringBoot 5

[Spring Security] 인증/인가 프로세스

인증(Authentication) 처리 흐름UsernamePasswordAuthenticationFilter: 로그인 요청을 가로채어 Authentication 객체를 만듭니다.AuthenticationManager: 인증 처리의 중심이며, 하나 이상의 AuthenticationProvider에 인증을 위임합니다.AuthenticationProvider: 실제 인증 로직(예: DB 조회, 비밀번호 비교 등)을 담당합니다.SecurityContext: 현재 인증된 사용자(Authentication)를 보관합니다.HttpSession: SecurityContext를 세션에 저장하여 요청 간 상태를 유지합니다.포인트설명인증 시작UsernamePasswordAuthenticationFilter가 로그인 요청을 ..

[Spring Security] 기본 사용법

1. 의존 라이브러리 추가(build.gradle)dependencies { ... implementation 'org.springframework.boot:spring-boot-starter-security' ...}2. Spring Security Configuration 적용기본 구조package com.springboot.config;import org.springframework.context.annotation.Configuration;@Configurationpublic class SecurityConfiguration { // 여기에 Spring Security의 설정 진행}3. HTTP 보안 구성HttpSecurity를 파라미터로 가지고, SecurityFilterChain을 리턴하..

Spring Transaction

1. 트랜잭션(Transaction)DB 상태를 변화시키는 작업의 논리적 단위반드시 모두 성공하거나 모두 실패해야 함데이터 무결성(일관성) 보장과 예외 상황 대비트랜잭션 속성: ACID트랜잭션이 신뢰성과 무결성을 갖추기 위한 핵심 원칙속성의미 목적실무 포인트AAtomicity (원자성)모두 성공 또는 모두 실패(All or Nothing)작업 단위 보호CConsistency (일관성)트랜잭션 전후 데이터 일관성(무결성) 유지데이터 오염 방지IIsolation (격리성)동시에 실행되는 트랜잭션 독립성 유지동시성 이슈 방지DDurability (지속성)성공된 작업은 영구 보존장애 발생 시 복구 보장Isolation (격리성)각 트랜잭션이 서로 영향을 받지 않도록 분리격리 수준(Isolation Level)수..

[MapStruct] Default 메서드 활용한 커스텀 매핑 전략

📚 MapStruct 시리즈기본 사용법Default 메서드 활용한 커스텀 매핑 전략 @MappingTarget: 기존 객체 수정 매핑개념자동 매핑이 어려운 로직이나 직접 커스텀 매핑이 필요한 경우 사용직접 생성자 호출이 필요한 경우두 개 이상의 매개변수를 조합해서 하나의 객체를 만들 경우MapStruct가 default 메서드도 Spring Bean으로 등록사용법@Mapper(componentModel = "spring")public interface UserStatusMapper { // 자동 매핑 (MapStruct가 처리) UserStatusDto toDto(UserStatus userStatus); // 수동 매핑 (직접 로직 작성, default 메서드) default U..

N+1 문제의 발생 원인과 해결 방안

N+1 문제는 ORM 환경에서 발생하는 대표적인 문제로, 한 번의 쿼리로 N개의 엔티티를 조회한 후 각 엔티티에 연관된 데이터를 조회하면서 총 N+1번의 쿼리가 실행되는 문제이다.발생 원인JPA의 연관 관계 기본 Fetch 전략이 ‘Lazy’인 경우, 연관된 엔티티를 실제로 접근할 때마다 쿼리가 실행된다. 특히 컬렉션(List)의 Lazy 로딩은 초기 조회 시 쿼리가 실행되지 않다가 각 엔티티의 컬렉션에 접근할 때마다 개별 쿼리가 발생하여 N+1문제가 발생하므로 조심해야 한다.List members = memberRepository.findAll(); // 1번 쿼리 발생for (Member m : members) { System.out.println(m.getOrders()); // N번 쿼리 발..

728x90