개발 공부/Spring 48

외주 가구업체 리뉴얼 하기 성능 -> 직접 쿼리 사용으로 성능 3.09배 개선

안녕하세요! 이번 글에서는 JPA를 사용하다가 직접 쿼리를 작성해 성능을 개선한 경험을 공유하려 합니다.보통 JPA는 객체 지향적으로 DB를 다루기에 개발 편의성과 유지보수 측면에서 뛰어나지만, 때로는 성능 최적화가 필요한 상황에서 직접 쿼리를 작성하는 것이 더 유리할 수 있습니다. 1. 문제 상황: JPA 성능 이슈프로젝트에서 장바구니 기능을 구현하며 JPA의 기본 메서드를 통해 데이터를 조회하고 수정했습니다.하지만 대량의 데이터를 처리하거나 복잡한 조건을 다룰 때 다음과 같은 문제가 발생했습니다.N+1 문제로 인한 쿼리 과다 발생데이터 수정 시 여러 번 DB를 호출하여 응답 지연복잡한 조건 조회 시 쿼리가 비효율적장바구니 기능을 개발하면서 API 응답 속도를 측정해보니, TTFB(Time To Fir..

적절한 Redis 사용 ?

Redis는 그 자체로 매우 빠르고 효율적인 데이터베이스이기 때문에, 특히 성능이 중요한 분야에서 유용하게 활용할 수 있습니다. 아래는 Redis가 적합한 주요 도메인들1. 실시간 데이터 처리 시스템Redis는 실시간 데이터를 처리하는 데 매우 적합합니다. 빠른 읽기와 쓰기 성능 덕분에 실시간으로 업데이트되는 데이터를 저장하고 처리하는 데 유용하죠.적용 사례:실시간 주식 가격 추적: 주식 시장의 데이터를 실시간으로 모니터링하고, 특정 주식 가격이 변할 때마다 실시간으로 데이터를 업데이트하고 사용자에게 빠르게 전달하는 시스템.실시간 스포츠 경기 결과: 스포츠 경기의 실시간 점수나 경과 시간을 추적하고, 이를 실시간으로 사용자에게 제공하는 시스템.2. 세션 관리 및 사용자 인증Redis는 세션 저장소로 많이..

Dirty Checking

JPA를 사용하면 엔티티 변경 감지로 자동 업데이트 됨 하지만 여기서 성능 최적화 및 동시성 관리가 필요하다면?  - > 쿼리 메서드를 추가해야함 💡 Dirty Checking을 사용하면, 서비스에서 rental.increaseLike() 호출 후 repository.save()만 해주면 된다.  Dirty Checking란?DB에 반영되는 기능 JPA가 제공하는 자동 변경 감지 기능엔티티의 상태가 변경되었는지 자동으로 감지해서, 트랜잭션이 끝날 때 DB에 반영해주는 기능입니다.  📌 어떻게 작동할까?   JPA로 DB에서 엔티티를 가져오면, JPA는 영속성 컨텍스트라는 곳에 엔티티의 초기 상태를 저장해 둡니다.엔티티의 값을 변경해도, 반영되기 전이다. 트랜잭션 종료 시점에 감지 만약 값이 변경됐다면..

15만건 데이터 개선해보기

현재 15만건의 데이터를 불러오는데 -> 2.43초가 걸림 Workbench에서 EXPLAIN SELECT * FROM chat_message WHERE room_id = 124;  실행 type = ref로 떠있음  rows = 78781로 쿼리를 실행할 때 약 78,781개의 행을 읽어야 한다는 의미야.→ 너무 많다! 이것을 최적화를 진행해야합니다.   key_len =9  - >.인덱스의 바이트 크기가 9라는 소리.   # Redis - 데이터 보관 : 메시지 휘발성, 지속 저장 가능 -> 구독하지 않은 순간 놓친 메시지를 다시 받을 수 가없다. 메시지 큐 기능이 없음 - 처리 방식 : 단순 Pub/Sub -> 실시간 데이터 전달- 성능 : RAM 기반으로 빠른 속도를 자랑 한다. - 확장성 : 수..

AI와 협업을 위한 CI/CD 깃허브 액션

# CI/CD- CI (Continuous Integration), CD(Continuous Deployment) - CI 지속적인 통합 : - 개발 팀이 코드를 지속적으로 통합 -> 이를 자동으로 테스트 -> 통합 버그 최소화 - 코드 변경 push 할때마다 자동으로 빌드 및 테스트 실행 - 코드 충돌 현상 미리 발견 가능 - 프로덕트 품질 관리 및 버그 발견 가능 - CD 지속적인 배포 : - 지속적으로 통합된 코드를 자동으로 프로덕션 환경에 배포하는 프로세스 - 테스트 및 승인을 거쳐 자동으로 프로덕션 환경에 배포 됨 - 새로운 기능과 버그 수정 사항이 실제 사용자에게 빠르게 제공됨 - 피드백을 수집하고 제품을 개선하는 속도를 향상 시킴 -  ..

채팅방 실시간 WebSocket 통신 구현 Study

# 웹소켓으로 채팅을 만들기 전 공부 - 외부 API를 통해 웹소켓으로 데이터를 전달하는 것은 비교적 간단하다.- 실제 채팅 시스템처럼 클라이언트 간 양방향 통신을 직접 설계하려면 고려해야할 복잡한 요소가 있다.- 특히 채팅은 상태 관리, 연결 유지, 동시성 처리 등 여러 측면에서 공부하기에 좋을 것 같다.# 채팅 시스템 구조 --------------1. WebSocket 서버 - 클라이언트 연결을 관리하고 메시지를 송수신한다. - 메시지를 받아서 해당 채팅방으로 브로드 캐스트 하거나 특정 사용자에게 전달하는 로직을 포함한다.2. 채팅방 Room 관리 - 여러 사용자가 서로 다른 방에서 채팅할 수 있도록 채팅방 개념을 도입 - 서버에서 채팅방 목록과 사용자 정보를 관리해야한다.3. 사용..

IPv4 VS IPv6

IPv4, IPv6IPv4IPv4는 32 비트 (약 43억개 주소를 가지고 있다.)주소형식: 192.168.1.1패킷 해더 크기 20바이트 라우팅 효율성 : 복잡하고, NAT(Network,Address Translation) 의존보안: IPsec 선택사항으로 사용 브로드캐스팅을 지원한다. #IPv6128비트 사용( 2^128개 주소, 즉 사실상 무한정으로 사용한다고 생각하면된다.)주소형식 : 2001:0db8:85a3:0000:0000:8a2e:0370:7334간소화된 라우팅 NAT가 불필요하다.IPsec 기본 내장이 되어있고, 브로드 캐스트가 없어 멀티캐스트 애니캐스트를 사용함 성능 비교IPv6는 패킷 헤더가 더 크지만, 고정된 크기로 설계 처리 효율성이 높음NAT를 사용하지 않기떄문에 테이블..

쿼리 튜닝 준비

1. 성능 최적화(1) 빠른 데이터 조회데이터베이스의 데이터 양이 증가함에 따라, 복잡한 쿼리 실행은 느려질 수 있습니다.튜닝을 통해 불필요한 테이블 스캔(Full Table Scan)이나 느린 조인 방식을 줄여 데이터 조회 속도를 높입니다.(2) 시스템 부하 감소비효율적인 쿼리는 CPU, 메모리, 디스크 I/O를 과도하게 사용하여 데이터베이스 서버의 자원을 소모합니다.효율적인 쿼리로 부하를 줄이면 서버의 자원을 절약하고 더 많은 동시 요청을 처리할 수 있습니다.2. 사용자 경험 향상웹 애플리케이션이나 API의 응답 시간이 길어지면 사용자 경험이 나빠지고, 이는 비즈니스 손실로 이어질 수 있습니다.튜닝된 쿼리는 요청 처리 시간을 줄여 사용자 만족도를 높입니다.3. 확장성 확보데이터베이스는 데이터가 증가할..