사내에서 로그를 Error 수준으로만 보내고 있었다. 그래서 CS가 들어오는 경우에 확인할 방법이 DB 말고는 없었다. 즉, 로그가 잘 찍히지 않은 상태였다. 그래서 로깅하는 것을 보완하게 되었다.로그 레벨 설정info: 특정 이벤트 CS 업무가 많이 들어오거나 데이터로 활용 가능해서 의미 있다고 생각하는 부분은 Info 수준으로 남겼다.warn: 만약 5번 이상이거나 몇 분간 지속적으로 발생된다면 문제가 생길 것 같은 부분에는 warn 레벨로 설정하였다.error: 즉각적으로 인지하거나 해결해야 하는 부분에는 error를 달게 되었다.Logbacklogback부터 먼저 손을 보았다. logback이 환경별로 구분되지 않은 상태였다. 이를 dev, prod 환경으로 나누었고, 메인 logback이 있으면..
채팅서버에 대해 정리하기 위해 글을 적었습니다Http, WebSockethttp프로토콜은 서버로 요청을 하고 서버가 주는 응답을 기다리는 단방향 구조입니다웹소켓은 클라이언트가 서버에게 메시지를 보낼수도있고 받을수도있다 양방향 통신서버가 요청을안해도 클라이언트에게 먼저보낼수도있는것이다 웹소켓 프로토콜은 http에 비해가볍다라는 뜻HTTP: 매 요청마다 헤더(Header)를 포함해야 하며, 기본적으로 수십수백 바이트의 헤더를 포함함.WebSocket: 초기 핸드셰이크 후에는 헤더 크기가 매우 작아짐(보통 210바이트).더해서 HTTP는 Stateless이다 그래서 요청마다 HTTP는 세션을 유지하기 위해 쿠키나 세션을 정보가 추가적으로 들어가지만 웹소켓은 그렇지 않다불필요한 TCP 핸드셰이크를 반복하지 않기..
ConfigMap우리는 어플리케이션 yaml파일에서 db host라던지 패스워드 등을 적곤한다.그런데 이러한 환경변수 값을 deployment에서 적을 수 있다.그런데 아래와 같이 적는방법도 있다. env: - name: MY_ACCOUNT value: hello - name: MY_PASSWORD value: pwd1234그러나 이러한 설정값을 디플로이먼트에 적는다는것은 관리하기가 어려워진다 설정값 변경만해도 디플로이먼트를 다시 배포해야한다.각각의 역할을 가지고 있는 것처럼 환경 변수를 관리하는 역할을 가진 오브젝트가 따로 존재하는것이다. 이게 바로 컨피그 맵이다.더해서 별도의 파일로 분리를 해서 관..
Deployment파드를 묶음으로 쉽게 관리할 수 있는 기능이전까지는 파드매니패스트 파일을 실행했지만 개수가 많아지면 코드가 늘어나게 되고 관리가 힘들다 그래서현업에서는 일반적으로 서버를 작동시킬 때 파드(Pod)를 수동으로 배포하진 않는다. 디플로이먼트(Deployment)라는 걸 활용해서 파드(Pod)를 자동으로 배포한다. 디플로이먼트(Deployment)의 장점- 파드 개수를 지정하는대로 생성이 가능하다- 파드가 비정상적으로 종료되는경우 새로 파드를 생성해 유지한다- 즉 일괄적으로 수정, 삭제, 중지, 업데이트 하기가 쉽다 디플로이 먼트 구조디플로이먼트는 레플리카셋을 관리하고 레플리카 셋은 여러 파드를 관리한다디플로이먼트 -> 레플리카셋 -> 파드그래서 디플로이먼트 -> 파드를 관리한다 라고 성립..
쿠버네티스란?오케스트레이션을 보고나면 지휘자가 어느곳은 약하게 강하게 이런지휘를 하게 된다 또 어떤곳을 연주할지랑 조율을 자주한다이런이미지를 인프라에 대입시켜보면 쿠버네티스는 인프라 관리지휘를 하는 역할을하는것이다.개발적으로는 컨테이너가 악기들이며 이러한 다수의 컨테이너를 효율적으로 배포, 확장 및 관리하기 위한 오픈소스이다.DokcerCompose와 비슷하지만 DockerCompose의 확장판이라고 생각하자 쿠버네티스 장점- 컨테이너 관리 자동화(배포, 확장, 업데이트)- 부하 분산(로드 밸런싱)- 쉬운 스케일링 (매니페스트 파일로 간단)- 셀프 힐링 Pod도커에서는 하나의 프로그램을 실행시키는 단위를 컨테이너 쿠버네티스에서는 파드라고 부른다. 파드는 일반적으로 쿠버네티스에서 하나의 프로그램을 실행시키..
이번글은 Spring Batch5에서 멀티데이터소스 설정에 대한 글입니다.제가 원하는 상황은 spring batch에 대한 meta-table을 schema를 서비스 schema와 분리시키고 싶었습니다. Spring Batch5 특징및 달라진점들어가기전에 Spring Batch5로 바뀌면서 달라진점에 대해 간단히 알아보자일단 Java17이 필수다@EnableBatchProcessing을 사용 안해야한다. 사용하는 경우는 meta-table정보를 다른곳으로 지정하고 싶을때라고 한다.또한 JobBuilderFactory는 Deprecated되었고 JobBuildeer와 StepBuilder를 사용해야한다. 제일 중요한것은 JobRepositorymeta데이터에 관한 테이블을 저장하는것은 JobReposi..
용어에 대해 정리한 글입니다. 향후 CDC에 대해 자세하게 정리할 것입니다. ETLExtract(추출), Transform(변경), Load(적재)를 뜻하며원천데이터에서 필요한 부분을 Extract 추출하여, Transform(클렌징,형식변환,표준화,통합 등)의 비즈니스룰을 적용한후, 특정 시스템에 Load(적재)하는 방식이다.주로 배치성으로 작업을 하며, 솔루션으로는 개인적으로 아는것은 AWS Glue, Spring Batch로 처리하는 방법이 존재합니다. 하둡의 등장으로 쌓아둘수있어서 쌓아두는걸 먼저하자 ELT하둡의 등장으로 쌓아둘수 있어서 쌓아두는걸 먼저하는 경우가 생겼다고 한다.ELT란 데이터를 먼저 추출 적재한 이후 변환을 하는 프로세스를 의미한다. ELT에서는 데이터 웨어하우스에서 데이터 변..
지연로딩을 하는데 어느 경우에만 즉시로 가져오고 싶은 컬럼이 존재했다. 그런데 이것을 아래와 같이 where: { member, }, relations: ['memberRole'], }); lazy: true 하면은 같이 가져오지 못해 Promise를 받게 된다. 그런데 아래조합으로 하면은 즉시 가져오게 된다. 도대체 왜 그런지 살펴봐야 겠다. eager: false where: { member, }, relations: ['memberRole'], }); 찾아보니 lazy는 항상 Promise를 반환하도록 되어있는거 같다. GPT에도 물어보니 relations와 eager로만 조합되어있지 lazy랑은 조합이 없는거 같다. nest/typeorm과 typeorm의 차이점이 무엇인가? nest/typeor..
이번 글은 사내 CI/CD작업을 하면서 알게 된 점을 적었습니다. 제가 볼려고 알게 된 점을 정리한 글입니다. EC2 인스턴스 접속할 때 홈 디렉토리가 계정별로 다른이유 알게된 이유는 젠킨스로 작업을 하면서 파일 실행을 내부에서 시켜야하는 경우가 존재했습니다. 그런데 이것을 못읽게 되면서 발생하는 문제였습니다. 파일을 찾을 수 없는것입니다. 그래서 찾아보니 Linux시스템에서 홈디렉터리 설정되어있지않는 유저는 ssh접속시 인자없으면 홈 디렉토리는 /home/ec2-user가 됩니다. 왜냐하면 일반적으로 사용자 계정이 생성될 때, 해당 계정의 홈 디렉토리는 /home/계정이름 과 같이 설정이 되기때문입니다. 따라서 자신의 홈 디렉토리로 이동하게 됩니다. 항상 파일위치만 보다가 홈 디렉토리를 확인안하게 되었..