[SpringBoot] Micrometer 와 Actuator 개념과 사용 이유 알아보기
·
Spring
SpringBoot 환경에서 애플리케이션 모니터링을 구축할 때 흔히 사용되는 Micrometer 와 Actuator 에 대해 간략하게 개념을 정리한 글입니다.Micrometer 알아보기Micrometer는 JVM 기반 애플리케이션을 위한 벤더 중립적인 메트릭 수집 라이브러리다.로그 시스템에서 SLF4J가 다양한 로깅 구현체에 대한 추상화를 제공하듯, Micrometer는 Prometheus, Datadog, CloudWatch 등 다양한 모니터링 시스템에 동일한 방식으로 메트릭을 기록할 수 있도록 추상화된 인터페이스를 제공한다.이러한 추상화 덕분에 애플리케이션 개발자는 특정 모니터링 벤더에 종속되지 않고, 코드를 변경하지 않고도 메트릭 전송 대상을 유연하게 교체할 수 있다. Micrometer는 메트릭을..
[Spring Security] Preflight는 성공하지만 실제 요청에서 CORS 오류가 발생하는 문제 해결하기
·
Spring
제목과 같이 Preflight (Options) 는 성공하지만 실제 요청에서 Cors 가 발생하는 이슈가 생겨, 이에 대해 정리한 글이다. 이슈 당시 확인해 본 사항CORS 발생 당시 아래 2개 최우선으로 확인했다.Access-Control-Allow-Origin 과 Access-Control-Allow-Credentials2개를 왜 확인해야 하는지, 개념을 간략하게 정리해보면 아래와 같다. Access-Control-Allow-Origin 는 없거나 다르다면 브라우저에서 응답 자체를 막아버리므로 CORS 오류가 발생한다.Access-Control-Allow-Credentials 는 session 인증의 경우 1) 에 jwt 기반 인증의 경우 2) 에 영향을 미치며 마찬가지로 설정이 없으면 CORS 오..
[Spring] WireMock 로 Feign (ApacheHttp5Client) 테스트시 NoHttpResponseException 발생 케이스와 해결방법
·
Spring
들어가며FeignClient 등 외부 API 를 호출하는 환경에서 테스트를 하기 위해 다음과 같은 방법을 사용할 수 있다.mock 서버 구성Mockito 로 mockingWireMock 사용mock 서버는 Postman 의 Mock Servers 등으로 구성하는 레퍼런스가 꽤 있지만 테스트코드가 아닌 외부 툴에 의존한다는 점과, 그로 인한 호출량 제한 등을 생각해야 하므로 일단은 배제했다. 다음으로 mocking 은 FeignClient 자체의 기능을 테스트하는게 아니라, Feign 을 mocking 해서 이를 의존하는 다른 로직이 정상적으로 실행되는 케이스를 검증하는 것이므로 Decoder 등으로 설정한 Feign 자체 예외 케이스 핸들링에 대한 검증을 할 수 없어 배제했다. 결론적으로 이중 WireM..
[Spring] TestContainers, @TestConfiguration 사용시 @DynamicPropertySource 가 적용되지 않는 문제와 해결방안
·
Spring
들어가며@TestConfiguration 내부에서 Testcontainers와 @DynamicPropertySource를 사용해 테스트 환경을 구성했으나, @DynamicPropertySource가 의도대로 동작하지 않아 문제가 발생했다. 이 글은 해당 문제의 원인과 해결 방법을 정리한 내용이다. 문제가 발생한 테스트 환경 테스트환경에서는 TestContainers 를 이용해 Redis 를 사용하고 있다. RedisConnectionFactory 설정부분은 다음과 같다.애플리케이션 코드의 RedisConfig 에서 생성자로 RedisProperties 를 주입받고 있고, 이 값을 바탕으로 Redis 서버와의 연결을 시도한다.package org.springframework.boot.autoconfigur..
[Spring] API 응답에서 직접 정의한 Error code 는 왜 사용할까?
·
Spring
직접 정의한 Error code 란?직접 정의한 에러코드는 HTTP Status code 와 별개로 정의한 에러코드를 의미한다. HTTP 응답에는 HTTP 요청이 성공했는지 실패했는지 나타내주는 HTTP Status code 가 존재함에도, 대부분의 서비스에서는 아래처럼 HTTP Status code 뿐만 아니라 직접 정의한 Error code 도 함께 내려준다. [카카오 쇼핑 에러코드]응답 코드 및 에러 코드[카카오뱅크 에러코드]간편하고 다양한 인증이 필요할때 카카오뱅크 인증서[Naver Cloud Platform 에러코드]CLOVA eKYC 에러코드[NHN CLOUD]오류 코드 - NHN Cloud 사용자 가이드 이렇게 에러코드를 직접 정의하면 REST API의 에러 응답을 이해하기 위해 API 문서..
[Spring] OpenApI 3.0 Swagger 문서 작성 및 설정 방법
·
Spring
들어가며Swagger 는 RestDocs 에 비해 단순 적용은 간편하지만 기본적인 설정만으로 사용하기에는 아쉬운 부분이 있다. 이번 글에서는 Open API 3.0 Swagger 를 적용할때 필요한 개념과 조금 더 나은 문서를 만들기 위한 몇가지 노력들을 적어본다. Spring을 사용한다면 아래 2개의 라이브러리를 사용할 수 있다.Spring FoxSpring DocSpring Fox의 경우 마지막 업데이트일인 2020년 이후 업데이트가 없으므로, Spring Doc을 사용했다. Springdoc-openapi Modules SpringDoc OpenAPI는 Spring Boot 뿐만 아니라, WebFlux 도 지원하며 UI 레이어와 REST API 레이어로 구분되어 구성된다.UI 레이어는 API 문서를..
[SpringBoot] MapStruct 제대로 활용하기
·
Spring
들어가며MapStruct는 Java 애플리케이션에서 객체 간의 매핑을 자동으로 생성하기 위한 코드 생성기다.이번 글에서는 프로젝트에서 MapStruct 를 사용한 부분을 리팩토링한 몇 가지 예시를 통해 MapStruct 를 조금 더 효율적으로 쓰기 위해 알아야 할 부분들을 정리했다. 기본 사용법에 대한 내용은 편리한 객체 간 매핑을 위한 MapStruct 적용기 (feat. SENS) 에 잘 설명되어 있으니 참고하면 좋을 것 같다. default 메소드는 필요시에만 사용한다아래처럼 source 와 target 이 존재하고 이를 매핑해야 하는 경우// source@Builderpublic record QueryMemberJoinTeam( TeamMemberRole role, Lon..
[SpringBoot] @DataJpaTest 테스트 클래스 간 데이터 충돌 문제 해결
·
Spring
들어가며Repository 테스트를 하던 중, 개별 테스트는 성공하는데 전체 테스트가 실패하는 현상이 발생해, 이를 해결하고 정리한 글이다. Repository 단위 테스트 구성Repository 테스트는 아래처럼 RepositoryTest 클래스를 만들어서 상속하도록 구성했다.이렇게 구성한 이유는 아래와 같다.모든 테스트 클래스마다 애노테이션을 매번 붙이기 번거롭다.공통으로 의존성을 주입해야 하는 것들을 한 번만 작성하면 된다. (ex TestEntityManager 등)@BeforeEach 등을 상위 클래스에 정의해주면 이를 상속하는 모든 클래스에 적용된다.static 으로 공통 설정을 관리할 수 있다. (TestContainers 등)@DataJpaTest@ExtendWith(SpringExtens..