- 끝나지 않는 한여름 - 평점 (8 / 10)
- 머더미스테리 오브 더 데드 - 평점 (7/10)
- 새장 속 제비는 꿈을 꾼다. - 평점 (7/10)
- 양심의 기생 - 평점 (5/10)
- 구두룡 저택의 살인사건 - 평점 (2 / 10)
전체 글
- 머더미스터리 순위 링크 2025.08.06 1
- 스프링부트 Websocket을 쓸 때 테스트 안되는 경우 2024.06.03 1
- 자바 코딩테스트 2024.05.24
- 스프링 부트 웹소켓 빈 등록 오류 2024.04.18 1
- jwt token 생성하는 가장 간단한 방법 2024.04.18
- redis properties 세팅 (빨간줄을 무서워하지말자) 2024.04.18
- JPA DATA 엔티티 어노테이션이 잘 작동하지 않을 때 2024.04.18
- multipart/form-data 로 파일과 데이터 둘 다 받기 2024.04.17
머더미스터리 순위 링크
스프링부트 Websocket을 쓸 때 테스트 안되는 경우
스프링 부트로 채팅 시스템을 만들기 위해 stomp방식으로 웹소켓을 구현하고
테스트를 해보려고
Postman, websocket king 으로 테스트를 하려고 했는데
테스트가 안됐다.
심지어 서버에는 아무 로그도 출력되지 않아서 뭐가 문제인지도 찾기 어려웠다.
원인은 sockJS였다.
첫번째로 SockJs를 빼보니 웹소켓 연결이 성공적으로 이뤄지는 것을 확인했다.
하지만 스프링 부트 웹소켓에서 sockJS가 빠진다면 아쉬울 것 같아서 버그 해결 방법을 찾아보던중에
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws")
.setAllowedOriginPatterns("*");
registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.setApplicationDestinationPrefixes("/app");
registry.enableSimpleBroker("/topic");
}
}
이런식으로 두가지 방법 다 registry에 등록하면 해결 된다는 것을 발견했다!
'스프링' 카테고리의 다른 글
| 스프링 부트 웹소켓 빈 등록 오류 (1) | 2024.04.18 |
|---|---|
| jwt token 생성하는 가장 간단한 방법 (0) | 2024.04.18 |
| redis properties 세팅 (빨간줄을 무서워하지말자) (0) | 2024.04.18 |
| JPA DATA 엔티티 어노테이션이 잘 작동하지 않을 때 (0) | 2024.04.18 |
| multipart/form-data 로 파일과 데이터 둘 다 받기 (0) | 2024.04.17 |
자바 코딩테스트
공백으로 구분 된 경우
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Deque;
import java.util.LinkedList;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 첫 줄에서 숫자 N 입력받기
int n = Integer.parseInt(br.readLine());
Deque<Deque<Integer>> deque = new LinkedList<>();
// N개의 줄에서 각각 공백으로 구분된 여러 개의 숫자 입력받기
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
Deque<Integer> tempDeque = new LinkedList<>();
while (st.hasMoreTokens()) {
tempDeque.add(Integer.parseInt(st.nextToken()));
}
deque.add(tempDeque);
}
// Deque 출력하기
for (Deque<Integer> innerDeque : deque) {
for (int num : innerDeque) {
System.out.print(num + " ");
}
System.out.println();
}
}
}
쉼표로 구분된 경우
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Deque;
import java.util.LinkedList;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 첫 줄에서 숫자 N 입력받기
int n = Integer.parseInt(br.readLine());
Deque<Deque<Integer>> deque = new LinkedList<>();
// N개의 줄에서 각각 쉼표로 구분된 여러 개의 숫자 입력받기
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), ",");
Deque<Integer> tempDeque = new LinkedList<>();
while (st.hasMoreTokens()) {
tempDeque.add(Integer.parseInt(st.nextToken()));
}
deque.add(tempDeque);
}
// Deque 출력하기
for (Deque<Integer> innerDeque : deque) {
for (int num : innerDeque) {
System.out.print(num + " ");
}
System.out.println();
}
}
}
자바 커스텀 정렬
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Main {
public static void main(String[] args) {
ArrayList<int[]> list = new ArrayList<>();
// 데이터 추가
list.add(new int[]{1, 3});
list.add(new int[]{2, 2});
list.add(new int[]{1, 1});
list.add(new int[]{2, 1});
list.add(new int[]{1, 2});
// 정렬
Collections.sort(list, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if (o1[0] != o2[0]) {
return Integer.compare(o1[0], o2[0]);
} else {
return Integer.compare(o1[1], o2[1]);
}
}
});
// 정렬된 결과 출력
for (int[] pair : list) {
System.out.println("[" + pair[0] + ", " + pair[1] + "]");
}
}
}'알고리즘' 카테고리의 다른 글
| 파이썬 백준 14584 (0) | 2024.01.18 |
|---|
스프링 부트 웹소켓 빈 등록 오류
백엔드 서버개발을 통합하고, 머지하는 과정에서 빈등록이 안된다는 오류가 발생했다.
아래는 에러 목록이다.
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration': Injection of autowired dependencies failed at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:503) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1414) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:518) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:973) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952) ~[spring-context-6.0.18.jar:6.0.18] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:615) ~[spring-context-6.0.18.jar:6.0.18] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.1.10.jar:3.1.10] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:738) ~[spring-boot-3.1.10.jar:3.1.10] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:440) ~[spring-boot-3.1.10.jar:3.1.10] at org.springframework.boot.SpringApplication.run(SpringApplication.java:324) ~[spring-boot-3.1.10.jar:3.1.10] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1317) ~[spring-boot-3.1.10.jar:3.1.10] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-3.1.10.jar:3.1.10] at com.roulette.roulette.RouletteApplication.main(RouletteApplication.java:12) ~[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.1.10.jar:3.1.10] Caused by: java.lang.RuntimeException: Could not postProcess org.springframework.security.config.annotation.web.builders.WebSecurity@6fbc0368 of type class org.springframework.security.config.annotation.web.builders.WebSecurity at org.springframework.security.config.annotation.configuration.AutowireBeanFactoryObjectPostProcessor.postProcess(AutowireBeanFactoryObjectPostProcessor.java:69) ~[spring-security-config-6.1.8.jar:6.1.8] at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration.setFilterChainProxySecurityConfigurer(WebSecurityConfiguration.java:148) ~[spring-security-config-6.1.8.jar:6.1.8] 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.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:842) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:145) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:497) ~[spring-beans-6.0.18.jar:6.0.18] ... 22 common frames omitted Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mvcHandlerMappingIntrospectorRequestTransformer': Cannot resolve reference to bean 'mvcHandlerMappingIntrospector' while setting constructor argument at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:377) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:135) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:681) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:202) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1350) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1187) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:558) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:518) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1310) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1271) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:484) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.DefaultListableBeanFactory$1.getIfUnique(DefaultListableBeanFactory.java:436) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.security.config.annotation.web.builders.WebSecurity.setApplicationContext(WebSecurity.java:397) ~[spring-security-config-6.1.8.jar:6.1.8] at org.springframework.context.support.ApplicationContextAwareProcessor.invokeAwareInterfaces(ApplicationContextAwareProcessor.java:112) ~[spring-context-6.0.18.jar:6.0.18] at org.springframework.context.support.ApplicationContextAwareProcessor.postProcessBeforeInitialization(ApplicationContextAwareProcessor.java:87) ~[spring-context-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:419) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1760) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:410) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.security.config.annotation.configuration.AutowireBeanFactoryObjectPostProcessor.postProcess(AutowireBeanFactoryObjectPostProcessor.java:65) ~[spring-security-config-6.1.8.jar:6.1.8] ... 30 common frames omitted Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mvcHandlerMappingIntrospector' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Error creating bean with name 'stompWebSocketHandlerMapping' defined in class path resource [org/springframework/web/socket/config/annotation/DelegatingWebSocketMessageBrokerConfiguration.class]: Failed to instantiate [org.springframework.web.servlet.HandlerMapping]: Factory method 'stompWebSocketHandlerMapping' threw exception with message: javax/websocket/WebSocketContainer at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1768) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:596) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:518) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:365) ~[spring-beans-6.0.18.jar:6.0.18] ... 52 common frames omitted Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'stompWebSocketHandlerMapping' defined in class path resource [org/springframework/web/socket/config/annotation/DelegatingWebSocketMessageBrokerConfiguration.class]: Failed to instantiate [org.springframework.web.servlet.HandlerMapping]: Factory method 'stompWebSocketHandlerMapping' threw exception with message: javax/websocket/WebSocketContainer at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:647) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:484) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1330) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1160) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:558) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:518) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:663) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:1322) ~[spring-context-6.0.18.jar:6.0.18] at org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:368) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.web.servlet.handler.HandlerMappingIntrospector.initHandlerMappings(HandlerMappingIntrospector.java:130) ~[spring-webmvc-6.0.18.jar:6.0.18] at org.springframework.web.servlet.handler.HandlerMappingIntrospector.afterPropertiesSet(HandlerMappingIntrospector.java:118) ~[spring-webmvc-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1815) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1764) ~[spring-beans-6.0.18.jar:6.0.18] ... 59 common frames omitted Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.HandlerMapping]: Factory method 'stompWebSocketHandlerMapping' threw exception with message: javax/websocket/WebSocketContainer at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:171) ~[spring-beans-6.0.18.jar:6.0.18] at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:643) ~[spring-beans-6.0.18.jar:6.0.18] ... 75 common frames omitted Caused by: java.lang.NoClassDefFoundError: javax/websocket/WebSocketContainer at java.base/java.lang.Class.getDeclaredConstructors0(Native Method) ~[na:na] at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3373) ~[na:na] at java.base/java.lang.Class.getConstructor0(Class.java:3578) ~[na:na] at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2754) ~[na:na] at org.springframework.util.ReflectionUtils.accessibleConstructor(ReflectionUtils.java:185) ~[spring-core-6.0.18.jar:6.0.18] at org.springframework.web.socket.server.support.AbstractHandshakeHandler.initRequestUpgradeStrategy(AbstractHandshakeHandler.java:158) ~[spring-websocket-5.3.0.jar:5.3.0] at org.springframework.web.socket.server.support.AbstractHandshakeHandler.<init>(AbstractHandshakeHandler.java:119) ~[spring-websocket-5.3.0.jar:5.3.0] at org.springframework.web.socket.server.support.DefaultHandshakeHandler.<init>(DefaultHandshakeHandler.java:35) ~[spring-websocket-5.3.0.jar:5.3.0] at org.springframework.web.socket.sockjs.transport.handler.DefaultSockJsService.getDefaultTransportHandlers(DefaultSockJsService.java:90) ~[spring-websocket-5.3.0.jar:5.3.0] at org.springframework.web.socket.sockjs.transport.handler.DefaultSockJsService.<init>(DefaultSockJsService.java:78) ~[spring-websocket-5.3.0.jar:5.3.0] at org.springframework.web.socket.config.annotation.SockJsServiceRegistration.createSockJsService(SockJsServiceRegistration.java:306) ~[spring-websocket-5.3.0.jar:5.3.0] at org.springframework.web.socket.config.annotation.SockJsServiceRegistration.getSockJsService(SockJsServiceRegistration.java:259) ~[spring-websocket-5.3.0.jar:5.3.0] at org.springframework.web.socket.config.annotation.WebMvcStompWebSocketEndpointRegistration.getMappings(WebMvcStompWebSocketEndpointRegistration.java:128) ~[spring-websocket-5.3.0.jar:5.3.0] at org.springframework.web.socket.config.annotation.WebMvcStompEndpointRegistry.getHandlerMapping(WebMvcStompEndpointRegistry.java:155) ~[spring-websocket-5.3.0.jar:5.3.0] at org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurationSupport.stompWebSocketHandlerMapping(WebSocketMessageBrokerConfigurationSupport.java:82) ~[spring-websocket-5.3.0.jar:5.3.0] at org.springframework.web.socket.config.annotation.DelegatingWebSocketMessageBrokerConfiguration$$SpringCGLIB$$0.CGLIB$stompWebSocketHandlerMapping$10(<generated>) ~[spring-websocket-5.3.0.jar:5.3.0] at org.springframework.web.socket.config.annotation.DelegatingWebSocketMessageBrokerConfiguration$$SpringCGLIB$$FastClass$$0.invoke(<generated>) ~[spring-websocket-5.3.0.jar:5.3.0] at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:258) ~[spring-core-6.0.18.jar:6.0.18] at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331) ~[spring-context-6.0.18.jar:6.0.18] at org.springframework.web.socket.config.annotation.DelegatingWebSocketMessageBrokerConfiguration$$SpringCGLIB$$0.stompWebSocketHandlerMapping(<generated>) ~[spring-websocket-5.3.0.jar:5.3.0] 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.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:139) ~[spring-beans-6.0.18.jar:6.0.18] ... 76 common frames omitted Caused by: java.lang.ClassNotFoundException: javax.websocket.WebSocketContainer at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[na:na] at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[na:na] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[na:na] ... 101 common frames omitted
빈 등록이 안된다는 알 수도 없는 말에, 이것저것 확인해봤는데
어노테이션도 제대로 주입했고, 의존성도 제대로 주입했는데
계속 에러가 나서 2시간동안 잡고 하나하나 디버깅한 끝에 원인을 알 수 있었다.
//webjars
implementation 'org.webjars:webjars-locator-core'
implementation 'org.webjars:sockjs-client:1.0.2'
implementation 'org.webjars:stomp-websocket:2.3.3'
implementation 'org.webjars:bootstrap:3.3.7'
implementation 'org.webjars:jquery:3.1.1-1'
내가 웹소켓을 구현할 때 사용한 라이브러리다.
그런데 다른 팀원도 웹소켓을 구현했는데 다른 라이브러리를 이용했다.
implementation 'org.springframework:spring-messaging:5.3.0'
implementation 'org.springframework:spring-websocket:5.3.0'
두 웹소켓이 충돌이 일어나서 빈등록이 제대로 안되는 오류였다.
우리는 라이브러리를 하나로 통일해서 오류를 수정했다.
'스프링' 카테고리의 다른 글
| 스프링부트 Websocket을 쓸 때 테스트 안되는 경우 (1) | 2024.06.03 |
|---|---|
| jwt token 생성하는 가장 간단한 방법 (0) | 2024.04.18 |
| redis properties 세팅 (빨간줄을 무서워하지말자) (0) | 2024.04.18 |
| JPA DATA 엔티티 어노테이션이 잘 작동하지 않을 때 (0) | 2024.04.18 |
| multipart/form-data 로 파일과 데이터 둘 다 받기 (0) | 2024.04.17 |
jwt token 생성하는 가장 간단한 방법
jwt.secret=your_secret_key_here
이 코드를 application.properties 넣으면 된다.
jwt:
secret: your_secret_key_here
이거는 yml일경우
그런데 secret_key는 어떻게 구하냐
openssl rand -hex 32
이 코드를 쓰면 되는데
어디에 쓰냐면
윈도우 기준으로 가장 쉬운 방법은
git bash에 입력하는거다.
그리고 git bash는
복사는 ctrl + insert
붙여넣기는 shift + insert
'스프링' 카테고리의 다른 글
| 스프링부트 Websocket을 쓸 때 테스트 안되는 경우 (1) | 2024.06.03 |
|---|---|
| 스프링 부트 웹소켓 빈 등록 오류 (1) | 2024.04.18 |
| redis properties 세팅 (빨간줄을 무서워하지말자) (0) | 2024.04.18 |
| JPA DATA 엔티티 어노테이션이 잘 작동하지 않을 때 (0) | 2024.04.18 |
| multipart/form-data 로 파일과 데이터 둘 다 받기 (0) | 2024.04.17 |
redis properties 세팅 (빨간줄을 무서워하지말자)
개발 초기에 서로 각자 개발하다가 코드 통합을 했는데
redis 사용은하는데, 세팅은 git ignore때문에 안 들어와서
오류가 난 걸 해결한 방법을 써보려고 한다.
오류는
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.redis.host' in value "${spring.redis.host}"
spring.redis.host=localhost
spring.redis.port=6379
이 코드를 application.properties에 넣었는데
빨간줄이 막 떠서 알고보니 deprecated
spring.data.redis.host=localhost
spring.data.redis.port=6379
로 바꿨는데
오류가 해결되지가 않는거다.
그래서 그냥 빨간줄이 뜨더라도 전자의 방식대로 썼더니 오류가 해결됐다.
'스프링' 카테고리의 다른 글
| 스프링 부트 웹소켓 빈 등록 오류 (1) | 2024.04.18 |
|---|---|
| jwt token 생성하는 가장 간단한 방법 (0) | 2024.04.18 |
| JPA DATA 엔티티 어노테이션이 잘 작동하지 않을 때 (0) | 2024.04.18 |
| multipart/form-data 로 파일과 데이터 둘 다 받기 (0) | 2024.04.17 |
| Page contents에 아무런 정보가 없는 경우 (0) | 2024.04.17 |
JPA DATA 엔티티 어노테이션이 잘 작동하지 않을 때
스프링 부트 + JPA DATA로 서버를 개발하고 있었는데,
JPA DATA를 사용하는 부분에서
@GeneratedValue 어노테이션이 제대로 작동하지 않는
또 @Column(nullable='false') 도 제대로 작동하지 않아서
Field 'post_img_id' doesn't have a default value
자꾸 이런 오류가 발생했다.
한마디로 기본키에서
값이 자동으로 생성되지 않음 => 기본키는 null값이 되면 안됨 => 오류 발생
이런 상황이었다.
Datagrip으로 뜯어보니
분명 설정한 어노테이션 옵션들이 제대로 작동중이지 않은것을 확인했다.
그래서 datagrip으로 필드설정을 수동으로 바꿔줬는데
Cannot change column 'post_img_id': used in a foreign key constraint 'FKsm7rxneua28dabgupobcmft78' of table 'webide.image'.
이런 오류가 떴다.
요약하자면 참조키 제약조건 때문에 필드 설정을 못바꿔주는 상황이였던것이다.
-- 외래 키 제약 조건 일시 해제
ALTER TABLE webide.image DROP FOREIGN KEY FKsm7rxneua28dabgupobcmft78;
-- 컬럼 변경 작업 수행 (예: 데이터 타입 변경, AUTO_INCREMENT 설정 등)
ALTER TABLE webide.post_image MODIFY COLUMN post_img_id BIGINT AUTO_INCREMENT NOT NULL;
-- 외래 키 제약 조건 재생성
ALTER TABLE webide.image ADD CONSTRAINT FKsm7rxneua28dabgupobcmft78 FOREIGN KEY (post_img_id) REFERENCES webide.post_image(post_img_id);
그래서 이 SQL문을 실행해서 수동으로 필드 설정을 바꿔준 결과
오류가 해결됐다.
예를 들어 설명하자면
webide : 스키마
image : post_image 테이블을 '참조하는' 테이블 (다시말해서 참조키가 있는 테이블)
post_image : '참조 당하는' 테이블(외래키가 없고, 기본키)
FKsm7rxneua28dabgupobcmft78
이거는
Cannot change column 'post_img_id': used in a foreign key constraint 'FKsm7rxneua28dabgupobcmft78' of table 'webide.image'.
참조키 제약조건 오류가 뜰때 나오는 값을 복사 붙여넣기 했다.
'스프링' 카테고리의 다른 글
| jwt token 생성하는 가장 간단한 방법 (0) | 2024.04.18 |
|---|---|
| redis properties 세팅 (빨간줄을 무서워하지말자) (0) | 2024.04.18 |
| multipart/form-data 로 파일과 데이터 둘 다 받기 (0) | 2024.04.17 |
| Page contents에 아무런 정보가 없는 경우 (0) | 2024.04.17 |
| DTO 파싱 에러 (0) | 2024.04.17 |
multipart/form-data 로 파일과 데이터 둘 다 받기
1. 우선 DTO를 만들어 줬다.
@Getter @Setter
@AllArgsConstructor
public class AskPostRequestDto {
private String title;
private String contents;
private Long member_id;
private MultipartFile image; // 이미지 파일 추가
}
2. 컨트롤러
@PostMapping(value = "/ask", consumes = "multipart/form-data")
public ResponseEntity<AskPostResponseDto> askPost(
@ModelAttribute AskPostRequestDto request) {
Long postId = postService.createPost(request);
return ResponseEntity.ok(new AskPostResponseDto(postId));
}
multipar/form-data를 받을 수 있는 컨트롤러를 만들어 줬다.
- consumes = "multipart/form-data": 이 속성은 이 메서드가 multipart/form-data 형식의 데이터만을 처리한다는 것을 나타냅니다. 이 형식은 주로 파일 전송과 같이 다중 부분 메시지를 필요로 할 때 사용됩니다.
- @ModelAttribute는 HTTP 요청의 파라미터를 메서드 파라미터에 바인딩할 때 사용하는 어노테이션입니다. 주로 폼 데이터를 객체에 바인딩할 때 사용되며, 다음과 같이 작동합니다.
-
- AskPostRequestDto request: AskPostRequestDto 타입의 request 파라미터는 요청에서 전송된 데이터(예: 폼 필드)를 포함합니다. @ModelAttribute는 폼 데이터의 각 필드를 AskPostRequestDto 객체의 필드에 자동으로 바인딩합니다. 예를 들어, 폼 데이터에 title과 contents 필드가 있으면, 이 어노테이션은 해당 값을 AskPostRequestDto 객체의 title과 contents 필드에 설정합니다
요약 : multipart를 쓰기 위해서는 어노테이션 옵션으로 consumes = "multipart/form-data" 를 사용하고
@ModelAttribute는 폼 데이트의 각 필드를 자동으로 바인딩 한다.

포스트맨으로 테스트 하는법
'스프링' 카테고리의 다른 글
| redis properties 세팅 (빨간줄을 무서워하지말자) (0) | 2024.04.18 |
|---|---|
| JPA DATA 엔티티 어노테이션이 잘 작동하지 않을 때 (0) | 2024.04.18 |
| Page contents에 아무런 정보가 없는 경우 (0) | 2024.04.17 |
| DTO 파싱 에러 (0) | 2024.04.17 |
| 엔티티에 @Setter 사용에 관하여 (0) | 2024.04.17 |