안녕하세요, 선생님! 좋은 강의 감사합니다. 사이드 프로젝트를 진행하기 위해 이 강의를 신청해서 열심히 듣고 있습니다. 강의를 들으면서 궁금한 점이 생겨서 질문 드립니다. 제가 예매 시스템 을 개발하려고 하는데, 다음과 같은 여러 기능들을 구현해야 합니다: 채팅 기능 (강의에서 다루신 Chat API) AI 추천 기능 (Spring AI에서 제공하는 API) 데이터 수집 기능 (크롤링 API) 기타 예매 관련 API들 이런 상황에서 모듈 구조 설계 에 대해 고민이 됩니다. 방법 1: 모든 API 기능들을 하나의 API 모듈에서 관리 방법 2: 기능별로 모듈을 나누고, 각 모듈 내에서 해당 기능의 API들을 그룹화 어떤 방식이 더 적절한 설계일까요? 혹시 이런 다중 기능을 가진 시스템에서의 모듈 설계에 대한 조언을 해주실 수 있을까요? 감사합니다!
안녕하세요 강사님 제가 실전이라 생각하고 프론트랑 백엔드를 배포 했습니다. auto at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50) ~[spring-boot-devtools-3.5.3.jar:3.5.3] Caused by: org.springframework.data.redis.listener.adapter.RedisListenerExecutionFailedException: org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis at org.springframework.data.redis.listener.RedisMessageListenerContainer.lazyListen(RedisMessageListenerContainer.java:383) ~[spring-data-redis-3.5.1.jar:3.5.1] at org.springframework.data.redis.listener.RedisMessageListenerContainer.start(RedisMessageListenerContainer.java:361) ~[spring-data-redis-3.5.1.jar:3.5.1] at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:405) ~[spring-context-6.2.8.jar:6.2.8] ... 19 common frames omitted Caused by: org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$ExceptionTranslatingConnectionProvider.translateException(LettuceConnectionFactory.java:1858) ~[spring-data-redis-3.5.1.jar:3.5.1] at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$ExceptionTranslatingConnectionProvider.getConnection(LettuceConnectionFactory.java:1789) ~[spring-data-redis-3.5.1.jar:3.5.1] at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceC Redis 에러 (백엔드 에러는 이렇게 뜨고) 프론트 엔드 (로그인 하고 들어가는 거 잘됩니다. 채팅만 치면 저렇게 뜹니다.) EC2에서 redis 접속은 잘 됩니다. 프론트는 S3+cloudfront (도메인 적용 안함)를 통해 배포를 했고 둘다 https 는 적용했습니다. 백엔드는 Redis(ElastiCache(실시간 PubSub 기능을 위해) + EC2+RDS +nginx(https)+ 깃헙 액션으 로 배포했고 몇시간 쨰 하는데 저 에러가 뜹니다. 백엔드 배포 자체는 /opt ~ 를 통해서 배포 했습니다. 혹시 프론트 배포가 잘 못 된건가요? S3+cloudfront 면 안될수도 있나요? StompWebSocketConfig package org.example.javademo.chatserver2.chat.config; import org.springframework.context.annotation.Configuration; import org.springframework.messaging.simp.config.ChannelRegistration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; import org.springframework.web.socket.config.annotation.StompEndpointRegistry; import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; @Configuration @EnableWebSocketMessageBroker public class StompWebSocketConfig implements WebSocketMessageBrokerConfigurer { private final StompHandler stompHandler; public StompWebSocketConfig(StompHandler stompHandler) { this.stompHandler = stompHandler; } /** * 클라이언트가 WebSocket으로 접속할 수 있는 endpoint 설정 */ @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/connect") .setAllowedOrigins( ) // SockJS를 통해 ws가 아닌 환경에서도 연결 가능하게 설정 .withSockJS(); } /** * STOMP 메시지 브로커 설정 */ @Override public void configureMessageBroker(MessageBrokerRegistry registry) { // /publish 로 시작하는 메시지는 @MessageMapping 메서드로 라우팅 registry.setApplicationDestinationPrefixes("/publish"); // /topic 으로 시작하는 메시지는 메시지 브로커를 통해 구독자에게 전달 registry.enableSimpleBroker("/topic"); } /** * 클라이언트 → 서버 (inbound) 메시지 처리 쓰레드 풀 설정 */ @Override public void configureClientInboundChannel(ChannelRegistration registration) { registration.taskExecutor() .corePoolSize(10) .maxPoolSize(20) .keepAliveSeconds(60); } /** * 서버 → 클라이언트 (outbound) 메시지 처리 쓰레드 풀 설정 */ @Override public void configureClientOutboundChannel(ChannelRegistration registration) { registration.taskExecutor() .corePoolSize(10) .maxPoolSize(20) .keepAliveSeconds(60); } // 인증 등을 처리하고 싶을 경우 stompHandler 등록 (현재 주석처리) // @Override // public void configureClientInboundChannel(ChannelRegistration registration) { // registration.interceptors(stompHandler);... // } } 이거는 조금 수정했습니다. RedisConfig package org.example.javademo.chatserver2.common.configs; import org.example.javademo.chatserver2.chat.service.RedisPubSubService; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.RedisStandaloneConfiguration; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.listener.PatternTopic; import org.springframework.data.redis.listener.RedisMessageListenerContainer; import org.springframework.data.redis.listener.adapter.MessageListenerAdapter; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; @Configuration public class RedisConfig { @Value("${spring.data.redis.host}") private String host; @Value("${spring.data.redis.port}") private int port; // 연결 팩토리 생성 @Bean @Qualifier("chatPubSub") public RedisConnectionFactory chatPubSubFactory() { RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(); config.setHostName(host); config.setPort(port); return new LettuceConnectionFactory(config); } // String 기반 Redis 템플릿 @Bean @Qualifier("chatPubSub") public StringRedisTemplate stringRedisTemplate(@Qualifier("chatPubSub") RedisConnectionFactory connectionFactory) { return new StringRedisTemplate(connectionFactory); } // 메시지 수신 처리 리스너 어댑터 @Bean public MessageListenerAdapter messageListenerAdapter(RedisPubSubService redisPubSubService) { return new MessageListenerAdapter(redisPubSubService, "onMessage"); } // 수신 채널 주제 설정 @Bean public PatternTopic chatTopic() { return new PatternTopic("chat"); } // 메시지 수신을 처리하는 리스너 컨테이너. @Bean public RedisMessageListenerContainer redisMessageListenerContainer( @Qualifier("chatPubSub") RedisConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter, PatternTopic chatTopic ) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); container.addMessageListener(listenerAdapter, chatTopic); return container; } // (선택) Object 기반 Redis 템플릿 @Bean public RedisTemplate<String, Object> redisTemplate(@Qualifier("chatPubSub") RedisConnectionFactory connectionFactory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(connectionFactory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return template; } } ElastiCache로 접속은 굉장히 잘 됩니다. (EC2 내부에서는) 문제는 이게 UI 에 왜 안 뜨는지 모르겠습니다.
JwtAuthFilter에서 /connect 경로의 토큰 검증도 이루어진다면 interceptor는 구현할 필요는 없는건가요? 동일하게 subscribe, disconnect도 JwtAuthFilter에서 검증이 이루어지니까 interceptor 코드는 필요 없는 걸까요?
안녕하세요, 선생님! 8장 강의 학습 중에 궁금한 부분이 있어 이렇게 질문드립니다. 8장 실습 중 WebRTC 관련 예제를 크롬에서 먼저 실행한 뒤, 익스플로러 엣지에서 실행했더니 첨부한 이미지와 같은 현상이 발생했는데요, 혹시 이 경우가 왜 발생하는 건지 조언 구드려도 될까요? 강의 덕분에 많은 걸 배워가고 있습니다. 무더운 여름 건강 유의하시고, 감사합니다!
학습중 궁금한 것은 언제든 문의 하세요. 질문을 최대한 자세히 남겨주시면 반드시 답변 드리도록 하겠습니다. 추가로 알고 싶은 내용도 요청해주시면 강의 자료를 업데이트 해서 제공할 예정입니다. 저만 궁금한 걸 수 있는데, 예를들어 Producer가 두개일 때 이 경우는 스프링 애플리케이션의 publish하는 두개의 스레드를 의미하는 건지... 애플리케이션 두 개를 의미하는 건지... 아니면 커넥션 두개를 의미하는 건지... 무엇을 기준으로 Producer/Consumer 단위를 세는건지 아시나요 ?
안녕하세요 강의 잘 듣고 있습니다. 섹션2 12번 강의에서 ( 관심사 기반의 뉴스 레터 발행 / 구독 모델 ) 에서 질문 있습니다. fanout exchange는 바인딩된 모든 큐에 메시지를 보내는 방식이므로 모든 큐에 메시지가 가는 것으로 알고 있습니다. 예를 들어 제가 java 라는 특정 topic을 구독하면 java queue 에 있는 메시지만 계속 소비할텐데, 그러면 나머지 spring queue나 vue queue 에는 메시지가 계속 쌓여 문제가 되는 것 아닌가요 ? 발행/구독 모델을 왜 fanout exchange로 구현하신 건지 궁금합니다.
안녕하세요. 강의 잘 듣고 있습니다. 섹션2. 8번 강의 11분 13초 쯤에 하시는 말씀에 의문이 들어 질문글 남깁니다. 이 부분 설명하실때 ' 컨슈밍을 할때 파라미터로 받은 초를 슬립을 준 뒤에 소진을 하겠다' 라고 하셨는데, 메시지를 받은 순간 이미 소진이 시작 된 것이고 각각 2초 4초 5초뒤에 소진이 끝나는 것 아닌가요? 조금 헷갈려서 질문 드립니다. 좋은 강의 감사드립니다.
개발자라면 알아야 할 redis 기본 개발자라면 알아야 할 리눅스(linux-ubuntu) 기본 이거 두강좌 굉장히 저렴했던걸로 기억하는데 지금은 많이 올라갔네요 기존 수강생에게 이전 저렴한 가격으로 구입할수있는 할인쿠폰을 발행해주실수없으신지요? 괜히 가격인상됬다하니 구입하고싶은마음이 생겨났습니다. DB를 MYSQL을 사용하기에 선생님 강의 MYSQL둘다 구입했는데 그래서 REDIS가 뭔지 몰라서 관심밖이였었거든요 그리고 새로 개강한 eks를 활용한 spring 운영서버 배포(feat. devops의 모든것) 이강좌는 제가 구입해도될런지 잘모르겠습니다. 스프링부트로 게시판한번 만들어봤는데... 그단계의 연장선상인가요??? 빠르게 배우는 Spring Cloud 기초(MSA) 이강좌를 들어야만 새로개강한강좌를 이해할수있는건지요??? 스프링부트로 웹사이트만들어서 창업목적을 두고있는 사람입니다. 취업목적이아니라...
안녕하세요 강의 잘 듣고 있습니다. "5. websocket, stomp 비교" 강의 6:07초에 STOMP 흐름에서 궁금한 점이 있습니다! 방법1 "(클라이언트 1-> 서버)로 연결 요청 및 특정 room 구독"으로 되어 있어서 서버를 통해 브로커를 거쳐 구독하는 방법 방법2 "(클라이언트 2 -> 브로커)로 연결 요청 및 특정 room 구독"에서는 클라이언트 2는 웹 소켓 서버로 다이렉트로 전달하지 않고, 바로 브로커에게 요청을 보내는 방법 질문 두 가지 방법으로 요청을 할 수 있는건가요? 두 방법의 차이는 무엇인가요??
안녕하세요. 강의 잘 듣고 있습니다! http,websocket의 비교 강의를 듣다가 갑자기 궁금한게 생겼는데요. http 통신의 경우 요청을 보내는 쪽은 클라이언트로 정해져 있는 것 같은데, 웹 소켓 통신을 위해 클라이언트와 서버가 연결을 맺을 땐 연결 요청 주체 는 항상 클라이언트라고 보면 될까요? 반대로 서버가 클라이언트에게 연결 요청을 보낸 후 클라이언트와 웹 소켓 연결이 될 수도 있나요??
새로 개강한 강좌에 수강전문의게시판이없어서 여기에 질문을 남기게되었습니다. eks를 활용한 spring 운영서버 배포(feat. devops의 모든것) 이강좌가 새로 오픈했던데 빠르게 배우는 Spring Cloud 기초(MSA) 이강좌가 선수과정인가요??? 아니면 이걸안해도 새로 개강한강좌만 신청해도 되는관계인지 궁금합니다.
안녕하세요:) 도메인구성 강의 중 ddl-auto : update로 처음 설정 한 뒤 서버를 돌렸을 때 member 테이블 생성이 안되어서 ddl-auto: create로 바꾸신걸까요?? 제가 헷갈리는 부분이 처음 member테이블을 생성할 때는 ddl-auto: update로 설정했을 때에도 테이블생성이 되는 걸로 알고 있어서요. 혼자서 스프링부트 jpa프로젝트 만들엇을때도 ddl-auto:udpate로 엔티티테이블 잘 생성되었던 것 같은데 update를 꼭 create로 처음에 (지금처럼 member 테이블을 처음생성할 때) 바꿔줘야하는 건가요??
WssControllerV1 에서 @SendTo 어노테이션을 통해 구독중인 클라이언트들에게 메세지를 보낸다고 이해했는데, STOMP 문서를 읽어보니 SimpMessagingTemplate 를 통해 메세지를 보내는 것 같았습니다. 이 둘의 차이점과 @SendTo 를 사용하신 이유를 알 수 있을까요?
위와 같이 로그가 찍혔으면, DLQ에서 ack 상태가 되어야하는것 아닐까요? @RabbitListener(queues = RabbitMQConfig.DLQ) public void process(String message) { System.out.println("DLQ Message Received: " + message); try { String fixMessage = "success"; rabbitTemplate.convertAndSend( RabbitMQConfig.ORDER_EXCHANGE, "order.completed.shipping", fixMessage ); System.out.println("DLQ Message Sent: " + fixMessage); } catch (Exception e) { System.err.println("### [DLQ Consumer Error] " + e.getMessage()); } } 위의 코드인 경우 AUTO 모드로 동작해서 자동으로 DLQ에서 처리가 되면 ACK 을 받을 것이라 생각했는데, DLQ에서 unack 상태로 남아있어서 여쭤봅니다! 이후에 애플리케이션을 종료하면 DLQ에서는 다시 ready 상태가 되고, 애플리케이션을 실행하면 이를 실행하고 와 같이 로그가 찍힌 다음에 다시 unack 상태가 됩니다. 좋은 강의 감사드립니다 :)
알려주신데로 UserControllerV1.java에 어노테이션 추가하고 재기동한 뒤 검색 했는데...로그에 com.auth0.jwt.exceptions.JWTDecodeException: The token was expected to have 3 parts, but got 1. 이런 에러가 나옵니다.ㅠㅠ 개발자 도구에는 아래와 같은 에러가 나옵니다. UserControllerV1.java는 이렇게 작성되어 있습니다. 어떤 부분을 더 확인해야 하는지, 어떤 부분이 문제 인건지 확인 부탁드립니다.ㅠㅠ **추가로 에러내용 전체입니다. com.auth0.jwt.exceptions.JWTDecodeException: The token was expected to have 3 parts, but got 1. at com.auth0.jwt.TokenUtils.splitToken(TokenUtils.java:21) ~[java-jwt-3.12.0.jar!/:3.12.0] at com.auth0.jwt.JWTDecoder.<init>(JWTDecoder.java:36) ~[java-jwt-3.12.0.jar!/:3.12.0] at com.auth0.jwt.JWTDecoder.<init>(JWTDecoder.java:32) ~[java-jwt-3.12.0.jar!/:3.12.0] at com.auth0.jwt.JWT.decode(JWT.java:45) ~[java-jwt-3.12.0.jar!/:3.12.0] at com.example.demo.security .JWTProvider.decodedJWT(JWTProvider.java:109) ~[!/:0.0.1-SNAPSHOT] at com.example.demo.security .JWTProvider.getUserFromToken(JWTProvider.java:123) ~[!/:0.0.1-SNAPSHOT] at com.example.demo.domain.user.controller.UserControllerV1.searchUser(UserControllerV1.java:43) ~[!/:0.0.1-SNAPSHOT] 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.web.method.support .InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) ~[spring-web-6.1.13.jar!/:6.1.13] at org.springframework.web.method.support .InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) ~[spring-web-6.1.13.jar!/:6.1.13] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.1.13.jar!/:6.1.13] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) ~[spring-webmvc-6.1.13.jar!/:6.1.13] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) ~[spring-webmvc-6.1.13.jar!/:6.1.13] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.1.13.jar!/:6.1.13] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) ~[spring-webmvc-6.1.13.jar!/:6.1.13] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) ~[spring-webmvc-6.1.13.jar!/:6.1.13] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.1.13.jar!/:6.1.13] at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[spring-webmvc-6.1.13.jar!/:6.1.13] at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) ~[tomcat-embed-core-10.1.30.jar!/:na] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.1.13.jar!/:6.1.13] at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.30.jar!/:na] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) ~[tomcat-embed-core-10.1.30.jar!/:na] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.30.jar!/:na] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.30.jar!/:na] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.30.jar!/:na] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.30.jar!/:na] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.1.13.jar!/:6.1.13] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.13.jar!/:6.1.13] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.30.jar!/:na] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.30.jar!/:na] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.1.13.jar!/:6.1.13] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.13.jar!/:6.1.13] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.30.jar!/:na] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.30.jar!/:na] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.1.13.jar!/:6.1.13] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.13.jar!/:6.1.13] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.30.jar!/:na] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.30.jar!/:na] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-10.1.30.jar!/:na] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.30.jar!/:na] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) ~[tomcat-embed-core-10.1.30.jar!/:na] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.30.jar!/:na] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.30.jar!/:na] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.30.jar!/:na] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) ~[tomcat-embed-core-10.1.30.jar!/:na] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:384) ~[tomcat-embed-core-10.1.30.jar!/:na] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.30.jar!/:na] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:905) ~[tomcat-embed-core-10.1.30.jar!/:na] at org.apache.tomcat.util.net .NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) ~[tomcat-embed-core-10.1.30.jar!/:na] at org.apache.tomcat.util.net.SocketProcessorBase.run (SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.30.jar!/:na] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) ~[tomcat-embed-core-10.1.30.jar!/:na] at org.apache.tomcat.util.threads.ThreadPoolExecutor$ Worker.run (ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.30.jar!/:na] at org.apache.tomcat.util.threads.TaskThread$ WrappingRunnable.run (TaskThread.java:63) ~[tomcat-embed-core-10.1.30.jar!/:na] at java.base/ java.lang.Thread.run (Thread.java:833) ~[na:na]