Spring이 대신 객체 생성
Spring Bean: 개발자가 직접 객체 생성한게 아니라 Spring 이 대신 객체 생성 주입 해주는 단위
- Singletone 싱글톤: 싱글톤 객체를 Spring의 ApplicationContext이 대신 만들어서 주입
Spring Bean이 싱글톤으로 관리되는 이유
대규모 엔프라이즈 서버 환경을 서버 하나당 최대로 초당 수십, 수백 번씩 브라우저나 여러 시스템으로부터 요청을 받아 처리할 수 있는 높은 성능이 요구되는 환경
Spring MVC 구조에 따라 하나의 요청에 대한 응답을 만들기까지, 데이터 액세스 로직, 서비스 로직 등의 다양한 기능을 담당하는 객체들이 모두 참여하는 계층형 구조이다.
- 결과: 요청이 올때마다 각 로직을 담당하는 객체를 새로 만들어서 사용한다면 서버에 엄청난 부하
- 해결: 이런 서버 환경에서 제한된 객체들만 만들도록 싱글톤 사용이 권장된다.
Spring 자체 싱글톤 레지스트리를 통한 싱글톤 사용: 싱글톤 객체 생성, 할당 및 관리
- IoC 방식 중 DI 컨테이너를 사용해 제어권을 컨테이너에게 넘겨 싱글톤 방식 관리
Java의 싱글톤 사용의 문제
- private 생성자로 인해 (1) 생성자 호출 불가로 인한 상속 불가 (2) 불편한 테스트
- 클래스 로더에 싱글톤 여부 의존 (예를 들어서, 1 어플리케이션: N 클래스 로더 시 싱글톤 불가능)
Spring Bean 의 Scope에 따른 Bean의 라이프사이클
스프링 빈이 생성되고, 존재하며 적용되는 범위를 스코프라고 한다. 스프링 빈의 기본 스코프는 싱글톤
Singleton 스코프(기본)
ApplicationContext(Spring Ioc Container) 에 의해 한 개 객체로 관리

Prototype 스코프
Bean 객체를 요청할 때마다 새 객체를 만들어서 반환 (객체 소멸은 GC에게 위임)

