CronTab - Application Health Check
💻 Server/Linux2024. 5. 23. 13:07CronTab - Application Health Check

CronTab 사용법특정 IP:Port에 대한 HTTP Request가 Connection Refused가 뜰 때 Docker Container를 Kill 하고 재기동 하는 Cron을 예시로 작성해 보겠습니다.skw@skw:~$ curl -X GET http://localhost:3546/v1/core/instancescurl: (7) Failed to connect to localhost port 3546 after 0 ms: Connection refusedCronTab에 적용할 Shell Script를 먼저 작성해줍니다.로그 파일의 크기를 50MB로 제한50MB가 넘어갈 시 오래된 로그 삭제 및 새로운 로그로 대체특정 API에 GET 요청을 보냈을 때 Connection Refused가 아니라면 "..

ReentrantReadWriteLock - ReadLock & WriteLock을 사용한 Read Thread 성능 향상
📘 Backend/Concurrency2024. 5. 3. 15:34ReentrantReadWriteLock - ReadLock & WriteLock을 사용한 Read Thread 성능 향상

ReentrantReadWriteLock왜 사용해야 하는지?주로 읽기 작업이 많은 어플리케이션에서 읽기 작업이 느릴때읽기 작업에 드는 비용이 클 때읽기 작업을 수행하는 Reader Thread가 여러개일때 이런 상황이 왜 문제일까?읽기 작업을 수행하는 Thread가 여러개가 있고,한 Thread가 공유 Resource를 읽을때 다른 Thread들은 Blocking 상태가 됩니다. 이때 앱의 읽기 성능애 문제가 생깁니다. (다른 Thread들은 대기상태 이기 때문)위와 같은 상황을 ReentrantReadWriteLock을 사용하여, 읽기 작업을 수행하는 Thread들의 공유 리소스 동시 접근이 가능하게 하기 위한 클래스가 ReentrantReadWriteLock 입니다.사용법Thread 여러개가 있는 앱..

ReentrantLock - Lock 획득을 위해 대기중인 Thread에 Interrupt 호출이 안먹힐 때
📘 Backend/Concurrency2024. 4. 30. 17:53ReentrantLock - Lock 획득을 위해 대기중인 Thread에 Interrupt 호출이 안먹힐 때

ReentrantLock - lockInterruptibly()특정 Thread에서 Lock 획득을 위해lock.lock()을 호출했을 때 다른 스레드에 의해 이미 Lock이 점유되어 있는 상황에서 현재 Thread는 Lock이 해제되는걸 기다리기 위해 무한 대기 상태에 걸려 있습니다. (Blocking 상태)이때 대기 상태를 해제하기 위해 Thread를 Interrupt를 시켰는데 Interrupt 호출이 되지 않아서, 알아보고 해결한 방법을 기록합니다.아래 예시 코드로 설명해보겠습니다.lockInterruptibly()를 사용해야 하는 이유 - 예시 코드@Overridepublic void run() { lock.lock(); // Lock 획득 실패 - 다른 스레드에서 사용 중 // ....

Spring WebSocket (Stomp X)
📘 Backend/Spring2024. 4. 26. 11:25Spring WebSocket (Stomp X)

처음 WebSocket을 사용할떄 WebSocket API를 직접 사용하는것이 아닌, Stomp를 사용했었습니다.Stomp는 WebSocket 위에서 동작하는 Messaging Sub Protocol입니다.Stomp를 사용할때의 장점은,구독(Subscribe) & 발행(publish) 메시징 패턴을 빠르고 쉽게 구현할 수 있고,다양한 플랫폼과의 호환성이 높아 통합이 용이합니다.하지만, Stomp 프로토콜 자체의 오버헤드가 있어 많은 메시지를 처리하는데 있어 속도 저하를 느껴서 바꾸게 되었습니다.이번엔 순수 WebSocket API를 이용하는 걸로 바꾸었고,순수 WebSocket API를 이용하면 직접적인 메시지 포맷팅, 연결 상태 관리 등을 직접 제어해 복잡성이 증가하지만,성능과 낮은 지연 시간이 중요한..

조회 성능 최적화 - MPTT(트리 순회 방식)
📘 Backend/Spring2024. 4. 23. 14:59조회 성능 최적화 - MPTT(트리 순회 방식)

조회 성능 최적화를 위한 테이블 설계 (트리 순회 방식)지금까지 어떤 Entity와 연관된 다른 Entity를 불러올때 계층적 쿼리 방식을 많이 사용했었습니다.아래 Entity 클래스처럼 한 테이블에 Parent를 둬서 Children이 Parent를 참조하는 일반적인 방식입니다.이 방법은 설계가 쉽고 직관적이라는 장점이 있는 반면,계층의 층위가 깊어질수록 쿼리의 복잡도와 읽기 시간이 점점 증가합니다.특히, SQL 재귀 쿼리를 사용해야 할 때는 성능 저하까지 발생할 수 있습니다.@Entity@Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Box extends BaseEntity { @Id ..

Discord WebHook 연동 (Spring Boot)
📘 Backend/Spring2024. 4. 9. 14:47Discord WebHook 연동 (Spring Boot)

Discord Bot 연동 Slack Push Webhook을 구현했었는데 비용 문제로 Slack을 사용하자마자 바로 Discord Push Web Hook으로 변경할 일이 생겨 작성합니다. Discord WebHook 연결 Webhook을 설정할 채널의 편집 설정에 들어가서 연동탭에서 WebBook 만들기 탭을 클릭해줍니다. 이후 바로 코드 작성으로 넘어갑니다. Discord WebHook API 사용법 { "content": "Hello, World!", "tts": false, "embeds": [{ "title": "Hello, Embed!", "description": "This is an embedded message." }] } Message DTO 위 공식 문서의 Create Message..

Slack Bot 연동하기
📘 Backend/Spring2024. 4. 5. 13:33Slack Bot 연동하기

Slack Web Hook 연동 사내 플랫폼을 운영하면서 생긴 Internal Server Error 등에 직접적으로 대응 및 모니터링을 하다가, 자동화가 필요할 것 같아 Web Hook을 알아보던 중 Slack을 사용하기로 하여 알아본 Web Hook 연동입니다. Slack Bot 생성 https://api.slack.com/ 위 링크 접속 - 우측 상단 Your Apps 클릭 Create an App - From Scratch 를 선택 후 사용하고자 하는 앱 이름을 작성합니다. (Slack Bot 이름) 그리고 이 봇을 사용하고자 하는 WorkSpace를 선택합니다. 생성하였다면 좌측 Bots를 클릭하면 자기가 생성한 Slack Bot이 보입니다. Slack Bot 설정 봇 생성이 완료 되었다면 생성..

image