참고
Redis 세션 스토리지
Session
NOTE
Session은 네트워크 상에서 2개 이상의 통신장치간에 유지되는 상호 연결이다!
•
HTTP는 상태가 유지되지 않는 Stateless한 비접속형 프로토콜이다.
•
그래서 서버는 클라이언트의 이전 상태를 기억하기 위해 Session이라는 개념을 사용한다!
클라이언트는 쿠키를 가지고 서버에 보낸다
서버는 쿠키를 읽어서 SessionID를 읽은뒤 처리한다.
•
Session의 가장 대표적인 사례가 바로 로그인이다,
•
브라우저는 Cookie를, 서버는 해당 Cookie에 연관된 세션 정보를 저장한다.
•
유저가 로그아웃하거나, 세션이 만료될 때 까지 유지되어 유저에게 특정한 서비스가 가능하다!
◦
ex) 다시 접속해도 유저의 장바구니가 유지된다.
스프링부트 Session
NOTE
HashMap<String, String> sessionMap = new HashMap<>();
@GetMapping("/login")
public String login(HttpSession session, @RequestParam String name) {
session.setAttribute("name", name);
return "saved";
}
@GetMapping("/myName")
public String myName(HttpSession session) {
String myName = sessionMap.get(session.getId());
return myName;
}
Java
복사
HttpSession을 활용해서 Session을 편리하게 관리한다.
서블릿이 제공하는 HttpSession은 JESSIONID라는 이름의 Cookie를 자동으로 생성한다!
실제 조회가능한 쿠키값
분산 환경에서의 Session처리(세션 클러스터링)
NOTE
분산환경의 경우 각 웹서버별로 세션정보가 다른데 이를 알지 못한다!
WEB1과 WEB2의 Session 정보는 다르지만 각 서버는 이를 모른다! (공유할 방법이 필요) ⇒ 세션 클러스터링
세션 데이터의 특징
Session은 아래의 특징들로 RDB보다는 Redis가 더 효율적!
•
빠른 접근 시간이 필요하다.
•
세션 데이터는 영속성을 필요로하지 않는다.
◦
로그인하는 동안만 필요하고, 시간이 지나면 사라진다.
•
세션 데이터는 자주 변경된다.
◦
사이트나 앱을 사용하는 동안의 상호작용에 대한 정보를 가지기 때문이다.
•
저장 용량이 적다.
Spring에서 Redis 사용하기 (RedisTemplate)
NOTE
spring:
redis:
host: localhost
port: 6379
YAML
복사
Redis 등록
@Autowired
StringRedisTemplate redisTemplate;
// setFruit?name=banana
// /getFruit
@GetMapping("/setFruit")
public String setFruit(@RequestParam String name) {
ValueOperations<String, String> ops = redisTemplate.opsForValue();
ops.set("fruit", name);
return "saved";
}
@GetMapping("/getFruit")
public String getFruit() {
ValueOperations<String, String> ops = redisTemplate.opsForValue();
String fruitName = ops.get("fruit");
return fruitName;
}
Java
복사
RedisTemplate를 활용한 코드
세션 클러스터링(Redis를 통한 Session 관리)
NOTE
최종적인 아키텍
spring:
session:
store-type: redis
YAML
복사
yaml에서 session타입을 Redis로하면 쉽게 설정가
@GetMapping("/login")
public String login(HttpSession session, @RequestParam String name) {
session.setAttribute("name", name);
return "saved";
}
@GetMapping("/myName")
public String myName(HttpSession session) {
String myName = (String) session.getAttribute("name");
return myName;
}
Java
복사
ehd