[F-Lab 모각코 챌린지] 29일차 - DI 와 DL, 빈 스코프
F-Lab 모각코 챌린지 29일차 DI, DL, 빈 스코프를 학습하며 정리한 내용입니다
![[F-Lab 모각코 챌린지] 29일차 - DI 와 DL, 빈 스코프](/content/images/size/w1200/2023/06/-------_--------_-------23.png)
DI 와 DL
DI:의존성 주입 (Dependency Injection)
- 인스턴스의 생성을 개발자가 직접 하는 방식이 아닌 Spring 의 IoC 를 이용해서 인스턴스를 주입 받는 방식
- DI 는 객체 사이의 결합도를 낮추고 코드의 재사용성을 높인다
DL: 의존성 조회 (Dependency Lookup)
- 특정 객체의 의존성이 Spring 의 ApplicationContext 에 존재하는지 검색하는 방법
빈 스코프
스코프 종류
- 기본 스코프 :
Singleton
,Prototype
- 애플리케이션 스코프 :
request
,session
,globalSession
,application
애플리케이션 스코프 - 요청 스코프:Request scope
생명주기
요청(request) 당 하나의 인스턴스를 가진다
HTTP 요청이 들어올 때마다 새로운 빈이 생성되고, 해당 요청이 끝날 때 빈은 소멸된다
사용 사례
웹 애플리케이션에서 사용자별로 데이터를 격리하고자 할 때 유용하다
예를 들면 인증 데이터, 임시 상태 등에 사용하면 좋다
사용 방법
@Bean
@Scope("request")
public UserPreferences userPreferences() {
return new UserPreferences();
}
@Component
@Scope("request")
public class UserPreferences {
// ...
}
주의 사항
- 웹 환경에서만 사용 할 수 있다
- 다른 요청 간에 상태를 공유하지 않는다
애플리케이션 스코프 - 세션 스코프:Session scope
생명 주기
HTTP 세션당 하나의 인스턴스를 가진다
즉, 사용자가 웹 애플리케이션에 접속하여 새로운 세션을 시작 할 때 빈이 생성되고, 사용자의 세션이 종료될 때 소멸된다.
사용 사례
사용자별로 상태를 유지해야 하는 경우 유용하다
예: 로그인 한 사용자의 프로필, 장바구니, 설정 등
사용 방법
@Bean
@Scope("session")
public ShoppingCart shoppingCart() {
return new ShoppingCart();
}
@Component
@Scope("session")
public class ShoppingCart {
// ...
}
주의 사항
- request 와 마찬가지로 웹 환경에서만 사용 할 수 있다
- 다른 사용자 세션과는 상태를 공유하지 않는다
애플리케이션 스코프 - 글로벌 세션 스코프: globalSession scope
생명주기
전역 HTTP 세션당 하나의 인스턴스를 가진다
Portlet 기반 애플리케이션에서 Portlet 들이 같은 세션을 공유할 때 유용하다
즉, 하나의 사용자 세션 내에서 실행되는 여러 웹 애플리케이션들이 같은 빈 인스턴스를 공유한다
사용 방법
@Bean
@Scope("globalSession")
public UserPreferences userPreferences() {
return new UserPreferences();
}
@Component
@Scope("globalSession")
public class UserPreferences {
// ...
}
주의 사항
globalSession
스코프는 포털 환경과 같이 전역 세션을 사용하는 특수한 경우에만 사용해야 한다- 일반적인 웹 애플리케이션 개발에서는 session 스코프가 더 적절하다
애플리케이션 스코프 - 애플리케이션 스코프: application scope
생명 주기
웹 애플리케이션을 시작할 때 생성, 종료할 때 소멸된다
사용사례
애플리케이션 수준의 구성, 공유 데이터, 서비스 등을 관리하는 데 사용될 수 있다
예를 들어 Database 연결, 구성 서비스, 애플리케이션 수준의 캐시 등이 해당된다
사용 방법
@Bean
@Scope("application")
public ConfigurationService configurationService() {
return new ConfigurationService();
}
@Component
@Scope("application")
public class ConfigurationService {
// ...
}
주의 사항
- application 스코프의 빈은 상태를 가질 수 있으므로 스레드 안전성 및 동기화를 고려해야 한다