전체 글

Hello World!😀 Hi, I'm Judy🐰(Junior Developer)
Spring Boot 애플리케이션을 실행하던 중 다음과 같은 에러를 만났다.java.lang.IllegalStateException: LettuceConnectionFactory is STOPPING 처음에는 Redis 서버 문제라고 생각했지만, 실제 원인은 Spring Boot 애플리케이션의 라이프사이클과 WebSocket thread의 동작 방식이 맞물리면서 발생한 문제였다. 이 글에서는 로그를 기반으로 Spring Boot의 종료 과정과 Redis, WebSocket이 어떻게 상호작용하는지 정리해보려고 한다. 문제 상황로그의 흐름은 다음과 같았다.WebSocket connected↓price message 수신↓Redis 캐시 저장 시도↓Spring context 종료 시작↓Redis STOPPIN..
웹 어플리케이션과 싱글톤의 관계 여러 고객이 동시에 동일한 서비스를 요청하는 경우통상적으로 서비스를 운영하다보면 위 그림과 같이 동일한 요청이 서로 다른 클라이언트로부터 동시에 들어올 수 있다.요청이 들어오면 객체를 만들어서 메모리를 사용하게 되는데, 만약 동일한 요청들을 전부 상이한 메모리 공간에 할당시켜 각각 응답해주게되면 메모리 공간이 남아나질 않을 것이다.이에 대한 해결방안으로 웹 어플리케이션을 구현할 때, 동일한 요청들에 대해서는 싱글톤 패턴을 적용시킨다. 싱글톤 패턴이란?: 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 재사용스프링은 기본적으로..
최근 김영한님의 스프링 핵심 원리 기본편 강의를 듣다가, ConcurrentHashMap에 대한 개념이 등장했다. 강의에서 멤버를 저장할 때 아래와 같이 HashMap을 사용하셨는데, 코드에서 HashMap은 동시성 이슈가 있으므로 실무에서는 CocurrentHashMap을 쓰는 게 좋다고 하셨다. private static Map store = new HashMap(); CocurrentHashMap을 들어보긴 했지만, 직접 사용해서 개발해본 경험은 없었기에 해당 자료구조가 어떻게 동시성을 제어하는지 궁금해졌다. 그리고 이와 함께 많이 사용하는 HashMap과 HashTable 자료구조에 대해 같이 다뤄보고자 한다. HashTable vs HashMap 위의 2개 자료구조는 이전에 cs를 공부하면서..
작년까지 운영했던, 터닝이라는 서비스를 개발하던 중 동시성 문제를 발견했던 적이 있다.사실 해당 문제에 대해 인지하고 있지 못하고 있다가, 어느날 prod db를 살펴보던 중 이 사실을 알게 되었다. 당시 문제 상황을 정리해보면 아래와 같다. 터닝 서비스에는 사용자가 마음에 드는 공고를 스크랩 추가 및 취소할 수 있는 기능이 있다.검색 시에 또는 공고 리스트에 공고마다 스크랩 수를 보여주고 있으며 또한 공고 상세보기 시에도 스크랩 수를 화면에 보여준다.위와 같은 이유로, 반정규화를 통해 조회 성능상의 이점을 가져가고자 했으며, 테이블의 구성을 아래와 같이 해놓은 상황이었다. 아래 사진과 같이, 공고 테이블의 ID가 70인 공고의 스크랩 수 필드에는 값이 4로 저장되어 있었지만, 실제 스크랩 테이블에..
주디(Junior developer)
주디는 언제나 당근을 원해🥕