1. 웹소켓을 통해 채팅 프로그램 만들기...1에서 왠만한건 다 복붙해서 이런건 감사...

2. 1:N 으로 적용해야합니다. 

3. 저장은 DB로 해야하는데 이때 저는 REDIS를 알게 되었습니다. 그냥 활용해보기...

key, value값인데 뭘 어떻게 조회해야하나...여러 고민을 하였습니다. 첫번째 블로그만해도 금방 sysout프린트 되서
아~~~!!!너무 좋구나야 했는데 이걸 채팅룸에 비번 넣고 저장하고 불러오고 CRUD redis와 이런걸 하려니 너무 어렵더라구요. 이제부터 검색과 chatGPT(무료버전이라 오류가 좀 많아요)와의 싸움입니다... 기간은 2주였고 실제 작업한 일은 7일 정도입니다.

websocket 채팅 프로그램 코드등에 대해 정리합니다.

디자인 패턴을 꼼꼼히 맞춰서 만들지는 않았고 일단 빠른 진행을 목적으로 만들었으니깐 참고해주세요. 

1. 웹소켓을 bean으로 설정하기 위해 파일도 만들었다 어쩌구 저쩌구 많은 고생을 했는데 결론은

@SpringBootApplication
public class Chat3Application {
    /*웹소켓을 사용하기위해 설정한 Bean*/
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }

    public static void main(String[] args) {
        SpringApplication.run(Chat3Application.class, args);
    }
}

여기다 붙이는게 가장 좋았습니다. 이유는 @serverEndpoint  때문이였습니다. 
이놈 붙은건 @기본생성자를 만들어야만 했기에 controller같은 파일은 만들어서 진행하기가 어려웠어요...왜냐??
DB저장해야하잖아요....기본로직을 따라가려니 잘 안되더라구요....3일째 여러 고생하다가 안착한 곳이...

@SpringBootApplication

붙은 Application 클래스였습니다. 에러안나는 곳은 여기 뿐이였어요.

2. 

@Configuration
public class CustomSpringConfigurator extends ServerEndpointConfig.Configurator implements ApplicationContextAware {

    /**
     * Spring application context.
     * ServerEndpoint 는 웹소켓에 의해 세션이 연결될때마다 인스턴스가 JWA 구현에 의해 생성되고 관리되기에
	 * 생성될때마다 의존성 주입을 할수 있도록 별도 설정이 필요
     */
    private static volatile BeanFactory context;

    @Override
    public <T> T getEndpointInstance(Class<T> clazz) throws InstantiationException {
        return context.getBean(clazz);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        CustomSpringConfigurator.context = applicationContext;
    }
}

redis설정....application.properties에는 기재내용은 검색해봐도 많이 넣을 필요 없이 심플심플하게..

#redis설정 == application.properties 파일에
spring.redis.host=localhost
spring.redis.port=6379

//별도로 Config 파일로 설정해주는데 
//비번 설정을 안했기에 주석처리 했구요...
//tamplate메소드는 매핑처리하는데 필요, Serializer (JSON) 처리로 추가..
@EnableRedisRepositories
@Configuration
public class RedisConfig {
    @Value("${spring.redis.host}")
    private String host;

    @Value("${spring.redis.port}")
    private int port;

   /* @Value("${spring.data.redis.password}")
    private int password;
*/
   @Bean
   public RedisConnectionFactory redisConnectionFactory() {
       return new LettuceConnectionFactory(host, port);
   }

    @Bean
    public RedisTemplate<?, ?> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        // Key Serializer
        redisTemplate.setKeySerializer(new StringRedisSerializer());

        // Value Serializer (JSON)
        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));

        // Hash Key Serializer
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());

        // Hash Value Serializer (JSON)
        redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));

        return redisTemplate;

    }
        @Bean
    public ObjectMapper objectMapper() {
        return new ObjectMapper();
    }

3. dto ..저는 채팅룸과 실제 채팅내용을 분리해서 만들었습니다.

timetoLive는 만료시간을 설정하는 속성으로 30으로 적어서 30초 후에 만료 및 조회되면 안되는데 조회됩니다.

검색결과redis폴더에서 redis.conf파일을 들어가서 maxmemory-policyvolatile-lru 또는 volatile-ttl로 설정하라고 하는데....

https://blog.naver.com/PostView.naver?blogId=whddbsml&logNo=222389726721&parentCategoryNo=&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView 글도 참고해보고

이렇게 조회는 되는데.....전 공부용이라서 일단 그냥 두었습니다..ㅠㅠ 사실 conf 파일까지 검색할때는 거의 끝나가는 부분이였어요. 정리를 나름 순서대로 하느라 그렇치 하면서 저는 마지막이라 이미 지쳤습니다.ㅠㅠ

그리고 왜 redis 할때 로그인 정보라던가 이런거 할때 많이 쓴다고 하더라구요. 그때 임의의 랜덤 key값이 사용되는데 그때 이건가봐요.

private String id= UUID.randomUUID().toString();

참고하세요.,

+ Recent posts