Request 스코프
HTTP 요청 들어오고, 응답되기까지 서블릿 기반 WebApplicationContext가 관리
Session 스코프
HTTP Session에 의존, 이 또한 서블릿 기반 WebApplicationContext 가 관리
제어 역전(IoC, Inversion of Control)
spring 이 대신 객체 생성 및 주입
제어 역전 = 객체 생성 및 주입
- 객체의 생성을 직접할 것인가: 객체가 필요할 때 개발자가 코딩 내 직접 `new` 로 생성하여 사용할 것인가?
- 어떤 주체가, 객체가 필요할 때 객체를 대신 생성하여 필요한 곳에 주입해줄 것인가?
제어 역전 구현 방법 5가지: 어떤 주체 = 어떻게 객체 대신 주입?
- Template Pattern: 추상 클래스 부분 구현
- Delegate: 위임(실행 결과를 받는것까지 모두 위임, 자기 자신을 보낸다)
- Event: 이벤트 발행(Publisher & Subscriber)
- Service Locator / Lookup: Service Locator 에서 직접 가져와쓰기 개발자가 직접 Bean 주입하는 것
- Locator 가 직접 주입 + 의존성 파악 불가
- 테스트 시 외부에서 Mock, Stub 주입 불가
- DI(Dependancy Injection) 의존성 주입: (IoC) Container 가 대신 Bean 수집, 관리 ,주입 해주는 것
- 생성자만으로 주입 + 의존성 파악 가능
- 테스트 시 외부에서 Mock, Stub 주입 가능
- 생성자 주입을 해야하는 이유이다.
과거 Spring 에서는 필요 객체들을 개발자가 개발한 뒤, XML을 통해 일일히 Bean 등록
현재 Spring 에서는 XML 아닌 @Container, @Repository 등의 지정으로 Bean 등록
Spring Bean 관리
1. Bean 등록 방법
- @ComponentScan + @Component 를 통한 등록
- @Controller, @Service, @Repository 등을 통한 등록
- @Configuration + @Bean
2. Bean 사용 방법
- 구체 클래스를 지정하여 Bean 객체 사용 ← 구체 클래스로 Bean 등록
- 부모 클래스를 지정하여 Bean 객체 사용 ← 부모 클래스의 자식 클래스로 Bean 등록
- 인터페이스를 지정하여 Bean 객체 사용 ← 인터페이스의 구체 클래스로 Bean 등록
- 다수 자식 클래스 혹은 다수 인터페이스의 구체 클래스를 Collection 자료구조로 Bean 사용
Bean 주입 방법
1. 생성자 주입
장점
- 순환참조를 컴파일 시 방지: 순환 참조 여부를 객체 생성 후가 아닌 생성 전에 인지해 실수 방지
- Final 적용 가능: Bean 객체의 불변성 보장(한번 주입되면 이후에 바뀌지 않는다는걸 보장)
@Controller
@RequestMapping("/users")
@RequiredArgsConstructor
public class UserController {
private final UserServiceInterface userService;
@Controller
@RequestMapping("/users")
@RequiredArgsConstructor
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
public class UserController {
UserServiceInterface userService;
2. 필드 주입
주니어 개발자들이 가장 많이 선호하는 직관적인 방식
@Controller
@RequestMapping("/users")
public class UserController {
@Autowired
private UserServiceInterface userService;
3. 수정자 주입((Setter) Method Injection)
@Controller
@RequestMapping("/users")
public class UserController {
private UserServiceInterface userService;
@Autowired
public void setUserService(UserServiceInterface userService) {
this.userService = userService;
}
'ASAC 웹 풀스택 > Spring Boot' 카테고리의 다른 글
Spring 구조(1) - MVC 아키텍처 패턴, Front Controller (1) | 2024.10.08 |
---|---|
Spring Boot 특장점 및 동작(1) - Spring과 Spring Boot의 차이점 (0) | 2024.10.08 |
Spring MVC 원리(3) - @Controller, MessageConverter (0) | 2024.10.08 |
Spring MVC 원리(2) - Tomcat + Spring 상세구조 (0) | 2024.10.07 |
Spring MVC 원리(1) - 동작 과정 (0) | 2024.10.07 |
Spring이 대신 객체 생성
Spring Bean: 개발자가 직접 객체 생성한게 아니라 Spring 이 대신 객체 생성 주입 해주는 단위
- Singletone 싱글톤: 싱글톤 객체를 Spring의 ApplicationContext이 대신 만들어서 주입
Spring Bean이 싱글톤으로 관리되는 이유
대규모 엔프라이즈 서버 환경을 서버 하나당 최대로 초당 수십, 수백 번씩 브라우저나 여러 시스템으로부터 요청을 받아 처리할 수 있는 높은 성능이 요구되는 환경
Spring MVC 구조에 따라 하나의 요청에 대한 응답을 만들기까지, 데이터 액세스 로직, 서비스 로직 등의 다양한 기능을 담당하는 객체들이 모두 참여하는 계층형 구조이다.
- 결과: 요청이 올때마다 각 로직을 담당하는 객체를 새로 만들어서 사용한다면 서버에 엄청난 부하
- 해결: 이런 서버 환경에서 제한된 객체들만 만들도록 싱글톤 사용이 권장된다.
Spring 자체 싱글톤 레지스트리를 통한 싱글톤 사용: 싱글톤 객체 생성, 할당 및 관리
- IoC 방식 중 DI 컨테이너를 사용해 제어권을 컨테이너에게 넘겨 싱글톤 방식 관리
Java의 싱글톤 사용의 문제
- private 생성자로 인해 (1) 생성자 호출 불가로 인한 상속 불가 (2) 불편한 테스트
- 클래스 로더에 싱글톤 여부 의존 (예를 들어서, 1 어플리케이션: N 클래스 로더 시 싱글톤 불가능)
Spring Bean 의 Scope에 따른 Bean의 라이프사이클
스프링 빈이 생성되고, 존재하며 적용되는 범위를 스코프라고 한다. 스프링 빈의 기본 스코프는 싱글톤
Singleton 스코프(기본)
ApplicationContext(Spring Ioc Container) 에 의해 한 개 객체로 관리

Prototype 스코프
Bean 객체를 요청할 때마다 새 객체를 만들어서 반환 (객체 소멸은 GC에게 위임)

Request 스코프
HTTP 요청 들어오고, 응답되기까지 서블릿 기반 WebApplicationContext가 관리
Session 스코프
HTTP Session에 의존, 이 또한 서블릿 기반 WebApplicationContext 가 관리
제어 역전(IoC, Inversion of Control)
spring 이 대신 객체 생성 및 주입
제어 역전 = 객체 생성 및 주입
- 객체의 생성을 직접할 것인가: 객체가 필요할 때 개발자가 코딩 내 직접new
로 생성하여 사용할 것인가?
- 어떤 주체가, 객체가 필요할 때 객체를 대신 생성하여 필요한 곳에 주입해줄 것인가?
제어 역전 구현 방법 5가지: 어떤 주체 = 어떻게 객체 대신 주입?
- Template Pattern: 추상 클래스 부분 구현
- Delegate: 위임(실행 결과를 받는것까지 모두 위임, 자기 자신을 보낸다)
- Event: 이벤트 발행(Publisher & Subscriber)
- Service Locator / Lookup: Service Locator 에서 직접 가져와쓰기 개발자가 직접 Bean 주입하는 것
- Locator 가 직접 주입 + 의존성 파악 불가
- 테스트 시 외부에서 Mock, Stub 주입 불가
- DI(Dependancy Injection) 의존성 주입: (IoC) Container 가 대신 Bean 수집, 관리 ,주입 해주는 것
- 생성자만으로 주입 + 의존성 파악 가능
- 테스트 시 외부에서 Mock, Stub 주입 가능
- 생성자 주입을 해야하는 이유이다.
과거 Spring 에서는 필요 객체들을 개발자가 개발한 뒤, XML을 통해 일일히 Bean 등록
현재 Spring 에서는 XML 아닌 @Container, @Repository 등의 지정으로 Bean 등록
Spring Bean 관리
1. Bean 등록 방법
- @ComponentScan + @Component 를 통한 등록
- @Controller, @Service, @Repository 등을 통한 등록
- @Configuration + @Bean
2. Bean 사용 방법
- 구체 클래스를 지정하여 Bean 객체 사용 ← 구체 클래스로 Bean 등록
- 부모 클래스를 지정하여 Bean 객체 사용 ← 부모 클래스의 자식 클래스로 Bean 등록
- 인터페이스를 지정하여 Bean 객체 사용 ← 인터페이스의 구체 클래스로 Bean 등록
- 다수 자식 클래스 혹은 다수 인터페이스의 구체 클래스를 Collection 자료구조로 Bean 사용
Bean 주입 방법
1. 생성자 주입
장점
- 순환참조를 컴파일 시 방지: 순환 참조 여부를 객체 생성 후가 아닌 생성 전에 인지해 실수 방지
- Final 적용 가능: Bean 객체의 불변성 보장(한번 주입되면 이후에 바뀌지 않는다는걸 보장)
@Controller @RequestMapping("/users") @RequiredArgsConstructor public class UserController { private final UserServiceInterface userService;
@Controller @RequestMapping("/users") @RequiredArgsConstructor @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) public class UserController { UserServiceInterface userService;
2. 필드 주입
주니어 개발자들이 가장 많이 선호하는 직관적인 방식
@Controller @RequestMapping("/users") public class UserController { @Autowired private UserServiceInterface userService;
3. 수정자 주입((Setter) Method Injection)
@Controller @RequestMapping("/users") public class UserController { private UserServiceInterface userService; @Autowired public void setUserService(UserServiceInterface userService) { this.userService = userService; }
'ASAC 웹 풀스택 > Spring Boot' 카테고리의 다른 글
Spring 구조(1) - MVC 아키텍처 패턴, Front Controller (1) | 2024.10.08 |
---|---|
Spring Boot 특장점 및 동작(1) - Spring과 Spring Boot의 차이점 (0) | 2024.10.08 |
Spring MVC 원리(3) - @Controller, MessageConverter (0) | 2024.10.08 |
Spring MVC 원리(2) - Tomcat + Spring 상세구조 (0) | 2024.10.07 |
Spring MVC 원리(1) - 동작 과정 (0) | 2024.10.07 |