Spring

    Jpa 쿼리 파라미터 로그 확인방법 - With DataJpaTest p6spy

    Spring Boot 기본 설정으로는 hibernate SQL 바인딩 변수 자리에 '?' 표시된 SQL 과 바인딩 변수 값이 따로 표시되어 SQL 디버깅이 불편하다. 쿼리 파라미터가 어떤 값을 가지고 있는지 확인할 수 있는 2가지 방법과 커스텀 방법에 대해 정리한다. 일반적으로 2번째 방법인 p6spy가 더 자세하고 편리하게 사용할 수 있지만, 리소스를 많이 사용하니 운영 환경에서는 사용하지 않는게 좋아 보인다. JPA 쿼리 파라미터 로그 체크 설정 파일을 통한 로그 설정 yaml 또는 properties 파일을 통한 로그 레벨 설정으로 쿼리 파라미터 바인딩을 확인할 수 있다. yaml logging: level: org.hibernate.SQL: debug org.hibernate.type.descri..

    Spring Security - SecurityContext, SecurityContextHolder, SecurityContextHolderStrategy, Authentcation

    먼저 인증이 진행되어 인증객체가 생성되는 간단한 지식을 정리하자. 스프링 시큐리티는 servlet filter를 기반으로 인증 기능을 지원한다. spring boot의 기본 설정을 사용한다면 springSecurityFilterChain filter를 자동으로 등록해 주고 이 filter를 이용하여 스프링 시큐리티의 인증 과정의 전체적인 동작을 주관한다. FilterChain 이름에서 보이다시피, 필터들은 다양하게 순서대로 엮여서 Chain을 구성하며, 이 필터들의 체인을 요청이 거쳐가면서 인증과정이 진행된다. 인증 과정이 끝나고 인증이 된다면, 이 요청의 사용자가 누구인지 알아야 하고 이 사용자가 올바른 인증된 사용자인지, 올바른 권한을 가지고 있는지 판단하기 위해서 인증 객체를 사용하게 된다. 그래서..

    Spring MVC의 기본 요청 처리 방식 - Thread Per Request Model

    Thread Per Request Model이란, 1개의 Request당 1개의 쓰레드를 사용하는 웹 요청 처리 모델이다 일반적으로 Spring Web MVC를 사용하면, 1개의 요청에 1개의 쓰레드를 사용하게 되고, Controller, Service, Repository, 도메인 모델 어디에서든 같은 쓰레드를 사용하게 된다. event Loop 모델과는 다르다 1요청당 1쓰레드를 사용하기 때문에 Spring MVC에서는 ThreadLocal을 이용하여 MVC 전역에서 다양한 처리들을 할 수 있다. 사용자 인증정보 전파 - Spring Security에서는 ThreadLocal을 이용해서 사용자 인증 정보를 전파한다. - SecurityContext 트랜잭션 컨텍스트 전파 - 트랜잭션 매니저는 트랜잭션..

    FilterChainProxy

    FilterChainProxy https://docs.spring.io/spring-security/site/docs/3.1.4.RELEASE/reference/security-filter-chain.html Spring Security란 Spring Security는 일반적인 공격에 대한 인증, 권한 부여 및 보호를 제공하는 프레임워크입니다. 명령형 및 반응형 애플리케이션 모두를 보호하기 위한 최고 수준의 지원을 통해 Spring 기반 애플리케이션을 보호하기 위한 사실상의 표준입니다. -스프링 시큐리티 문서- 인증과 인가 일반적인 해킹 공격으로부터 보호(CSRF, 세션고정 등) Spring Security의 Servlet 지원은 FilterChainProxy에 포함되어 있습니다. FilterChainP..

    DelegatingFilterProxy - Spring Security

    DelegatingFilterProxy delegating의 사전적 의미 : 위임하다 DelegatingFilterProxy : 들어온 요청을 서블릿으로 전달하기 전에 Security filter에 위임을 해서 인증/인가 처리를 하고 Servlet으로 요청을 전달해주는 역할을 하는 서블릿 필터 javax.servlet.filter 인터페이스를 구현하고 있다. Spring Security를 사용한다면, DelegatingFilterProxy가 생성된다. Spring Boot 사용시 SecurityFilterAutoConfiguration을 통해서 DelegatingFilterProxyRegistrationBean 빈을 생성하며 DelegatingFilterProxyRegistrationBean 은 Dele..

    인증 예외(AuthenticationException)를 처리하는 AuthenticationEntryPoint

    Spring Security 인증 예외를 처리하는 AuthenticationEntryPoint AuthenticationEntryPoint 는 인증되지 않은 사용자에 대한 처리를 담당한다. (핸들러 라고 볼 수 있다) 이 때 처리는, 그냥 http 응답이라던가, 페이지 redirect 라 던가 등 개발자가 정의할 수 있다. AuthenticationException (인증 예외)예외가 발생했을떄 처리하는 인터페이스이다. 헷갈리지 말아야 하는게, AccessDeniedException( 인가 예외) 가 발생했을 때 처리하는 인터페이스가 아니다. /** * Used by {@link ExceptionTranslationFilter} to commence an authentication scheme. */ p..

    영속성 전이(Cascade) ManyToOne 시 주의할점 - 상위 엔티티 삭제 문제

    @ManyToOne(cascade=CascadeType.ALL) 또는 @ManyToOne(cascade=CascadeType.REMOVE) 일 때, Many쪽 (자식 엔티티)를 제거할 때 주의 하여야 한다. 연관된 부모도 삭제하기 때문이다. 연관된 부모를 삭제하게 된다면 그 부모를 참조하고 있던 자식 엔티티들이 고아객체가 되어버린다. 상황 Member(회원)과 Order(주문) 테이블의 관계가 1:N 이라고 할 때, Member와 Order는 1:N 단방향 관계로 Order는 @ManyToOne- Member 필드를 참조한다. 이 때, Order가 @ManyToOne(cascade=CascadeType.ALL) 또는 @ManyToOne(cascade=CascadeType.REMOVE) 일 때 Order를..

    Spring Data Jpa Cursor based Pagenation (커서 기반 페이지네이션) 예제 (JpaRepository 커서 기반 페이지네이션

    환경 Spring boot 2.7.6 hibernate 5.6.4 QueryDsl를 사용하면 더 편리하겠지만, Spring Data Jpa Repository Interface만을 이용하여 조회하는 예제이다. Repository는 Interface이고, Interface에 페이징을 계산하는 비즈니스 연산을 넣는것은 옳지 않다고 생각되어 Service Class에서 연산하여 Repository에 위임한다. Post라는 게시글의 cursor를 postId로 가정하고, postId와 createdAt의 역순으로 조회하는 커서 기반 페이지네이션 예이다. 이 때, 다음 게시물이 있는지 없는지 여부를 표현하기 위해 응답객체에 hasNext를 추가했다. Post Class @Entity @Table(name = "p..

    RestDocs By Gradle 설정

    환경 Spring Boot 2.7.6 Gradle 7.2 Java 11 junit5 MocvMvc build.gradle 먼저 전체 설정이다. plugins { id 'java' id 'org.springframework.boot' version '2.7.6' id 'io.spring.dependency-management' version '1.0.15.RELEASE' id "org.asciidoctor.jvm.convert" version "3.3.2" } configurations { compileOnly { extendsFrom annotationProcessor } asciidoctorExt } repositories { mavenCentral() } ext { set('snippetsDir', ..

    Security - WebsecurityConfigurerAdapter Deprecated 대체

    Spring Security 5.7.0-M2 부터 websecurityconfigureradapter는 컴포넌트 기반의 보안 설정을 권장한다는 이유로 Deprecated 처리되었다. 그래서 다른 방식으로 시큐리티 설정을 권장한다. https://spring.io/blog/2022/02/21/spring-security-without-the-websecurityconfigureradapter 어떻게 바뀌었나 기존에 다음과 같이 사용했던 방식은 @Configuration @EnableWebSecurity public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSe..