Backend Development/SPRING 35

@CurrentUser + HandlerMethodArgumentResolver로 인증 인터페이스 미리 설계하기

인증 시스템을 아직 붙이지 않은 초기 개발 단계에서도, 나중에 Spring Security나 JWT가 들어올 자리를 미리 만들어 둘 수 있습니다. 지금은 가짜 데이터를 돌리더라도, 커스텀 파라미터 애노테이션(@CurrentUser)과 HandlerMethodArgumentResolver를 조합해 유연한 인터페이스를 먼저 선언해 두는 것입니다.목적 및 장점핵심 목적이 패턴의 본질은 "인증 정보를 꺼내오는 구체적인 방법"을 컨트롤러로부터 숨기는 것에 있습니다.컨트롤러는 그저 @CurrentUser User loginUser라고 선언만 하면 됩니다.이 유저가 임시 가짜 유저인지, HTTP 세션에서 나왔는지, JWT 토큰을 해독해서 나왔는지는 컨트롤러가 알 필요가 없습니다. 알맹이(인증 방식)가 어떻게 바뀌든 ..

N+1 문제의 원인과 해결 전략 선택 기준 정리

1. N+1 문제란?1번의 쿼리로 N개의 레코드를 가져온 뒤, 각 레코드에 대해 연관 데이터를 조회하는 쿼리가 N번 추가로 발생하는 현상이다. 예) 게시글 목록을 조회할 때 각 게시글의 댓글도 함께 보여줘야 하는 상황이다.1. SELECT * FROM post → 게시글 10개 조회 (1번)2. SELECT * FROM comment WHERE post_id = 1 → 게시글 1번 댓글3. SELECT * FROM comment WHERE post_id = 2 → 게시글 2번 댓글4. SELECT * FROM comment WHERE post_id = 3 → 게시글 3번 댓글...11. SELECT * FROM comment WHERE post..

IoC / DI 정리

1. IoC — 제어의 역전핵심 개념IoC(Inversion of Control)는 이름 그대로 제어권이 역전된다는 개념이다.전통적인 방식에서는 개발자가 직접 객체를 생성, 의존성 연결, 생명주기를 관리했다.Spring에서는 이 모든 제어권이 Spring 컨테이너로 넘어간다. 구분전통 방식IoC 방식객체 생성개발자가 new로 직접 생성Spring 컨테이너가 생성의존성 연결개발자가 코드에서 직접 연결컨테이너가 자동으로 주입생명주기 관리개발자가 직접 관리컨테이너가 관리구현체 결정코드에 하드코딩설정(Config)에서 결정전통 방식의 문제전통 방식에서는 클래스가 의존하는 구체 클래스를 직접 알아야 한다.public class OrderService { private MemberRepository repo ..

[Spring HTTP Client] 1. RestTemplate vs WebClient vs RestClient

외부 API 호출은 백엔드 개발에서 거의 필수적인 기능이다.결제, 인증, 메시징, 지도, 사내 MSA 통신 등 대부분의 서비스는 외부 시스템과 통신한다.Spring에서는 HTTP 호출을 위해 세 가지 주요 클라이언트를 제공한다.RestTemplateWebClientRestClient이번 글에서는 이 세 가지의 차이점과 특징을 정리한다.1. 비교 구분 등장 시기 방식 현재 권장 여부 RestTemplateSpring 3Blocking (동기)유지보수 모드WebClientSpring 5Non-blocking (Reactive)적극 권장RestClientSpring 6Blocking (동기, 개선형)최신 대안2. RestTemplate1) 개요과거 표준 HTTP 클라이언트동기(Blocking) 방식요청을..

Spring Boot에서 웹소켓 연결 시 Authentication 객체를 읽는 방법(JWT 기준)

흐름1. Client가 WebSocket 연결 시 헤더 또는 쿼리 파라미터로 AccessToken을 전송2. Server에서 WebSocket과 HandShake 과정에서 토큰을 추출함1) ChannelInterceptor 사용(STOMP 권장):STOMP 프로토콜을 사용하는 경우, ClientInboundChannel에 인터셉터를 등록하여 CONNECT 메시지 헤더에서 토큰을 검증하고 Authentication 객체를 생성하여 웹소켓 세션에 저장구현 예시:import org.springframework.messaging.Message;import org.springframework.messaging.MessageChannel;import org.springframework.messaging.simp.s..

AOP에서 자기 호출(self invocation) 문제와 해결법

1. self invocation 문제 정의프록시 기반 동작 구조에서 발생한 클래스 내의 메서드에서 다른 내부 메서드를 호출할 때, AOP 어노테이션이 적용되지 않는 현상Spring AOP는 프록시 기반이므로같은 클래스 내 자기 호출(self-invocation)에서는 프록시가 개입하지 않아 AOP가 동작하지 않음자기 호출: 프록시를 거치지 않고 같은 객체(this) 내에서 직접 메서드를 호출하는 구조@Trasactional 자기 호출 문제메서드에 @Trasactional 어노테이션이 붙어있으면 프록시가 해당 메서드를 감싸서 트랜잭션을 시작 및 관리@Trasactional 어노테이션이 있는 메서드를 내부에서 직접 호출하면트랜잭션이 이미 열려 있지 않은 경우 새 트랜잭션 생성 X@Async 자기 호출 문제..

[Spring] Spring Cache

1. Spring Cache 주요 어노테이션@Cacheable캐시가 없을 경우 메서드를 실행하고 그 결과를 캐시에 저장캐시가 있으면 메서드를 실행하지 않고 캐시의 데이터 반환@CachePut캐시를 조회하지 않고 항상 메서드를 실행하여 메서드 결과로 캐시 업데이트@CacheEvict특정 키를 가진 캐시 데이터 제거2. @Cacheable목적데이터 조회 및 저장데이터 조회 시, 반복적으로 DB에 접근하는 것을 피하고 캐시를 활용하여 성능 향상동작 방식메서드가 호출되면 key에 해당하는 캐시가 있는지 확인캐시 데이터 O: DB 접근 없이 캐시 데이터 즉시 반환캐시 데이터 X: 메서드를 실행 → 반환된 결과를 key와 함께 캐시에 저장 → 반환사용 시점자주 변경되지 않는 데이터 조회메뉴, 카테고리 등 자주 변경..

[Spring] 비동기 환경에서 컨텍스트 정보 전달 방법

1. 비동기란?별도의 스레드 풀이나 다른 스레드에서 코드를 실행하는 방식@Async, CompletableFuture, ExecutorService 등현재 요청 스레드와 다른 스레드에서 로직이 수행되는 것2. 컨텍스트 정보란?MDC (Mapped Diagnostic Context)Logback과 같은 로깅 프레임워크에서 제공하는 기능로그에 사용자 ID, 요청 ID 등 공통 정보를 저장하는 공간로그 추적 ID, 사용자 ID를 자동으로 로그에 포함시켜 로그 추적에 사용SecurityContextSpring Security와 같은 보안 프레임워크에서 사용현재 인증된 사용자의 정보(Authentication) 등을 저장하는 곳비동기 로직에서도 인증 정보 유지를 위해 필요이 정보는 애플리케이션 내에서 현재 사용자..

[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을 리턴하..

728x90