[Spring Boot] Spring Boot Session 사용 (Spring Bean Scope)

2023. 3. 15. 00:24기술 창고/Spring

728x90
SMALL
// spring boot session - session 데이터를 관리하기 위한 dependency (프로젝트 단계별 정보들 관리)
implementation 'org.springframework.session:spring-session-core'

프로젝트를 진행하면서 데이터를 DB에 바로 저장시키는 것이 아닌 따로 임시저장하여 나중에 한번에 불러와서 DB에 넣고 싶었다.

처음에는 HttpServlet에 존재하는 setAttribute 함수를 사용하여 데이터를 임시저장하고 불러와서 사용하려고 했으나 HttpServlet은 기본적으로 호출되고 응답이 발생되었으면 종료되고 내부에 설정한 데이터가 휘발된다는 특성을 가지고 있었다.

따라서 setAttribute로 임시저장하는 방법은 보류!

 

Spring에는 Bean Scope를 사용하여 session을 생성하여 임시저장하고 관리할 수 있도록하는 방법이 있다.

설정하는 방법을 알아보자.

 

 

build.gradle

// spring boot session - session 데이터를 관리하기 위한 dependency (프로젝트 단계별 정보들 관리)
implementation 'org.springframework.session:spring-session-core'

session을 관리하기 위한 해당 dependency 를 추가해준다.

 

 

ResponseDto (session으로 관리하며 데이터가 임시저장될 객체)

package com.example.zzapdiz.fundingproject.response;

import lombok.*;
import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.stereotype.Component;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.multipart.MultipartFile;

import java.io.Serializable;

@AllArgsConstructor
@NoArgsConstructor
@Component
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
@Builder
@Setter
@Getter
public class ResponseDto implements Serializable {
    private String projectTitle;
    private MultipartFile thumbnailImage;
    private String endDate;
    private String adultCheck;
    private String searchTag;
}
  • Dto 객체 안에는 임시저장하며 관리할 데이터들이 들어간다.
  • @AllArgsConstructor, @NoArgsConstructor : 테스트 코드를 작성하고 테스트할 때 Dto를 사용하려면 기본 생성자가 존재해야 사용이 가능하였다. 따라서 기본 생성자 어노테이션과 추가로 모든 변수를 포함하는 생성자 어노테이션을 지정해주었다.
  • @Component : Spring Bean Scope로서 관리될 객체이기 때문에 Component로 지정하여 Bean 객체임을 명시해주었다.
  • @Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
    : value = WebApplicationContext.SCOPE_SESSION - 객체가 한 session 에서 생명주기를 갖도록 Bean Scope를 session으로 설정.
    proxyMode = ScopedProxyMode.TARGET_CLASS - Bean Scope를 session으로 설정하려면 proxymode를 TARGET_CLASS로 설정해주어야한다.
  • @Builder, @Setter, @Getter : Dto 객체 안의 데이터들을 불러오거나 세팅하기위해 설정한 어노테이션
  • implements Serializable : 객체를 직렬화하하여 Java 외부 시스템에서도 사용할 수 있도록 Byte 형태로 변환해주어야 하기 때문에 해당 인터페이스를 implements 받았다.
    현재로서는 어플리케이션 내부에서 관리되기 때문에 굳이 implements를 받을 필요는 없지만 이후에 프로젝트를 운영하면서 redis와 같은 외부 데이터베이스를 이용할 것이기 때문에 직렬화가 필수다.

 

ApiController

@PostMapping(value = "/funding/create/phase2", consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.MULTIPART_FORM_DATA_VALUE}, produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.MULTIPART_FORM_DATA_VALUE})
public ResponseEntity<ResponseBody> fundingCreatePhase2(
        HttpServletRequest request,
        @RequestPart(value="phase2Request", required = false) FundingProjectCreatePhase2RequestDto fundingProjectCreatePhase2RequestDto,
        @RequestPart(value="thumbnailImage", required = false) MultipartFile thumbnailImage){
    log.info("펀딩 프로젝트 생성 2단계 api : 생성자 - {}, 프로젝트 타이틀 확인 - {}", request, fundingProjectCreatePhase2RequestDto.getProjectTitle());

    return fundingProjectService.fundingCreatePhase2(request, fundingProjectCreatePhase2RequestDto, thumbnailImage);
}

 

 

ApiService

public ResponseEntity<ResponseBody> fundingCreatePhase2(
        HttpServletRequest request,
        FundingProjectCreatePhase2RequestDto fundingProjectCreatePhase2RequestDto,
        MultipartFile thumbnailImage){

    // 펀딩 프로젝트 생성 요청 회원의 토큰 유효성 검증
    memberException.checkHeaderToken(request);
    // 2단계 정보 확인
    fundingProjectException.checkPhase2Info(fundingProjectCreatePhase2RequestDto, thumbnailImage);

    // sprin scope bean 을 사용하여 2단계 생성 정보들을 session으로 어플리케이션 내부에 저장 및 관리
    fundingProjectCreatePhase2ResponseDto.setProjectTitle(fundingProjectCreatePhase2RequestDto.getProjectTitle());
    fundingProjectCreatePhase2ResponseDto.setThumbnailImage(thumbnailImage);
    fundingProjectCreatePhase2ResponseDto.setEndDate(fundingProjectCreatePhase2RequestDto.getEndDate());
    fundingProjectCreatePhase2ResponseDto.setAdultCheck(fundingProjectCreatePhase2RequestDto.getAdultCheck());
    fundingProjectCreatePhase2ResponseDto.setSearchTag(fundingProjectCreatePhase2RequestDto.getSearchTag());

    HashMap<String, Object> resultSet = new HashMap<>();
    resultSet.put("phase2CreateMessage", "펀딩 프로젝트 생성 2단계 완료!");
    resultSet.put("phase2ResponseInfo", fundingProjectCreatePhase2ResponseDto);

    return new ResponseEntity<>(new ResponseBody(StatusCode.OK, resultSet), HttpStatus.OK);
}

api 를 호출하고 service에 session으로 관리되는 Dto 객체에 set을 통해 각 데이터 정보를 넣어주었다.

 

 

application.properties

server.servlet.session.timeout=2h

component로 bean 객체로 지정해주었고, session이 유지되는 생명주기를 설정해준다.

 

 

 

이제 session으로 데이터를 임시저장하게 되었다.

포스트맨으로 확인해보자

cookie 항목에 session아이디가 생성되어 발급된 것을 확인할 수 있다.

 

 

 

[도움받은 글]

https://gofnrk.tistory.com/42

 

Spring Boot Session 사용하기 (Bean Scope)

Spring Boot에서 세션을 사용하는 방법에 대해서 알아볼게요. Bean Scope를 활용하여 session 데이터를 편리하게 관리할 수 있는 방법을 알려드릴거에요. 굉장히! 간단합니다. 컴포넌트 하나만 추가하면

gofnrk.tistory.com

 

이후에 Redis나 외부에서 데이터를 관리하기위해 도움 받을 글

https://gofnrk.tistory.com/43

 

Spring Boot Session Redis 연동, 저장

이미 구현한 Spring Session의 데이터를 Redis에 저장하는 방법에 대해서 알아볼거에요. 예제 소스가 필요하신 분은 아래 글을 참고해주세요. https://gofnrk.tistory.com/42 Spring Boot Session 사용하기 (Bean Scope)

gofnrk.tistory.com

 

728x90
반응형
LIST