jnk1m
Foliage IT
jnk1m
전체 방문자
오늘
어제
  • 분류 전체보기 (209)
    • Today I Learned (34)
    • Java (47)
    • Database (15)
    • [NHN Academy] (27)
    • Spring (47)
    • HTML + CSS + JavaScript (11)
    • JSP (3)
    • Node.js (10)
    • React Native (2)
    • 기타 (8)
    • 스크랩 (5)

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
글쓰기 / 관리자
jnk1m

Foliage IT

Today I Learned

[TIL]2023/06/13 NOAUTH HELLO 에러 + 스프링,EC2 Redis 세부 설정, Redis Test

2023. 6. 13. 19:04

오늘 배운 것

 

  • EC2 서버를 통해 레디스를 이용하려면 보안 그룹에서 Redis 포트를 열어줘야 한다.
    1. 사용 중인 보안 그룹을 찾아서 선택하고 인바운드 규칙을 추가한다.
    2. Type: "사용자 TCP" 포트 : 6379 
    3. 개발 환경용 소스, 프로덕션용 소스 고려하여 내 IP(개발 환경용), 해당 EC2 인스턴스의 탄력적 IP (프로덕션용) 각각 넣어준다.
  • 스프링 애플리케이션에서 Redis 설정 수정
    1. spring.redis.host 에 localhost를 넣는 게 아니다. EC2의 탄력적 IP를 넣어주자. 
  • NOAUTH HELLO 에러
NOAUTH HELLO must be called with the client already authenticated, otherwise the HELLO AUTH <user> <pass> option can be used to authenticate the client and select the RESP protocol version at the same time

Redis에 비밀번호를 설정해놓았으니, 처음 접근할 때 AUTH 인증이 필요하다. 이 에러는 HELLO 명령을 통한 인증이 수행되지 않은 상태에서 다른 명령을 수행하려 할 때 발생한다.

application.properties에 올바른 비밀번호 값을 넣어줬는데도 위 에러가 발생했다.

알아보니, Lettuce가 Redis6 이상 버전의 HELLO 명령을 사용하려고 했기 때문에 발생한 문제라고 한다. Redis 서버의 버전을 명시적으로 지정해주면 된다.

 

@Bean
  public LettuceConnectionFactory redisConnectionFactory() {
    RedisStandaloneConfiguration redisStandaloneConfiguration =
            new RedisStandaloneConfiguration(redisHost, Integer.parseInt(redisPort));
    redisStandaloneConfiguration.setPassword(RedisPassword.of(redisPassword));

    LettuceClientConfiguration lettuceClientConfiguration = LettuceClientConfiguration.builder()
            .clientOptions(ClientOptions.builder().protocolVersion(ProtocolVersion.RESP2).build())
            .build();

    return new LettuceConnectionFactory(redisStandaloneConfiguration, lettuceClientConfiguration);
  }

 

  • 스프링 WebMvcTest 에 Redis 관련 코드 추가하기
    • @WebMvcTest는 웹 MVC 계층에 대한 어노테이션. 즉, 해당 어노테이션은 웹 MVC 계층과 관련된 @Controller, @ControllerAdvice 등만 로드한다. @Configuration, @Service, @Component, @Repository 등이 붙은 클래스를 사용하려면 별도로 @Import 또는 @MockBean 등을 사용해야 한다.
    • java.lang.NumberFormatException: For input string: "${spring.redis.port}"가 뜬다면 프로파일을 테스트에서 활성화되지 않았다는 의미. @ActiveProfiles 어노테이션으로 프로파일을 활성화해주자.
@Import(RedisConfig.class)
@ActiveProfiles("dev")

 


 

생각해봐야 할 것

 

현재 테스트 코드는 로컬 Redis에 직접 접근하고 있다. 테스트 코드는 어느 환경에서나 동일하게 실행되어야 하는데 로컬 피씨에 레디스를 띄워서 접근하면 이미 저장되어 있는 값에 의해 테스트 결과가 달라질 수도 있다. -> 일관적인 테스트가 보장되지 않는다. 

Testcontainers나 Embedded Redis? 더 알아보자.

    'Today I Learned' 카테고리의 다른 글
    • [TIL] 2023/06/16 브랜치 합병, aws s3, twilio sms 인증
    • [TIL] 2023/06/15 Redis -> EC2 보안 그룹 규칙 수정
    • [TIL] 2023/06/12 Redis 이용을 위한 초기 세팅 및 Spring 설정
    • [TIL] 06/08/2023 Google OAuth Sign in authorization_request_not_found 에러 (로드밸런서 스티키 세션)

    티스토리툴바