개념정리
다른 서버가 다른 서버의 세션을 접근할 수 없다는 한계가 있다.
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 정의
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 설정에서
사용할 변수를 넣는다.
.env는 프로젝트 루트 경로에 만들어야된다.
//.env 내부 구조
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
Java
복사
루트 폴더에 .gitignore 파일에 .env를 등록해준다.
여기 등록하면 깃에 푸시가 되어도 푸시가 되지 않는다.
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(저장된 키값))
으로 사용