본문 바로가기

분류 전체보기101

[소셜 로그인 / 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.
[DDD] 값객체와 엔티티, 도메인 서비스 도메인 주도 설계란?- 도메인 : 프로그램에 쓰이는 대상 영역. - 도메인 모델 : 현실을 일반화하여 추상화하는 것. 이 과정에서 도메인에 맞게 필요한 개념만 취사선택하는 것이 필요하다. - 도메인 객체 : 도메인 모델을 구현하여 표현한 것. - 도메인 주도 설계 : 도메인 지식에 초점을 맞춰 개발하는 것. 초점을 맞춘다는 것은 도메인을 이해하고 도메인이 직면한 문제를 해결하는 것에 유용한 것을 프로그램에 적용하는 것. - 도메인 주도 설계의 장점: 프로그램을 오랜기간 운영하며, 변화가 필요할 때, 더욱 쉽고 유연하게 대처할 수 있음. 값 객체1. 정의 도메인 상의 값을 객체로 표현한 것 2. 이점: 1. 표현력이 증가한다. 하나의 값이 여러 부분으로 이뤄진 경우, 각각이 무엇인지 코드에서 명시할 수 있.. 2023. 6. 3.
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.
MSA(Micro Service Architecture) 이해해보기 목차 1. MSA란? 2. 왜 MSA를 사용하는가? 3. 어떻게 MSA를 도입하는가? MSA란?  마이크로서비스 아키텍처는 소프트웨어를 여러 개의 작은 독립적인 서비스로 분할하는 소프트웨어 아키텍처 스타일입니다. 이것은 아래의 특징이 있습니다. 서비스 간에 네트워크 통신을 한다. 도메인 중심으로 설계한다. 서비스 별 최적화된 기술을 독립적으로 사용 가능하다. 서비스 크기는 작아지고, 독자적 개발 / 배포/ 확장/ 관리가 가능하다. 왜 MSA를 사용하는가? Monolithic 구조의 단점들이 Business에 미치는 부정적인 영향이 크고, MSA로 얻을 수 있는 이익이 이 단점들 보다 클 경우에 사용합니다. Monolithic 구조의 단점은 다음과 같습니다. 복잡성으로 인한 관리의 어려움: 하나의 애플리.. 2023. 5. 22.
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.