개발/Backend
-
개요 Feign은 HTTP 요청을 생성하는 과정을 단순화하는 선언적 웹 서비스 클라이언트입니다. 개인적으로 선호하는 클라이언트여서 SpringCloud의 의존성을 추가하는 번거로움을 감수하고라도 사용하고 있습니다. 하지만 종종 Response 의 필드가 애플리케이션에서 예상하는 케이스와 일치하지 않는 상황이 발생합니다. 이를 처리하기 위한 과정을 기록합니다. GitHub Repository 문제상황 포스트 내에서 사용하는 Application Server는 SpringBoot 프로젝트를 의미하고, API Server는 외부에서 정보를 받아오는 서버로 용어를 사용할 예정이다. API Server의 필드는 snake_case를 사용하고 아래와 같은 JSON을 반환한다. { "date": "2023-12-21..
FeignClient에서 네이밍 전략 변환하기개요 Feign은 HTTP 요청을 생성하는 과정을 단순화하는 선언적 웹 서비스 클라이언트입니다. 개인적으로 선호하는 클라이언트여서 SpringCloud의 의존성을 추가하는 번거로움을 감수하고라도 사용하고 있습니다. 하지만 종종 Response 의 필드가 애플리케이션에서 예상하는 케이스와 일치하지 않는 상황이 발생합니다. 이를 처리하기 위한 과정을 기록합니다. GitHub Repository 문제상황 포스트 내에서 사용하는 Application Server는 SpringBoot 프로젝트를 의미하고, API Server는 외부에서 정보를 받아오는 서버로 용어를 사용할 예정이다. API Server의 필드는 snake_case를 사용하고 아래와 같은 JSON을 반환한다. { "date": "2023-12-21..
2024.01.11 -
개요 slueth-zipkin을 통해서 하나의 Request가 어떻게 어떤서비스에서 얼마의 시간을 소요하고 흘러가는지 확인할 수 있었다. 전통적으로 서비스는 개별로 로그를 보관한다. 로그를 확인하기 위해서 개별 서비스의 로그를 찾아가면서 확인하는 비효율적인 작업을 타개하기 위해 ELK Stack이 도입되었다. 각각 Elasticsearch, Logstash, Kibana 의 약어이다. 분산된 로그데이터들을 중앙화하고 분석과 검색, 시각화에 용이하게 수집 및 정리하는데 사용된다. ELK Stack Elasticsearch 로그를 저장하는 저장소 역할을 한다. 실시간으로 대용량 데이터를 검색하고 분석하는데 사용되는 오픈소스 검색 엔진이다. 기본적인 full-text 검색 뿐 아니라, 구조화된 데이터와 비구조..
분산환경은 로깅을 어떻게 할까개요 slueth-zipkin을 통해서 하나의 Request가 어떻게 어떤서비스에서 얼마의 시간을 소요하고 흘러가는지 확인할 수 있었다. 전통적으로 서비스는 개별로 로그를 보관한다. 로그를 확인하기 위해서 개별 서비스의 로그를 찾아가면서 확인하는 비효율적인 작업을 타개하기 위해 ELK Stack이 도입되었다. 각각 Elasticsearch, Logstash, Kibana 의 약어이다. 분산된 로그데이터들을 중앙화하고 분석과 검색, 시각화에 용이하게 수집 및 정리하는데 사용된다. ELK Stack Elasticsearch 로그를 저장하는 저장소 역할을 한다. 실시간으로 대용량 데이터를 검색하고 분석하는데 사용되는 오픈소스 검색 엔진이다. 기본적인 full-text 검색 뿐 아니라, 구조화된 데이터와 비구조..
2023.12.05 -
Spring Cloud Sleuth:3.0.4 docs 개요 최종적으로 trace를 통해 각 서비스의 로그를 파악하기 위한 수단은 Kibana인데 어떻게 각 서비스에서 수집된 데이터가 하나로 뭉쳐지는지에 대해서 궁금증이 생겼다. 현재 프로젝트에서 구성되어있는 트레이싱을 예측해보면 아래와 같다. 각각의 도메인 서버에서 spring-cloud-sleuth를 통해 수집된 정보를 logback 설정을 통해 JSON으로 샘플링하고 logstash -> Elasticsearch -> Kibana로 가는 구조로 보인다. 차례로 서비스들의 역할을 정리하고 예시로 기동까지 해볼예정이다. 이 글에서는 Spring-cloud-sleuth와 zipkin을 살펴볼것이다. spring-cloud-sleuth Spring Clou..
분산환경은 서비스 트레이싱을 어떻게 할까Spring Cloud Sleuth:3.0.4 docs 개요 최종적으로 trace를 통해 각 서비스의 로그를 파악하기 위한 수단은 Kibana인데 어떻게 각 서비스에서 수집된 데이터가 하나로 뭉쳐지는지에 대해서 궁금증이 생겼다. 현재 프로젝트에서 구성되어있는 트레이싱을 예측해보면 아래와 같다. 각각의 도메인 서버에서 spring-cloud-sleuth를 통해 수집된 정보를 logback 설정을 통해 JSON으로 샘플링하고 logstash -> Elasticsearch -> Kibana로 가는 구조로 보인다. 차례로 서비스들의 역할을 정리하고 예시로 기동까지 해볼예정이다. 이 글에서는 Spring-cloud-sleuth와 zipkin을 살펴볼것이다. spring-cloud-sleuth Spring Clou..
2023.11.30 -
@Primary가 있다면 Bean이름으로 주입이 안된다 별도의 설정을 한 RestTemplate Bean을 사용하려는데, 내부 라이브러리에 @Primary로 등록된 RestTemplateBean이 있었다. @Bean @Primary public RestTemplate restTemplate() { // some configuring source return restTemplate; } 위 설정과 다른 Bean을 프로젝트 내부에 생성하고 @Qualifier를 통해 주입하던것을 확인했다. @Bean public RestTemplate targetRestTemplate() { // the other configuring source return new RestTemplateBuilder() }; @Requir..
@RequiredArgsConstructor와 @Qualifier를 함께 쓰기@Primary가 있다면 Bean이름으로 주입이 안된다 별도의 설정을 한 RestTemplate Bean을 사용하려는데, 내부 라이브러리에 @Primary로 등록된 RestTemplateBean이 있었다. @Bean @Primary public RestTemplate restTemplate() { // some configuring source return restTemplate; } 위 설정과 다른 Bean을 프로젝트 내부에 생성하고 @Qualifier를 통해 주입하던것을 확인했다. @Bean public RestTemplate targetRestTemplate() { // the other configuring source return new RestTemplateBuilder() }; @Requir..
2023.11.28 -
@AttributeConverter @AttributeConverter를 쓰면 좋은 상황 @AttributeConverter 는 다음과 같은 경우에 유용하게 사용 될 수 있다. JPA가 지원하지 않는 타입을 매핑할때 두개 이상 속성을 갖는 밸류타입을 하나의 컬럼에 매핑할때 AttributeConverter는 자바 타입과 DB 타입간의 변환을 처리해준다. AttributeConverter Interface & Method AttributeConverter의 인터페이스는 아래와 같이 정의되어 있다. package javax.persistence; public interface AttributeConverter { public Y convertToDatabaseColumn (X attribute); publi..
[JPA] @AttributeConverter@AttributeConverter @AttributeConverter를 쓰면 좋은 상황 @AttributeConverter 는 다음과 같은 경우에 유용하게 사용 될 수 있다. JPA가 지원하지 않는 타입을 매핑할때 두개 이상 속성을 갖는 밸류타입을 하나의 컬럼에 매핑할때 AttributeConverter는 자바 타입과 DB 타입간의 변환을 처리해준다. AttributeConverter Interface & Method AttributeConverter의 인터페이스는 아래와 같이 정의되어 있다. package javax.persistence; public interface AttributeConverter { public Y convertToDatabaseColumn (X attribute); publi..
2021.08.06 -
Bean을 주입받을때, @Autowired는 권장되지 않음 IntelliJ에서 @Autowired를 사용하다보면 다음과 같은 메세지를 종종 보게된다. 필드주입은 권장되지 않는다. 생성자 주입을 사용. Spring에서 Bean을 주입받는 방법은 아래와 같다. @Autowired setter 생성자 이중 가장 권장하는 방식이 생성자로 주입받는 방식이다. 생성자 주입을 권고하는 이유 순환참조 방지 final 선언 테스트코드 작성의 용이 1. 순환참조방지 생성자 주입방식은 먼저 생성자의 인자에 사용되는 Bean을 찾거나 Bean Factory에서 만든다. 그 후에 찾은 인자 Bean으로 주입하려는 Bean의 생성자를 호출한다. ⇒ 먼저 Bean을 생성하지 않고 주입하려는 Bean을 먼저 찾는다. setter와 ..
[Spring] Bean을 주입받을때, @Autowired는 권장되지 않음Bean을 주입받을때, @Autowired는 권장되지 않음 IntelliJ에서 @Autowired를 사용하다보면 다음과 같은 메세지를 종종 보게된다. 필드주입은 권장되지 않는다. 생성자 주입을 사용. Spring에서 Bean을 주입받는 방법은 아래와 같다. @Autowired setter 생성자 이중 가장 권장하는 방식이 생성자로 주입받는 방식이다. 생성자 주입을 권고하는 이유 순환참조 방지 final 선언 테스트코드 작성의 용이 1. 순환참조방지 생성자 주입방식은 먼저 생성자의 인자에 사용되는 Bean을 찾거나 Bean Factory에서 만든다. 그 후에 찾은 인자 Bean으로 주입하려는 Bean의 생성자를 호출한다. ⇒ 먼저 Bean을 생성하지 않고 주입하려는 Bean을 먼저 찾는다. setter와 ..
2021.04.27 -
lombok @Builder 와 @NoArgsConstructor 같이 사용할때 예외 예외유발 @Entity @Builder @Getter @NoArgsConstructor public class AccountEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) // AutoIncrement private Long id; @Column(length = 25, nullable = false) private String email; @Column(length = 20, nullable = false) private String password; } //빌드 에러 전문 /Users/autocat/dev/personal/omr/src/main/jav..
[JPA] Entity에서 @Builder 와 @NoArgsConstructor 같이 사용할때 예외lombok @Builder 와 @NoArgsConstructor 같이 사용할때 예외 예외유발 @Entity @Builder @Getter @NoArgsConstructor public class AccountEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) // AutoIncrement private Long id; @Column(length = 25, nullable = false) private String email; @Column(length = 20, nullable = false) private String password; } //빌드 에러 전문 /Users/autocat/dev/personal/omr/src/main/jav..
2021.04.23