전체 글 17

[MySQL] 검색 쿼리 개선하기(innodb 버퍼풀 cache hit rate 늘리기)

현재 진행하는 프로젝트에서 검색 기능을 지원하기 위해 fulltext index를 사용중이다. 세 개의 컬럼에 fulltext index를 걸어주고 있고, n-gram size도 1로 설정했기 때문에, 인덱스 용량을 고려해보면 좋겠다고 생각했다. 인덱스 크기를 고려해야 하는 이유 중 하나가 버퍼풀 cache miss로 인한 disk i/o 과다 발생이라는 것을 알게 됐고, 해당 내용을 중심으로 검색 기능을 개선한 과정을 정리해봤다. 이 글의 모든 내용은 MySQL innodb 엔진 기준으로 설명할 것이다. 📍 디스크 I/O 데이터베이스의 데이터들은 디스크에 영속화된다. 그런데 디스크에 존재하는 데이터에 접근하는 시간은 메모리에 접근하는 시간에 비해 매우 느리다. 만약 HDD에 접근한다 하면 ..

DB/MySQL 2025.11.30

[Java] JVM, GC

부하테스트를 하다 보니 java의 메모리 구조, GC 등 학습의 필요성을 느꼈다. 프로메테우스에서 jvm에 대한 여러 메트릭을 수집해주는데, 이를 기반으로 해석 혹은 튜닝을 하기에 근거가 부족하다는 생각이 들었다. 적어도 대시보드를 이해할 수 있을 정도로 공부를 해야할 것 같아서, 이 참에 한 번 정리해보려 한다.📍 JVMJVM(Java Virtual Machine)은 자바 바이트코드를 실행하기 위한 가상 머신이다. 💡 왜 필요할까? 세상에는 다양한 하드웨어/OS가 존재하는데, C/C++ 프로그램은 플랫폼마다 다시 컴파일해야 했다. (C/C++ 프로그램은 컴파일하면 기계어가 생성된다.) 따라서 운영체제, CPU 아키텍처 바뀌면 다시 컴파일해야 한다는 번거로움이 있다. 그런데 자바 코드는 한 번 작성하..

자바 2025.11.17

k6 부하테스트, 튜닝, 시행착오

6차 데모데이 백엔드 요구사항에 "목표 TPS 설정 및 서버 설정 최적화"라는 내용이 있었다. 우리 서버가 현재 얼만큼의 부하를 감당할 수 있는지, 목표 TPS를 처리할 수 있는지 확인하기 위해 부하테스트르 진행했다. 그리고 그 과정이 매우 길고도 험난했기에 글로 남기려 한다. 성능테스트를 처음 접하는 사람들이 이 글을 통해 조금이나마 도움을 받으면 좋을 것 같다. ✔️ 부하테스트 목적지금 당장은 실사용자가 없기 때문에, 사용자가 존재하는 미래를 가정해 부하테스트를 진행하려 했다. 따라서 프리코스 디스코드 혹은 인스타그램을 통해 서비스를 열심히 홍보하고, 이벤트를 개최하는 상황에 운영 서버가 부하를 얼마나 버틸 수 있는지 확인하는 것을 목적으로 삼았다.✔️ 튜닝 대상 핵심 기능튜립은 유튜버들의 여행 브이..

[MySQL, SpringBoot] 검색 기능 개선하기(fulltext index, 전문 검색 쿼리, UNION, TestContainers)

현재 개발하고 있는 서비스에는 검색 기능이 존재한다. 콘텐츠 제목, 크리에이터의 이름, 콘텐츠에 나오는 장소들의 이름 중 하나에 걸리면 검색 결과로 나오는 구조이다. 현재는 데이터가 별로 없어서 검색이 느리다고 체감한 적이 없었다. 그런데 만약 많은 데이터가 쌓이면 검색 속도가 얼마나 느려질까? 많이 느리다면 속도를 어떻게 개선할 수 있을까? 이 글을 읽으면 좋은 대상은 아래와 같다.검색 기능을 구현하려는 사람, MySQL의 fulltext index과 전문 검색 기능을 도입하려는 사람LIKE 쿼리를 통해 검색 기능을 구현한 사람📍 쿼리 속도 테스트 환경 검색에 활용되는 테이블은 content, creator, place이고, 연관관계를 생각했을 때 총 4개의 테이블을 이용한다. t4g.small 볼륨..

DB 2025.09.28

[MySQL] 인덱스

나는 DB와 MySQL에 대해 한 번이라도 깊게 공부하지 않았고, 인덱스가 조회 성능을 향상시킨다는 정도로만 알고 있었다. 이번에 프로젝트에 검색 기능을 도입했는데, 아직은 느리다는 체감을 하지는 못했으나, 데이터가 쌓일수록 느려질 수 있겠다는 생각이 들어 인덱스를 찍먹해봤고, 그 내용을 공유하고자 한다. 이 글을 읽으면 좋은 대상은 다음과 같다.인덱스가 무엇인지 궁금하지만, 이름만 들어봤지 개념이나 사용법은 잘 모르는 사람MySQL에서 인덱스가 어떻게 저장되고, 그 구조가 탐색 속도를 어떻게 높여주는지 알고 싶은 사람, MySQL의 인덱스 종류가 궁금한 사람✏️ 인덱스인덱스는 데이터를 빠르게 찾기 위한 도구이다. 어떤 데이터를 찾기 위해 테이블 전체를 뒤지지 않아도 되게끔, 목차를 제공하는 것이다. 예..

DB/MySQL 2025.09.15

