이번글에서는 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..
이번 글에서는 SSL offloading에 대해 알아보도록 하겠습니다. 1. 상황 (KKK 서비스) A : 저희 이번 신년 기점으로 순간 트랙픽이 튀었었는데. 이부분 관련해서 고민해 보아야 할 게 있어요. B : 트래픽 몰릴 것을 대비해서 서버 수도 미리 증설해두었는데도.. 트래픽을 감당하지 못했네요.. 이 문제를 어떻게 해결하면 좋을까요? A : 서버 갯수의 문제가 아니였던 것 같아요. 트래픽이 몰린 시점을 보면, 각 서버별 CPU 사용량도 그렇게 높지 않았어요. 인프라쪽에 문의해본결과 트래픽이 처음 인입되는 L4의 QPS에 한계가 있는 것 같다는 답변을 받았습니다. 즉.. 맨 앞단에서 클라이언트 트래픽을 받고 있는 L4가 해당 트래픽을 견디지 못하고 있기 때문에 효과가 없었던 것 같습니다. B : 네..
1. 문제 redis 서버에서 특정 command를 실행할때 아래와 같은 에러가 발생할 수 있다. 2. 원인 redis 서버에 password가 설정되어 있어서 그렇다. password는 redis.conf 파일을 편집해 설정할 수 있다. 3. 해결 위의 requirepass에 설정되어있는 password를 redis-cli에 아래와 같이 제출하면 된다. 추천서적 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 COUPANG www.coupang.com 파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
이번 글에서는 Linux 에서 Prcoess Status 를 확인하는 방법에 대해 알아보겠습니다. 1. Process Status process status 는 ps command 를 사용해 확인할 수 있습니다. 1-1) basic 예를 들어 다음과 같이 입력할 경우 ps현재 system 에서 실행되고 있는 basic process 들의 정보를 간단히 확인할 수 있습니다. 이때 4개의 column 은 각각 다음과 같이 해석할 수 있습니다. PID : 프로세스 ID TTY : 프로세스가 속해 있는 Terminal TIME : CPU 가 해당 prcess 를 수행하는데 사용한 총 시간 CMD : 해당 프로세스를 실행한 program 혹은 command 이름 1-2) options ps command 는 다양..
대학교 4학년 즈음에.. 갑작스럽게 IT 로 진로를 변경한 뒤로 네이버, 카카오와 같은 IT 서비스기업은 내 목표 기업에 존재하지도 않았다. (너무 높아 보였다.) 대신 차선책으로 대기업 SI 를 목표로 취업준비를 했었는데. 당시에 나름 이름있는 SI 업체들에는 대부분 서류통과가 되었다. (물론 인적성 & 코딩테스트 등은 별개로.. ) 서류만 기준으로 합격했던 업체들을 나열해보면 다음과 같은데 - 삼성 SDS - SK C&C - LG CNS - 포스코 ICT - 롯데 정보통신 - CJ 올리브네트웍스 - 아시아나 IDT 사실.. 위의 SI 업체들이 워낙에 인력들을 많이 모집했었기에.. 서류통과는 시작일 뿐이지 크게 기뻐할 일은 아니였다. 그럼에도 불구하고.. 나름 주변에서 취업을 준비하는 친구들 사이에서는..
1. 문제 intellJ에서 JUnit Test를 수행할때 package 내의 class를 찾지 못해 import 할 수 없는 경우가 있다. 2. 원인 test전에 directory 구조를 변경한 것이 문제였다. 이때 변경전의 class들의 구조가 compile 되어 out directory에 담겨있었다. 3. 해결 IntellJ를 종료 후 다시 재시작하면, IntellJ가 package 구조가 변경된 것을 스스로 감지하고 이전 version의 out directory를 지울 것이냐고 물어본다. 이때 제거한다고 선택하면 에러가 해결된다. 추천서적 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 COUPANG www.coupang.com 파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
1. 문제 spring-boot에서 원격 redis 서버에 접속이 아래와 같이 거절될 수 있다. 2. 원인 기본적으로 redis는 로컬에서만 접속하도록 막아두었기 때문이다. 이유는 redis는 보안적으로 취약한 구조이기 때문이다. 3. 해결 이를 해결하기 위해선 redis server의 redis.conf 파일을 수정해야한다. redis.conf 파일을 편집기를 통해 연다. sudo nano /etc/redis/redis.conf bind 명령어를 찾는다. 기본 설정인 127.0.0.1을 주석처리하고 모든 IP 대역을 허용하는 0.0.0.0 로 변경한다. 프로덕션 환경에서는 위처럼 모든 대역의 IP를 허용하면 절대 안된다. 실제 redis에 접근할 서버의 IP 대역만 허용하도록 하자. 위의 redis.c..
이전글에 이어서 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에 순서..
이번글에서는 차세대 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에 대해 알아보도록 하겠습니다. 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에 대해 알아보도록 하겠습니다. 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..
이전글에 이어서 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를 열어 가장 ..