이번글에서는 Sleuth를 사용할 때 불필요하게 생성되는 Mesage Header 정보를 Remove 하는 방법에 대해 알아보겠습니다. Spring Cloud Slueth sleuth는 MSA 환경에서 분산된 micro service 의 추적을 용이하게 해주는 라이브러리로.. traceId & spanId 와 같은 추적 정보를 MDC 에 자동으로 Inject 해줌으로써 분산되어 있는 Micro Service 내의 전체적인 Call Stack 을 손쉽게 추적할 수 있도록 도와줍니다. slueth 에 대한 자세한 내용은 이곳을 참고하시길 바랍니다. 이때 주의점으로는 만약 slueth 를 사용하는 서비스에서 message 를 produce 하게 된다면 'TracingChannelInterceptor..
문제 kafka에 메세지를 전송하려고 할때 다음과 같이 에러가 발생하며 메시지 전송을 실패한다. org.springframework.messaging.MessageHandlingException: error occurred in message handler [org.springframework.cloud.stream.binder.kafka.KafkaMessageChannelBinder$ProducerConfigurationMessageHandler@5283b1f8]; nested exception is org.apache.kafka.common.errors.SerializationException: Can't convert key of class java.lang.String to class or..
이번글에서는 Spring Cloud Stream 을 사용할 때 Multiple Binder 를 사용하는 방법에 대해 알아보겠습니다. 1. RabbitMQ Bindings & Binders 먼저 Bindings 와 Binders 에 대해 간단히 살펴보겠습니다. 일반적으로 rabbitMQ binder(message broker)를 한개만 사용할 경우의 config 설정이 다음과 같을 때 spring cloud: stream: bindings: "like.event": destination: like.event.exchange contentType: application/json binder: rabbit-like binders: rabbit-like: type: rabbit environment: sprin..
문제 Lombok 의 @Data 와 @Builder 가 동시에 선언되어있는 클래스를 Jackson이 Deserialize 를 실패하며.. 다음과 같은 에러가 발생한다. fail to retrieve #{Object} data - Type definition error: [simple type, class #{package.object}]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of #{package.object} (no Creators, like default construct, exist): cannot deserialize from Object ..
이번글에서는 API 에서 Json 과 MultipartFile 을 한번에 전달받는 방법에 대해 알아보겠습니다. @RequestBody 먼저 API 규격상 다음의 값들을 한번에 전달받아야 한다고 가정하겠습니다. 1. 이름 2. 나이 3. 이미지 일반적인 경우 API 에서 클라이언트에게 값을 전달받기 위해선 Request Vo 를 생성해 @RequestBody 로 데이터를 전달받도록 구현합니다. 따라서 심플하게 생각하면.. 다음과 같은 vo 를 생성해 String/Long 값과 MultipartFile 형태의 값을 한번에 전달받으면 되겠군? 이라고 생각할 수 있습니다. @Getter @ToString public class CharacterCreateRequest { private String name; p..
이번 시리즈에서는 스프링 부트로 프로젝트를 처음부터 생성 및 구축해보도록 하겠습니다. # 목차 1. 스프링 부트 프로젝트 생성 & 실행 - EP01 2. Controller 생성 & API 호출 (1) - EP02 3. Controller 생성 & API 호출 (2) - EP03 DispatcherServlet 이전글에 이어 다음으로 살펴볼 클래스는 DispatcherServlet 입니다. 앞단에서 HTTP request 에 대한 여러 Filter 처리가 완료된 후에는 DispatcherServlet 이 호출되어 실제로 해당 request 에 mapping 된 method 를 호출하게 됩니다. 위 Debugger Stack 상으로는 HttpServlet 이라고 표기되어 있지만. DispatcherServ..
이번 시리즈에서는 스프링 부트로 프로젝트를 처음부터 생성 및 구축해보도록 하겠습니다. # 목차 1. 스프링 부트 프로젝트 생성 & 실행 - EP01 2. Controller 생성 & API 호출 (1) - EP02 3. Controller 생성 & API 호출 (2) - EP03 Controller 생성 이제 Contoller 를 하나 생성해보도록 하겠습니다. 프로젝트 경로 밑에 web 이라는 폴더를 생성하고 다음과 같이 HelloController 클래스를 생성합니다. 생성한 HelloController 클래스 상단에는.. 이 클래스가 RestController 의 역할을 한다는 걸 명시하기 위해 @RestController 어노테이션을 작성해줍니다. @RestController 어노테이션은 @Cont..
1. 문제 redis 서버에서 특정 command를 실행할때 아래와 같은 에러가 발생할 수 있다. 2. 원인 redis 서버에 password가 설정되어 있어서 그렇다. password는 redis.conf 파일을 편집해 설정할 수 있다. 3. 해결 위의 requirepass에 설정되어있는 password를 redis-cli에 아래와 같이 제출하면 된다. 추천서적 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 COUPANG www.coupang.com 파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
이번 글에서는 SSL offloading에 대해 알아보도록 하겠습니다. 1. 상황 (KKK 서비스) A : 저희 이번 신년 기점으로 순간 트랙픽이 튀었었는데. 이부분 관련해서 고민해 보아야 할 게 있어요. B : 트래픽 몰릴 것을 대비해서 서버 수도 미리 증설해두었는데도.. 트래픽을 감당하지 못했네요.. 이 문제를 어떻게 해결하면 좋을까요? A : 서버 갯수의 문제가 아니였던 것 같아요. 트래픽이 몰린 시점을 보면, 각 서버별 CPU 사용량도 그렇게 높지 않았어요. 인프라쪽에 문의해본결과 트래픽이 처음 인입되는 L4의 QPS에 한계가 있는 것 같다는 답변을 받았습니다. 즉.. 맨 앞단에서 클라이언트 트래픽을 받고 있는 L4가 해당 트래픽을 견디지 못하고 있기 때문에 효과가 없었던 것 같습니다. B : 네..
이전글에 이어서 Nginx의 configuartion에 대해 알아보도록 하겠습니다. 10. Worker Process nginx에서 실제로 작업을 수행하고 response를 return 하는 process는 master prcoess가 아닌 worker process입니다. 저의 nginx는 default 값으로 1개의 master process와 1개의 worker process를 사용하고 있습니다. 이번글에서는 이 중 worker process에 대해 알아보고 조작하는 방법에 대해 살펴보도록 하겠습니다. 10-1) change worker process number worker process의 숫자를 변경하고 싶다면 nginx.conf를 변경하면 됩니다. 아래와 같이 nginx.conf를 열어 가장 ..
이전글에 이어서 Nginx의 configuartion에 대해 알아보도록 하겠습니다. 5. Redirect 우리가 이전글에서 사용했던 location 은 return 을 사용해 특정 uri의 request에 대한 결과값을 전달했습니다. # return location /hello { return 200 "Hello World"; } 위와 같은 return statement는 state code + response data 로 이루어져 있으며, 아래와 같이 정적인 string 값을 return 하는 경우의 state code는 200입니다. return 만약 정적인 값이 아닌 또다른 uri를 return 하는 경우에 state code는 307이며 이를 redirect 라고 합니다. redirect 예를들어..
이전글에 이어서 Nginx의 configuartion에 대해 알아보도록 하겠습니다. 7. Try Files try files은 server & location context에서 사용합니다. try files은 rewrite와 비슷하게 모든 request에 대해 일치하는 path를 앞에서 부터 순서대로 비교한뒤 root에 존재하는 path를 rewrite 하는 명령어입니다. server { listen 80; server_name 54.180.79.141; root /sites/demo; try_files /thumb.png /greet; location /greet { return 200 "Hello User"; } } 예를 들어 위와 같이 try_files를 작성하면 호출되는 모든 request에 순서..
1. 문제 A 도메인에서 B도메인으로 cors xmlhttprequest 요청을 보낼때 The 'Access-Control-Allow-Origin' header contains multiple values 에러가 발생할 수 있다. 예를 들어 S3로 호스팅하고 있는 React에서 Nginx+Spring Boot로 구성되어 있는 API 서버로 요청을 보낼때.. 2. 원인 중복된 cors 설정때문이다. Nginx로 proxy server를 구성하고, Spring boot로 application server를 구성했을 경우 Nginx와 Spring boot 두곳에 cors 설정을 하게되면 중복으로 Access-Control-Allow-Origin가 header에 붙게된다. 따라서 multiple ..
이번글에서는 차세대 web server인 Nginx에 대해 알아보고, 설치하는 과정까지 진행해보도록 하겠습니다. 1. Nginx란? high performance & high concurrency & low resource usage 를 자랑하는 web server 입니다. Nginx는 apache의 성능에 좌절한 어느한 개발자가.. 동시에 최대 10,000건의 concurrent connections 까지 처리할 수 있도록 개발한 차세대 web server 입니다. 이러한 Nginx는 reverse proxy server로도 사용가능합니다. 2. Apache vs Nginx 그렇다면 apache와 비교해 nginx이 다른점은 무엇일까요? 먼저 apache는 prefork로 구성된 web server입니..
이번글에서는 Nginx의 configuartion에 대해 알아보도록 하겠습니다. 1. nginx.conf nginx의 configuration을 관리하는 파일입니다. 저의 nginx conf 파일은 /etc/nginx/ 에 위치하고 있습니다. 이 nginx.conf 파일을 수정해 nginx의 configuartion을 변경할 수 있습니다. 처음 nginx을 다운받으면 아래와 같이 default configuartion이 작성되어 있습니다. nginx.conf #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/ng..
이전글에 이어서 Nginx의 configuartion에 대해 알아보도록 하겠습니다. 3. Location Blocks location은 specific uri에 대한 behavior를 정의하며 server 내부에 작성합니다. location block은 nginx.conf 에서 가장 많이 사용되는 configuration 이며, 기본적인 구조는 다음과 같습니다. location structure server { location uri { // hadnle response } } 아래의 예시는 /greet request를 받은 경우 return 값으로 repsonse code로 200을 response data로 string을 넘겨줍니다. nginx.conf events { } http { include ..
이전글에 이어서 Nginx의 configuartion에 대해 알아보도록 하겠습니다. 9. Logging Nginx는 access & error log를 기본으로 제공합니다. log는 nginx뿐만아니라 많은 service에서 error를 tracking 하거나 user의 행동들을 분석하는데 주요하게 사용되므로, 이번글에선 nginx의 logging system을 어떻게 관리하고 조작하는지 알아보도록 하겠습니다. 저의 nginx default log path는 /var/log/nginx 입니다. 9-1) access log access log는 모든 nginx에 대한 접근을 기록합니다. 기존에 쌓여있던 log를 비우고 /thumb.png로 접근해보겠습니다. clear log access 이후에 access..