강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

blackhole124님의 프로필 이미지
blackhole124

작성한 질문수

6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법

5-5. JPA 와 N+1 문제 - 이력서

API 별 실행 쿼리 모니터링 구현 질문 있습니다.

해결된 질문

작성

·

49

0

1. 현재 학습 진도

  • 몇 챕터/몇 강을 수강 중이신가요?

     

  • 여기까지 이해하신 내용은 무엇인가요?

 

2. 어려움을 겪는 부분

  • 어느 부분에서 막히셨나요?

  • 코드의 어떤 로직이 이해가 안 되시나요?

  • 어떤 개념이 헷갈리시나요?

 

3. 시도해보신 내용

  • 문제 해결을 위해 어떤 시도를 해보셨나요?

  • 에러가 발생했다면 어떤 에러인가요?

  • 현재 작성하신 코드를 공유해주세요

 

 

안녕하세요 강의 잘 보고 있습니다.

 

저는 강의를 보고 아래와 같이 이해를 했습니다.

1.API 별 실행 쿼리 모니터링 구현

2.그러면, 모든 api 엔드포인트에 대한 쿼리 min , max값을 알 수 있음.

 

질문1

근데, 그렇게 되면 실제로 서비스에 필요한 코드와 모니터링 코드가 불필요하게 섞이는 거 아닌가요?

 

왜냐하면, 실제 모니터링이라고 하면 서버를 유지보수할 때, 필요한 데이터를 실시간으로 받아와서 시각화한다는 것으로 이해를 했습니다.

 

그런데 "API 별 실행 쿼리 모니터링 구현"은 서버의 유지보수에 필요한 모니터링 기능이 아니라,

 

1번만 딱 실행되면 되는데 이 부분이 왜 모니터링 구현으로 분류가 되는지 잘 모르겠습니다!

 

질문2

API 별 실행 쿼리 모니터링 구현 부분에서,

실무에서도 "API 별 실행 쿼리 모니터링을 구현"해서 사용하는게 맞나요?

 

잘은 모르겠지만, 쿼리 분석이나 다른 방법이 있을 것 같은데 왜 이 부분이 서비스 코드 내에 포함을 시키면서까지 모니터링의 영역으로 분류가 되는지 잘 모르겠습니다 !

 

질문3

만약에 실무에서는 해당 방법을 잘 사용하지 않는다면 API 별 실행 쿼리 횟수를 보통 어떤 식으로 측정을 하는건가요???

 

감사합니다 !

 


 

 

이렇게 구체적으로 알려주시면, 더 정확하고 도움이 되는 답변을 드릴 수 있습니다!

답변 2

0

딩코딩코님의 프로필 이미지
딩코딩코
지식공유자

안녕하세요 blackhole 님!! 좋은 질문 해주셔서 감사합니다. 모니터링의 목적에 대해 정확하게 짚어주셨네요! 하나씩 명확하게 정리해드릴게요.

 

우선 가지고 계신 의문이 정확합니다!! 제가 작성한 코드는 개발/성능 분석 단계의 모니터링이라, 반드시 실제 코드에 존재할 필요가 없고, 존재하지 않는 것이 좋습니다.

개발/성능 분석 단계 모니터링: N+1 문제를 찾고, 각 API가 몇 개의 쿼리를 실행하는지 파악하는 용도입니다. 이건 문제를 발견하고 최적화하기 위한 도구죠. 한 번 측정해서 문제를 찾고, 개선하고, 다시 측정해서 효과를 확인하는 겁니다.

운영 단계 모니터링: Prometheus, Grafana, CloudWatch처럼 실제 서비스가 돌아갈 때 서버 상태, 응답 속도, 에러율 등을 실시간으로 추적하는 거죠. 이건 계속 켜져 있어야 합니다.

강의에서 다룬 건 전자입니다. 개발 중에 "이 API는 쿼리가 몇 개 나가지?"를 확인하는 거예요. 그래서 프로덕션 코드에 항상 포함될 필요는 없고, 개발/테스트 환경에서만 활성화하거나 필요할 때만 켜는 방식으로 쓰입니다.

 

실무에서는 이를 위해 여러 방법을 함께 사용합니다.

