Search

#Redis

개념정리

다른 서버가 다른 서버의 세션을 접근할 수 없다는 한계가 있다.
Server1이 단일진입점으로 Spring Session을 바로보게 하고 이 세션에서 저장소를 Redis를 이용하든 세션을 이용하든 하면 된다.

yml 설정

spring: redis: data: host: 127.0.0.1 port: 6379 password:
Java
복사
application.yml에 spring내부에 이렇게 적어준다. 나중에 이거 전부 환경변수로 설정해야된다.
Redis내부에 Dockerfile 생성 redis.conf 생성 docker-compose.yml 생성

Dockerfile 정의

FROM redis COPY redis.conf /etc/redis/ RUN chmod 777 /etc/redis/redis.conf
Java
복사

Redis.conf 정의

redis.conf
61.8KB

Docker-compose.yml 정의

version: '3.3' services: redis: build: context: . restart: always container_name: redis-container ports: - "6379:6379"
Java
복사

docker-compose up 실행

생긴것도 확인

redis 키값 확인

docker exec -it 2478 bash 로 실행해서 컨테이너에 들어가서 redis-cli 로 redis를 접속 할 수 있고 keys * 로 저장 된 키값을 확인 할 수 있다.
redis-container는 서비스 명이고 redis: 은 DNS서버에 등록이 되는 이름이다.

Redisconfig 패키지 생성

클래스도 생성

RedisConfig 어노테이션 달기

configuaration 이랑 enableRedisHttpSession 어노테이션을 달아준다. 그리고 속성 정의 하기
@Value 어노테이션으로 환경변수를 매핑할 수 있다.
UserController에 RedisConfig를 의존성 주입한다. 왜 의존성 주입이 되지?? RedisConfig에 @Configuration을 달았으니까 IOC에 등록이 된거지. 근데 redisConfig.get 할려면 현재 변수가 private되어있으니까 getter가 필요하다.
이렇게 RedisConfig에 게터를 달아주자.
근데 터져가지고, 에러를 확인해보니 yml설정이 잘 못되어있었다. 사진처럼 data랑 redis 위치를 바꿔주면 빨간줄도 사라진다.
잘 작동됨

application.yml 전체코드

RedisConfig 작업

RedisConfig ⇒ Factory만들기

@Bean을 등록하면 리턴값을 IOC컨테이너에 담는다.

redisConnectionFactory 코드

redisConnectionFactory 테스트

1. 일단 서버를 실행하고 2. RedisConfig가 @Configuration으로 서버가 실행되면 IOC에 등록이 될 것이고, 3. redisConnectionFactory는 @Bean 으로 서버가 실행되면 이 역시 IOC에 등록이 될 것임 그럼 서버가 실행이 되면 “서버 실행시 동작!” 이 떠야됨!
동작 확인

redisTest 테스트

@ResponseBody 가 반환타입 앞에 붙으면, 템플릿 리소스를 찾지 않고, 바로 텍스트를 리턴한다. 위에 @GetMapping (”/redis/test”) 달아주기
테스트 확인

stringRedisTemplate 작성

직렬화 오류가 발생하니까, 이 메소드가 필요하다고 하신다.

redisTemplate 메소드 코드

지금 이 작업의 이유???

세션 코드를 그대로 유지하면서 Redis를 사용하기 위해서, Object를 String으로 변환하는 작업이라 생각하면 된다. 세션을 안쓰고 레디스만 쓸려면 그냥 RedisTemplate를 사용하면 된다.

RedisConfig 전체 코드 (펼쳐보기)

웹 테스트

로그인 테스트

이제 로그인 하면 Redis서버에서 session이 확인이 되어야 된다.
웹으로 접속은 잘 되는 것 같고 도커컨테이너에 들어가서 레디스를 확인해보자.

Redis 세션 입력 확인

// 실행 명령 1. docker ps 2. 컨테이너 ID 확인 3. docker exec -it c24c bash
Java
복사
위의 명령어 세트로 컨테이너 접속이 가능하다.
// 실행 명령어 1. redis-cli 2. keys *
Java
복사
redis-cli 는 redis 서버에서 커맨드를 날릴수 있다. keys * 로 세션값이 저장되어있는지 확인 가능
이렇게 확인 할 수 있다면 Redis 서버가 정상 작동했다는 뜻이다! 그리고 이게 로그아웃이 잘되는지 이런 것도 체크하면 좋겠지..

레디스 세션에 값이 그대로 들어가있을까??

레디스로 확인되는 세션 값은 Base64이다. 이렇게 Base64로 저장된 세션 값이, 만약 내가 꺼내서 쓰고 싶을때 내가 저장한 Object가 그대로 저장되어서 내가 꺼내 쓸수 있을까??? 테스트를 해보자.
Java
복사
/redis/test를 위와 같이 다시 정의해보자. 웹으로 해당 주소를 때리면, sessionUser의 이름이 콘솔에 찍혀야 된다.
테스트 실행
레디스에 저장된 값이 Object로 저장이 되었으니까, 이렇게 꺼내쓸수 있다는 걸 확인 할 수 있다.

Redis의 특징

redis는 스트링으로 키값을 가지고 있다. 그래서 Object를 스트링으로 변환해줄수 있으며 그 작업을 RedisTemplate를 사용하면 된다. 한 마디로 세션을 사용안하고 Redis만 사용할 때 쓸 수 있다.
RedisTemplate<String, Object> 로 의존성 주입을 해서 원하는 키값과 객체를 짝을 지어서 맵으로 저장하는 로직이다.

레디스 세션에 저장할 때

rt.opsForValue().set().(키값, 밸류값)
Java
복사
그냥 주입된 의존성으로 rt.opsForValue().set().(키값, 밸류값) 으로 세션처럼 사용이 가능하고

세션을 폐기 할때

rt.opsForValue().get(키값)
Java
복사
이렇게 저장된 키값으로 세션을 꺼내쓰면 된다.

환경변수 사용하기

// 순서 1. 의존성 주입 2. application.yml 설정 변경 3. .env 작성 -> root 경로에 4. .gitignore에 .env 등록 5. main메소드 수정
Java
복사
의존성 주입
// 의존성 주입 implementation 'io.github.cdimascio:java-dotenv:5.2.2'
Java
복사
application.yml 설정 변경
application.yml 설정에서 사용할 변수를 넣는다.
.env에 변수 추가
.env는 프로젝트 루트 경로에 만들어야된다.
//.env 내부 구조 REDIS_HOST=127.0.0.1 REDIS_PORT=6379
Java
복사
.gitignore에 등록
루트 폴더에 .gitignore 파일에 .env를 등록해준다. 여기 등록하면 깃에 푸시가 되어도 푸시가 되지 않는다.
main메소드 수정
package shop.mtcoding.bank; import io.github.cdimascio.dotenv.Dotenv; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class BankApplication { public static void main(String[] args) { Dotenv dotenv = Dotenv.load(); // Set environment variables System.setProperty("REDIS_HOST", dotenv.get("REDIS_HOST")); System.setProperty("REDIS_PORT", dotenv.get("REDIS_PORT")); SpringApplication.run(BankApplication.class, args); } }
Java
복사
메인 메소드가 시작될떄 변수를 적용하게 된다. Dotenv.load() 로 변수가 로드가 되고, 사용할때는 System.setProperty(시스템변수, dotenv.get(저장된 키값)) 으로 사용