강의 자료에 대해서 궁금해요
미해결
Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
강의에서 나오는 자막들 따로 받거나 할 수는 없나요??
- spring-boot
- jpa
- 아키텍처
- spring-cloud
- kafka
- msa
- rabbitmq
173만명의 커뮤니티!! 함께 토론해봐요.
미해결
Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
강의에서 나오는 자막들 따로 받거나 할 수는 없나요??
미해결
Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
server: port: 8000 eureka: client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://localhost:8761/eureka spring: application: name: apiGateway-service cloud: gateway: server: webflux: default-filters: - name: GlobalFilter args: baseMessage: Spring Cloud Gateway WebFlux Global Filter preLogger: true postLogger: true routes: - id: user-service uri: lb://USER-SERVICE predicates: - Path=/user-service/** - id: first-service uri: lb://MY-FIRST-SERVICE predicates: - Path=/first-service/** filters: - AddRequestHeader=f-request, 1st-request-header-by-yaml - AddResponseHeader=f-response, 1st-response-header-from-yaml - name: LoggingFilter args: baseMessage: Spring Cloud Gateway WebFlux Logging Filter preLogger: true postLogger: true 다음처럼 apigateway의 설정파일을 작성하였습니다. 하지만 두 필터가 모두 동작하지 않습니다. 필터 클래스 모두 강의와 동일하게 작성하였고, first-service와 apigateway-service 모두 유레카 서버에 잘 등록되며, api 게이트웨이 또한 동작을 정상적으로 합니다. 혹시 어느 부분에서 잘못되었는 지 알 수 있을까요?
해결됨
Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
안녕하게요 강의를 보고 있는데 Kafka Connect 이 부분이 기존의 zookeeper 에서 kraft 로 버전이 변경되서 지원을 안 하는데 혹시 다른 방법이 있을까 ? 싶어 질문 올립니다. 참고로 블로그 도 여러개 봤는데 계속 에러가 걸려서 질문 올립니다. 정확히 kafka Connect 설치 를 하고 이거를 했을때 C:\Work\confluent-5.5.2>bin\windows\connect-distributed.bat etc\kafka\ connect-distributed.properties Classpath is empty. Please build the project first e.g. by running 'gradlew jarAll' C:\Work\confluent-5.5.2> 윈도우이고 이런 에러가 계속 뜨는데 해결이 안됩니다.
미해결
Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
이전 강의에서 콘솔로 디비 이벤트를 소스커넥트로 추적하고 싱크커넥트로 추적한 내용을 저장했는데 여기서는 소스커넥터로 추적하는 방식은 제외하고 싱크커넥터로 추적하는 방식을 사용해서 오더서비스 디비의 내용을 동기화한 건가요?
미해결
RabbitMQ를 이용한 비동기 아키텍처 한방에 해결하기
강의자료가 PDF로 변환하다보니, 문자 길이 때문인지 끊어지는 경우가 있는거 같은데 혹시 Notion 페이지로 제공해주실 수 잇나요?
미해결
Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
깃허브에 올라와있는 강의자료는 언제쯤 업데이트 될까요?
미해결
Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
강사님 이 부분에서 security password 가 (password 입력시) 기본값으로 사용하는 용도인가요? bCryPassword가 암호화를 해준다는 말은 알겠는데 이부분이 살짝 개념이해가 되지 않아 문의드립니다.
해결됨
Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
현재 강의를 약 60% 정도 수강한 상태이며, 이제 강의가 아직 업데이트되지 않은 부분만 남아 있습니다. 향후 강의 업데이트 일정이나 계획이 어떻게 되는지 알 수 있을까요? 업데이트 계획에 따라 남은 강의를 수강하려고 합니다.
미해결
RabbitMQ를 이용한 비동기 아키텍처 한방에 해결하기
학습중 궁금한 것은 언제든 문의 하세요. 질문을 최대한 자세히 남겨주시면 반드시 답변 드리도록 하겠습니다. 추가로 알고 싶은 내용도 요청해주시면 강의 자료를 업데이트 해서 제공할 예정입니다. application.yml spring: application: name: HelloMessageQueue rabbitmq: host: localhost port: 5672 username: admin password: admin server: port: 8080 docker-compose.yml services: rabbitmq: image: rabbitmq:3-management container_name: mq ports: - "5672:5672" - "15672:15672" environment: RABBITMQ_ERLANG_COOKIE: rabbitmqCookie RABBITMQ_DEFAULT_USER: admin RABBITMQ_DEFAULT_PASS: admin 이렇게 해서 실행하면 2025-08-08T11:17:15.145+09:00 ERROR 11684 --- [HelloMessageQueue] [ restartedMain] o.s.boot.SpringApplication : Application run failed org.springframework.context.ApplicationContextException: Failed to start bean 'container' at org.springframework.context.support .DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:408) ~[spring-context-6.2.9.jar:6.2.9] at org.springframework.context.support .DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:394) ~[spring-context-6.2.9.jar:6.2.9] at org.springframework.context.support .DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:586) ~[spring-context-6.2.9.jar:6.2.9] at java.base/java.lang.Iterable.forEach(Iterable.java:75) ~[na:na] at org.springframework.context.support .DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:364) ~[spring-context-6.2.9.jar:6.2.9] at org.springframework.context.support .DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:310) ~[spring-context-6.2.9.jar:6.2.9] at org.springframework.context.support .AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:1006) ~[spring-context-6.2.9.jar:6.2.9] at org.springframework.context.support .AbstractApplicationContext.refresh(AbstractApplicationContext.java:630) ~[spring-context-6.2.9.jar:6.2.9] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.5.4.jar:3.5.4] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) ~[spring-boot-3.5.4.jar:3.5.4] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) ~[spring-boot-3.5.4.jar:3.5.4] at org.springframework.boot.SpringApplication.run (SpringApplication.java:318) ~[spring-boot-3.5.4.jar:3.5.4] at org.springframework.boot.SpringApplication.run (SpringApplication.java:1361) ~[spring-boot-3.5.4.jar:3.5.4] at org.springframework.boot.SpringApplication.run (SpringApplication.java:1350) ~[spring-boot-3.5.4.jar:3.5.4] at com.study .rabbitmq.RabbitmqApplication.main(RabbitmqApplication.java:10) ~[main/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.springframework.boot.devtools.restart.RestartLauncher.run (RestartLauncher.java:50) ~[spring-boot-devtools-3.5.4.jar:3.5.4] Caused by: org.springframework.amqp.AmqpIllegalStateException: Fatal exception on listener startup at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.waitForConsumersToStart(SimpleMessageListenerContainer.java:643) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doStart(SimpleMessageListenerContainer.java:603) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.start(AbstractMessageListenerContainer.java:1417) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.context.support .DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:405) ~[spring-context-6.2.9.jar:6.2.9] ... 19 common frames omitted Caused by: org.springframework.amqp.rabbit.listener.exception.FatalListenerStartupException: Authentication failure at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:631) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.initialize(SimpleMessageListenerContainer.java:1482) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$ AsyncMessageProcessingConsumer.run (SimpleMessageListenerContainer.java:1322) ~[spring-rabbit-3.2.6.jar:3.2.6] at java.base/ java.lang.Thread.run (Thread.java:842) ~[na:na] Caused by: org.springframework.amqp.AmqpAuthenticationException: com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile. at org.springframework.amqp.rabbit.support .RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java:64) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:632) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createConnection(CachingConnectionFactory.java:726) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.createConnection(ConnectionFactoryUtils.java:257) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils$RabbitResourceFactory.createConnection(ConnectionFactoryUtils.java:345) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.doGetTransactionalResourceHolder(ConnectionFactoryUtils.java:140) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.getTransactionalResourceHolder(ConnectionFactoryUtils.java:102) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.getTransactionalResourceHolder(ConnectionFactoryUtils.java:85) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:625) ~[spring-rabbit-3.2.6.jar:3.2.6] ... 3 common frames omitted Caused by: com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile. at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:395) ~[amqp-client-5.25.0.jar:5.25.0] at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:1251) ~[amqp-client-5.25.0.jar:5.25.0] at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:1198) ~[amqp-client-5.25.0.jar:5.25.0] at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.connectAddresses(AbstractConnectionFactory.java:678) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.connect(AbstractConnectionFactory.java:647) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:593) ~[spring-rabbit-3.2.6.jar:3.2.6] ... 10 common frames omitted 이 에러가 발생합니다 계정도 있는데 인증이 안되는 이유를 모르겠습니다
해결됨
RabbitMQ를 이용한 비동기 아키텍처 한방에 해결하기
안녕하세요. 트랜잭션 메시징에 대해 궁금한 것이 생겨 질문드립니다. 트랜잭션 메시징은 데이터베이스 작업과 메시지 발행 작업을 원자적으로 수행하여 데이터의 일관성을 보장하는 것으로 알고 있습니다. 강의 내용 중 '트랜잭션 메시징의 한계'에서 분산 트랜잭션을 완벽하게 보장하지는 않는다고 하셔서 이를 DB의 트랜잭션과 메시지 전송의 트랜잭션이 서로 독립적으로 작동한다고 이해했습니다. 그럼 RabbitMQ에서 트랜잭션 메시징을 지원한다고 할 수 있나요?
미해결
Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
인사말 안녕하세요. 질 높은 강의를 제공해주셔서 너무 감사하다는 말씀드립니다. 아직 강의를 모두 본 것은 아니어서, 제가 질문드리고자 하는 내용이 강의에 포함이 되어있을지 모르겠습니다만.. 궁금한 내용을 질문드립니다. 질문 많은 모놀리식 프로젝트에서는 Spring Web + Spring Data JPA를 의존성을 주입하고 개발을 하고 저 또한 이러한 방식의 개발을 경험해왔습니다. Spring Data JPA와 Spring Web은 동기방식으로 동작하게 되는데, MSA의 독립 모듈을 만들 때 해당 의존성들을 사용하는 것이 바람직한지 모르겠습니다. 강의의 내용처럼 하나의 서비스는 독립적으로 구성된 수십개에서 수백개의 독립된 애플리케이션으로 동작을 하게 될 것인데요. 상황에 따라 다르기는 하겠지만 Spring Web과 Spring Data JPA를 사용하는 독립된 애플리케이션이 있게 된다면 이쪽에서 병목이 일어나 엄청난 성능 이슈가 발생할 것으로 생각이듭니다. 이와 같은 고민을 갖고 GPT한테 물어보니 WebFlux와 R2DBC를 사용하여 모두 비동기적으로 만드는 것이 권장되는 사항이라고 하는데 이 답변이 맞을까요? MSA를 구성한다고 한들, 모놀리식보다 성능상 좋지가 않으면 MSA로 구축할 필요성이 없을 것인데, 제가 우려하는 성능상의 심각한 문제 / 병목현상을 예방하기 위한 설계를 어떻게 해야하는지 너무 궁금합니다. 추가적으로는 Speing web이나 Spring Data Jpa가 MSA에거 어느 점에 필요하게 됭까요? 성능 관점에서 도무지 필요성을 느끼지 못하고있습니다. 질문이 너무 두서가 없는데... 질문 내용이 강사님께 잘 전달되었길 바랍니다..!
미해결
Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
강의를 한 번 수강했던 수강생입니다. 반년전 듣고 실습을 안해서 까먹어서 다시 들어볼려고 하는데 어떤 게 업데이트 된 건지 알 수 있을까요? 기존에 커리큘럼별 강의 제목은 같은데 업데이트 된 건가요? 아니면 새로 찍으신 강의가 별도로 올라와있는건가요?
미해결
Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
spring_cloud_gateway_requests_seconds_count{ httpMethod ="GET", httpStatusCode ="401", instance ="localhost:8000", job ="apigateway-service", outcome ="CLIENT_ERROR", routeId ="user-service", routeUri ="lb://USER-SERVICE", status ="UNAUTHORIZED"} 22 spring_cloud_gateway_requests_seconds_count{ httpMethod ="GET", httpStatusCode ="404", instance ="localhost:8000", job ="apigateway-service", outcome ="CLIENT_ERROR", routeId ="order-service", routeUri ="lb://ORDER-SERVICE", status ="NOT_FOUND"} 회원가입과 로그인만 하더라도 이러한 것들의 숫자가 올라가 총 요청 수 중 성공한 숫자가 매우 적습니다. chat gpt에서는 자동으로 health-check를 해서 그렇다라고는 하는데 정확히 어떤 것이 문제인지 잘 모르겠습니다.
해결됨
Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
java.sql.SQLException: No suitable driver found for jdbc:h2:mem:testdb java.sql.SQLException: Access denied for user 'root'@' localhost ' (using password: YES) 현재 kafak connect 연결시 이런 오류가 뜹니다. order-service를 mariadb Driver로 설정했는데 왜 h2메모리방식의 드라이버를 찾는지 이유를 잘 모르겠으며 해결방법이 절실합니다. Kafka의 zookeeper, Kafka server는 현재 작동이 잘됩니다. 윈도우 사용자입니다. 도움이 절실합니다.
미해결
Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
현재 zookeeper, kafka server는 다 실행되고 topic list도 잘 나오는 상황입니다. 하지만 현재 Caused by: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/mydb 이 에러 때문에 진도를 못나가고 있는 상황입니다. 강의 그대로 했음에도 불구하고 어떤것이 문제인지 모르겠습니다. 제발 도와주세요
미해결
Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
기존에는 http://localhost:8081 과같이 보내줬는데, 이걸 lb:/MY-FIRST-SERVICE 로 바꿨습니다. 그렇다면, 원래 localhost:8081로 직접 http 프로토콜로 보내줬던건, 유레카를 거치지 않았고, 하드코딩으로 직접 보내줬던 것이고, 그리고 lb:/를 이용하는 것이 유레카에 저장되어 있는, 정보들을 통해 읽어와서 동적으로 보내주는 것으로 이해하였는데, 제가 이해한게 맞을까요?
해결됨
RabbitMQ를 이용한 비동기 아키텍처 한방에 해결하기
학습중 궁금한 것은 언제든 문의 하세요. 질문을 최대한 자세히 남겨주시면 반드시 답변 드리도록 하겠습니다. 추가로 알고 싶은 내용도 요청해주시면 강의 자료를 업데이트 해서 제공할 예정입니다. 저만 궁금한 걸 수 있는데, 예를들어 Producer가 두개일 때 이 경우는 스프링 애플리케이션의 publish하는 두개의 스레드를 의미하는 건지... 애플리케이션 두 개를 의미하는 건지... 아니면 커넥션 두개를 의미하는 건지... 무엇을 기준으로 Producer/Consumer 단위를 세는건지 아시나요 ?
해결됨
RabbitMQ를 이용한 비동기 아키텍처 한방에 해결하기
안녕하세요 강의 잘 듣고 있습니다. 섹션2 12번 강의에서 ( 관심사 기반의 뉴스 레터 발행 / 구독 모델 ) 에서 질문 있습니다. fanout exchange는 바인딩된 모든 큐에 메시지를 보내는 방식이므로 모든 큐에 메시지가 가는 것으로 알고 있습니다. 예를 들어 제가 java 라는 특정 topic을 구독하면 java queue 에 있는 메시지만 계속 소비할텐데, 그러면 나머지 spring queue나 vue queue 에는 메시지가 계속 쌓여 문제가 되는 것 아닌가요 ? 발행/구독 모델을 왜 fanout exchange로 구현하신 건지 궁금합니다.
해결됨
RabbitMQ를 이용한 비동기 아키텍처 한방에 해결하기
안녕하세요. 강의 잘 듣고 있습니다. 섹션2. 8번 강의 11분 13초 쯤에 하시는 말씀에 의문이 들어 질문글 남깁니다. 이 부분 설명하실때 ' 컨슈밍을 할때 파라미터로 받은 초를 슬립을 준 뒤에 소진을 하겠다' 라고 하셨는데, 메시지를 받은 순간 이미 소진이 시작 된 것이고 각각 2초 4초 5초뒤에 소진이 끝나는 것 아닌가요? 조금 헷갈려서 질문 드립니다. 좋은 강의 감사드립니다.
미해결
Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
server: port: 8000 eureka: client: register-with-eureka: false fetch-registry: false service-url: defaultZone: http://localhost:8761/eureka spring: application: name: apigateway-service cloud: gateway: server: webflux: routes: - id: first-service uri: http://localhost:8081/ predicates: - Path=/first-service/** filters: - AddRequestHeader=first-request, first-request-header2 - AddResponseHeader=first-response, first-response-header2 - id: second-service uri: http://localhost:8082/ predicates: - Path=/second-service/** filters: - AddRequestHeader=second-request, second-request-header2 - AddResponseHeader=second-response, second-response-header2 위처럼 weflux:라고 yml에서 작성해주셔야 잘 동작합니다.