Web/Spring

[Springboot] Session with MySQL

Binceline 2018. 1. 29. 00:16


참고 : https://pupli.net/2017/03/06/how-to-configure-spring-session-with-jdbc-for-mysql/


Springboot에서 Session 정보를 Mysql DB에 연동하는 방법에 대해 적어 보겠습니다.


Dependency는 다음과 같습니다.


저는 Maven을 사용합니다.


pom.xml

<dependency>

    <groupId>org.springframework.session</groupId>

    <artifactId>spring-session-jdbc</artifactId>

</dependency>

<dependency>

<groupId>mysql</groupId>

    <artifactId>mysql-connector-java</artifactId>

    <version>5.1.6</version>

</dependency>

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-jdbc</artifactId>

</dependency>


application.properties 파일에 다음과 같이 작성합니다.


spring.session.store-type=jdbc

server.compression.enabled=true

server.use-forward-headers=true

server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain,text/css,application/javascript

logging.file=logbook-server.log

spring.datasource.url=jdbc:mysql:DB서버 IP/DB 이름

spring.datasource.username=ID입력

spring.datasource.password=PW입력

spring.datasource.driver-class-name=com.mysql.jdbc.Driver


# Number of ms to wait before throwing an exception if no connection is available.

spring.datasource.tomcat.max-wait=10000


# Maximum number of active connections that can be allocated from this pool at the same time.

spring.datasource.tomcat.max-active=50


# Validate the connection before borrowing it from the pool.

spring.datasource.tomcat.test-on-borrow=true


spring.jpa.hibernate.ddl-auto=create // 기존에 생성된 테이블들 삭제하고 새로 만드는 옵션

// jpa, 하이버네이트에 대한 간략한 설명은 요기 블로그를 보쟝. http://bcho.tistory.com/906


Table을 2가지 만든다.


SPRING_SESSION에는 생성시간, 등의 Session의 기본 속성에 대한 데이터를 저장하고,


SPRING_SESSION_ATTRIBUTES에는 유저의 Token Key와 저장한 데이터의 Key/Value 정보가 저장된다.


CREATE TABLE SPRING_SESSION (

    SESSION_ID CHAR(36),

    CREATION_TIME BIGINT NOT NULL,

    LAST_ACCESS_TIME BIGINT NOT NULL,

    MAX_INACTIVE_INTERVAL INT NOT NULL,

    PRINCIPAL_NAME VARCHAR(100),

    CONSTRAINT SPRING_SESSION_PK PRIMARY KEY (SESSION_ID)

) ENGINE=InnoDB;


CREATE INDEX SPRING_SESSION_IX1 ON SPRING_SESSION (LAST_ACCESS_TIME);


CREATE TABLE SPRING_SESSION_ATTRIBUTES (

    SESSION_ID CHAR(36),

    ATTRIBUTE_NAME VARCHAR(200),

    ATTRIBUTE_BYTES BLOB,

    CONSTRAINT SPRING_SESSION_ATTRIBUTES_PK PRIMARY KEY (SESSION_ID, ATTRIBUTE_NAME),

    CONSTRAINT SPRING_SESSION_ATTRIBUTES_FK FOREIGN KEY (SESSION_ID) REFERENCES SPRING_SESSION(SESSION_ID) ON DELETE CASCADE

) ENGINE=InnoDB;


CREATE INDEX SPRING_SESSION_ATTRIBUTES_IX1 ON SPRING_SESSION_ATTRIBUTES (SESSION_ID);


테이블 이름은 꼭 위와 같이 해야 한다. 기본 옵션으로 저 이름으로 되어 있는 것 같다.


다르게 해보려 했으나 옵션 설정을 아직 잘 모르겠다. 아시는 분은 댓글 부탁드려욧!


이제 Jdbc Session을 적용시켜야 한다. 


이것은 SpringBoot에서는 간단히 다음과 같이 @EnableJdbcHttpSession 어노테이션을 @Configuration 어노테이션과 함께 작성해 주면 적용된다.


@Configuration

@EnableJdbcHttpSession

public class HttpSessionConfig {

}


@EnableJdbcHttpSession에 대한 설명은 Spring문서 에서 자세히 확인할 수 있는데,


@Configuration 어노테이션이 달린 클래스와 함께 사용하면


SessionRepositoryFilter라는 클래스를 Bean으로 등록해 활성화시킨다고 한다.


SessionRepositoryFilter클래스는 Spring 서버가 HttpSession을 지원하도록 활성화시킨다.. 정도로 이해하고 있습니다.



이렇게 구성하면 DB에 세션 정보가 잘 저장되는 것을 볼 수 있습니다.

반응형