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
/login call -> sessionMap에 name 변수 세팅
/myName call -> sessionMap 리턴
그래서, 왜 그런지 chatgpt와 stack overflow에 질문을 남겨서 확인해보았다.
stack overflow
컨트롤러가 싱글톤이기 때문에, sessionMap = new HashMap<>(); 이 부분이 한번만 실행될 거라고 했다.
chatgpt
- sessionMap 변수가 클래스 레벨에 위치한 변수 선언 구문이기 때문에, LoginController 클래스 객체가 생성될때, sessionMap 변수가 생성된다고 한다.
- 또, LoginController 클래스의 객체는 웹 애플리케이션 시작 시 스프링 컨테이너에 의해 생성된다. 이 객체는 클라이언트 요청마다 생성되는 것이 아니라, 애플리케이션 실행 시점에 단 한 번만 생성한다.
그리고 HashMap을 사용하면 동기화 문제가 생길수도 있기 때문에 synchronized 키워드를 추천해주었다.
좀 더 찾아보니, 이 외에도 ConcurrentHashMap 을 사용하거나, Hashtable을 사용하면 동기화 처리가 되어있다고 한다.
여기 참고해보면 좋은 블로그 글이다.
https://tomining.tistory.com/169
반응형
'개발 > java' 카테고리의 다른 글
jsp. 주석 종류 (클라이언트 미노출하고 싶다면 <%-- --%>) (0) | 2023.10.24 |
---|---|
spring. component vs bean 차이점 (0) | 2023.07.27 |
java. 버전 바꾸는 방법 (mac) (0) | 2023.04.16 |
java. 여러개의 port로 jar 파일 실행 (0) | 2023.04.16 |
@bean vs @component (0) | 2022.10.27 |