안녕하세요. 인덱스를 활용한 조회 성능 개선을 공부하던 중 궁금한 점이 생겨 질문드립니다. 현재 저는 OFFSET 기반 pagination을 사용하는 서비스 를 개발하고 있으며, 다음과 같은 환경에서 성능 테스트를 진행했습니다. 데이터: 약 1,000만 건 서버: EC2 t3.small DB: RDS t4g.micro k6 vus100 1. 문제 상황 초기에는 OFFSET 제한 없이 마지막 페이지까지 이동 가능하도록 구현했습니다. 하지만 데이터가 1,000만 건 수준으로 증가하자, 깊은 페이지로 갈수록 조회 속도가 급격히 느려지는 문제 를 확인했습니다. 2. 고민 및 제약 일반적으로 이 문제는 Keyset Pagination(커서 기반) 으로 해결하라고 많이 알려져 있습니다. 하지만 제 서비스는 👉 네비게이션 바를 통한 페이지 직접 이동 (ex. 1, 10, 100 페이지 클릭) 이 필요하기 때문에 Keyset 방식만으로는 요구사항을 만족시키기 어렵다고 판단했습니다. 3. 적용한 개선 방법 다음과 같은 방식으로 성능 개선을 진행했습니다. OFFSET 최대 범위를 제한 (최대 10,000 페이지 / OFFSET 100,000) 커버링 인덱스 적용 조회 방식 개선 먼저 ID만 조회 → 이후 필요한 10건만 상세 조회 전체 게시글 수(count)는 캐싱 처리 4. 성능 개선 결과 [Page 10] avg: 1.4s → 700ms p95: 4.5s → 1.8s [Page 100] avg: 17s → 1.18s p95: 24s → 3.3s [Page 1000] avg: 32.1s → 1.7s p95: 59s → 4.27s 5. 추가 제약사항 로그인 사용자와 비로그인 사용자의 조회 결과가 다름 (사용자별 구독 게시글이 포함됨) 따라서 캐시는 비로그인 사용자에만 적용 위 성능 수치는 로그인 사용자 기준 6. 현재 고민 위와 같이 개선했지만, 👉 여전히 성능이 충분하지 않다고 느끼고 있습니다. 특히 궁금한 점은 다음과 같습니다. 7. 질문 OFFSET 기반 pagination을 유지하면서 👉 추가로 성능을 개선할 수 있는 방법이 있을까요? 다음과 같은 방법들을 고려했는데, 방향성이 맞는지 궁금합니다. RDS를 2개를 사용하여 조회 성능 데이터를 각각 2개의 db가 처리하도록 한다? Keyset + OFFSET 혼합 방식 ( 일반적인 페이지 이동은 Keyset Pagination을 사용하고, 사용자가 특정 페이지를 직접 입력하거나 점프하는 경우에만 제한적으로 OFFSET 기반 조회를 사용하는 혼합 방식) RDS 스펙 업그레이드 또한 에펨코리아( https://www.fmkorea.com/ )와 같은 대형 커뮤니티는 제가 원하는 페이지 네이션 방식을 사용하면서 깊은페이지(최대 1만)도 지원하고 동시접속자 수십만 페이지 수천~수만 대량 데이터 환경에서도 빠른 조회 성능을 유지하는데 👉 이러한 서비스들은 어떤 방식으로 pagination 및 조회 성능을 처리하는지 궁금합니다.
window운영체제에서, cursor 터미널 환경에서 claude 실행하여 작업 시 스크린샷 이미지 붙여넣기때 단축키 중 alt+v 만 적용됩니다. 다만 이 때, 화살표를 좌 우로 해줘야 글이 보이는데 이런 현상은 왜있는걸까요...? 추가로 Plan mode로 명령 시 보기가 3가지(수정 yes 관련 2가지 & 취소) 밖에 안나옵니다ㅠㅠ
안녕하세요 31. 히든클래스와 성능저하모드 강의를 듣고 질문남깁니다. 해당 강의를 react에 적용해보고 있습니다. 기존에는 useState를 사용해서 상태관리를할때 object와 Map은 수정 삭제시 대부분의 경우 불변성을 지키며 setState를 하고 있었습니다. 매번 Map과 object를 재생성할때 Map이 좀더 메모리를 많이 차지한다고 들어서 비번한 수정/삭제가 일어날때는 Map대신 object를 사용해서 상태관리를 하고 있었는데 Map 강의듣고나니 일반적인 수정삭제일때는 Map이 좋은걸로 이해했는데 불변성을 지켜야할 때는 기존에 제가 가지고 있던 생각이 맞는지 의문이 생겼습니다. 불변성을 반드시 지켜야하는건 아니지만 그래도 지켜야 하다 가정하고 수정삭제가 1초에 1번정도 난다고 해도 Map이 유리한가요?
교안에 써주신 대로, 쉬프트+엔터 / 옵션+엔터 둘다 해봤는데 위 처럼 나오네요. 지피티에게 물어보니 저건 줄바꿈이 된게 아니라, 프롬프트가 실행된거라고 하네요. 혹시 줄바꿈이 안되는 이유를 알수 있을까요? (개발, 코딩, 터미널 모르는 입장에서 강의 내용 정말 어렵네요 ㅠㅠ)
교안에 써주신 대로, 쉬프트+엔터 / 옵션+엔터 둘다 해봤는데 위 처럼 나오네요. 지피티에게 물어보니 저건 줄바꿈이 된게 아니라, 프롬프트가 실행된거라고 하네요. 혹시 줄바꿈이 안되는 이유를 알수 있을까요? (개발, 코딩, 터미널 모르는 입장에서 강의 내용 정말 어렵네요 ㅠㅠ)
안녕하세요, Sonnet 을 주 모델로 활용하고 Opus도 사고 토큰을 조정하기 위해 선생님이 작성하신대로 MAX_THINKING_TOKENS를 8000으로 설정하였는데요, 생각처럼 동작하지 않는것같아 문의드립니다. 참고한 문서: https://code.claude.com/docs/en/env-vars 현재 Global settings (.claude)에 적용한 내용 { "env": { "ENABLE_TOOL_SEARCH": "true", "CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING": "1", "MAX_THINKING_TOKENS": "8000" }, "alwaysThinkingEnabled": false, "model": "Sonnet" } MAX_THINKING_TOKENS 만 적용했을때 /config 의 Thinking mode 의 설정이 여전히 true이길래, 공식문서 여기저기 뒤져서 아래 옵션을 추가하였습니다. alwaysThinkingEnabled: false CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING: 1 근데.. 위처럼 설정해도 계속 /config 로 확인한 Thinking mode는 'true'로 남아있습니다 ㅠㅠ 제대로 설정이 된걸까요..? 아니면 제가 과도하게 설정한건지 문의드리고 싶어요
select o from Order o where o.orderAmount > ALL(select p.stockAmount from Product p) ALL 예제가 강의록에 위와같이 되어있던데요. 이게 아래 sql 문처럼 서브쿼리에 MAX 적용한 거랑 동일한 결과를 내는 걸까요?? select o from Order o where o.orderAmount > (select MAX(p.stockAmount) from Product p)
.claude/plans 파일이 users/사용자 이름/.claude/plans에 생성되어 있던데 선생님 강의에서는 CLAUDE-CODE-MASTERY 폴더 안에 .claude/plans가 있더군요 따로 각각 폴더(프로젝트)마다 생성 할 수 있는건가요? 할 수 있다면 어떻게 해야하나요?