세션을 HashMap에 저장, 저장한 세션을 조회하는 두개의 api를 구현했다.
@RestController
public class LoginController {
// /login?name= Jay
// /myName => "Jay"
HashMap<String, String> sessionMap = new HashMap<>();
@GetMapping("/login")
public String Login(HttpSession session, @RequestParam String name) {
sessionMap.put(session.getId(), name);
return "saved";
}
@GetMapping("/myName")
public String Login(HttpSession session) {
String myName = sessionMap.get((session.getId()));
return myName;
}
}
두 개의 터미널을 열어 각각 다른 포트로 자바 서버를 실행시킨다.

gradle의 build를 실행시키면 build파일에 SNAPSHOT.jar 파일이 생성된다.
해당 경로로 이동하여 각각의 터미널에서
java -Dserver.port=8080 -jar Dustin-0.0.1-SNAPSHOT.jar
java -Dserver.port=8081 -jar Dustin-0.0.1-SNAPSHOT.jar 실행한다.


8081로 실행된 서버 인스턴스는 8080에서 생성된 세션을 확인하지 못하고 새로운 세션을 생성하고 덮어쓰게 된다.
Session Clustering 구현하기
params로 받아온 세션 데이터를 기존 로컬변수가 아닌 세션 저장소에 저장한다.
@RestController
public class LoginController {
@GetMapping("/login")
public String Login(HttpSession session, @RequestParam String name) {
// 세션에 파라미터로 들어온 name을 저장한다
session.setAttribute("name",name);
return "saved";
}
@GetMapping("/myName")
public String Login(HttpSession session) {
String myName = (String)session.getAttribute("name");
return myName;
}
}
의존성을 추가한다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-redis' // redis를 사용하기 위한 추가
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.session:spring-session-data-redis' // redis Session을 위한 추가
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
yml 파일 수정: 세션이 redis에 저장될 수 있도록 수정
spring:
session:
storage-type: redis
redis:
host: localhost
port: 6379
8080에서 생성한 세션의 이름을 8081에서 조회할 수 있다. 헤더를 확인해 보면 같은 쿠키를 참조하고 있는 것을 볼 수 있다.
