Spring Controller의 Stateless
예전에 공부한 Spring Controller에서 쓴 내용이 잘못 됐다는것을 발견했다.
https://tmpfactory.tistory.com/39?category=932695
Spring 완전정복 - 1 / Controller
Spring에서 페이지를 띄우는 여러 방법 1. 정적 페이지, MVC와 템플릿 엔진 위 그림과 같이 동작하는데, 각각의 경우에 따라 다르게 동작한다. 정적 페이지를 호출 할 경우 -> http://localhost:8080/hello.htm
tmpfactory.tistory.com
문제가 된 것은 이 부분이다.
Spring Bean은 싱글톤 형식으로 Spring Container에 담겨져 있다는걸 공부하고 있을 때, 이러한 싱글톤 객체에는 필드를 가지고 있어서는 안 된다는것을 알게 되었다.
싱글톤 패턴에대한 이전 글
https://tmpfactory.tistory.com/59?category=932695
Spring 핵심 원리 3 - 싱글톤 패턴과 스프링 컨테이너
스프링은 필요한 메소드들을 스프링 컨테이너에 빈 형태로 관리하게 되는데, 그 동안 DIP(Dependency Inversion Principle)를 지키기위해 AppConfig이라는 Config 파일을 만들어두어, 스프링 빈으로 등록해서
tmpfactory.tistory.com
위에서 내가 쓴 코드는, 명백히 싱글톤 객체에 필드를 넣은 실수이다.
물론 사용상의 문제는 없겠지만(helloApi를 호출하는 시점에 para의 값을 set하기 때문), 이후에 누군가 getName을 했을 때 동기화 오류가 발생 할 수 있다. (getName을 한 시점이, 누군가 setName을 한 직후는 아닌지?)
Controller도 Bean과 같이 스프링에서 싱글톤 패턴으로 관리되므로, Controller내에 필드가 있어서는 안 된다.
@GetMapping("hello-api")
@ResponseBody
public Param helloApi(@RequestParam("name") String name) {
Param para = new Param();
para.setName(name);
return para;
}
메모리를 더 사용하는 한이 있더라도, 싱글톤 객체에는 "필드"를 넣어서는 안 된다.