
오늘날 빠른 속도의 웹서비스를 제공하기 위한 전략들은 여러가지가 있다. 이미지 캐싱, 객체 캐싱, CDN.. 그리고 스케일아웃 - 스케일업 까지. 하지만 여러가지 전략들 중에 가장 쉽고 효과가 좋은녀석은 개인적으로 캐싱이 아닐까 한다. 오늘은 웹서비스의 주요 병목구간인 (비즈니스 레이어 - RDB) 구간을 캐싱하여 성능향상을 꾀해보고자 한다. 구성도에도 나와있지만 (비즈니스 레이어 - RDB) 구간 사이에 캐시를 넣고 클라이언트의 요청이 발생 할 경우 캐시에서 처리가 가능한 부분은 캐시에서 객체로 리턴, 캐시에서 처리가 불가능한 (데이터가 없다거나..) 사항들은 rdb로 다시 요청하고 수신된 객체를 캐시에 저장해두는 단순한 흐름이다. 여러 캐시 시스템들이 있지만 (redis, memcached 그리고 스..

* 편법입니다. 참고만 하세요. JpaRepository를 상속받아 사용 할 경우 상속시 제네릭 인자로 던진 클래스만 JpaRepository의 persist가 가능해진다. 정확하게는 1depth child까지만. JpaRepository사용시 인자클래스와 PK type을 받는데 pk 조회의 기준은 인자 클래스가 된다. 그렇기때문에 OneToOne이든, OneToMany든 자식엔티티 까지는 해당 PK Column이 존재하기때문에 JpaRepository에서 접근이 가능하지만, 손자까지는 사용이 불가능한것이다. 그렇다고 손자와 인자 클래스간 관계를 맺어 줄 사람은 없다고 생각한다. 보통은 이런경우 Repository를 모두 분리한다. ParentRepository, ChildRepository, Grand..

Spring Boot Webflux 환경에서 Security (form based / authentication manager customize)를 연동하는 방법에 대해 소개한다. 기본적인 initializr과정은 생략한다. (webflux / security 필수) 기준버전은 2.1.6 해당 글에서는 Spring Security 구성, ReactiveAuthenticationManager를 상속받은 AutenticationManager 구현, 로그인 실패시 처리하는 ServerAuthenticationFailureHandler를 상속받은 LoginFailureHandler 구현만을 다루며 기본적인 사항은 다루지 않는다. 먼저 ReactiveAuthenticationManager를 상속받은 Autenti..

WebFlux로 프로젝트를 진행하던 중, Multipart로 전송시 Spring Security에 설정한 CSRF 관련 사항과 충돌이 발생하여 이에대한 대응책을 남긴다. (invalid csrf token) Multipart의 경우 FormData가 ServerRequest에 QueryParameter로 들어오지 않기 때문에, 클라이언트 - CSRF Filter 사이에 중개필터를 하나 두고 필터 순서를 변경하여 CSRF관련 작업을 처리해야 한다. 작업순서는 아래와 같다. 1. 중개필터 작성 2. Spring Security에 중개필터 추가 (Filter Order는 CSRF Filter 이전에 위치하도록 순서지정) 먼저 중개필터를 작성한다. @Component public class MultipartCs..

Spring Boot WebFlux - Thymeleaf 환경에서 에러 핸들링 하는 방법을 소개한다. 아래는 참고한 가이드 https://www.baeldung.com/spring-webflux-errors Handling Errors in Spring WebFlux | Baeldung Have a look at different methods to gracefully handle errors in Spring Webflux. www.baeldung.com 하지만 위 예제는 error status에 따른 json return만 구현되어있기 때문에, 우리가 통상적으로 생각하는 404/500에 대한 error 처리를 하기 위해서는 추가적인 작업이 필요하다. 완성된 코드는 아래와 같다. @Component @..
@ManyToOne 관계에서 위와같은 에러가 발생 할 경우 기존 save 도메인에 ManyToOne으로 관계가 맺어진 객체가 생성되어있지 않은지 확인해봐야 한다. 객체가 생성되어있을 경우 ID가 부여되므로 위와같은 에러가 발생. https://stackoverflow.com/questions/9549098/transientobjectexception-object-references-an-unsaved-transient-instance-save
일반적인 jpa paging 구현방법이라면 간단한 구글링 만으로도 방법을 알 수가 있다. 하지만, 일반적이지 않은 상황에서는 QuerydslRepositorySupport를 상속받아서 구현하는것이 아니라 직접 구현해야하는 경우가 발생한다. 아래 경우는, rownum을 동반한 페이징을 직접 구현하여 사용하고자 했던 기록이다. ** 2021. 02. 25 ** (현재는 Page로 결과만 전달받고, rownum util을 사용하지 않으며 프론트엔드 단에서 Page의 변수를 계산하여 사용중이다) 계산식은 아래와 같다. {{(data.totalElements - data.numberOfElements) * data.number + index + 1}} pageable.getOffset() ? query.fetch..
- Total
- Today
- Yesterday
- spring webflux
- Util
- Spring Security
- 친환경차
- 저공해자동차
- 저공해자동차 스티커
- SI
- memcached
- multipart
- CSRF
- JPA
- Spring Cache
- WebFlux
- spring-data-jpa
- SpringDataJPA
- hibernate
- Weblogic
- Thymeleaf
- 취업
- Java
- Spring
- query-dsl
- intellij
- Spring Boot
- 국비교육
- 이직
- spring-jpa
- 스프링
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |