묻고 답해요
152만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
두 쿼리문의 차이
안녕하세요, 쿠케님 강의 만족스럽게 수강하고 있는 수강생입니다.아래 2개의 쿼리문에 대해 첫번째 쿼리문에 where article_id = 1 이라는 조건문이 있고(비록 index를 생성한 컬럼이지만), 두번째 쿼리문에서는 where article_id가 빠진 상태인데도 첫번째 쿼리문의 속도가 더 빨랐습니다. explain 해보니,두번째 쿼리문에 Using filesort가 존재하는데,order by path로 인해 저희가 지정한 index의 컬럼인데도 불구하고 왜 Using filesort가 되고, 속도가 첫번째 쿼리문에 비해 조건이 없는데도 더 느린지 잘 이해가 안됩니다. mysql> explain select path from comment_v2 where article_id = 1 order by path desc limit 10; +----+-------------+------------+------------+------+---------------------+---------------------+---------+-------+---------+----------+----------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+------------+------------+------+---------------------+---------------------+---------+-------+---------+----------+----------------------------------+ | 1 | SIMPLE | comment_v2 | NULL | ref | idx_article_id_path | idx_article_id_path | 8 | const | 4990965 | 100.00 | Backward index scan; Using index | +----+-------------+------------+------------+------+---------------------+---------------------+---------+-------+---------+----------+----------------------------------+ 1 row in set, 1 warning (0.00 sec) mysql> explain select path from comment_v2 order by path desc limit 10; +----+-------------+------------+------------+-------+---------------+---------------------+---------+------+---------+----------+-----------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+------------+------------+-------+---------------+---------------------+---------+------+---------+----------+-----------------------------+ | 1 | SIMPLE | comment_v2 | NULL | index | NULL | idx_article_id_path | 110 | NULL | 9981930 | 100.00 | Using index; Using filesort | +----+-------------+------------+------------+-------+---------------+---------------------+---------+------+---------+----------+-----------------------------+ 1 row in set, 1 warning (0.00 sec)
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
트랜잭션 레벨에 대해 궁금합니다!
안녕하세요. 쿠케님 강의가 너무 유익해서 잘듣고있습니다!강의를 진행하면서 문득 생각이 든건데 실무에서 트랜잭션 레벨을 조절을 하기도 하나요???기본 트랜잭션은 REPEATABLE_READ인데 갭락이 걸릴것을 우려해서 COMMITED_READ로 바꾼다거나 이런식으로 트랜잭션 레벨을 조절하는 경우가 있나요???
-
미해결카프카 완벽 가이드 - 코어편
실습 코드는 어디서 받나요.. 아무리 찾아도 엄네요..
실습 코드는 어디서 받나요.. 아무리 찾아도 엄네요..
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
멀티모듈 질문
혹시 강의에 멀티모듈구조 설정하는 방법이 있을까요 ? 하나의 프로젝트에서 무듈별로 나누는 방법은 제공하지 않겠죠 ?
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
무한 depth 구현 설계에서 질문이 있습니다.
학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.00a0z의 prefix(parentPath)를 가지고 모든 자손 댓글에서, 가장 큰 path(descendantsTopPath)를 찾는 과정인데요. 현재 childrenTopPath가 00a0z 00002 이지만 해당 댓글에 대댓글이 없고 00a0z 00001의 대댓글만 있는 상황에서는 00a0z 00002 자기 자신이 childrenTopPath 이자 descendantsTopPath가 되는걸까요? 00a0z 00002 와 00a0z 00001 00000 을 비교했을때 앞의 것이 더 큰 path라고 판단하면 되는걸까요?
-
해결됨은행 서버 프로젝트 실습을 통해 배우는 코틀린 마스터 클래스
class 가 아닌 파일로 생성하시는이유
강의를 보니 코틀린 클래스 생성 대신 파일을 생성하시는데 이유를 알수있을까요?
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
락 처리
안녕하세요 선생님동시성 처리 방법에는 redisson을 활용한 방법도 있는데요 혹시 이 방법은 언제 써야할까요? 감사합니다
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
rowLock
안녕하세요 강의 잘 보고 있습니다.rowLock 단점에 대해서 질문드리고 싶습니다.강의에 나온내용 말고 rowLock이 걸려도 격리레벨때문에(mysql기준) 이미 조회시 같은 값을 조회 했기때문에 동시서 이슈가 해결되지 않는다고 봐도 괜찮을까요??감사합니다
-
미해결[아파치 카프카 애플리케이션 프로그래밍] 개념부터 컨슈머, 프로듀서, 커넥트, 스트림즈까지!
파티션, 컨슈머 그룹, 컨슈머 관련 질문
안녕하세요 원영님, 강의를 듣다가 궁금한 점이 생겼습니다.1-1. 하나의 파티션은 여러 컨슈머에 할당될 수 없다고 하셨는데 엄밀히 말하면 '동일 컨슈머 그룹' 기준으로 여러 컨슈머에 할당될 수 없는게 맞을까요?엘라스틱서치, 하둡 예제에 따르면 하나의 파티션이 엘라스틱서치,하둡 컨슈머에 할당되어 있어서요.1-2. 컨슈머 그룹마다 동일 파티션에 대해 다른 offset를 가질까요?엘라스틱서치, 하둡 예제를 보면 각각의 컨슈머가 동일한 파티션을 구독하고 있습니다. 만약 엘라스틱서치,하둡 컨슈머가 동일한 offset을 가진다면 어느 한쪽에서 이미 커밋한 레코드는 다른 쪽에서 poll하지 못할 것으로 예상되어 질문드립니다.2.하나의 컨슈머가 여러 토픽을 구독하는 경우는 실무 기준으로 어떤 case가 있을지 궁금합니다. 강의 잘 듣고 있습니다. 감사합니다.
-
해결됨커머스 서비스로 배우는 NestJS 실전 개발 (w. Prisma, Docker, Redis, Kafka)
timezone 관련 질문
안녕하세요. prisma에서 utc 시간이 아닌 다른 시간대를 사용하고 싶은데, 현재 prisma에서는 timezone 관련 지원이 부재한 것으로 보입니다. 강사님께서는 위와 같은 상황일 경우, 이 부분을 어떤 식으로 해결하셨는지 궁금합니다.
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
카프카에 담긴 이벤트 순서가 올바르지 않을 가능성 관련 질문
안녕하세요 쿠케님, 강의를 복습하다 새로운 궁금증이 생겨 질문 남깁니다.본론부터 말씀드리자면, 카프카는 큐에 이벤트가 담기고, 동일 토픽 및 동일 파티션의 경우 동일한 offset을 쓰기 때문에 순서가 지켜져서 소모가 된다고 이해했습니다. 즉, 컨슈머가 몇개든 동일 토픽, 파티션인 경우 큐에 담겨진 순서대로 명확하게 소비된다고 이해했습니다. 그런데 만약 큐에 담겨진 순서가 올바른 순서가 아니라면 어떻게 되는 것일까요?예를 들어, 2명의 클라이언트가 거의 같은 시간에 게시글 A에 대해 댓글을 생성했고 각 클라이언트는 서로 다른 댓글 서버에서 요청이 처리됐다고 가정하겠습니다. 이때 유저 A가 게시글 A에 대한 댓글을 먼저 생성했고, 유저 B가 간발의 차로 같은 게시글에 대한 댓글을 생성했을 때, 유저 A가 생성했을 때의 게시글 댓글 수는 4였고 B가 뒤 이어서 생성했다면 5가 될 것입니다. 백엔드 서버가 전송한 유저 A의 이벤트가 알 수 없는 문제로 카프카로 늦게 도착했고, 그 사이에 유저 B의 이벤트가 먼저 큐에 담겨졌습니다. 그렇다면 제가 첨부한 그림과 같이 됩니다. (이벤트는 지연 전송 방식이 아닌 트랜잭션 After Commit 이후에 즉시 전송됐다고 가정.) 이때 컨슈머인 article-read 서비스에서 이벤트를 순서대로 소비하며 레디스에 저장된 게시글 A의 ArticleQueryModel 댓글 수를 최신화하는데 먼저 최신 값인 5로 최신화하고 다시 과거 값인 4로 최신화 할 것입니다. 이렇게 되면 게시글 A의 댓글 수 데이터의 일관성이 깨진다고 볼 수 있을 것 같습니다.그래서 이에 대한 해결책으로 이벤트 payload에 댓글의 스노우플레이크 id가 담겨 있고, 스노우 플레이크는 시간 순으로 생성되기 때문에 레디스에 게시글 A에 대해 가장 마지막으로 처리된 이벤트의 스노우플레이크 id를 저장하고 다음으로 소비될 이벤트가 가장 마지막으로 처리된 이벤트 id보다 과거에 생성된 이벤트면 이 이벤트를 무시하면 되지 않을까? 생각했지만, 게시글에 대한 이벤트 타입이 여러가지이기 때문에 다른 타입의 이벤트가 무시될 수도 있겠다는 생각이 듭니다.쓰고 나니까 너무 길게 질문 드린 것 같은데, 쿠케님의 강의가 정말 도움이 많이 돼서 이렇게 염치 불구하고 길게 질문드립니다. 이에 대한 의견 주시면 너무 감사하겠습니다. 강의 항상 잘 듣고있습니다.
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
질문 하나 있습니다!
저번에 다음 강의 관련 글을 본 적이 있었는데요. 다음 강의는 Redis Cache Hit 관련 강의가 맞을까요? 맞다면 한 언제쯤 출시가 될까요! 다음 강의도 무척 기대되어서 그렇습니다!
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
게시글 목록 최적화 전략 구현 - 테스트 에서 오류가 발생합니다
학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요 거의 막바지에 이르러서 테스트 부분을 들으려 하고 있습니다테스트 부분에서 강의 코드와 같이 맞춰 보아도 에러가 발생하여 어떤 에러인지 감이 잘 잡히지 않아 질문드립니다.최하단에 에러 로그를 첨부합니다. 저장소의 완성 코드 파라미터대로 하면 성공하지만, 강의대로 하면 에러가 납니다이것은 저장소의 완성본 코드이고 @Test void readAllTest() { ArticleReadPageResponse response1 = articleReadRestClient.get() .uri("/v1/articles?boardId=%s&page=%s&pageSize=%s".formatted(1L, 3000L, 5)) .retrieve() .body(ArticleReadPageResponse.class); System.out.println("response1.getArticleCount() = " + response1.getArticleCount()); for (ArticleReadResponse article : response1.getArticles()) { System.out.println("article.getArticleId() = " + article.getArticleId()); } ArticleReadPageResponse response2 = articleRestClient.get() .uri("/v1/articles?boardId=%s&page=%s&pageSize=%s".formatted(1L, 3000L, 5)) .retrieve() .body(ArticleReadPageResponse.class); System.out.println("response2.getArticleCount() = " + response2.getArticleCount()); for (ArticleReadResponse article : response2.getArticles()) { System.out.println("article.getArticleId() = " + article.getArticleId()); } 이것은 에러가 발생하는 강의의 코드입니다.@Test void readAllTest(){ ArticleReadPageResponse response1 = articleReadRestClient.get() .uri("/v1/articles?boardId=%s&page=%s&pageSize=%s".formatted(1L, 1L, 5)) .retrieve() .body(ArticleReadPageResponse.class); System.out.println("response1 = " + response1); for (ArticleReadResponse article : response1.getArticles()) { System.out.println("article.getArticleId() = " + article.getArticleId()); } ArticleReadPageResponse response2 = articleRestClient.get() .uri("/v1/articles?boardId=%s&page=%s&pageSize=%s".formatted(1L, 1L, 5)) .retrieve() .body(ArticleReadPageResponse.class); System.out.println("response2 = " + response2); for (ArticleReadResponse article : response2.getArticles()) { System.out.println("article.getArticleId() = " + article.getArticleId()); } } 이것은 에러 로그입니다(본문 제한으로 부득이하게 이미지로 첨부합니다)
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
강의 화면이 나오지 않고 소리만 납니다.
섹션1의 'Cloud Native Architecture', 'Cloud Native Application' 강의에서 영상이 나오지 않는데 원래 그런건가요? 아래처럼 까맣게 아무것도 안나오고 소리만 납니다.
-
미해결카프카 완벽 가이드 - ksqlDB
Table의 상태(Stateful) 관리 질문
안녕하세요.Table의 상태(Stateful) 관리 강의에서Table을 생성하고 동일 key 값으로 insert를 하고 나면 Push 쿼리로 재조회 하였을 때 동일 key값의 최신으로 가져온다고 하셨는데요.버전이 동일하지 않아서 그런건지 도커 환경이여서 그런건지는 모르겠지만, 동일 키값으로 insert를 하고 Push 쿼리로 조회하여도 모두 조회되는 현상은 어떤 이유일까요?
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
ArticlePageResponse 클래스 질문
안녕하세요 강의 듣다가 문득 궁금한점이 생겨서 질문드립니다. ArticlePageResponse 클래스에 List<ArticleResponse> articles; 를 구성으로 하여 클래스를 생성해주셨는데ArtlcieResponse를 상속하여 만들어진 ArticlePageResponse를 활용하여도 상관 없을까요?? 자바, 스프링을 동시에 공부하고 있다보니.. 주니어의 허접한 질문에 답변해주시면 감사드리겠습니다..
-
미해결실습으로 배우는 선착순 이벤트 시스템
프로젝트 진행할때 모듈로 추가하는 이유가 궁금합니다!
프로젝트 처음 진행할때 보면, spring init에서 프로젝트를 만든 후 src파일을 삭제하고 대신 new Module로 api라는 디렉토리를 만들어서 진행하는데요.... 혹시 이렇게 하는 이유가 있나요??? 이런 방식은 처음봐서 질문 드립니다 !
-
해결됨은행 서버 프로젝트 실습을 통해 배우는 코틀린 마스터 클래스
카프카 컨슈머 구현 질문
카프카 스프링을 구현하실 때, @KafkaListener를 따로 안 사용하시는 이유가 있으신가요?https://inf.run/cuNfG
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
Comment 최상위 entity에서 parentCommentId를 자기 자신의 id를 두는 이유가 궁금합니다.
안녕하세요!강의 늘 잘 듣고 있습니다, 감사합니다.다름이 아니고, Comment 테이블 관련한 질문인데요.일전에 비슷한 경우를 보았는데, parentCommentId를 null로 둔걸 본 것 같습니다.(용량절약을 위한 목적이였다고 들었습니다)혹시 최상위 자신의 commentId로 parentComentId를 지정한 부분에 대해 궁금해서 글 올리게 되었습니다.감사합니다.
-
미해결실습으로 배우는 선착순 이벤트 시스템
Redis 활용하기 문제점 해결하기 부분이 이해가 잘 안됩니다...
위 도표를 보여주시면서 설명을 해주실때,10시 정각에 스레드 1이 쿠폰 발급 로직을 시작10시 2분에 완료가 된다면,스레드 2는 스레드 1의 작업이 모두 종료될때까지 기다렸다림.스레드 2는 10시 2분에 작업을 시작 이렇게 설명해주셨는데, 이게 잘 이해가 안됩니다... 제 생각에는 아래와 같이 10시에 동시에 처리되는 흐름이 되어야 할 것 같은데요... 즉, 스레드2는 쿠폰 생성 로직이 끝날 때까지 기다리지 않고,스레드 1이 쿠폰 발급 로직을 수행 중이라도 스레드 2는 곧바로 Redis 값을 받고 독립적으로 로직을 수행할 수 있을 것 같은데 아닌가요?? 레디스 자체는 싱슬스레드이니 레디스를 찌를때는 무조건 하나씩만 들어가겠지만 스레드 1은 레디스에 찌르고 값을 받아온 후 본인의 비즈니스 로직 수행할때 스레드2가 레디스 서버에 찌를 수는 없는건가요? 제가 이렇게 이해한 부분이 잘못된 것인지, 아니면 제가 강의 설명을 오해한 것인지 혼란스러워 질문을 드리게 되었습니다.