개발/java

spring. 클래스 레벨에 위치한 변수의 생성 시점

ttoance 2023. 5. 24. 20:32
package com.example.redisstudy;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.util.HashMap;

@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 myName(HttpSession session){
        String myName = sessionMap.get(session.getId());

        return myName;
    }
}

 

아래 강좌를 듣고 실습하다가. 아래대로 실행한다고 했을때 sessionMap에 값이 남아있는 원리가 궁금했다. 

https://fastcampus.co.kr/dev_online_bedata

 

백엔드 개발자를 위한 한 번에 끝내는 대용량 데이터 & 트래픽 처리 초격차 패키지 Online. | 패스

데이터 처리 4대장 : MySQL, MongoDB, Kafka, Redis 외 31가지 기술스택 활용을 담은 초격차 강의! 실무 경험에 기반한 18가지 Use Case와 105개 실습 클립으로 대용량 테이터 & 처리를 완벽하게 경험해보세요!

fastcampus.co.kr

/login call -> sessionMap에 name 변수 세팅 

/myName call -> sessionMap 리턴 

 

그래서, 왜 그런지 chatgpt와 stack overflow에 질문을 남겨서 확인해보았다. 

 

stack overflow 

https://stackoverflow.com/questions/76219470/spring-class-variable-remains-although-i-call-the-api-twice

 

spring class variable remains although i call the api twice

i expected if i call the api twice , then the class variables will be initialized but it's not. i want to know why. what did i do /login?name=Jay /myName => Jay returned what i expected /logi...

stackoverflow.com

컨트롤러가 싱글톤이기 때문에, sessionMap = new HashMap<>(); 이 부분이 한번만 실행될 거라고 했다. 

 

 

chatgpt

- sessionMap 변수가 클래스 레벨에 위치한 변수 선언 구문이기 때문에, LoginController 클래스 객체가 생성될때, sessionMap 변수가 생성된다고 한다. 

- 또, LoginController 클래스의 객체는 웹 애플리케이션 시작 시 스프링 컨테이너에 의해 생성된다. 이 객체는 클라이언트 요청마다 생성되는 것이 아니라, 애플리케이션 실행 시점에 단 한 번만 생성한다. 

 

그리고 HashMap을 사용하면 동기화 문제가 생길수도 있기 때문에 synchronized 키워드를 추천해주었다. 

 

좀 더 찾아보니, 이 외에도 ConcurrentHashMap 을 사용하거나, Hashtable을 사용하면 동기화 처리가 되어있다고 한다. 

여기 참고해보면 좋은 블로그 글이다. 

https://tomining.tistory.com/169

 

HashMap, Hashtable, ConcurrentHashMap 동기화 처리 방식

먼저 HashMap과 HashTable의 차이에 대해서 알아보자. Key, Value 형식의 데이터를 저장하는 기능을 제공하는 자료 구조로 큰 맥락에서는 동일하다. 그러나 크게 3가지 정도의 차이를 보인다. Null 허용

tomining.tistory.com

 

반응형