분류 전체보기28 [DB] 클러스터링 인덱스 들어가며면접관님께서 최근에 어떤 것을 공부하고 있느냐고 해서, 자신있게 Real MySQL을 읽으며 데이터베이스에 대해서 공부하고 있다고 말씀드렸습니다. 그러자 클러스터링 인덱스와 비 클러스터링 인덱스에 대해서 아는지, 비교를 해달라고 하셨습니다. 해당 말씀을 듣고 저는 단일 컬럼 인덱스와 복합 컬럼 인덱스로 착각하여 말씀드리게 되었습니다. 면접관님께서는 그냥 넘어가셨지만, 면접 직후 바로 찾아보니 답변을 잘못했다는 것을 알게되고 글을 기록하며 다시 한번 기억에 남기고자 글을 작성합니다!클러스터링 인덱스란?클러스터링이란 테이블의 레코드를 비슷한 것으로 묶어서 저장하는 것을 의미합니다. 이는 MySQL에서는 InnoDB 스토리지 엔진에서만 지원합니다.클러스터링 인덱스는 프라이머리 키에 대해서만 적용되는 내.. 2025. 3. 25. [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 & 팀 프로젝트] 실행 계획을 통해 인덱스 걸어보기! 들어가며Real MySQL 8.0 1권 책을 읽으며 조회 시, 인덱스의 중요성에 대해서 새삼 느끼게 되었습니다. 따라서 현재 프로젝트에서 작성한 쿼리의 실행 계획을 확인 후, 인덱스를 설정하여 조회 성능을 개선할 수 있는 부분이 있는지 확인해보고자 글을 작성하게 되었습니다!어플리케이션 코드.OtherMemberProfileView otherMemberProfileView = queryFactory .from(member) .leftJoin(hobby).on(hobby.id.in(member.profile.hobbyIds)) .leftJoin(job).on(job.id.eq(member.profile.jobId)) .. 2025. 3. 4. [DB] MySQL NamedLock vs Redisson 락 관리. 들어가며이전 글(https://kongdevlog.tistory.com/20)에서 Named Lock을 통해 삽입 작업에서의 동시성을 제어하였습니다.다만 이 과정에서, Redisson을 사용하는 방법이 더 좋은 방법이라고 생각이 들어 이를 비교해보고자 글을 작성하게 되었습니다.테스트 설계동시성이 발생할 수 있는 상황을 발생시키기 위해 다음과 같은 API 시나리오를 작성하였습니다.특정 엔티티(행) 조회.해당 엔티티의 컬럼 값 증가.증가한 컬럼 값 반환.이 과정에서 조회 후, 값을 증가하는 트랜잭션이 동시성이 발생할 수 있는 상황입니다.Test Entity@Entitypublic class TestEntity { @Id @GeneratedValue(strategy = GenerationType.I.. 2025. 2. 25. [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 3 4 5 다음