MSA 프로젝트를 진행하며 모든 서비스에 세션을 공유해줘야해 Redis를 사용했다. 어떻게 사용했는지 정리해보자 😣
Session을 사용할 모든 프로젝트에 설정해줘야 한다.
redis dependency를 추가해준다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.7.1</version>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>2.7.0</version>
</dependency>
아래 설정 정보를 추가해준다.
spring:
redis:
host: localhost
password:
port: 6379
@EnableRedisHttpSession
어노테이션을 추가해준다.
@SpringBootApplication
@EnableRedisHttpSession
public class SessionApplication
{
public static void main(String[] args)
{
SpringApplication.run(TaskMngSessionAuthServerApplication.class, args);
}
}
😲
정말 간단하게 설정이 끝났다.
이제 사용해보자~~!
사용자가 로그인하면 로그인 서비스에서 Session을 생성해 setting 해준다.
@PostMapping(value = "/login")
public String login(LoginRequest request, HttpSession session) {
...(생략)
SessionInfoDTO sessionInfo = authService.login(request);
session.setAttribute("sessionInfo", sessionInfo);
return returnUrl;
}
로그인 서비스에서 set해준 session을 업무 서비스에서 사용 가능한 것을 확인할 수 있다.
@GetMapping(value = "/tasks")
public ResponseEntity<?> getTasks(@Valid GetTaskListRequest request, HttpSession session) {
SessionInfoDTO sessionInfo = (SessionInfoDTO)session.getAttribute("sessionInfo");
...(생략)
return ResponseEntity.ok(response);
}
SpringBoot의 경우엔 application.yml
에 간단하게 설정해줄 수 있다.
server:
servlet:
session:
timeout: 7200
하지만, 배포시 내장 톰캣을 사용하지 않고 별도의 was를 사용하면 위 방법이 동작하지 않는다. 이런 경우에는 별도의 SessionListner를 만들어 설정해줘야한다.
public class SessionListener implements HttpSessionListener {
@Override
public void sessionCreated (HttpSessionEvent se)
{
se.getSession().setMaxInactiveInterval(60*120); //120분
}
@Override
public void sessionDestroyed (HttpSessionEvent se) {}
}
SessionListener
를 Bean으로 등록해줘야한다.
@Bean
public HttpSessionListener httpSessionListener() {
return new SessionListener();
}