강사님 안녕하세요. 코틀린을 자바처럼 쓴 제 자신을 혼내면서(?) 열심히 청강 중입니다. 강의에서 작성하신 Transactional.kt 코드를 보면 스프링의 TransactionTemplate을 활용한 명시적 트랜잭션 제어 방식과 큰 차이점이 없어 보입니다. 코틀린 래핑방식으로 사용했을때 어떤 장점이 있는걸까요? 제가 생각한 래핑 방식의 장점은 다음과 같습니다. 코드 스타일, 네이밍, optional 옵션 추가 등에서 약간 더 자유로움 예를 들어 여러 종류의 트랜잭션 처리 규칙(특정 로그, 메트릭, 롤백 조건 등)을 한곳 에 구현해서 공용유틸로 쓰기 좋고, 내부 구현을 추후 TransactionTemplate, PlatformTransactionManager 등 다양한 방식으로 손쉽게 변경 가능 트랜잭션 코드에 특별히 넣어야 할 커스텀 공통로직"이 없다면, 웬만하면 @Transactional / TransactionTemplate만으로 충분하다는 생각입니다. 정답은 없고 팀의 규칙마다 다를것 같아요. 강사님 팀에서는 어떤 방식으로 사용중이신가요? 강의 찍어주셔서 감사합니다앗~! (개인적인 사견인데 말씀하시는 중에 '죄송합니다'는 안하셔도 될것 같아요~!)
안녕하세요, 쿠케님 강의 만족스럽게 수강하고 있는 수강생입니다. 아래 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)
학습 관련 질문을 최대한 상세히 남겨주세요! 고민 과정도 같이 나열해주셔도 좋습니다. 먼저 유사한 질문이 있었는지 검색해보세요. 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 00a0z의 prefix(parentPath)를 가지고 모든 자손 댓글에서, 가장 큰 path(descendantsTopPath)를 찾는 과정인데요. 현재 childrenTopPath가 00a0z 00002 이지만 해당 댓글에 대댓글이 없고 00a0z 00001의 대댓글만 있는 상황에서는 00a0z 00002 자기 자신이 childrenTopPath 이자 descendantsTopPath가 되는걸까요? 00a0z 00002 와 00a0z 00001 00000 을 비교했을때 앞의 것이 더 큰 path라고 판단하면 되는걸까요?
안녕하세요 원영님, 강의를 듣다가 궁금한 점이 생겼습니다. 1-1. 하나의 파티션은 여러 컨슈머에 할당될 수 없다고 하셨는데 엄밀히 말하면 '동일 컨슈머 그룹' 기준으로 여러 컨슈머에 할당될 수 없는게 맞을까요? 엘라스틱서치, 하둡 예제에 따르면 하나의 파티션이 엘라스틱서치,하둡 컨슈머에 할당되어 있어서요. 1-2. 컨슈머 그룹마다 동일 파티션에 대해 다른 offset를 가질까요? 엘라스틱서치, 하둡 예제를 보면 각각의 컨슈머가 동일한 파티션을 구독하고 있습니다. 만약 엘라스틱서치,하둡 컨슈머가 동일한 offset을 가진다면 어느 한쪽에서 이미 커밋한 레코드는 다른 쪽에서 poll하지 못할 것으로 예상되어 질문드립니다. 2.하나의 컨슈머가 여러 토픽을 구독하는 경우는 실무 기준으로 어떤 case가 있을지 궁금합니다. 강의 잘 듣고 있습니다. 감사합니다.
안녕하세요 쿠케님, 강의를 복습하다 새로운 궁금증이 생겨 질문 남깁니다. 본론부터 말씀드리자면, 카프카는 큐에 이벤트가 담기고, 동일 토픽 및 동일 파티션의 경우 동일한 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보다 과거에 생성된 이벤트면 이 이벤트를 무시하면 되지 않을까? 생각했지만, 게시글에 대한 이벤트 타입이 여러가지이기 때문에 다른 타입의 이벤트가 무시될 수도 있겠다는 생각이 듭니다. 쓰고 나니까 너무 길게 질문 드린 것 같은데, 쿠케님의 강의가 정말 도움이 많이 돼서 이렇게 염치 불구하고 길게 질문드립니다. 이에 대한 의견 주시면 너무 감사하겠습니다. 강의 항상 잘 듣고있습니다.
안녕하세요. Table의 상태(Stateful) 관리 강의에서 Table을 생성하고 동일 key 값으로 insert를 하고 나면 Push 쿼리로 재조회 하였을 때 동일 key값의 최신으로 가져온다고 하셨는데요. 버전이 동일하지 않아서 그런건지 도커 환경이여서 그런건지는 모르겠지만, 동일 키값으로 insert를 하고 Push 쿼리로 조회하여도 모두 조회되는 현상은 어떤 이유일까요?
안녕하세요 강의 듣다가 문득 궁금한점이 생겨서 질문드립니다. ArticlePageResponse 클래스에 List<ArticleResponse> articles; 를 구성으로 하여 클래스를 생성해주셨는데 ArtlcieResponse를 상속하여 만들어진 ArticlePageResponse를 활용하여도 상관 없을까요?? 자바, 스프링을 동시에 공부하고 있다보니.. 주니어의 허접한 질문에 답변해주시면 감사드리겠습니다..