Spring12 [Spring & DB] 기존 Named Lock 방식 개선하기 들어가며이전에 Named-Lock 을 통해 동시성을 제어하는 방식과 분산락을 이용하여 제어하는 방식을 비교하며, Named-Lock은 경쟁 상태에 들어가는 요청이 늘어나는 경우에, ConnectionPool 이 고갈되는 현상이 생길 가능성이 존재한다며 단점으로 언급하였었습니다.그 이유로는 이전 글에서 언급하였던 것처럼 락을 획득하고 제어하는 트랜잭션 내에서 또 다른 트랜잭션이 필요하였기 때문입니다. 이러한 생각과 함께 또 다른 생각은 그렇다면 락을 획득하고 제어하는 부분에서는 트랜잭션을 걸지 않고 처리하면 되는 것이 아닐까? 라는 생각이 들었습니다. 하지만 Named Lock 을 해제하기 위해선 획득한 세션과 동일한 세션이 필요하며, 이를 유지하는 방법으로 트랜잭션을 묶어 동일한 커넥션을 가져오도록 강제.. 2025. 7. 6. [WAS] Java 로 순수하게 서버 구축하기 (2) 들어가며이번 글을 마지막으로 WAS 구축하기는 마무리하려고 합니다...! 사이드 프로젝트에 좀 더 힘을 주기 위해서...따라서, 해당 글에서 WAS를 구축하면서 이해한 부분들을 최대한 담고자 노력하였습니다.Front ControllerFront Controller 는 웹 어플리케이션으로 들어오는 모든 HTTP 요청을 가장 먼저 받아들이고, 해당 요청과 부합하는 컨트롤러에 의해 요청을 처리한 후 적절한 결과를 전달하는 컨트롤러 역할을 수행합니다.그리고 이러한 역할이 바로 DispatcherServlet 입니다.물론, 그림과 같이 가장 앞단에서는 Tomcat 에 의해 HttpServletRequest / HttpServletResponse 객체가 생성되고, 그 이후에 필터를 거쳐 DispatcherServl.. 2025. 6. 27. [팀 프로젝트] Enum 활용하기. 들어가며기존 프로젝트의 멤버 엔티티는 `Region` 이라는 Enum 하나만으로 지역을 관리하고 있었습니다. 해당 Region 은 '서울특별시', '대전광역시' . . . 처럼 상위 지역만을 나타내고 있었습니다. 하지만 기획의 변경으로 인해 '서울특별시 강남구' 처럼 구 단위까지 포함해야 했습니다.변경 방법변경을 위해서 Enum 으로 관리하던 지역을 따로 테이블을 통해 관리하는 것이 효과적이라는 생각이 먼저 들었습니다. 하지만 이렇게 되면 기존에 사용하던 코드를 모두 변경했어야 하기 때문에 수정의 범위가 너무 커질 것 같다는 생각이 들었습니다. 또한, 지역이라는 값은 데이터의 수정,추과그리고 삭제가 일어나지 않는 고정된 값이기 때문에 DB를 통해 관리하는 방식은 큰 장점이 없을 것 같았습니다.따라서 En.. 2025. 4. 22. [Kong's Blog] 채팅 기능 추가하기 (2) 설정 (Configure)@Configuration@RequiredArgsConstructor@EnableWebSocketpublic class WebSocketConfig implements WebSocketConfigurer { private final CustomWebSocketHandler customWebSocketHandler; @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(customWebSocketHandler, "/chat") .setAllowedOrigins("*"); }}먼저 WebSo.. 2025. 3. 16. [Kong's Blog] 채팅 기능 추가하기 (1) 들어가며프로젝트를 진행하며, 기존의 HTTP 통신 방식말고 색다른 통신을 구현해보고 싶었습니다! 그래서 참고 자료도 많고, 재밌게 구현할 수 있을 것 같은 주제로 채팅 기능을 선택하였습니다.구조기존 HTTP의 통신의 가장 큰 특징은 무상태성(stateless)과 요청-응답 방식이라고 생각합니다. 따라서 기존의 HTTP 통신으로 채팅을 구현하게 되면, 아래와 같은 오버헤드가 있습니다.클라이언트와 서버는 매 요청(메세지를 전송)하는 과정마다 TCP 연결 및 해제 과정을 거쳐야 합니다.서버가 선제적으로 클라이언트에게 메세지를 전송할 수 없으므로, 클라이언트는 새로운 메세지가 왔는지 인지할 수 없으며 매번 쿼리를 전송해야할 것입니다. (Polling)따라서, 소켓 통신 과정이 필요하였습니다.설계GPT와 FLow.. 2025. 3. 11. [DB & 팀프로젝트] 삽입 작업에서는 어떻게 동시성 제어를 할까? 들어가며이전 글(https://kongdevlog.tistory.com/19)에서는 행 단위 잠금만으로 모든 동시성 문제를 해결할 수 있을 것 같다고 생각을 하였습니다. 하지만 이번 기능을 구현하며, 잘못된 생각이었다는 것을 깨닫게 되었습니다. 문제 상황사용자 A가 다른 사용자 B에게 매칭을 요청하는 기능을 맡아 구현하게 되었습니다. 따라서 저는 아래와 같은 플로우로 코드를 구현하게 되었습니다. 1. A.id 와 B.id 둘 사이의 진행중인 매칭이 존재하는지 확인. 2 - 1. 매칭이 존재한다면 예외를 반환 2 - 2. 매칭이 존재하지 않다면, 매칭 생성. 이 과정을 단순히 하나의 트랜잭션으로 구현하였습니다.@Transactionalpublic void request(Long requesterId, Lo.. 2025. 2. 18. 이전 1 2 다음