본문 바로가기

Back-end36

[소셜 로그인 / SpringSecurity] authorization_request_not_found 에러 해결 문제 상황앱에서 소셜 로그인을 진행했을 때, authorization_request_not_found 에러를 응답 받았다.다만 조금 특이한 상황에서 발생했는데,1) 소셜 로그인 화면에서 로그인까지는 성공. 그 이후에 에러 리턴2) 한번 실패한 후에 브라우저에 로그인 기록이 남아있는 채로 다시 로그인하면 정상적으로 응답 원인우선 authorization_request_not_found이 어디서 발생하는 곳은 OAuth2LoginAuthenticationFilter의 attemptAuthentication 메서드입니다. 여기서 보면 removeAuthorizationRequest의 응답 값이 null이어서 문제가 발생하고 있습니다.OAuth2LoginAuthenticationFilter는 스프링 시큐리티에서.. 2024. 5. 26.
[DDD] SpringBoot에서 Repository 추상화하기 DDD에 따라 Repository를 구현할 때 추상화해서 구현합니다. 언제든지 DB가 바뀔 가능성을 고려해서 더 유연하게 만들어야하기 때문입니다. 그런데 SpringBoot를 비롯한 프레임워크에서는 주로 기술을 사용하기 쉽도록 추상화된 인터페이스를 사용하고 여기엔 지켜야할 규칙이 있기 때문에 바로 적용하기 어렵습니다. 어려움 도메인 엔티티와 기존 JpaRepository를 사용할 때 사용한 @Entity의 차이 @Entity 애노테이션을 비롯해서 여러 Jpa 기술에 종속적인 코드가 첨가된다. 애그리거트 안에 여러 값객체를 가지고 있다. ID 전략 JpaRepository를 사용하면 자동으로 ID를 부여하는데 이것 또한 기술 종속적이다. 위의 문제들을 해결하기 위한 방법을 알아보겠습니다. 도메인의 비즈니스.. 2023. 8. 8.
SpringBoot 3.1의 ConnectionDetails abstraction https://spring.io/blog/2023/06/19/spring-boot-31-connectiondetails-abstraction를 간단히 요약해보았습니다. spring.datasource.url 와 같이 properties로 remove service와 연결하던 것을 ConnectionDetails 라는 추상화를 통해 표현하게 됐습니다. 이것은 주로 새롭게 추가된 Docker Compose 와 Testcontainers 기능에 쓰입니다. ConnectionDetails Bean이 등록되어 있으면 이것을 사용하고, 그렇지 않으면 기존처럼 properties를 사용합니다. public interface JdbcConnectionDetails extends ConnectionDetails { St.. 2023. 8. 1.
SpringBoot 3.1의 Docker Compose MSA처럼 여러 어플리케이션을 구동하고 각각이 독립적인 DB를 가지게 되는 상황에서, 각 DB Server의 port 를 관리하는 것이 어렵기 때문에 중복 문제가 발생할 수도 있습니다. SpringBoot 3.1에서는 이러한 문제를 해결해줍니다. 각각 DB의 port를 명시하지 않고 random port를 사용하고 properties에 명시할 필요도 없어졌고, username, password 등등 또한 명시할 필요가 없어졌습니다. SpringBoot 3.1에서는 서비스를 구동하기 전에 docker compose up 를 먼저 구동해서 서비스들을 연결해줍니다. 이미 구동중이라면 그것을 감지해서 그것을 사용합니다. 서비스를 멈추면 자동으로 docker compose stop을 실행합니다. Docker Co.. 2023. 8. 1.
[Cache] 다수 key로 CacheEvict, Page 직렬화 (CacheResolver, Mixin, DefaultTyping, Custom Se/Deserializer) 목차 해결 과제: 한 번에 다수의 캐시를 Evict 하기, Page 직렬화하기 문제: @CacheEvict는 복수의 key 불가 해결. SpEL과 CacheResolver를 통해 해결 개선. RedisCacheMange 설정들 문제: 직렬화 실패 해결Java8부터 추가된 LocalDateTime -> JavaTimeModule 모듈 추가 Lazy Loading으로 인한 Hibernate Proxy -> Mixin을 등록하여 직렬화 무시 문제: 역직렬화 실패 LinkedHashMap으로 역직렬화 -> ObjectMapper에 DefaultTyping 설정 기본 생성자가 없어 역직렬화 불가 -> Customize Serializer / Deserializer 성능 테스트 with JMeter 해결 과제 배.. 2023. 6. 16.
Fetch join와 Batch size를 이용한 N+1 문제 해결 문제상황 배달 서비스의 서버를 개발하며, N+1 문제가 발생했습니다. 아래와 같이 테이블을 설계했는데, 주문 상세 내역을 조회할 때 유저, 주소, 가게, 메뉴, 세부 메뉴(ex. 짜장면), 메뉴의 옵션 그룹(ex. 추가메뉴), 옵션 그룹의 옵션(ex. 콜라, 단무지)가 함께 조회되는 구조입니다. 위와 같은 구조에서 3개의 메뉴와 각 메뉴마다 3개의 옵션그룹 그리고 각 옵션그룹마다 3개의 옵션있는 주문을 조회하면, 아래와 같이 총 번의 조회가 발생합니다. 총 18번 = Order(1번) + CanceledOrder(1번) + Store(1번) + User(1번) + Address(1번) + OrderMenu(1번) + OrderGroup(3번) + OrderOption(9번) 참고로 주문에서 실제 음식 정.. 2023. 6. 2.
Nginx를 로드밸런서로 사용하기 아래 공식 문서를 참고 했습니다. Using nginx as HTTP load balancer Using nginx as HTTP load balancer Introduction Load balancing across multiple application instances is a commonly used technique for optimizing resource utilization, maximizing throughput, reducing latency, and ensuring fault-tolerant configurations. It is nginx.org Configuration 작성하기 http { upstream myapp1 { server srv1.example.com; server sr.. 2023. 5. 7.
로드밸런싱 이해하기 로드밸런싱이란? 로드밸런싱은 트래픽을 여러 대의 서버로 분산시키는 기술입니다. 트래픽이 많아져서 서버를 확장하게 될 경우, 서버의 성능을 증대시키는 scale-up 방식과 서버의 수를 늘리는 scale-out 방식이 있습니다. 두 가지 방법 중 scale-out 방식을 통해 많아지는 트래픽을 대처한다면, 모든 서버에 적절할 트래픽이 갈 수 있도록 해야할 것이고, 이때 이 역할을 하는 것이 로드밸런싱입니다. 분산 알고리즘 트래픽을 분산시키는 알고리즘은 여러 종류가 있습니다. 사용하고 있는 여러 서버의 상황이나 서비스 통신의 특징에 따라 적합한 분산 알고리즘을 사용해야합니다. 라운드 로빈 (Round Robin) 순서대로 배정하는 방식입니다. 서버들이 스펙이 비슷하고, 세션이 짧은 경우에 적절한 방법입니다... 2023. 5. 7.
Java의 Functional Interface Functional Interface란? Java8부터 함수형 패러다임을 적용하기 위해 적용된 기능으로 Lamda Expression 또는 method reference를 이용하여 구현됩니다. Lamda Expression이란? 람다 표현식은 익명 함수를 보다 간결하고 가독성있게 표현하는 문법입니다. 기본적으로 아래와 같은 형태로 사용합니다. (매개 변수 목록) -> (실행문) Method Referece란? 메서드 참조란 람다 표현식을 더욱 간결하고 가독성있도록 표현하는 문법입니다. 아래와 같은 방법으로 사용할 수 있습니다. List names = Arrays.asList("Alice", "Bob", "Charlie"); // Lambda expression 사용 names.forEach(name ->.. 2023. 4. 27.