전체 글190 조회 성능 향상시키기(2) 커버링 인덱스 with Querydsl 커버링 인덱스란?커버링 인덱스는 쿼리에서 필요로 하는 모든 컬럼을 포함하는 인덱스다.쿼리가 요청하는 모든 데이터가 인덱스 자체에 이미 포함되어 있어, 데이터베이스가 원본 테이블에 접근할 필요 없이 인덱스만으로 쿼리를 처리할 수 있다.MySQL에서 커버링 인덱스는 select절에 있는 모든 컬럼과 where, order by, group by절에서 사용되는 모든 컬럼이 인덱스에 포함되어야 한다.이 때문에 쓰기 작업에서 트레이드오프가 존재하지만, 일반적인 웹 서버에서 읽기:쓰기 비율이 9:1정도인 것을 감안하면 오프셋 기반 페이지네이션에서는 커버링 인덱스를 적극적으로 활용하는 편이 좋다고 생각한다. 또한 유지 보수도 조금 까다로운 편이다. select절이 바뀌면 인덱스를 재설정해주어야 한다.커버링 인덱스는 .. 2025. 3. 22. 조회 성능 향상시키기(1) PageableExecutionUtils? 2025.02.06 - [팀 프로젝트/플러스 프로젝트] - 조회 성능 개선 작업 정리본최종 플젝 때 건 아니지만.. 예전에 완전한 조회속도 개선에 실패하고 후일을 도모했던 쿼리를 이제 진짜로 향상시켜보자우선 커서기반은 제쳐두고, 오프셋 기반 페이지네이션으로 튜닝에 도전해보자 PageableExecutionUtils - fetchCount과거의 내가 써놓은 코드를 보는데pageable을 이런식으로 리턴했다. 이당시엔 fetch로 불러오니 당연히 빠르겠지! 하고 사용한 것 같은데.. 해당 방식 대로 하니 8.51초가 나왔고,Fetchable#fetchCount() was computed in memory! See the Javadoc for AbstractJPAQuery#fetchCount for more.. 2025. 3. 21. 5. Real MySQL 8장 인덱스를 잘 걸자 디스크 I/O와 인덱스DB성능 튜닝에서 가장 신경써야 할 병목 중 하나는 디스크 I/O 이다. SSD가 HDD보다 수 배 이상 빠른 처리량을 보여주기 때문에, DB서버에는 주로 SSD를 사용한다.디스크 I/O는 다시 랜덤 I/O와 순차 I/O로 나뉘는데,순차 I/O:디스크에서 연속된 위치를 읽는 경우, 한 번 헤더가 움직여서 쭉 읽으면 되니까 비교적 빠르다.랜덤 I/O:디스크 여러 곳을 이리저리 읽어야 해서, 매번 헤더를 옮겨야 하므로 비교적 느리다. DB쿼리가 랜덤 I/O를 많이 일으키면 속도가 크게 떨어진다.(HDD에서는 둘의 차이가 크지만, SSD에서는 크지 않다.) 따라서 순차 I/O와 랜덤 I/O는 또 쿼리 튜닝의 포인트가 된다. 그런데 쿼리 튜닝으로 랜덤 I/O를 단순히 순차 I/O로 변경할 .. 2025. 3. 20. 트러블슈팅: 인증과 인가 개요현재 SecurityFilterChain이다. whiteList는 모든 요청을 허용하고, adminList는 ADMIN권한을 가진 사람에게만 허용하고,그 외의 요청은 모두 USER권한이 필요하도록 설정해놓았다. 이러한 권한 검증을 마친 후 filter가 작동되게끔 설계했는데,taskhandler에서 자동으로 작동하는 헬스체크가 실패하고있다. filterChain에서 권한 처리를 다 했는데, 왜 이런 현상이 발생할까? 원인이 문제를 해결하려면 인증과 인가의 차이를 이해해야 한다.인증(Authentication): 사용자의 신원을 검증하는 과정, jwtFilter에서 토큰을 검증하여 사용자를 인증하는 역할 수행인가(Authorization): 인증된 사용자의 권한을 확인하여 리소스 접근을 허용/거부함,.. 2025. 3. 19. Spring Security와 JWT Spring Security를 프로젝트에 적용해보자. 최대한 JWT의 장점을 잘 살릴 수 있는 방법은 무엇일까? JWTJWT가 무엇이고, 어플리케이션이 어떤 구조를 띄고 있을 때 가장 효율적일까?JWT는 무상태 인증 방식으로, 토큰의 Payload에 사용자 정보를 담아 인증을 수행하는 방식이다.클라이언트가 JWT를 요청 헤더 또는 쿠키에 포함하여 서버에 전달하고, 서버는 이를 검증하여 사용자를 인증한다. JWT에는 사용자 정보가 포함되어 있기 때문에, 컨트롤러에서 ArgumentResolver등을 활용하여 DB와 추가적인 통신 없이 사용자 객체를 추출할 수 있다. 이러한 특성 덕분에 JWT는 MSA구조에서 유리하다.각 서비스가 독립적으로 동작하며 인증 상태를 공유할 필요가 없는 구조에서는, 중앙 인증 .. 2025. 3. 18. 최종 프로젝트 KPT 회고 KEEP🥇 기록프로젝트 내내 팀원 모두가 5분 기록 보드, 트러블슈팅/기능구현 문서화를 꼼꼼히 해줘서 마무리가 편했다.팀장으로서 기록하는 분위기를 초반부터 잘 형성했다. 🥈 협업협업이 정말 힘들었지만, 그만큼 보람찼다. 의견 마찰이 있을 땐 최대한 남의 말을 수용하며 내 의견도 피력하려 노력했다.모든 PR에 리뷰어로 참석하여 이해도를 높였고 덕분에 프로젝트 전반을 잘 이끌어 갈 수 있었다.Jira를 이용하여 팀 전체의 일정을 관리하며 성공적으로 프로젝트를 끝마쳤다. 🥉 완성도기술적인 도전을 많이 할 수 있었다. 단순히 도전보단 해당 기술을 사용했을 때 어떻게 고도화, 안정화시킬까를 고민을 많이 했다.팀원들에게는 기능 구현을 맡기고, 팀원들의 구현 로직을 파악하며 어플리케이션의 전반적인 완성도를 높일.. 2025. 3. 17. 사용자가 엔드포인트를 잘못 입력했을 때, 404를 반환시키자! 사용자가 엔드포인트를 잘못 입력했을 경우 500에러를 출력하는 오류가 있다.보통 다른 웹 사이트들은 404 not found를 출력하기도 하고,500에러가 발생한 경우 grafana에서 slack알림을 보내도록 해놨는데이 오류는 서버에 영향을 주는 오류가 아니라서, 이대로 뒀다간 양치기소년이 될것만같았다GlobalExceptionHandler를 통해 엔드포인트를 잘못 입력했을 경우 500에러를 404로 처리해보자. application.yml 수정보통 잘못된 엔드포인트 입력으로 예외가 발생하면, No static resource.. 에러로 처리된다. spring boot는 기본적으로 정적 자원(html, css, js, image)을 제공하기 위해 spring-webmvc모듈로 정적 리소스 매핑을 설정.. 2025. 3. 15. RedisTemplate과의 결합도를 낮춰봅시다 (DIP) DIP란?DIP는 SOLID원칙 중 하나로, 고수준 모듈이 저수준 모듈에 의존하는 것이 아니라 "추상화"된 클래스를 의존하도록 만드는 원칙입니다.스프링에서는 IoC와 DI로 이를 구현할 수 있습니다.DIP를 적용하게 되면, 일반적인 어플리케이션 아키텍처에서 정의하고 있는 패키지 의존성 흐름대로 바꿀 수 있습니다. 예를 들어,현재 우리 서비스의 문제점입니다. Redis를 사용하는 수많은 Application계층의 서비스들이 모두 Infrastructure계층을 바라보며, RedisTemplate에 의존하고 있습니다. 이는 고수준 모듈이 저수준 모듈에 의존하게 되는 것이며 DIP를 위반합니다.이는 유연성을 감소시키고, 테스트를 불편하게 만들며, 모듈 간 결합도가 증가하는 원인이고, 확장성도 떨어지는 설계입니.. 2025. 3. 14. ALB에 Web Application Firewall 적용하기 개요예전에 서버를 열고 얼마 지나지 않은 시점에(한 한 시간 지났었나?) 해커의 공격을 받은 적이 있었다.누군가가 내 사이트로 php기반 공격을 하려했고.. 심지어 맨 뒤에 Hello라고 했다....그때부터 불안에 떨면서 ALB보안그룹에 우리 팀원들 IP만 열어뒀었는데, 늘 이렇게 숨어 살 순(?) 없었다.web application firewall을 적용해서, 어플리케이션을 안전하게 보호해보자! AWS WAF 란?Web Application Firewall은 웹 어플리케이션을 보호하기 위해 HTTP/HTTPS 트래픽을 감시하고, 필터링하는 보안 솔루션이다.네트워크 방화벽과는 달리 어플리케이션 계층(7계층)에서 동작하며, 웹 어플리케이션에 대한 공격을 탐지하고 차단해준다.이를 AWS에서 클라우드 기반으.. 2025. 3. 13. Grafana Alert Rule 설정하기 with Slack 개요현재 어플리케이션의 모니터링-로깅 아키텍처다.모니터링: 프로메테우스로 시계열 데이터를 수집하고, 그라파나로 시각화한다.로깅: fluentd로 logback을 수집하고, elasticsearch로 저장하며, kibana로 시각화한다. 개발자가 하루종일 시각화된 대시보드를 쳐다보고 있을 수는 없다. 자동화된 알림 정책이 필요했고, 우리 팀 슬랙과 연동하게 되었다. New alert rule(슬랙 연동과정은 생략)처음 보게되는 화면인데 굉장히 난해하다. 하지만 promQL을 몰라도 쉽게 적용할 수 있게 제공되어있다.대시보드로 들어가서 내가 확인하고자 하는 값이 어떤 metric인지 확인하자.난 jvm/500에러로 정했다. edit누르면 메트릭 정보를 볼 수 있다http_server_requests_sec.. 2025. 3. 12. 이전 1 2 3 4 5 6 ··· 19 다음