분류 전체보기

    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를..

    Junit5 AssertJ List 정렬 테스트 ( Check if list is sorted in junit)

    Junit5 AssertJ List 정렬 테스트 ( Check if list is sorted in junit) JUnit5 에서 assertJ의 Assertions를 이용하여 List가 정렬되었는지 테스트 할 수 있다. isSorted() 메서드 isSortedAccordingTo(Comparator comparator) 메서드 docs : https://assertj.github.io/doc/ https://www.baeldung.com/introduction-to-assertj https://javadoc.io/doc/org.assertj/assertj-core/latest/org/assertj/core/api/ListAssert.html https://javadoc.io/doc/org.assert..

    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..

    커서 기반 페이지네이션(Cursor-based-pagination) vs 오프셋 기반 페이지 네이션(offset-based-pagination

    Pagination? 한정된 네트워크 자원을 효율적으로 활용하기 위해 특정한 정렬 기준에 따라 데이터를 분할하여 가져오는 것이다. 서버의 입장에서도 클라이언트의 입장에서도 특정한 정렬 기준에 따라 + 지정된 갯수 의 데이터를 가져오는 것 한 번에 수만개의 데이터를 데이터베이스에서 애플리케이션으로 가져오면 메모리가 모자를 수 있다. 많은 데이터를 전송하므로 네트워크의 오버헤드가 생긴다. 즉, 데이터베이스에 수만~수억개의 데이터가 있을 때, 전체를 한번에 전달하는 대신 0번부터 49번까지 50개씩 전달하는 것을 의미한다. 여기서 다음 요청이 들어오면 50번부터 99번까지, 또 다음 요청이 들어오면 100번부터 149번까지 돌려준다. 이렇게 함으로써 네트워크의 낭비를 막고, 빠른 응답을 기대할 수 있게 된다...

    RefectionTestUtils - private 필드 값 주입, private 테스트

    * https://docs.spring.io/spring-framework/docs/current/javadocapi/org/springframework/test/util/ReflectionTestUtils.html ReflectionTestUtils 클래스는 Spring Test Context 프레임워크의 일부이다. 단위 및 통합 테스트에서 사용되는 리플렉션 기반 유틸리티 메서드들을 모은 클래스이며, private field 를 설정하고 private field 호출하고 을 dependencies을 주입할 수 있다. 일반적인 비즈니스 애플리케이션을 개발한다면 사실 프로덕션 코드에서 리플렉션을 사용할 경우는 거의 없다. 라이브러리나 프레임워크 등을 개발할 때 주로 사용될 수 있다. 하지만 테스트 코드에서..

    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..

    Controller + JPA, JUnit Slice Test Error [JPA metamodel must not be empty! 해결]

    JPA + JUnit Slice Test Error [JPA metamodel must not be empty! 해결] Controller 단위테스트를 위해 @WebMvcTest 어노테이션을 이용해서 테스트하던 중에 JPA metamodel must not be empty 라는 오류를 만났다. JPA Audit 기능을 사용하기 위해 @EnableJpaAuditing을 추가했었는데, @SpringBootApplication 클래스에 등록해놓은 것이 에러의 원인이었다. JPA metamodel must not be empty! 는 JPA 메타 모델은 비워둘 수 없다는 메시지다. @WebMvcTest는 Web기능과 관련된 Bean만 등록하기 때문에 JPA 생성과 관련된 기능이 전혀 존재하지 않는 테스트 어노테..