생각 풀어내기
close
프로필 사진

생각 풀어내기

github: @mete0rfish

  • 분류 전체보기 (12)
    • Java & Kotlin (2)
    • Spring (7)
    • Server (1)
    • DB (2)
    • Reflection (0)
  • 홈
  • 태그
  • 방명록

[MySQL] 복합 인덱스를 활용한 2차 카테고리 기능 개선

문제 정의원툴의 높은 가용성 확보와 사용자 경험 향상을 위해 여러 성능 개선을 시도하고 있다. 우리 팀은 현재 가지고 있는 기술을 통해 문제를 해결해보고, 불가능할 경우 새로운 기술 도입을 검토하는 것을 지향한다. 그 중 가장 문제가 될 수 있다고 판단한 부분이 SLOW QUERY이다. 결국 대량의 데이터가 쌓일 경우, 예기치 못한 문제가 충분히 발생할 수 밖에 없기 때문이다.이를 위해 100만 건의 더미 데이터를 삽입한 뒤 쿼리 속도를 측정한 결과, Long Query가 발생하는 것을 발견했다. 이 경우, 한 커넥션이 오랫동안 붙잡고 있어 전체적인 성능 저하 및 병목이 발생한다. 따라서, 인덱스를 생성하여 쿼리를 개선해보고자 한다.더미 데이터는 총 10가지 1차 카테고리, 5가지의 2차 카테고리가 랜덤..

  • format_list_bulleted DB
  • · 2025. 11. 30.

[Spring Boot] N+1 문제 해결 기술 비교 (FetchJoin, @EntityGraph, batch-size)

개요N+1 문제란 1개의 조회를 위해 N개의 추가적인 쿼리가 발생하는 문제를 말한다. JPA에서 조회 쿼리를 날릴 경우, 해당 엔티티와 연관된 모든 관계에 있는 내용도 받아오기 때문에 발생한다. 왜 N+1 문제가 실무에서 위험한가?실무에서 N+1 문제는 데이터 로딩 시 의도치 않은 다량의 쿼리가 발생해 서버와 DB를 동시에 압박한다. 목록 1건마다 추가 연관 데이터를 별도 쿼리로 가져오면, N개의 엔티티에 대해 1+N번의 쿼리가 나가며 트래픽이 늘어날수록 지수적으로 지연이 커진다. 이는 TPS 하락, 타임아웃, 커넥션 풀 고갈, 캐시 무력화 같은 장애로 직결된다.특히 ORM에서 지연 로딩이 컬렉션/연관 엔티티 접근 시마다 쿼리를 발생시킨다. 페이지네이션 환경에서 더 치명적인데, 페이지당 20건이라도 각 ..

  • format_list_bulleted Spring
  • · 2025. 11. 30.

[Spring Boot] Soft Delete로 개인정보 보호하기

논리적 삭제를 통해 얻게되는 장단점을 먼저 정리해보자.🔎 Soft Delete 개요Soft Delete 장점정보 보존에 따른 복구 가능DELETE 보다 빠른 속도의 UPDATE데이터를 활용한 추후 서비스 및 활용이 가능Soft Delete 단점데이터베이스 용량 증가모든 쿼리에서 Soft Delete된 데이터를 직접 제외하도록 설정 🤔 도입해야 할까?우리 서비스에 필요한가?현재 서비스에서 제공되는 기능 중 주요한 데이터라고 생각되는 것은 도면과 결제, 주문, 회원이라고 생각된다.도면의 경우, 추후 도입될 업로드 기능이 생길 경우 복구가 불가피할 것으로 보인다. 또한 삭제한 데이터도 가지고 있어 도면에 대한 데이터를 축적할 수 있다는 장점을 가진다.회원의 경우도 회원가입 시 선택되는 직업, 나이에 대한 ..

  • format_list_bulleted Spring
  • · 2025. 11. 30.
[Spring Boot] 공개 채팅 구축 및 동시성 문제 해결

[Spring Boot] 공개 채팅 구축 및 동시성 문제 해결

원툴의 채팅을 도입하여 도면에 대한 이야기를 하거나 정보를 공유할 수 있는 커뮤니케이션 도구를 개발하려고 한다. 사용성 측면에서 보다 구현이 용이한 공개채팅으로 구현하고자 한다. 본 구현은 페어 프로그래밍을 통해 2시간씩 총 6회차 진행했습니다.https://github.com/likelion-onetool/backend/issues/230 📚 기술 선택모놀리식 아키텍처를 통해 서버 비용을 절감하기 위해 별도의 프레임워크가 아닌 기존에 사용중인 Java와 Spring Boot를 사용하기로 결정했다. 메시지 처리 방식1:1이 아닌 다수의 사용자가 동시에 진행할 수 있는 채팅을 구현하기 위해 어떤 메시지 전송 방식이 접합할지 장단점을 구분했다.방식장점단점Polling서비스 구현이 간편- Polling 주기..

  • format_list_bulleted Spring
  • · 2025. 11. 27.

[DB] MySQL과 pgSQL의 트랜잭션 격리 수준과 이상 현상

이상 현상이름설명Dirty Read다른 트랜잭션에서 Flush되지 않은 변경사항이 반영되는 현상Non-Repeatable Read같은 조회 쿼리 사이에 다른 트랜잭션의 커밋된 내용이 반영되어 조회 결과가 달라지는 현상Phantom Reads다른 트랜잭션에서 추가된 행이 반영되는 현상Lost Update현재 트랜잭션에 의해 다른 트랜잭션의 커밋된 변경사항이 사라지는 현상Dirty ReadsequenceDiagram participant T1 participant T2 T1->>DB: UPDATE value=100 (커밋 안 함) T2->>DB: SELECT value (100 읽음, 실제 커밋 전 데이터) T1->>DB: ROLLBACKT1에 의해 value가 100으로 변경되었..

  • format_list_bulleted DB
  • · 2025. 11. 27.

[Test] 이럴 거면 테스트 코드를 왜 작성하는 거야?

🤔 테스트 코드를 왜 작성하는가?나는 크게 3가지의 이유로 테스트 코드를 작성한다고 생각한다.예외 처리를 위해프로덕션 코드 변경에 따른 영향을 쉽게 파악하기 위해코드 작성의 의도를 문서화이 중 나는 1번과 3번의 의미가 테스트 코드에서 크다고 생각한다.>에서도 3번에 대한 내용을 강조하고 있다. 해당 책에선 대부분의 테스트 코드(80%가량)가 단위 테스트로 이루어져야 한다고 말한다. 그래서 나도 이번 프로젝트에서 각 레이어의 메서드별 테스트 코드를 작성하였다. 그 결과 코드 커버리지는 높일 수 있었지만 테스트 코드 작성의 필요성에 대한 궁금증이 더 커졌다.🤯 작성할수록 모르겠는 테스트 코드의 의미현재 자바 진영에서 주로 Mockito 라이브러리를 통해 테스트 코드를 작성한다. 나 또한 Mockito를..

  • format_list_bulleted Spring
  • · 2025. 11. 27.
  • navigate_before
  • 1
  • 2
  • navigate_next

Github Profile


Today I Learned

공지사항
  • 블로그 목표
전체 카테고리
  • 분류 전체보기 (12)
    • Java & Kotlin (2)
    • Spring (7)
    • Server (1)
    • DB (2)
    • Reflection (0)
인기 글
전체 방문자
오늘
어제
Copyright © 개발자 성원 모든 권리 보유.
SKIN: Copyright © 쭈미로운 생활 All rights reserved. Designed by JJuum.
and Current skin "dev-roo" is modified by Jin.

티스토리툴바