개발 단계에서 사용하는 방법들:

  • Hibernate Statistics 활용: 개발 환경에서 hibernate.generate_statistics=true 설정으로 JPA가 실행한 쿼리 통계를 확인합니다. 이 설정을 dev profile 혹은 local 에서만 활성화 시킵니다.

  • 쿼리 로깅 분석: show-sql 또는 P6Spy 같은 도구로 실제 실행된 SQL을 확인하고 개수를 셉니다.

  • 테스트 코드에 검증 추가: "이 API는 쿼리가 정확히 3개만 나가야 해"라고 테스트에 명시해서, 누군가 코드를 바꿔서 N+1이 생기면 테스트가 실패하게 만듭니다.

운영 단계에서 사용하는 방법들은 다음과 같습니다

  • APM 도구 (Application Performance Monitoring): DataDog, New Relic, Scouter 같은 도구들은 실제 서비스에서 각 API의 쿼리 실행 횟수, 응답 시간, DB 커넥션 사용량 등을 자동으로 수집합니다.

  • 데이터베이스 프로파일링: MySQL Slow Query Log, EXPLAIN ANALYZE, Performance Schema 등으로 DB 레벨에서 쿼리 실행 패턴을 분석합니다.

실무에서는 보통 "개발할 때는 Hibernate Statistics나 테스트 코드로 체크하고, 운영에서는 APM 도구로 모니터링"하는 방식을 많이 씁니다.

 

보통 이런 코드를 분리하기 위해 Spring Profile을 활용해서 @Profile("dev") 같은 설정으로 개발 환경에서만 쿼리 카운팅 인터셉터가 동작하게 만듭니다. 프로덕션에는 아예 안 붙는 거죠.

강의에서 보여드린 방식은 "이런 식으로 측정할 수 있다"는 교육 목적의 예시고, 실제 프로젝트에 적용할 때는 환경 설정이나 AOP로 깔끔하게 분리해서 쓰시면 좋을 것 같습니다!! 좋은 질문 감사합니다

좋은 주말 보내세요!!

0

안녕하세요, 인프런 AI 인턴입니다. blackhole124님.

API 실행 쿼리 모니터링에 대한 고민을 하고 계신 것 같습니다. 백엔드 성능 모니터링 및 쿼리 분석은 매우 중요한 주제이며, 다양한 방법으로 접근할 수 있습니다. 질문에 대한 답변을 드리겠습니다.

질문 1: 실제 서비스 코드와 모니터링 코드의 분리

API별 실행 쿼리를 모니터링하는 것은 성능 개선을 위한 중요한 작업입니다. 그러나 실제 서비스 코드에 모니터링 코드를 포함시키면 코드가 복잡해질 수 있는 우려가 있습니다. 그래서 대부분의 경우, 로깅 프레임워크나 APM(Application Performance Management) 도구를 사용하여 모니터링 기능을 통합합니다. 예를 들어, Spring Boot에서는 Actuator를 사용하여 다양한 모니터링 엔드포인트를 제공할 수 있습니다. 이 방식은 모니터링과 비즈니스 로직을 분리하여 코드의 가독성과 유지보수성을 높입니다.

질문 2: 실무에서의 API별 쿼리 모니터링 구현

실무에서 API별 쿼리 모니터링은 일반적으로 APM 도구나 데이터베이스 모니터링 도구를 통해 이루어집니다. 대표적인 APM 도구로는 New Relic, Datadog, AppDynamics 등이 있으며, 이러한 도구는 쿼리 성능 및 호출 횟수를 모니터링하고 성능 개선에 필요한 데이터를 제공합니다. 이러한 솔루션들은 코드 외부에서 동작하며, 개발자는 모니터링 설정만 해두면 되므로 코드의 복잡성을 늘리지 않고도 모니터링이 가능합니다.

질문 3: 실무에서의 쿼리 횟수 측정 방식

실무에서는 데이터베이스 측에서 제공하는 도구나 쿼리 로깅 기능을 활용하여 쿼리 횟수와 성능을 측정합니다. MySQL의 경우 EXPLAIN 명령어나 slow query log를 활용할 수 있으며, 이는 애플리케이션 코드와 독립적으로 데이터를 수집해줍니다. 또한, 데이터베이스드 대시보드 모니터링 도구나 클라우드 서비스의 모니터링 도구를 사용하여 쿼리 성능을 모니터링할 수 있습니다.

이런 방법론을 차용하면 모니터링 코드가 실제 비즈니스 코드와 분리되어 유지보수성을 높일 수 있습니다. 해당 주제에 대해 더 깊이 이해하시는데 도움이 될만한 자료는 다음 링크에서 찾으실 수 있습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해 드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

blackhole124님의 프로필 이미지
blackhole124

작성한 질문수

질문하기