묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
카운팅 조회 시 질문
안녕하세요 질문있습니다.만약 게시글 전체 조회할 때 게시글 마다 좋아요 수도 함께 기재하려고 하면 게시글 조회 할 때 마다 articleId에 맞는 좋아요 수 정보도 함께 필요하잖아요?현재 게시글 서버와 좋아요 서버가 다른 환경을 고려할 때 그러면 게시글 조회할 때 마다 좋아요 서버로의 api요청이 불가피할 거 같은데 이 경우 조회 성능이 당연히 안좋게 나올 수 밖에 없다고 생각합니다. 비정규화로 좋아요수를 게시글 테이블에 붙여서 단일 서버로의 요청을 만들어줄려고 해도 말씀하신 한계 때문에 안될 거 같구요.만약 게시글 전체 조회 시에 게시글과 게시글의 좋아요수가 반드시 제공되어야 한다면 제가 생각한 성능 저하 포인트가 타당한가요? 만약 타당하다면 어떻게 개선할 수 있을까요? 인기게시글만 따로 추려서 레디스로 메모리를 활용해야할까요?
-
미해결카프카 완벽 가이드 - 코어편
mainThread.join() 관련 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.강의 영상 잘 보고 있습니다! 영상 보다가 궁금한 점이 있어서 질문을 남기게 됐습니다.JVM에서 정상 종료의 경우는 항상 모든 Shutdown Hook의 실행이 보장되지 않나요? 메인 쓰레드에 대한 join() 호출 없어도 정상 종료의 흐름에서는 wakeup과 JVM 내부에서는 finally 블럭의 consumer.close()의 호출이 보장되지 않나요? 명시적으로 join()을 호출하지 않았을 때 발생할 수 있는 문제 상황이 궁금합니다!
-
미해결카프카 완벽 가이드 - 커넥트(Connect) 편
Debezium CDC Source Connector 이벤트 메시지
안녕하세요, Debezium CDC Source Connector가 이벤트를 만들때 before, after 값 설명하시는 부분에서 이해가 안가는 부분이 있어서 질문드립니다.before값이 필요한 이유가 나중에 rollback할때 다시 after를 before로 가지고 갈 수 있어서라고 설명을 주셨는데, 이것은 RedoLog에 한정된 얘기인가요 아니면 CDC Source Connector에서도 실제로 이 값을 이벤트로 들어온다는 뜻인가요?커밋이 확정된 변경 내용만 CDC 캡쳐를 하는 것으로 알고있어서 Redolog에 한정된 설명이라고 이해했는데 그렇다면 before값이 필요하다고 설명주신 이유가 정확히 어떤 뜻인지 궁금합니다.혹시 아니면 CDC Event Source Connector에도 롤백처리된 트랜잭션의 변경이전데이터가 after값에 저장되어 온다는 의미인가요?
-
해결됨가장 쉽고 깊게 알려주는 Kafka 완벽 가이드 [ By. 비전공자 & Kakao 개발자 ]
이벤트 기반 주문 질문 있습니다.
MSA기반 주문 서비스에서 동기식으로 호출할때 재고 차감 - 쿠폰 사용 - 주문 완료 이런식으로 구성되어 있을때 쿠폰 사용 실패일때는 바로 사용자에게 응답이 가능하다고 생각을 하고 있습니다.하지만 EDA기반으로 재고 차감 - 쿠폰 사용 - 주문 완료를 구현하면 주문이 완료되고 쿠폰사용에 실패가 되어 사용자는 주문이 완료되었지만 다시 실패메시지가 가고 그때서야 이유를 알수 있다고 생각을 하고 있습니다.그래서 사용자 경험 상 동기식이 맞다고 판단되는데 제가 잘못 생각을 하고 있는걸까요?MSA 기반 EDA 주문 구조에서 재고가 부족하여 실패한다면 사용자에게 바로 응답을 해줄수 있을까욤?.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
강의에서 BCryptPasswordEncoder 에 역할(5-2)
강사님 이 부분에서 security password 가 (password 입력시) 기본값으로 사용하는 용도인가요?bCryPassword가 암호화를 해준다는 말은 알겠는데 이부분이 살짝 개념이해가 되지 않아 문의드립니다.
-
미해결Kafka & Spark 활용한 Realtime Datalake
git action에서 install_codedeploy-agent.yml
안녕하세요! 강사님 이 부분이 에러가 뜨는데 혹시 어떤 걸 확인해봐야할까요?
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
게시글 페이징시 게시글 수
안녕하세요!BoardArticleCount 데이터를 추가로 관리하면서 게시글 수 조회 성능이 개선돼 PageLimitCalculator를 통한 최적화 방식을 더 이상 사용하지 않아도 될 것같은데 혹시 맞을까요??
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
ArticleQueryModel 질문
안녕하세요. 강의 잘 수강하고 있습니다 : )다름이 아니라 게시글 같은 경우에 레디스에 저장해서 조회할 때 빠르게 조회하는 건 이해했습니다. 그런데 ArticleQueryModel에 들어가있는 요소들을 보니까 댓글같은 경우에는 댓글 수만 넣어주더라고요. 프런트에서 게시글을 클릭했을 때 게시글에 저장되어 있는 댓글 데이터들을 조회하려면 comment-service로 요청을 해야하는 거죠??ArticleQueryModel은 순수하게 게시글을 위한 용도인거고 댓글들 같은 경우에는 comment-service로 요청을 해야하는 것 같은데 댓글들은 redis에 저장하지 않고 rdb에서 조회를 해야하는건가요??
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
redis 종료시 캐싱 처리
학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요!article-read service에서 ArticleIdListRepository는 createdEvent를 받았을 때만 추가되는데 만약 redis가 종료돼 데이터가 유실된다면 createdEvent로만 추가되기 때문에 당장 캐시 db로서 역할을 못 할 것 같습니다이 부분은 redis에 데이터가 유실되지 않는다고 가정하신 뒤 코드를 작성한 것이 맞을까요??
-
미해결실전에서 바로 써먹는 Kafka 입문
적정 파티션 개수 계산하는 방법 질문드립니다
안녕하세요 강사님 질문을 자주올리는것같아 죄송하고 답변달아주셔서 감사합니다.pdf에 나온것처럼 프로듀서가 보내는 메시지량은 120하나의 쓰레드가 처리하는 메세지량 0.3 을기준으로토픽의 파티션을 400개로 생성했을때어플리케이션 서비스의 max 스레드가 기본값 200이라 가정하에 파티션 400개를 처리하려면 스레드가 200개가 더 필요하니 대부분 실무에서는 200 스레드 기준으로 2개의 컨슈머 서비스를 구동시키나요?추가로 부하테스트 강의에도 지금 강의에 설명되는 파트가 ( 카프카 파티션구하기 관련? ) 따로 있는지도 궁금합니다
-
미해결실전에서 바로 써먹는 Kafka 입문
섹션5 33 질문드립니다
안녕하세요 강사님지금은 샘플 프로젝트라 하나의 컨슈머 서버에서파티션3개를 처리하고있는데만약 email.send topic기준으로 파티션을 5개 생성했을때 컨슈머 서버도 5개를 띄우는게 일반적인가요?실무기준으로 궁금합니다추가로 하나의 컨슈머에서 지금은 email.send 토픽만 구독하고있는데 만약 토픽이 slack.send , telegram.send 등 여러가지가 있을경우 컨슈머 어플리케이션에서 카프카리스너를 다중으로 등록하는게 일반적인가요 아니면 각 토픽마다 서비스를 띄우는게 일반적인가요?만약 각 토픽마다 서비스를 띄운다가정했을때email.send topic 파티션 5개 => 서비스 5개 구동 필요slack.send topic 파티션 3개 => 서비스 3개 구동 필요총 8개가 띄워지는게 일반적인건지 .. 실무기준으로 궁금합니다
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
Select 조회를 할 때 내부 DB 흐름 질문
안녕하세요. select * from article where board_id= 1 order by article_iddesc limit 30 offset 90;해당 쿼리문을 날렸을 때의 문제점을 설명하는 부분에서 이해가 잘 가지 않는 부분이 있어 질문드립니다! 제가 기억하는 내용이 틀릴 수도 있어 질문드립니다! 제가 알고있던 바로는 Secondary index에 의해 만들어진 자료구조에서 leaft노드는 원본 데이터의 주솟값을 가진다고 알고있었습니다.따라서 강의의 설명에서는 article id를 가지고 다시 clustered index를 통해 조회한다 했지만 바로 O(1)으로 원본 데이터에 접근한다는 이해는 틀린것일까요? 틀렸다면 어떤 부분일까요? 좋은 강의 잘 듣고있습니다! 감사드립니다! 학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
-
미해결실전에서 바로 써먹는 Kafka 입문
aws아닌 도커로는 안되나요?
aws 인스턴스 종료를 하는 경우 퍼블릭 ip가 바뀌어 proeprties내용을 변경해야하는 상황이 계속 발생하는데 도커로 진행해도 강의 수강에 지장없을까요?
-
미해결실전에서 바로 써먹는 Kafka 입문
파티션 증가 질문드립니다
안녕하세요 강사님파티션의경우 줄일수 없다고 설명해주셨는데만약 예로들어 실무에서 하나의 토픽 기준으로 3개의 파티션으로 작업도중 데이터 처리량이 많아져서 랙이 쌓이는걸 확인했을때파티션을 늘리고 컨슈머도 늘린다고 가정했을때따로 문제는없는걸까요? ( 줄이는경우에는 새로운 토픽을 생성하여 마이그레이션 한다고 설명해주셨는데 늘리는건 실제 사용중 파티션을 늘렸을때 아무런 문제가 없는지 궁금합니다 )
-
미해결Kafka & Spark 활용한 Realtime Datalake
consumer 실행 오류 질문: connect ip 관련
안녕하세요3주만에 카프카를 실행시키니 Consumer 실행에 문제가 있어 질문 남깁니다디스코드에도 글을 남겼으니 편하신 곳으로 답변 부탁드립니다 1-1) poll consumer를 10분정도 실행시켰다가(잘돌아갔음) 종료후 다시한번 실행한 상황1-2) poll consumer 실행하니까 반응이없음(python poll_consumer.py 입력하니 쉘 묵묵부답)1-3) consume consumer는 실행이 잘됨2)서버 껐다켜니 둘다 실행이 안됨3) UI가 안켜져서 보안그룹 public-nat를 건드리고나니 comsumer 실행시 아래와 같은 현상 발생<8월 31일>%3|1756625877.560|FAIL|rdkafka#consumer-1| [thrd:kafka03:9092/bootstrap]: kafka03:9092/bootstrap: Connect to ipv4#172.31.58.18:9092 failed: Connection refused (after 1ms in state CONNECT)%3|1756625878.559|FAIL|rdkafka#consumer-1| [thrd:kafka02:9092/bootstrap]: kafka02:9092/bootstrap: Connect to ipv4#172.31.39.189:9092 failed: Connection refused (after 1ms in state CONNECT)<9월 2일>%6|1756814397.408|FAIL|rdkafka#consumer-1| [thrd:kafka02:9092/bootstrap]: kafka02:9092/bootstrap: Disconnected while requesting ApiVersion: might be caused by incorrect security.protocol configuration (connecting to a SSL listener?) or broker version is < 0.10 (see api.version.request) (after 1248ms in state APIVERSION_QUERY)모든 강의자료에 나오는 보안그룹 관련 설정을 최대한 따라하였으나 잘 진행이 되지않습니다 public-nat 보안규칙은 아래와 같습니다 ..
-
해결됨은행 서버 프로젝트 실습을 통해 배우는 코틀린 마스터 클래스
access_token Db 저장건
휘발성이 강한 access_token 을 redis 에 저장하지 않고, 굳이 mysql 에 저장하는 이유가 있을까요??
-
해결됨개발자라면 알아야 할 redis 기본
Redis Pub/Sub, Stream과 Kafka 비교 질문입니다.
안녕하세요.Redis에 관련하여 좋은 강의 감사합니다. Redis Pub/Sub과 Stream 기능의 큰 역할은 메시지를 발행하면 구독하고 있던 서버에 실시간으로 전달해주는 것으로 이해했습니다. 위 역할만 하는 것이면 아래 이유로 Redis에 비해 Kafka를 선택하는 것이 일반적이지 않을까 생각이 듭니다.속도적인 부분은 Redis가 메모리 위에서 동작하여 Kafka 보다 빠르지만 유저 입장에서는 거의 차이가 없을 것 같다.Kafka가 더 많은 자원을 요구하지만 확장성과 영속성, 안전성을 고려했을 때 이점이 있다. 위 생각에 대하여 피드백 부탁드립니다.
-
미해결실전에서 바로 써먹는 Kafka 입문
섹션7 51 컨슈머서버 무한 리로드?
이전에 컨슈머 서버 ( email-send-consumer ) 에서는 문제가없었는데마지막 email-service에서는2025-08-28T23:50:12.394+09:00 INFO 40252 --- [ner#0.dlt-0-C-1] o.a.k.c.c.internals.ConsumerCoordinator : [Consumer clientId=consumer-email-service.dlt-29, groupId=email-service.dlt] Discovered group coordinator 13.209.11.23:9092 (id: 2147483646 rack: null)2025-08-28T23:50:12.394+09:00 INFO 40252 --- [ner#0.dlt-0-C-1] o.a.k.c.c.internals.ConsumerCoordinator : [Consumer clientId=consumer-email-service.dlt-29, groupId=email-service.dlt] Request joining group due to: rebalance failed due to 'The coordinator is not available.' (CoordinatorNotAvailableException)2025-08-28T23:50:12.396+09:00 INFO 40252 --- [ner#0.dlt-2-C-1] o.a.k.c.c.internals.ConsumerCoordinator : [Consumer clientId=consumer-email-service.dlt-31, groupId=email-service.dlt] Discovered group coordinator 13.209.11.23:9092 (id: 2147483646 rack: null)2025-08-28T23:50:12.396+09:00 INFO 40252 --- [ner#0.dlt-1-C-1] o.a.k.c.c.internals.ConsumerCoordinator : [Consumer clientId=consumer-email-service.dlt-30, groupId=email-service.dlt] (Re-)joining group2025-08-28T23:50:12.396+09:00 INFO 40252 --- [ner#0.dlt-2-C-1] o.a.k.c.c.internals.ConsumerCoordinator : [Consumer clientId=consumer-email-service.dlt-31, groupId=email-service.dlt] Request joining group due to: rebalance failed due to 'The coordinator is not available.' (CoordinatorNotAvailableException)2025-08-28T23:50:12.399+09:00 INFO 40252 --- [ner#0.dlt-0-C-1] o.a.k.c.c.internals.ConsumerCoordinator : [Consumer clientId=consumer-email-service.dlt-29, groupId=email-service.dlt] (Re-)joining group2025-08-28T23:50:12.401+09:00 INFO 40252 --- [ner#0.dlt-2-C-1] o.a.k.c.c.internals.ConsumerCoordinator : [Consumer clientId=consumer-email-service.dlt-31, groupId=email-service.dlt] (Re-)joining group2025-08-28T23:50:12.411+09:00 INFO 40252 --- [ner#0.dlt-1-C-1] o.a.k.c.c.internals.ConsumerCoordinator : [Consumer clientId=consumer-email-service.dlt-30, groupId=email-service.dlt] Successfully joined group with generation Generation{generationId=261, memberId='consumer-email-service.dlt-30-5a032e9e-a903-4fb7-9004-487d74eb6c79', protocol='range'}2025-08-28T23:50:12.411+09:00 INFO 40252 --- [ner#0.dlt-2-C-1] o.a.k.c.c.internals.ConsumerCoordinator : [Consumer clientId=consumer-email-service.dlt-31, groupId=email-service.dlt] Successfully joined group with generation Generation{generationId=261, memberId='consumer-email-service.dlt-31-0cdcda6c-6ddf-4e0b-980a-868f587ed2bd', protocol='range'}2025-08-28T23:50:12.411+09:00 INFO 40252 --- [ner#0.dlt-0-C-1] o.a.k.c.c.internals.ConsumerCoordinator : [Consumer clientId=consumer-email-service.dlt-29, groupId=email-service.dlt] Successfully joined group with generation Generation{generationId=261, memberId='consumer-email-service.dlt-29-2b16177f-2cc3-44c0-b244-50109078218e', protocol='range'}2025-08-28T23:50:12.411+09:00 INFO 40252 --- [ner#0.dlt-1-C-1] o.a.k.c.c.internals.ConsumerCoordinator : [Consumer clientId=consumer-email-service.dlt-30, groupId=email-service.dlt] Finished assignment for group at generation 261: {consumer-email-service.dlt-31-0cdcda6c-6ddf-4e0b-980a-868f587ed2bd=Assignment(partitions=[]), consumer-email-service.dlt-29-2b16177f-2cc3-44c0-b244-50109078218e=Assignment(partitions=[user.signed-up.dlt-0]), consumer-email-service.dlt-30-5a032e9e-a903-4fb7-9004-487d74eb6c79=Assignment(partitions=[])}...이런식으로 계속 로그가 반복됩니다프로듀서에 발행은 완료됐고 cli에서 메세지도 확인했는데컨슈머서버에서 저렇게 자꾸 정상적으로 작동을 하지않습니다 @Service public class UserSignedUpEventConsumer { private final EmailLogRepository emailLogRepository; public UserSignedUpEventConsumer(EmailLogRepository emailLogRepository) { this.emailLogRepository = emailLogRepository; } @KafkaListener( topics = "user.signed-up", groupId = "email-service", concurrency = "3" ) @RetryableTopic( attempts = "5", backoff = @Backoff(delay = 1000, multiplier = 2), // 1 초 2초 4초 8초 16초 5번 dltTopicSuffix = ".dlt" ) public void consume(String message) throws InterruptedException { UserSignedUpEvent userSignedUpEvent = UserSignedUpEvent.fromJson(message); // 실제 이메일 발송 로직 String receiverEmail = userSignedUpEvent.getEmail(); String subject = userSignedUpEvent.getName() + "님 회원가입 ㅊㅋ"; Thread.sleep(3000); System.out.println("메일 발송 완료"); // 이메일 발송 로그 저장 EmailLog emailLog = new EmailLog(userSignedUpEvent.getUserId(), receiverEmail, subject); emailLogRepository.save(emailLog); } 강사님 코드랑 이전 email-send-consumer 서비스 코드 및 야믈파일도 몇번 확인했는데 다른점이 없습니다 왜그런걸까요
-
미해결실전에서 바로 써먹는 Kafka 입문
섹션6 43 질문드립니다
안녕하세요, 강의 잘보고있습니다.프로듀서나 컨슈머서버 야믈파일에서 3개의 ip를 적고있는데만약 컨슈머 서버를 2대이상 돌렸을때 기준으로 각 서비스마다 ip를 똑같이 3개 적어야하는건가요? 아니면 1번 서버에서는 리더 노드ip 만2번 서버에서는 팔로워 파티션 노드 ip 만이런식으로 나눠서 적용하나요?또 저런식으로 서버가 나눠져있는경우 순차적으로 메세지 처리는 이전에 강의에서 언급한 하나의 파티션은 단 하나의 컨슈머에만 할당되고 컨슈머는 메세지를 순서대로 처리한다했는데 순서에는 상관이 없는걸까요? 추가로 그다음 섹션보다가 궁금한게현업에서도 라운드로빈방식을 대부분 사용하나요?실무기준에서 궁금합니다!
-
해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
강의 업데이트 계획이 궁금합니다.
현재 강의를 약 60% 정도 수강한 상태이며, 이제 강의가 아직 업데이트되지 않은 부분만 남아 있습니다.향후 강의 업데이트 일정이나 계획이 어떻게 되는지 알 수 있을까요?업데이트 계획에 따라 남은 강의를 수강하려고 합니다.