inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Hoàn thành trong 6 tuần! 4 chiến lược tạo sự khác biệt cho CV Backend - Cách để nổi bật giữa hàng loạt hồ sơ giống nhau

5-5. JPA và vấn đề N+1 - Sơ yếu lý lịch

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

Đã giải quyết

79

blackhole124

60 câu hỏi đã được viết

0

1. 현재 학습 진도

 

2. 어려움을 겪는 부분

 

3. 시도해보신 내용

 

 

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

 

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

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

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

 

질문1

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

 

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

 

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

 

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

 

질문2

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

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

 

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

 

질문3

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

 

감사합니다 !

 


 

 

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

java spring mysql redis 이력서 카카오공채-채용

Câu trả lời 2

0

dingcodingco

안녕하세요 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

communityai8509

안녕하세요, 인프런 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를 활용할 수 있으며, 이는 애플리케이션 코드와 독립적으로 데이터를 수집해줍니다. 또한, 데이터베이스드 대시보드 모니터링 도구나 클라우드 서비스의 모니터링 도구를 사용하여 쿼리 성능을 모니터링할 수 있습니다.

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

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

Build 관련 문제 (테스트 관련 문제)

0

30

1

인덱스 관련 질문 있습니다.

0

51

1

비관적 락 구현 방식 문의 건

0

61

2

외부 api 처리 방안에 대하여 궁금한 점이 있습니다.

0

87

2

네임드 락 사용 시 커넥션 풀을 분리하는 방법에 대한 질문

0

78

2

이벤트) 백엔드 기술면접 실전문제집

0

99

2

로컬에서 테스트 한 결과를 이력서에 써도 괜찮을까요?

0

127

2

데드락 발생 시, 외래 키를 제거하는 방법 관련 질문

0

82

2

Redis 캐싱을 도입하는데 db조회와 성능이 차이가 거의 없습니다.

0

107

2

k6 부하테스트 중인데 개선 전 성능이 너무 안나와서 고민

0

115

2

강의와 성능수치 비교

0

100

2

13강 강의 뒷부분의 과제 안내부분은 어디있나요?

0

49

2

이벤트 참가자 수 증가 후, save 메서드 호출 코드 질문

0

64

2

[수업 자료 질문] Cache Aside의 특징 문의

0

82

2

[수업자료 문의] RedisTemplate으로 SETNX 시 리턴값 문의

0

79

2

블로그에 학습 내용 정리 포스트를 올려도괜찮나요?

0

107

2

멀티스레드 상황인데 currentParticipants 가 AtomicInteger가 아닌 이유?

0

86

3

클라우드 환경 배포시 부하 테스트 방식에 대하여

0

133

2

k6 dashboad 안나오는 상

0

111

2

2-4 도커 빌드 에러가 계속 납니다.

0

295

2

AWS EC2에 도커 컨테이너가 동작하지 않을 때 확인 해야하는 것

0

112

2

성능 측정시

0

104

2

이력서 작성에 대한 질문

0

105

2

트랜잭션 격리성 설계도 어필포인트로 가져갈 수 있을까요?

1

63

2