[Spring] 트랜잭션, @Transactional

영속성 컨텍스트를 공부하는 과정에서 트랜잭션을 정리할 필요성을 느꼈고, 겸사겸사 락도 공부하면 좋을 것 같았다. 그런데 트랜잭션 내용만으로 이미 너무 방대해서, 내가 스프링을 사용하면서 많이 사용했던 @Transactional 애노테이션에 대해 정리하려 한다.💉 트랜잭션이 뭐야?트랜잭션은 “db의 상태를 변경시키는 작업의 단위” 이다. 내가 가장 와닿았던 설명은 "트랜잭션 작업 단위는 모두 성공하거나 모두 실패해야 한다"는 것이었다. 가장 흔하게 사용되는 비유는 송금 기능이다. A 통장에서 B 통장으로 송금하는 과정은 A 통장에서 출금, B 통장에 입금이라는 두 단계로 이루어진다. 그런데 만약 A 통장에서 출금만 성공하고 B 통장에 입금에 실패한다면 명백한 오류 상황이다. 출금, 입금은 모두 실패하거나..

스프링 2025.07.06

[JPA] 영속성 컨텍스트

JPA를 공부하다보면 자연스럽게 영속성 컨텍스트를 접하게된다. 내용이 방대하니까 한 번 정리하면 좋을 것 같다. ☁️ ORM의 영속성 컨텍스트ORM은 객체지향과 관계형 DB 사이의 패러다임 불일치를 해소시키는 개념이다. 그리고 ORM은 객체의 영속성을 관리하기 위해 영속성 컨텍스트를 활용한다. (ORM을 자바에 맞는 형태로 명세한 것이 JPA이다. JPA는 Entity Manager에서 영속성 컨텍스트를 관리하도록 명세한다. JPA 구현체인 Hibernate는 Session의 형태로 영속성 컨텍스트를 관리한다.) ☁️ @PersistenceContextJPA를 이용할 때, @PersistentContext를 통해 현재 트랜잭션에서 사용중인 Entity Manager를 주입받을 수 있다.@Repositor..

스프링/JPA 2025.06.27

[Spring] 테스트코드를 어떻게 작성할 수 있을까? (계층 테스트, 통합 테스트)

스프링, JPA 등 외부 기술을 도입하면서, 다양한 테스트 방법들을 자연스럽게 접하게 됐다. 스프링 프레임워크에서 제공하는 테스트 환경, HTTP 요청을 보내고 결과를 검증하는 라이브러리 등 테스트에 사용한 도구들이 많았는데, 개념끼리 뒤섞여서 내가 혼동하고 있는 것이 많았다. 한 번 정리해두면 좋을 것 같아서 포스팅하려 한다.🍃 스프링 프레임워크가 제공하는 테스트용 애노테이션스프링 프레임워크에서 DI는 컨테이너에 등록된 빈을 기반으로 동작한다. 따라서 스프링 애플리케이션을 실행하면 컴포넌트 스캔, 환경 설정을 통해 Bean Definition을 등록하는 과정이 필요하고, 우리는 필요한 컴포넌트를 직접 new로 생성하지 않고 @Autowired를 통해 주입받을 수 있다. 테스트 역시 필요한 빈들을 컨테..

스프링 2025.06.22

[우아한테크코스 7기] 레벨2 회고

우테코 레벨 2가 끝난 지 일주일이 넘었다! 매번 시간에 쫓겨 대충 작성하긴 했지만, 각 미션별로 회고를 작성했었기 때문에 Spring, 웹 지식 등 기술적인 내용은 적지 않을 것이다. 대신 소프트스킬과 내가 느꼈던 감정, 들었던 생각에 대해 정리해보려 한다.🏃🏿‍♀️ 레벨2 동안의 변화레벨2 기간동안 나의 변화를 정리해봤다. 나는 평소에 정말 아-무런 생각을 하지 않았고, 고민도 크게 없었다. 특히 나 자신을 되돌아보는 시간을 크게 갖지 않았다. 우테코에 들어오고 가장 크게 변한 것은, 메타인지를 시작했다는 것이다. 여기서 내가 말하는 메타인지는 스스로 부족한 점을 인지하는 것이다. 실제로 실천해서 성장하는 단계까지는 가지 못했다. 레벨2에서 내가 뼈저리게 느낀 나의 약점을 적어보면 아래와 같다...

[우아한테크코스 7기] 레벨2 미션4(방탈출 결제 / 배포) 회고

아주 혼란스러웠고 불안했던 레벨2의 마지막 회고글이다. 노랑이 주최한 블로그 포스팅 스터디에 참여하지 않았다면, 레벨2동안 단 한 개의 포스팅도 하지 못했을 것이라 확신한다... (고마워 노랑🐣) 레벨2 전체 회고는 별도 포스팅으로 작성할 예정이다 💪👥 페어 프로그래밍우테코에서의 마지막 페어는 서프였다. 서프는 똑똑하고, 두뇌 회전 속도가 빠르고, 설명도 잘하고, 착한 페어였다. 누구나 함께 일하고 싶은 개발자라고 생각할 것 같고, 닮고 싶은 부분이 정말 많았다. 서프와 함께 공부하는 과정에서, 핵심을 빠르게 찾고 모르는 부분을 파악해서 파고드는 능력을 키우고 싶다고 느꼈다. 그리고 나는 그냥 받아들이고 넘어갔던 부분도 서프는 궁금증을 갖고 여러 사람에게 의견을 물어보곤 했다. 의식적으로 "왜?"라..