🚩 1. 스프링의 빈(Bean)은 무상태로 설계하자!
- 스프링 프레임워크에서 빈은 주로 싱글톤(SingleTone)으로 관리되는 객체를 말한다.
- 빈은 여러 요청에 걸쳐 공유되므로 상태를 가지게 되면 여러 문제점이 발생할 수 있다.
- 따라서 빈을 설계할 때는 무상태(StateLess)로 설계하는 것이 좋다.
📌 1-1. 무상태로 설계해야 하는 영역
- 자바의 빈으로 등록되는 객체
- Controller, Service, Mapper/DAO, Repository
- 이러한 계층의 객체(클래스)는 여러 요청에 걸쳐 공유되므로 상태를 가지지 않도록 하는 것이 좋다.
- 여러 요청 간에 공유되는 객체
- 동시에 여러 사용자가 액세스할 수 있는 객체는 상태를 가지지 않는 것이 좋다.
- 상태를 가지게 되면 상태의 일관성을 유지하기 어려워 데이터 무결성 문제가 발생할 수 있다.
📌 1-2. 상태를 가질 수 있는 영역
- 요청 내에서 생성되고 소멸되는 라이프사이클을 가진 객체
- VO, Entity, DTO
- 요청과 함께 생성되고 응답과 함께 소멸되는 객체(클래스)는 해당 요청 내에서만 사용되므로 요청을 가질 수 있다.
- 해당 객체의 상태가 다른 요청에 영향을 미치지 않는 객체
📌 1-3. 무상태 설계법
- 필드의 상태 보관 지양
- 빈의 필드에 상태를 보관하지 않는다.
- 필요한 정보는 파라미터로 전달받아 사용한다.
- 데이터의 파라미터화
- 필요한 데이터는 메서드의 파라미터로 전달받아 사용하고, 결과는 반환값으로 전달한다.
- 이렇게 하면 메서드 내부에서만 데이터가 사용되므로 상태가 유지되지 않는다.
- 무분별한 스프링 설정 변경
- 스프링은 기본적으로 싱글톤으로 관리되므로 여러 요청에 걸쳐 공유한다.
- 따라서 분별없이 빈의 상태를 변경하는 로직은 지양해야 한다.
- 세션 정보 활용
- 사용자별로 상태를 유지해야 할 때는 세션을 활용한다.
- 세션은 사용자별로 고유하므로 다른 사용자의 요청에 영향을 미치지 않는다.