코드 깃허브는 없을까요?
해결됨
Spring Boot, AWS로 백엔드 서비스 한 사이클 완성하기
코드들 매번 쓰기 힘들어서 혹시 github링크가 따로 있는 것일까요??
- aws
- mysql
- docker
- spring-boot
- jpa
174만명의 커뮤니티!! 함께 토론해봐요.
해결됨
Spring Boot, AWS로 백엔드 서비스 한 사이클 완성하기
코드들 매번 쓰기 힘들어서 혹시 github링크가 따로 있는 것일까요??
미해결
김영한의 실전 데이터베이스 - 성능 최적화, 실행 계획과 인덱스 완전 정복
SELECT m.member_id, m.member_name, m.grade, COUNT(o.order_id) AS order_count, SUM(o.total_price) AS total_spent FROM member m JOIN orders o ON m.member_id = o.member_id WHERE m.grade = 'VIP' GROUP BY m.member_id, m.member_name, m.grade ORDER BY total_spent DESC LIMIT 20; 안녕하세요! 해당 쿼리에서는 group by 순서가 member_id, member_name, grade 순으로 되어있습니다. 강의에서는 group by 는 그룹핑을 할때 (member_id, member_name, grade) 을 기준으로 그룹핑 하여 순서가 상관없지만 인덱스 순서를 GROUP BY 순서에 맞게 인덱스를 설계 해야한다고 하셨습니다. grade 는 where 절에서 vip 상수로 필터링 하므로 인덱스에서 가장 왼쪽(앞)에 와야하지만 왜 member_id, member_name 순서에 맞게 인덱스를 줘야하는지 잘 모르겠습니다. 실제로 (grade, member_name, member_id) 순서로 member 테이블에 인덱스를 주고 EXPLAIN ANALZYZE 를 해보니 Aggregate using temporary table (actual time=373..373 rows=59999 loops=1) 가 나오는것을 확인했습니다. 임시테이블을 만들지 말지의 기준은 GROUP BY 로 그룹핑 하는 대상들이 연속적으로 올 경우는 굳이 임시테이블을 만들 필요가 없다는것으로 이해를 했습니다.(순서대로 오니까 미리 저장할 필요가 없으므로) 하지만 인덱스를 (grade, member_name, member_id) 순서로 줄 경우도 결국 인덱스 Grouping 순서에 맞게 오니까 임시테이블을 만들 필요가 없으니까 using temporary table 역시 발생하지 않아야 하는거 아닌가요? 그리고 설령 (grade, member_name, member_id) 로 주지 않고 (grade, member_name) 로 member테이블에 인덱스를 걸더라도 되는거 아닌가요? 어차피 세컨더리 인덱스 리프노드에는 member_id (pk) 가 선행컬럼을 기준으로 정렬되어 존재하니깐용 감사합니다!
해결됨
트래픽 급증을 견디는 서버 시스템 설계 - Coupon 발급 서비스
안녕하세요 이번 강의에서 @Modifying 이라는 어노테이션을 사용하고 있는데 이 @Modifying을 사용하는 상황이 발생하면 영속성 컨텍스트에 있는 데이터와 차이가 발생하게 되는 것을 알게 되었습니다. 이를 해결하기 위해 clearAutomatically = true, flushAutomatically = true 이런 옵션들이 있는 것으로 알고있는데, 현업에서는 이러한 옵션들을 어떻게 사용하는지 궁금합니다. Modifying을 쓰면 영속성 컨텍스트와 차이가 발생한다는 것을 인지하기 때문에 저런 옵션들을 따로 설정을 안하는지, 아니면 저런 옵션들을 사용하는지 궁금합니다!
미해결
김영한의 실전 데이터베이스 - 성능 최적화, 실행 계획과 인덱스 완전 정복
DB 쿼리를 설계하면서 항상 궁금했던 점이 있습니다. 쿼리가 점점 복잡해지다 보면 Sort , GROUP BY 등의 연산을 DB에서 처리하는 것보다, 데이터를 애플리케이션으로 가져온 후 애플리케이션에서 처리하는 것이 더 효율적이지 않을까 하는 생각이 들 때가 있습니다. 그렇다면 일반적으로 DB 쿼리를 최적화할 때는 애플리케이션으로 데이터를 가져와 처리하기보다는, 적절한 Index 설계를 통해 가능한 한 DB에서 연산을 처리하는 것이 맞는 방향일까요? 아니면 상황에 따라서는 필요한 데이터를 DB에서 조회한 후, 일부 연산을 애플리케이션에서 처리하는 것도 하나의 최적화 방법이 될 수 있을까요? 제가 생각하는 방향 자체가 잘못된 것인지, 아니면 실제로 상황에 따라 고려할 수 있는 방법인지 궁금해서 질문드립니다.
미해결
김영한의 실전 데이터베이스 - 성능 최적화, 실행 계획과 인덱스 완전 정복
안녕하세요 영한님! 강의에서 말씀해 주신 것처럼, 인덱스를 생성한다고 해서 항상 옵티마이저가 해당 인덱스를 사용하는 것은 아니라는 점은 이해했습니다. 그렇다면 실무에서는 특정 인덱스를 어떤 쿼리나 사용 패턴을 고려해서 만들었는지, 그리고 어떤 의도로 설계했는지를 별도로 기록하거나 관리하는 방법이 있을까요? 예를 들어 시간이 지나 다른 개발자가 인덱스를 보더라도, “이 인덱스는 특정 조회 쿼리의 성능을 개선하기 위해 만들었다”와 같은 설계 의도를 파악할 수 있도록 관리하는지가 궁금합니다. 설계 1편에서 소개해 주신 용어 사전처럼 별도의 문서나 규칙을 두고 관리하는 방법이 있는지, 혹은 실무에서 일반적으로 사용하는 다른 방법이 있는지도 궁금합니다!
해결됨
트래픽 급증을 견디는 서버 시스템 설계 - Coupon 발급 서비스
안녕하세요. 강의를 들으며 issuance 테이블에 status, coupon_id로 각각 인덱스를 생성하시면서 조회성능을 향상시키기 위함이라 설명하셨는데요. 특히 status를 이용한 인덱스가 꼭 필요한지 궁금합니다. 현재 status는 3가지 타입으로 (추후에도 늘어날 value가 제한적) 선택도가 약 33% 정도로 보입니다. 이렇게 가짓수가 적은 경우에는 인덱스의 효율을 잘 활용하기 어려워 인덱스를 생성하는 것이 비효율적이라고 학습한적이 있는데 지금과는 다른 상황인가요??
미해결
김영한의 실전 데이터베이스 - 기본편
[질문 내용] 여기에 질문 내용을 남겨주세요. 저는 1번문제에서 FK -> PK 로풀었습니다 영한님은 PK -> FK 로 푸셨던것에 질문입니다. FK -> PK는 항상 다대일으로 e.managed_id가 가리키는 PK 행은 0~1개라서 조인해도 왼쪽 테이블 행이 늘지 않아서 왼쪽 테이블이 행을 정하고, 조인은 컬럼만 붙인다고 생각했습니다. PK -> FK는 일대로써 한 행이 여러 행으로 늘어나는데, 그럼 on 조건까지 다 읽어야 이해되지 않을까 해서 여쭤봅니다. select e.employee_id, e.name, e.managed_id, m.name as manager_name from employees e join employees m on e.managed_id = m.employee_id where m.name = '최과장';
미해결
트래픽 급증을 견디는 서버 시스템 설계 - Coupon 발급 서비스
강의에서는 부하 테스트 시 시나리오 작성을 아래와 같이 5000 rps 정도로 부하를 가했을 때와, 1000 rps 수정해서 부하를 가했을 때의 latency(p50, 90, 99) 차이가 있는데, 실무에서는 보통 어떤 기준을 가지고 rps 를 정하는지 궁금합니다! scenarios: { burst: { ... rate: 5000, timeUnit: '1s', duration: '30s', // 1000 req/s × 30s = 총 30,000 요청 }, },
해결됨
6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
질문이라기 보다는 저같이 몇시간 버리시는 분 계실까 내용 공유드립니다. 도커 데스크탑 업데이트로 testcontainers 의존성 버전이 안맞은게 문제였습니다. 감사하게도 같은 문제로 다른분이 포스팅을 적어두셨더라구요. build.gradle 파일에서 testcontainers 의존성 -- 아래 처럼 변경 testImplementation 'org.testcontainers:testcontainers:2.0.5' testImplementation 'org.testcontainers:testcontainers-junit-jupiter:2.0.5' testImplementation 'org.testcontainers:testcontainers-mysql:2.0.5' ※ 최신버전은 Maven Rep 참고해주세요. 참고한 포스팅입니다. 도커 업데이트 이후 Testcontainers 테스트 실패 이슈 해결 기록 이슈 해결 외에도, 도커 버전에 따라 최소 API 버전 확인 할 수 있는 방법도 같이 기재되어있어 참고하기 좋은 것 같습니다.
미해결
중고급 SQL과 실전 데이터 분석 101 문제 풀이
안녕하세요, sakila실전 17번에서 궁금증이 생겼는데요, store 테이블에 manager_staff_id가 있고, staff에 저는 staff_id만 존재해가지고 manager_staff_id가 staff_id안에 있을거라고 판단하고 join을 staff와 store로 하였습니다. 그래서 간단히 풀기는 하였는데 현업에서도 혹시 이와 같은 경우가 발생할 경우, 분석가가 판단하고서 join을 진행하는게 맞는건가요? 아니면 유관 부서에 질문해서 두 테이블에 있는 내용이 같은지 다른지를 묻고 진행하는게 맞는건가요?
미해결
김영한의 실전 데이터베이스 - 성능 최적화, 실행 계획과 인덱스 완전 정복
안녕하세요 영한님, 영한님의 강의로 열심히 학습중인 학생입니다! 실전 진단 - 해결 방안2에서 복합인덱스 관련해 궁금증이 있습니다. 영한님의 강의에서는 (category_id, product_status, created_at)을 복합인덱스로 설정하셨는데, (category_id, created_at)을 복합인덱스로 설정하는 것에 대해서는 어떻게 생각하시는지 궁금합니다. product_status = 'ACTIVE'의 비율이 전체 테이블에 비교했을 때 전체의 85%였고, 이 price 조건을 비교하기 위해 클러스터드 인덱스가 접근해 행 전체를 읽은 후 실행엔진에서 걸러야하는데, product_stauts = 'ACTIVE' 비율이 85%에 해당되기 때문에 높은 확률로 통과하다 보니 인덱스 효용이 떨어질 것 같다는 생각이 들었습니다. 그래서 해당 쿼리를 생각했을 때 product_status도 복합인덱스에 추가할만한 가치가 있을까? 라는 질문을 던졌을 때 (영한님이 말씀해주신 것 처럼, 인덱스도 결국 비용이니깐) 크게 와닿지 못 했는데, 이와 관련해서 영한님의 의견이 궁금합니다! (두 복합 인덱스의 실행 계획) -- (category_id, created_at) -> Limit: 20 row(s) (cost=75331 rows=20)(actual time=0.719..11.5 rows=20 loops=1) -> Filter: ((product.price between 10000 and 50000) and (product.product_status = 'ACTIVE')) (cost=75331 rows=4595) (actual time=0.718..11.5 rows=20 loops=1) -> Index lookup on product using idx_category_created_at (category_id=11) (cost=75331 rows=413612) (actual time=0.698..11.4 rows=48 loops=1) -- (category_id, product_status, created_at) -> Limit: 20 row(s) (cost=78697 rows=20)(actual time=0.6..9.07 rows=20 loops=1) -> Filter: (product.price between 10000 and 50000) (cost=78697 rows=38255) (actual time=0.593..9.06 rows=20 loops=1) -> Index lookup on product using idx_category_status_created_at (category_id=11, product_status='ACTIVE') (cost=78697 rows=344330) (actual time=0.581..9.03 rows=40 loops=1)
미해결
스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
학습 관련 질문을 최대한 상세히 남겨주세요! 고민 과정도 같이 나열해주셔도 좋습니다. 먼저 유사한 질문이 있었는지 검색해보세요. 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. 64강 17분쯤 ArticleReadService의 count 메서드 구현하신 코드를 보면 아래 코드블럭과 같이 작성하셨습니다. private long count(Long boardId) { Long result = boardArticleCountRepository.read(boardId); if (result != null) { return result; } long count = articleClient.count(boardId); boardArticleCountRepository.createOrUpdate(boardId, count); return count; } 그런데 BoardArticleCountRepository의 count 메서드는 아래와 같이 작성하셨는데 이 경우 boardArticleCountRepository.count(boardId);는 Redis에서 데이터가 조회되지 않은 경우 0L를 반환하여 ArticleReadService의 count 메서드에서는 항상 client에서 조회하는 케이스가 발생하지 않을거 같습니다. public Long read(Long boardId) { String result = redisTemplate.opsForValue().get(generateKey(boardId)); return result == null ? 0L : Long.valueOf(result); }
미해결
김영한의 실전 데이터베이스 입문 - 모든 IT인을 위한 SQL 첫걸음(SQL부터 차근차근)
좀 늦게 알게되었는데..김영한 강사님의 마스터패스 기한을 좀 연장해 주실수 있나요?
해결됨
트래픽 급증을 견디는 서버 시스템 설계 - Coupon 발급 서비스
안녕하세요! 강의 잘 듣고 있습니다. 아래 issue 메서드 관련해서 질문드립니다. @Transactional fun issue(couponId: Long, userId: Long): Issuance { val policy = couponIssuePolicyReader.get(couponId) val now = LocalDateTime.now() if (!policy.isBookingOpen(now)) { throw NotStartedException() } val expiresAt = now.plusDays(policy.validityDays.toLong()) couponIssuer.tryIssue(couponId, userId) issuanceRequestProducer.publish( IssuanceRequested( couponId = couponId, userId = userId, issuedAt = now, expiresAt = expiresAt, ) ) return Issuance( userId = userId, couponId = couponId, issuedAt = now, expiresAt = expiresAt, ) } 해당 코드에서 couponIssuer.tryIssue() (Redis)는 성공했는데 바로 다음 issuanceRequestProducer.publish() (Kafka)가 실패하는 경우 재고는 차감됐는데 이벤트는 유실된 불일치 상태가 될 수 있을 것 같습니다. 만약 재고를 DB로 관리한다면 아웃박스 패턴으로 같은 트랜잭션 안에서 이벤트를 아웃박스 테이블에 적재하고 별도 워커가 Kafka에 발행하는 방식으로 원자성을 보장할 수 있을 것 같습니다. 그런데 지금처럼 재고 자체를 Redis로 관리하는 구조에서는 Redis와 Kafka 각각에 대한 이중 쓰기 문제가 생기고 아웃박스 패턴을 그대로 적용하기는 어려워 보입니다. 만약 해당 구조에서 at-least-once를 보장하려면 어떤 전략을 택해야 하는지 궁금합니다!
해결됨
트래픽 급증을 견디는 서버 시스템 설계 - Coupon 발급 서비스
Domain 패키지에 Coupon 같은 @Entity 와 CouponRepository 를 함께 두셨더라고요! 영속성을 storage(또는 Infrastructure) 로 따로 분리하는 구성도 있는데, 여기서는 엔티티와 레파지토리 모두 domain 에 두신게 궁금했습니다. 혹시 이 서비스 규모에서는 db가 바뀔 가능성이 낮고, 엔티티를 밖으로 빼면 도메인 <-> 엔티티 매핑 비용만 늘어난다고 보셔서 의도적으로 domain 안에 함께 두신걸까요? 아니면 다른 기준이 있으셨는지 궁금합니다.
해결됨
트래픽 급증을 견디는 서버 시스템 설계 - Coupon 발급 서비스
MacOs 사용자 분들이시고 cat ~/.docker/config.json 의 결과에 credsStore 필드가 osxkeychain이고 auth 필드의 값이 비어있으신 경우 인증정보가 keychain으로 관리되고 있고 이걸 jib이 가져오지 못하고 있는 겁니다. 방법 1 (가장 추천합니다) jib 내부의 from과 to 블록의 image 선언 다음 credHelper { helper = "osxkeychain" } 해당 코드를 추가해 keychain에 접근할 수 있도록 해주면 좋습니다. + auth {}로 인증정보를 주입하는 방법으로도 대체 가능합니다. 방법 2 (문제 회피) java 25 이미지를 docker pull 받아 로컬에 두고 ./gradlew jibDockerBuild 하시면 됩니다. 나중에 redis를 받던데 그때로 같은 방법으로 해결하면 될 것같습니다. 방법 3 (keychain 필드깨서 강제로 base64쓰게 하기) credsStore 필드를 훼손시켜 강제로 auth에 암호화된 내용을 저장하도록 하는 것같습니다. 정말 추천하지 않으며, 위 방법이 모두 실패하면 시도해보세요.
해결됨
트래픽 급증을 견디는 서버 시스템 설계 - Coupon 발급 서비스
안녕하세요 강의 잘 듣고 있습니다! 혹시 강의에서는 스크립트를 많이 사용하시는데 테스트 코드로는 못하는건가요? 실무에서도 스크립트를 많이 사용하시나요?
해결됨
트래픽 급증을 견디는 서버 시스템 설계 - Coupon 발급 서비스
안녕하세요 강의 잘 듣고있습니다 강의를 듣다가 궁금한게 생겨 질문을 드립니다! 같은 사용자가 따닥으로 중복 호출 했을 때 unique 제약 조건에 걸려 예외가 발생할텐데 redis에 있는 쿠폰 재고는 어떻게 되는지 궁금합니다!
미해결
김영한의 실전 데이터베이스 입문 - 모든 IT인을 위한 SQL 첫걸음(SQL부터 차근차근)
리뷰를 남기라고 하셨는데...리뷰를 어디에 남기는지 모르겠네요... 에너지 회사에서 시황 데이터와 거래 데이터를 많이 다루는 50대 입니다....sql말만 듣고 동영상 듣기까지 한 10년 정도 걸린거 같네요.. 도메인 지식만 가지고 최근 ai의 도움으로 여기까지 오게 되었습니다. 선생님 다른 강의도 잘 보겠습니다. ^^
해결됨
스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
학습 관련 질문을 최대한 상세히 남겨주세요! 고민 과정도 같이 나열해주셔도 좋습니다. 먼저 유사한 질문이 있었는지 검색해보세요. 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 쿠케님 강의 너무 잘 보고 있습니다. 해당 내용 수강중에 궁금한 점이 생겨 질문 드립니다. 혹시 제목이나 내용을 검색한다고 했을때는 redis에서 조건을 통해 조회를 하는것인지 다른 전략이 있는지 궁금합니다!