분류 전체보기

Backend

<Spring> Coroutine Actor 이용해서 단일 서버 락 구현하기 2

Coroutine Actor 이용해서 단일 서버 락 구현하기" data-og-description="📌 Actor🔵 Actor란?Actor 모델은 병렬 프로그래밍에서 상태를 가진 개체가 메시지를 주고받으며 비동기적으로 동작하는 개념이다.즉, 자체적인 상태를 가지고 메시지를 수신하며 이를 처리하는 " data-og-host="wtg1026.tistory.com" data-og-source-url="https://wtg1026.tistory.com/19" data-og-url="https://wtg1026.tistory.com/19" data-og-image="https://scrap.kakaocdn.net/dn/bnwsFD/hyWSioV8Ax/7O8RmVDgoySIRbq3uEYrkk/img.png?wi..

Backend

<Spring> Coroutine Actor 이용해서 단일 서버 락 구현하기

📌 Actor🔵 Actor란?Actor 모델은 병렬 프로그래밍에서 상태를 가진 개체가 메시지를 주고받으며 비동기적으로 동작하는 개념이다.즉, 자체적인 상태를 가지고 메시지를 수신하며 이를 처리하는 논리를 가지고 있는 실행 단위이다.코루틴에서도 스레드 간 동기화를 지원하기 위해 이를 지원해 준다. actorLaunches new coroutine that is receiving messages from its mailbox channel and returns a reference to its mailbox channel as a SendChannel. The resulting object can be used to send messages to this coroutine. The scope of the..

Backend

<Spring> Slack 메세지 전송 에러 처리

📌 에러 상황현재 수수에서 Slack을 통계, 에러 알림으로 사용하고 있다.근데 가끔 Slack 메시지 전송이 실패했다고 알림이 온다.스케줄러 에러인 것을 보아, 통계 알림의 슬랙 메시지 전송 부분에서 발생한 것을 알 수 있다.근데 위에 보여준 건 여러 개 중 하나이다.다행히 모두 통계 알림 에러이다.하지만 이 일이 에러 알림에서 발생해도 이상하지 않다.센트리로 에러 사항이 기록되긴 하지만 개발자가 이 에러의 발생을 빠르게 파악할 수 있는 것은 슬랙 알람뿐이다.그러므로 알람이 전달됨을 보장해주는 로직이 필요했다.  📌 처리에 관한 고민처음엔 서킷 브레이커를 생각했다.슬랙이 오랜 기간 동안 장애가 발생한다면 시스템의 안정성을 높이는 부분에 있어서 유용할 것이다.하지만 슬랙이 오랜 기간 동안 장애가 발생..

Backend

<Spring> Webflux + Coroutine vs MVC

📌 실험 개요Webflux는 적은 리소스에서 MVC에 비해 많은 요청을 처리할 수 있고, Coroutine은 스레드를 사용하는 것보다 메모리 자원을 효율적으로 관리할 수 있다고 한다.인터넷에 Webflux vs MVC를 비교한 글은 많아도, Webflux + Coroutine vs MVC를 비교하는 글은 없는 것 같다.이에 위 두 환경을 만들어서 앞서 언급한 부분에 대해 증명하고자 한다. 수수에서 Reactive Stack을 사용했는데, Webflux + Coroutine + JPA 조합을 사용했다.이와 흔히 사용하는 MVC + JPA 조합을 비교하고자 한다. 📌 실험 내용🔵 실험 목표이 실험을 통해 알아보고 싶은 점은 아래와 같다.MVC와 비교했을 때 Webflux의 요청 처리 능력Coroutin..

Backend

<Spring> SUSU의 Coroutine

📌 SUSU 프로젝트YAPP 23기에서 진행한 경조사비 관리 서비스이다.자세한 내용은 아래 링크를 이용하면 된다.결혼식, 돌잔치, 장례식, 생일 같은 경조사를 챙긴 적 있나요?주고받은 소중한 마음들, 수수와 함께 경조사비를 똑똑하게 관리해요! Disquiet*IT 서비스 메이커들의 소셜 네트워크. 디스콰이엇에서 서로의 프로젝트를 공유해 보세요!disquiet.io많관부 ㅎㅎ 📌 왜 Coroutine을 썼을까🔵 Coroutine 이란자세한 설명은 이 글에서 안 할 것이다.간단히 소개만 해보겠다. 위키백과에는 아래와 같이 쓰여있다.Coroutines are computer program components that allow execution to be suspended and resumed, gene..

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 { ..