본문 바로가기
스프링

스프링 세션 (Spring Session)이란? spring-session-jdbc 사용하기

by 책 읽는 개발자_테드 2021. 11. 26.
반응형

스프링 세션은 서버에 저장되는 HTTP 세션의 한계로부터 세션 관리를 자유롭게 한다는 목표를 갖고 있다. 

 

이러한 해결책으로 특정 애플리케이션 컨테이너(예:톰캣)에 얽매이지 않고, 클러스터링된 세션을 지원하여 클라우드에서 여러 서비스들 사이에 세션 데이터의 공유를 쉽게 만든다. 또한 동일한 브라우저에서 여러 개의 세션 지원하고, 헤더에서 세션을 전송한다.

 

 

스프링 세션 사용하기

 

스프링 세션은 JDBC, MongoDB, Redis 등을 사용하여 데이터를 유지할 수 있다. 여기서는 Spring-Session-JDBC를 사용하여 웹 앱에서 인증 정보를 관리해보자.

 

▶ 스프링 부트 프로젝트를 생성하고, 다음과 같은 종속성을 추가한다.

 

	<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.197</version>
            <scope>runtime</scope>
        </dependency>
	</dependencies>

 

▶ h2 데이터베이스 설정을 application.properties에 추가한다.

 

spring.h2.console.enabled=true
spring.h2.console.path=/h2-console

 

▶ h2 데이터베이스가 지원하는 스프링 세션을 활성화하기 위한 설정을 application.properties에 추가한다.

 

spring.session.store-type=jdbc

 

스프링 부트 프로젝트를 시작하자.

 

스프링 부트를 실행하면 아래와 같이 로그를 통해 데이터베이스로 이용가능한 JDBC URL을  출력한다. 이것을 복사한다.

 

다음 링크로 접속한다.

http://localhost:8080/h2-console/login.jsp

 

이동한 화면에 방금 복사한 링크를 'JDBC URL:' 입력란에 붙여넣고, 'Connect' 버튼을 클릭한다. 

 

이곳에서는 h2 데이터베이스의 테이블을 확인하고, SQL 명령을 수행할 수 있다. 그리고 왼쪽의 테이블을 보면 방금 application.properties 파일에 작성한 'spring.session.store-type=jdbc' 코드로 인해 SPRING_SESSION과  SPRING_SESSION_ATTRIBUTES 테이블이 자동으로 생성된 것을 볼 수 있다.

 

처음에 의존성으로 추가한 session-spring-jdbc를 열어보면, 데이터베이스에 해당 테이블들을 추가하는 sql이 정의되어 있는 걸 확인할 수 있다.

 

 

만약, 데이터베이스에 해당 테이블들이 추가되지 않았다면, 여기에 있는 SQL 명령어를 데이터베이스에 직접 입력하여 실행하자.

CREATE TABLE SPRING_SESSION (
	PRIMARY_ID CHAR(36) NOT NULL,
	SESSION_ID CHAR(36) NOT NULL,
	CREATION_TIME BIGINT NOT NULL,
	LAST_ACCESS_TIME BIGINT NOT NULL,
	MAX_INACTIVE_INTERVAL INT NOT NULL,
	EXPIRY_TIME BIGINT NOT NULL,
	PRINCIPAL_NAME VARCHAR(100),
	CONSTRAINT SPRING_SESSION_PK PRIMARY KEY (PRIMARY_ID)
);

CREATE UNIQUE INDEX SPRING_SESSION_IX1 ON SPRING_SESSION (SESSION_ID);
CREATE INDEX SPRING_SESSION_IX2 ON SPRING_SESSION (EXPIRY_TIME);
CREATE INDEX SPRING_SESSION_IX3 ON SPRING_SESSION (PRINCIPAL_NAME);

CREATE TABLE SPRING_SESSION_ATTRIBUTES (
	SESSION_PRIMARY_ID CHAR(36) NOT NULL,
	ATTRIBUTE_NAME VARCHAR(200) NOT NULL,
	ATTRIBUTE_BYTES LONGVARBINARY NOT NULL,
	CONSTRAINT SPRING_SESSION_ATTRIBUTES_PK PRIMARY KEY (SESSION_PRIMARY_ID, ATTRIBUTE_NAME),
	CONSTRAINT SPRING_SESSION_ATTRIBUTES_FK FOREIGN KEY (SESSION_PRIMARY_ID) REFERENCES SPRING_SESSION(PRIMARY_ID) ON DELETE CASCADE
);

 

 

▶ HttpSession 정보를 저장하고, 표시하는 Controller를 추가한다.

 

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/colors")
public class SpringSessionJdbcController {

	@GetMapping
	public List get(HttpSession session) {
		return getFavColors(session);
	}

	@PostMapping
	public String save(@RequestParam("color") String color,
			HttpServletRequest request) {

		List<String> favoriteColors
			= getFavColors(request.getSession());
		if (!ObjectUtils.isEmpty(color)) {
			favoriteColors.add(color);
			request.getSession().setAttribute("favoriteColors", favoriteColors);
		}
		return "success";
	}

	private List<String> getFavColors(HttpSession session) {
		List<String> favoriteColors = (List<String>)session
			.getAttribute("favoriteColors");

		if (favoriteColors == null) {
			favoriteColors = new ArrayList<>();
		}
		return favoriteColors;
	}
}

 

▶ 작성한 api에 요청을 보낸다. 클라이언트는 postman을 이용했다.

먼저 저장된 색상을 가져오는 GET 요청을 보낸다.

 

 

처음 api 요청을 보내면 session이 생성된다. 세션은 다음과 같이 h2 데이터베이스의 SPRING_SESSION 테이블에 저장된다.

 

 

이번에는 색상을 저장하는 POST 요청을 보낸다. KEY에 color를 VALUE에 red를 입력했다.

 

 

이렇게 입력한 요청한 결과는 방금 전 생성된 세션에 저장된다. 해당 내용은 SPRING_SESSION_ATTRIBUTES 테이블에서 확인할 수 있다.

 

 

 

출처

https://www.baeldung.com/spring-session

-> 해당 게시글의 코드 예제는 스프링부트 2.x 버전에서 deprecated된 Jedis를 주로 사용하므로, 따라하다가 피를 볼 수 있습니다.

https://www.baeldung.com/spring-session-jdbc

 

반응형

댓글