묻고 답해요
167만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결비전공자도 이해할 수 있는 쿠버네티스 입문/실전
쿠버네티스 학습
안녕하세요 선생님!강의 잘 듣고 있습니다.최대한 쉽게 설명해주시는 덕분에 이해가 잘 되어 도움 많이 되고 있습니다.이제 강의 내용은 모두 반복 학습하여 익혔는데 이후 쿠버네티스에 대해 좀 더 깊이 공부해 볼 만한 부분이 있을까요?? 앞으로의 학습 방향 추천 부탁드립니다 :)
-
미해결실전에서 바로 써먹는 Kafka 입문
UserSignedUpEventConsumer 에서 로그 DB 저장 문의
말씀해주신 것처럼 컨슈머 로직 안에 로그를 디비로 저장하는 부분이 비동기 처리를 하기 위해 kafka를 도입하는 것과 상충하지 않는지 의문입니다. @Service public class UserSignedUpEventConsumer { private 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), 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); } } 이 부분을 실무레벨에서 해결한다면 어떤 방법이 있는지 궁금합니다.
-
해결됨빠르게 배우는 Spring Cloud 기초(MSA)
프로젝트 환경세팅 파일 왜 안보일까요...
강의 관리가 안된느 것 같아 아쉽습니다.신속하게 답변 부탁드립니다..
-
해결됨비전공자도 이해할 수 있는 MSA 입문/실전 (feat. Spring Boot)
MSA에서 서비스별 DB 작성에 관해
안녕하세요.언제나 좋은 강의 만들어주셔서 감사합니다.강의에서 MSA는 서비스별로 DB를 구축하는 것으로 설명해주셨는데요.이 경우, 서비스 수가 늘어날수록 데이터베이스도 함께 증가하게 되어고정비용이 기하급수적으로 늘어날 것 같습니다.실제로 기업에서 사용하는 MSA 구조에서도이와 같이 서비스별로 별도의 데이터베이스를 구축하는지 궁금합니다.
-
미해결비전공자도 이해할 수 있는 MSA 입문/실전 (feat. Spring Boot)
Microservice 에 DB 띄우기
Microservice 에 DB 를 띄우게 될때 DB 를 여러대 띄우는것 같은데저렇게 하지않고하나의 DB 를 띄우고 스키마로 분리하는 경우도 있나요 ?? 너무 낭비가 되지 않나 ?? 생각도 들어서요
-
미해결비전공자도 이해할 수 있는 MSA 입문/실전 (feat. Spring Boot)
MSA 프로젝트 요구사항 및 설계 에서의 FK
안녕하세요 강의 잘 듣고있습니다.MSA 프로젝트 요구사항 및 설계 부분에서 모놀로식으로 설계하게 될때는FK 를 걸지만 MSA 에서는 DB가 독립적으로 분리되어 있어서 FK 를 걸 수 없을것 같습니다 .Application 단에서도 하지않나요 ?? 예를들어서 @ManyToOneuser: User;
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
kafka 업데이트 강의 듣고 시포요
선생님 kafka 업데이트 강의 듣고 싶어요♥
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
강의 교안
강의 교안 지금은 받을수있을까요
-
미해결MSA 아키텍처에 사용되는 Gateway 패턴 구현하기
교안에 사용되는 app.js 파일은 어디서 받을수 있을까요?
15. 포멧팅 형식을 따르는 yaml 잓겅 및 client 코드에서 사용 되는 app.js 파일은 어디서 받을수 있을까요?
-
미해결실전에서 바로 써먹는 Kafka 입문
리더 파티션 선출 규칙에 관한 질문
강사님, 안녕하세요. 강의 잘듣고 있습니다! 실습을 하고 있는데 궁금한 점이 있어서 글을 남깁니다. 혹시 파티션 중 리더 replica를 선출하는 규칙이 있는지 궁금합니다. 예를들면 파티션에 1,2,3 번 replica가 있었고 리더였던 1번 replica가 중단됐을 경우 2번, 3번 replica 중 어떤 것이 리더가 되는지 궁금합니다. 시간되실때 답변 꼭 부탁드립니다. 감사합니다!
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
마이크로서비스간 통신 시, 인증 처리
유저서비스에서 주문서비스로 주문 목록을 rest api 로 요청을 보내는데, 주문 서비스에서 주문 목록에 대한 api 는 유저서비스 의 IP만 접근하도록 방어 처리도 따로 필요 한가요 ??
-
해결됨비전공자도 이해할 수 있는 쿠버네티스 입문/실전
Docker Desktop 설치 관련 질문드립니다!
안녕하세요.자료 내의 URL 통해 Docker Desktop설치를 진행하였습니다! Dokcer Desktop설치 이후 쿠버 공식페이지에서 kubectl 1.35버전 다운로드하니, connectex 오류가 발생하였습니다. Docker Desktop에서 "Enable Kubernetes 활성"-> "kubeadm" 설치하니 kubectl 1.34로 설치되어 정상 확인되었는데, 버전 호환이 따로 있는걸까요?Client Version: v1.35.0Kustomize Version: v5.7.1Unable to connect to the server: dial tcp [::1]:8080: connectex: No connection could be made because the target machine actively refused it.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
api gateway 에서 인증 처리
api gateway 에서 jwt 검증을 해서 분기를 시키는데, 세션-쿠키 방식일때도 api-gateway에서 처리 하나요 ?만약 세션-쿠키 방식일 때,user-service 에서 인증 처리한다고 하면, order 서비스에서 인증이 필요한 경우, user-service로 http 통신으로 인증을 확인하나요 ?
-
미해결실전에서 바로 써먹는 Kafka 입문
kafka 실패 후 재시도 DLT 소비 무한으로 하는 현상이 발생합니다
현상:아래에도 동일하게 이슈 올려주신 분이 있는 것으로 보이는데 postman으로 다음과 같이 요청하였을 때, kafka에서 DLT 소비하는 과정에서 무한 반복하는 현상이 발생하면서 DLT 토픽 자체에 계속 쌓이게 됩니다! @RetryableTopic에 autoStartDltHandler = False 설정을 해주거나, @DLTHandler를 정의 해줘야 DLT 소비를 무한으로 하지 않는 것 같은데 뭔가 설정이 잘못 된게 있을까요? ㅠ 요청 파라미터:{ "from": "sender@naver.com", "to": "fail@naver.com", "subject": "heyyyy", "body": "helloo" }2026-02-01T15:53:25.480+09:00 ERROR 15124 --- [email-send-consumer] [ner#0.dlt-0-C-1] k.r.DeadLetterPublishingRecovererFactory : Record: topic = email.send.dlt, partition = 0, offset = 605, main topic = email.send threw an error at topic email.send.dlt and won't be retried. Sending to DLT with name email.send.dlt. org.springframework.kafka.listener.ListenerExecutionFailedException: Listener failed at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.decorateException(KafkaMessageListenerContainer.java:3014) ~[spring-kafka-4.0.2.jar:4.0.2] at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeOnMessage(KafkaMessageListenerContainer.java:2914) ~[spring-kafka-4.0.2.jar:4.0.2] at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeOnMessage(KafkaMessageListenerContainer.java:2880) ~[spring-kafka-4.0.2.jar:4.0.2] at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeRecordListener(KafkaMessageListenerContainer.java:2790) ~[spring-kafka-4.0.2.jar:4.0.2] at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeWithRecords(KafkaMessageListenerContainer.java:2632) ~[spring-kafka-4.0.2.jar:4.0.2] at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeRecordListener(KafkaMessageListenerContainer.java:2526) ~[spring-kafka-4.0.2.jar:4.0.2] at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeListener(KafkaMessageListenerContainer.java:2164) ~[spring-kafka-4.0.2.jar:4.0.2] at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeIfHaveRecords(KafkaMessageListenerContainer.java:1541) ~[spring-kafka-4.0.2.jar:4.0.2] at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.pollAndInvoke(KafkaMessageListenerContainer.java:1479) ~[spring-kafka-4.0.2.jar:4.0.2] at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.run(KafkaMessageListenerContainer.java:1348) ~[spring-kafka-4.0.2.jar:4.0.2] at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1804) ~[na:na] at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na] Caused by: org.springframework.kafka.listener.TimestampedException: Exception thrown at 2026-02-01T06:53:25.480044400Z at org.springframework.kafka.listener.adapter.KafkaBackoffAwareMessageListenerAdapter.onMessage(KafkaBackoffAwareMessageListenerAdapter.java:100) ~[spring-kafka-4.0.2.jar:4.0.2] at org.springframework.kafka.listener.adapter.KafkaBackoffAwareMessageListenerAdapter.onMessage(KafkaBackoffAwareMessageListenerAdapter.java:49) ~[spring-kafka-4.0.2.jar:4.0.2] at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeOnMessage(KafkaMessageListenerContainer.java:2901) ~[spring-kafka-4.0.2.jar:4.0.2] ... 10 common frames omitted Caused by: org.springframework.kafka.listener.ListenerExecutionFailedException: invokeHandler Failed at org.springframework.kafka.listener.adapter.MessagingMessageListenerAdapter.checkAckArg(MessagingMessageListenerAdapter.java:519) ~[spring-kafka-4.0.2.jar:4.0.2] at org.springframework.kafka.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:496) ~[spring-kafka-4.0.2.jar:4.0.2] at org.springframework.kafka.listener.adapter.MessagingMessageListenerAdapter.invoke(MessagingMessageListenerAdapter.java:425) ~[spring-kafka-4.0.2.jar:4.0.2] at org.springframework.kafka.listener.adapter.RecordMessagingMessageListenerAdapter.onMessage(RecordMessagingMessageListenerAdapter.java:92) ~[spring-kafka-4.0.2.jar:4.0.2] at org.springframework.kafka.listener.adapter.RecordMessagingMessageListenerAdapter.onMessage(RecordMessagingMessageListenerAdapter.java:52) ~[spring-kafka-4.0.2.jar:4.0.2] at org.springframework.kafka.listener.adapter.KafkaBackoffAwareMessageListenerAdapter.invokeDelegateOnMessage(KafkaBackoffAwareMessageListenerAdapter.java:106) ~[spring-kafka-4.0.2.jar:4.0.2] at org.springframework.kafka.listener.adapter.KafkaBackoffAwareMessageListenerAdapter.onMessage(KafkaBackoffAwareMessageListenerAdapter.java:97) ~[spring-kafka-4.0.2.jar:4.0.2] ... 12 common frames omitted Caused by: java.lang.IllegalStateException: No Acknowledgment available as an argument, the listener container must have a MANUAL AckMode to populate the Acknowledgment. ... 19 common frames omitted Caused by: org.springframework.kafka.listener.TimestampedException: Exception thrown at 2026-02-01T06:53:25.480044400Z Caused by: org.springframework.kafka.listener.ListenerExecutionFailedException: invokeHandler Failed Caused by: java.lang.IllegalStateException: No Acknowledgment available as an argument, the listener container must have a MANUAL AckMode to populate the Acknowledgment. > Task :com.example.emailsendconsumer.EmailSendConsumerApplication.main() FAILED Execution failed for task ':com.example.emailsendconsumer.EmailSendConsumerApplication.main()'. > Build cancelled while executing task ':com.example.emailsendconsumer.EmailSendConsumerApplication.main()' * Try: > Run with --stacktrace option to get the stack trace. > Run with --info or --debug option to get more log output. > Run with --scan to get full insights from a Build Scan (powered by Develocity). > Get more help at https://help.gradle.org. BUILD FAILED in 17s 3 actionable tasks: 2 executed, 1 up-to-date 코드 발생:오류 발생하는 것으로 보이는 consumer 코드는 다음과 같습니다. 우선 강사님 코드와 다른 점은 Backoff 부분인데 이건 라이브러리 버전 문제 인 것 같아서 넘어갔습니다. @Service public class EmailSendConsumer { @KafkaListener( topics = "email.send", groupId = "email-send-group" ) @RetryableTopic( attempts = "5", backOff = @org.springframework.kafka.annotation.BackOff( delay = 1000, multiplier = 2.0 ), dltTopicSuffix = ".dlt" ) public void consume(String message) { System.out.println("Received message: " + message); EmailSendMessage emailSendMessage = EmailSendMessage.fromJson(message); if (emailSendMessage.getTo().equals("fail@naver.com")) { // 잘못된 이메일 주소로 인해 발송 실패 throw new RuntimeException("Simulated email sending failure"); } // 이메일 전송 로직 구현 생략 (예: SMTP 서버를 통해 이메일 전송) try { Thread.sleep(3000); } catch (InterruptedException e) { throw new RuntimeException("Email sending interrupted", e); } System.out.println("Email sent to: " + emailSendMessage.getTo()); } }
-
미해결주문시스템으로 알아보는 분산트랜잭션
주문이벤트 발행에서 이벤트 발행을 동기적으로 처리하는 이유
안녕하세요, placeOrder 메서드의 TransactionSynchronization 구현 부분에 대해 질문드립니다!afterCommit() 내부에서 Kafka 전송을 동기적으로 처리하고 계신데, 이벤트 발행 안정성을 위한 의도적인 설계인지 궁금합니다!비동기로 처리하면 API 응답은 빨라지지만 전송 실패 처리가 복잡해진다고 생각하는데, Outbox Pattern 같은 메시지 전송 보장 메커니즘을 적용하지 않은 상태에서 안정성을 위해 동기 처리를 선택하신 걸까요?현업에서는 어떤 방법을 선호하는지도 궁금합니다! 좋은 강의 감사합니다.
-
미해결MSA 아키텍처에 사용되는 Gateway 패턴 구현하기
소스 download
소스 github으로 받을수 있나요?
-
해결됨카카오 면접관이 알려주는 MSA 관점에서의 분산 트랜잭션 패턴
23강 예제 질문입니다! (서비스 1 > 2 > 3 호출 시나리오 관련)
안녕하세요!기존에 설명해주신 Orchestration 예제의 다이어그램과 호출 순서가 실습 코드랑 다른 것 같아서 질문드립니다. 다이어그램 : 오케스트레이터가 모두 요청/응답 받는 구조. 오케스트레이터 -> 2번 호출/응답 -> 오케스트레이터가 다시 3번 호출/응답 실습코드 : 오케스트레이터가 2번 서비스를 호출하고 2번 서비스가 3번 서비스를 호출하는 형태 질문 1)위 2개의 내용이 다른 이유가 있을까요? + 오케스트레이션 패턴은 오케스트레이터가 모든 서비스를 호출하고, 다른 서비스는 오케스트레이터에 답변만 해주는 구조이고, 이 때문에 오케스트레이터가 SPOF가 될 수 있다고 이해했는데, 제가 잘못 이해한걸까요? 질문 2)지금 예제에서는 REST API를 쓰는지, kafka 이벤트는 쓰는 여부 말고는 오케스트레이션/코레오그래피 모두 서비스 1 -> 2 -> 3 호출 하는 시나리오와 보상 처리를 하는 방법이 크게 차이가 없는 것 같습니다 (DLQ외) 예제를 보니까 헷갈리게 되는 것 같은데 제가 어떻게 이해하면 좋을까요? 감사합니다!
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
섹션 19 질문드립니다
섹션 19 부분은 예전에 강의하셨을 때 쓰신 스프링부트 2점대 버전을 3점대 버전으로 업그레이드하는 강의인가요? 최신 강의 기준 업데이트 하신 3점대 버전으로 강의를 듣고 있는데 섹션 19에서 강의가 정확히 어떤 강의인지 궁금합니다. 만약 2점대 버전을 3점대 버전으로 업그레이드 하는 강의라면, 섹션 19에서 분산 트레이싱, swagger, kubernates 부분만 들어도 되는걸까요?
-
미해결[2026 NEW] 기초부터 이해하는 쉬운 쿠버네티스 - 리소스편
영상 강의에서 CoreDNS 이론을 설명하는 부분이 누락된 것 같습니다.
안녕하세요.영상 강의에서 CoreDNS 이론을 설명하는 부분이 누락된 것 같습니다. 강의 자료에는 있는데, 영상 자료는 없는 것 같아서요.확인 부탁 드려요. 감사합니다.
-
해결됨[2026 NEW] 기초부터 이해하는 쉬운 쿠버네티스 - 리소스편
51. L7 라우터와 인그레스 실습... 강의 복습 중 ingress 설정과, nginx.conf 파일 내용에 대해서 궁금한 점이 생겼습니다.
안녕하세요 선생님, 강의 복습 중에 조금 헷갈리는 부분이 생겨서 문의드립니다.현재 github 에서 제공해주시는 SUBSMANAER 프로젝트에서 yaml/01-basic/ingress/sm-ingress-domain.yaml파일에 보시면 다음과 같습니다.apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: sm-ingress namespace: subsmanager spec: ingressClassName: nginx rules: - host: subs-manager.com http: paths: - path: / pathType: Prefix backend: service: name: sm-frontend port: number: 80 - path: /users pathType: Prefix backend: service: name: sm-user port: number: 80 - path: /sub pathType: Prefix backend: service: name: sm-subs port: number: 80 - path: /recommend pathType: Prefix backend: service: name: sm-reco port: number: 80그리고 sm-frontend/nginx.conf 파일을 보면 아래와 같이 설정되어 있습니다.server { listen 80; location / { root /usr/share/nginx/html; index index.html; try_files $uri $uri/ /index.html; } # API 요청을 백엔드 서버로 프록시 location /users { proxy_pass http://sm-user:5000; } location /sub { proxy_pass http://sm-subs:5000; } location /recommend { proxy_pass http://sm-reco:5000; } } 여기서 갑자기 헷갈립니다.애초에 ingress 단에서 /sub//recommend , /user 요청에 대한 처리를 중간에 가로채서 처리를 하고 있는데, 굳이 frontend 에서 사용하는 nginx.conf 에도 설정하는 것이 좀 와닿지 않습니다. 이렇게 중복으로 설정해야되는 이유가 뭔지 궁금합니다!