전체 글

정상훈 삽질 기록 창고
Backend

<Spring> Webflux + Coroutine + MDC

📌 MDC란?Mapped Diagnostic Context의 약자로,로깅 시스템에서 사용자의 요청이나 특정 실행 경로를 추적하는 데 사용되는 도구이다.다중 스레드 상황에서 요청 간 구분을 위해 주로 사용한다.Java의 로거인 SLF4J가 이를 내부적으로 지원해 준다. 📌 Webflux와 MDCMDC는 보통 스레드 로컬을 사용한다.하지만 어떤 스레드에서 작업을 진행할지 확신할 수 없는 Webflux의 특성상 스레드 로컬 사용이 어렵다.이에 MVC와 다른 방법을 사용해야 했다. 아래 로직을 구현하는데, 아래 블로그를 많이 참고했다. 배달의민족 최전방 시스템! ‘가게노출 시스템’을 소개합니다. | 우아한형제들 기술블로그{{item.name}} 안녕하세요 우아한형제들 프론트검색서비스팀 권용근입니다. 저는 "..

Backend

<Spring> WARN 레벨 이상 로그 Slack 알림 보내기

📌 도입 배경원래 WARN 레벨 이상 로그를 Sentry로 보냈었다.하지만 Sentry 무료 라이선스를 이용 중이라서 도입한 지 10일 만에 용량 초과로 이메일이 왔다.그래서 찾은 대안이 슬랙이었다. 어떻게 해야할까?먼저 spring에서 log를 어떻게 처리할 수 있는지 알아보자.📌 Log🔵 System.out.printIn()자바에서 로그를 표시하는 기본 중의 기본 함수이다. 하지만 이는 아래와 같은 이유로 쓰면 안 된다.휘발된다로그를 단지 콘솔에 띄우기만 하고, 다른 파일에 저장하지 않는다.실제로 저장되는 것이 없으므로, 추후 로그를 이용한 시스템 관련 작업이 불가능하다.로그만 나온다로그가 잘 나오는데 무슨 문제가 있는가?라는 질문이 나올 수 있다.하지만 이는 문제로 작용한다.로그뿐만이 아니라 ..

Infra

<Infra> ubuntu 환경에서 의문사한 docker container 사인 규명

📌 사라진 서버 컨테이너All:Chive 회의를 했다.회의하는데 로그인이 안된다고 한다.뭐지 하고 ec2 접속해서, sudo docker ps해봤더니, 엔지닉스만 남아있다;;;보통 블로그 쓸 거였으면, 사진이라도 남겨뒀을 텐데여긴 사진도 못 남겼다... 당황해서;;일단 도커 컴포즈로 서버 복구만 시켜두고 원인을 찾아봤다. 📌 원인 규명🟢 CloudWatch All:Chive 서버에는 로그 보기 편하게, CloudWatch를 적용해뒀다.컨테이너가 종료된 걸 보고, 서버가 오류 나서 강제 종료된 건가 싶어서 로그를 켜봤다.종료될 때쯤, 서버에 아무런 요청이 없었고, 에러도 없었다.의문사했다.그래서 CPU 문제인가 싶어서 EC2 지표도 봤다.지표도 뭔가 이상하다.요청이 없는데 CPU 사용률이 저렇게 올라..

Backend

<Spring> Spring Bean, IoC/DI 정리 2

Spring Bean, IoC/DI 정리 1" data-og-description="📌 IoC 🟢 IoC 란? IoC는 Inversion of Control의 약자로 ‘제어의 역전’이라는 의미를 가진다. 이때, ‘제어의 역전’은 무슨 의미를 가지는 걸까? 제어 객체 생명주기나 메서드의 호출을 직접 제어한" data-og-host="wtg1026.tistory.com" data-og-source-url="https://wtg1026.tistory.com/11" data-og-url="https://wtg1026.tistory.com/11" data-og-image="https://scrap.kakaocdn.net/dn/yfFoc/hyT5TymqD8/i2KBQlPPZs098ytG38zB9k/img.png..

Backend

<Spring> Spring Bean, IoC/DI 정리 1

📌 IoC🟢 IoC 란?IoC는 Inversion of Control의 약자로 ‘제어의 역전’이라는 의미를 가진다.이때, ‘제어의 역전’은 무슨 의미를 가지는 걸까? 제어객체 생명주기나 메서드의 호출을 직접 제어한다 ⇒ 객체 생명주기나 메서드의 호출을 직접 관리한다직접 객체를 생성하여 코드를 “제어”public class A { private B b; public A() { this.b = new B(); }}A 클래스에서 B를 필드로 가지고 있고, 생성자 내부에서 직접 생성해 필드를 초기화하고 있다.이러한 코드를 객체 생명주기를 직접 제어하는 코드라고 말할 수 있다. 역전프로그램의 제어 프름을 직접 제어하는 것이 아니라 외부에서 관리하는 것public class A { ..

wjdtkdgns
삽질 일기