springboot
-
React-query 이용해서 무한 스크롤 구현하기(feat. Spring + Java)개발/React 2024. 6. 4. 17:00
직접 구현할 수 있는 부분에도 라이브러리를 쓰는 걸 별로 좋아하지 않지만, react-query는 회사에서 많이 쓰는 기술이기도 하고 철학이나 인사이트를 얻을 수 있는 점에서 공부할 거리가 있긴 하다. useInfiniteQuery를 이용해서 무한 스크롤을 구현하려는 사람에게 조금이나마 도움이 되기를 바란다.기술환경Next.js 14.1.3@tanstack/react-query: 5.28.4(react-query 버전이 올라가면서 @tanstack이 붙음)Spring boot starter: 3.2.3Spring boot starter security: 3.2.3(spring security core: 6.2.2)Spring data jpa: 3.2.3(hibernate core: 6.4.4.Final)..
-
[Security6] Factory method 'securityFilterChain' threw exception with message: This object has already been built개발/Spring Security 2024. 2. 26. 01:52
시큐리티에서는 생전 처음 보는 버그가 종종 나와 미소 짓게 한다. 5버전과 달리 6버전에서는 설정 클래스가 상속하는 클래스가 없고 메소드 빈 방식으로 설정 작업이 이뤄지기 때문에Authentication Manager(이하 매니저)를 얻는 방식이 기존과 다르다. 여기서 소개할 방법은 사용자가 정의한 Authentication Provider(이하 프로바이더)를 추가하기 용이한 방법이다. 이 설정에서는 필터, 프로바이더를 새로 정의해서 등록한다. @Bean SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.csrf(AbstractHttpConfigurer::disable); http.addFilterBefor..
-
[Intellij] 다른 모듈의 클래스 사용하기개발/etc 2024. 2. 20. 15:57
메인 프로젝트 하위에 모듈들을 추가했고 공통 모듈 하나를 다른 하위 모듈들이 참조하는 형태다. 아래 이미지를 보면 authserver 모듈을 제외한 OAuth2Client, ResourceSercerFriend, ResourceServerPhoto가 SharedObject에 있는 클래스를 참조한다. 1. 최상위의 메인 프로젝트의 settings.gradle에 공유 모듈의 이름을 include 한다. 가장 윗줄에는 해당 프로젝트의 이름이 쓰여 있을 거다. Load Gradle Changes를 클릭해서 변경 사항을 빌드하도록 하자. 아이콘이 뜨지 않는다면 우측에 Gradle의 탭을 찾아가서 Reload를 해주자. rootProject.name = 'authorizationserver' include 'Sha..
-
@RequiredArgsConstructor를 사용 못하는 경우개발/Spring 2023. 12. 24. 01:13
같은 타입의 빈을 복수로 정의했을 때는 모호성 에러가 발생하는데 이 때 생성자를 직접 정의해 객체를 주입할 때 @Qualifier를 사용해서 컴포넌트를 명시한다. public SecurityConfig( CustomUserDetails customUserDetails, PasswordEncoder passwordEncoder, AuthenticationDetailsSource authenticationDetailsSource, @Qualifier("customAuthSuccessHandler") AuthenticationSuccessHandler successHandler, @Qualifier("customAuthFailureHandler") AuthenticationFailureHandler failu..
-
[Spring Security5] SecurityContext에 가졌던 작은 오해개발/Spring 2023. 12. 18. 16:01
- 익명 사용자든 인증된 사용자든 매 요청 때마다 인증 객체(authentication)가 생성됨 - 인증 객체는 SecurityContext에 저장됨 - 익명 사용자의 요청일 때는 SecurityContext 객체를 만들어야 하지만, 인증 사용자는 Session에서 가져오기 때문에 미생성 - 인증 사용자는 SecurityContext 객체를 Session에 저장하지만, 익명 사용자는 Session에 저장하지 않음 - 각 요청마다 ThreadLocal이 만들어지고 SecurityContext는 각 ThreadLocal에 저장 - 이를 전역적으로 관리하는 SecurityContextHolder도 ThreadLocal에서 생성 - 이 안에서 ThreadLocal을 key, SecurityContext 객체를..
-
[Spring security5] 인증/인가에 대한 간략한 흐름개발/Spring 2023. 12. 16. 18:52
인증을 하지 않은 채로(로그인을 하지 않은 채로) 특정 자원에 접근하려고 한다면, 스프링 내부에선 어떤 흐름이 전객되는지 살펴보자. 루트 페이지로 접근했을 때의 과정이다. 1. 인가 실패이지만 익명 사용자는 조금 다른 로직을 거치게 된다 2. sendStartAuthentication() 실행 여기서 중요한 점은 reqeustCache 객체에 request를 저장한다는 점이다. 이는 인증과 인가에 성공했을 때 원래 접근하려던 url로 이동하게 하기 위함이다. saveRequest 함수 안에서 DefaultSavedRequest 객체를 만들어 해당 세션에 저장하게 되는데, savedRequest 객체 안에 요청 url이 저장되어 있다. 이는 로그인 성공 이후에 successHandler에서 이용한다. 그리..
-
@Deprecated fetchCount()개발/Querydsl 2023. 8. 3. 12:59
최근 버전(5.0.0)에서 deprecated 되었다. fetchCount가 동작하는 방식이 select 쿼리를 서브쿼리에 넣어서 랩핑하는 방법이었는데 SELECT COUNT(*) FROM (); jqpl에서는 서브쿼리에서 select 하는 방법을 지원하지 않는다. 보편적인 방법으로는 방법이 없어 querydsl에서는 결과 데이터의 수를 계산하는 수정된 쿼리를 사용해왔는데, group by나 having 절이 들어가있는 복잡한 쿼리에서는 그마저도 제대로 동작하지 않는다. 그래서 fetch로 다 가져와 메모리에서 size를 계산하는 방법을 지원했으나 이는 데이터가 클 경우 성능상의 단점이 존재한다. 결론: 별도의 count query를 작성해서 구하자 querydsl 4 까지는 blaze-persisten..