Spring Bean 원리(1) - 싱글톤, IoC, Bean 등록/사용

ASAC 웹 풀스택/Spring Boot
2024. 10. 8. 14:42
목차
  1. Spring이 대신 객체 생성
  2. Spring Bean이 싱글톤으로 관리되는 이유
  3. Spring Bean 의 Scope에 따른 Bean의 라이프사이클
  4. 제어 역전(IoC, Inversion of Control)
  5. Spring Bean 관리
  6. 1. Bean 등록 방법
  7. 2. Bean 사용 방법
  8. Bean 주입 방법
  9. 1. 생성자 주입
  10. 2. 필드 주입
  11. 3. 수정자 주입((Setter) Method Injection)
728x90

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가지: 어떤 주체 = 어떻게 객체 대신 주입?

  1. Template Pattern: 추상 클래스 부분 구현
  2. Delegate: 위임(실행 결과를 받는것까지 모두 위임, 자기 자신을 보낸다)
  3. Event: 이벤트 발행(Publisher & Subscriber)
  4. Service Locator / Lookup: Service Locator 에서 직접 가져와쓰기 개발자가 직접 Bean 주입하는 것
    • Locator 가 직접 주입 + 의존성 파악 불가
    • 테스트 시 외부에서 Mock, Stub 주입 불가
  5. DI(Dependancy Injection) 의존성 주입: (IoC) Container 가 대신 Bean 수집, 관리 ,주입 해주는 것
    • 생성자만으로 주입 + 의존성 파악 가능
    • 테스트 시 외부에서 Mock, Stub 주입 가능
    • 생성자 주입을 해야하는 이유이다.
과거 Spring 에서는 필요 객체들을 개발자가 개발한 뒤, XML을 통해 일일히 Bean 등록
현재 Spring 에서는 XML 아닌 @Container, @Repository 등의 지정으로 Bean 등록

Spring Bean 관리

1. Bean 등록 방법

  1. @ComponentScan + @Component 를 통한 등록
  2. @Controller, @Service, @Repository 등을 통한 등록
  3. @Configuration + @Bean

 

2. Bean 사용 방법

  1. 구체 클래스를 지정하여 Bean 객체 사용 ← 구체 클래스로 Bean 등록
  2. 부모 클래스를 지정하여 Bean 객체 사용 ← 부모 클래스의 자식 클래스로 Bean 등록
  3. 인터페이스를 지정하여 Bean 객체 사용 ← 인터페이스의 구체 클래스로 Bean 등록
  4. 다수 자식 클래스 혹은 다수 인터페이스의 구체 클래스를 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;
}
728x90

'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
  1. Spring이 대신 객체 생성
  2. Spring Bean이 싱글톤으로 관리되는 이유
  3. Spring Bean 의 Scope에 따른 Bean의 라이프사이클
  4. 제어 역전(IoC, Inversion of Control)
  5. Spring Bean 관리
  6. 1. Bean 등록 방법
  7. 2. Bean 사용 방법
  8. Bean 주입 방법
  9. 1. 생성자 주입
  10. 2. 필드 주입
  11. 3. 수정자 주입((Setter) Method Injection)
'ASAC 웹 풀스택/Spring Boot' 카테고리의 다른 글
  • Spring 구조(1) - MVC 아키텍처 패턴, Front Controller
  • Spring Boot 특장점 및 동작(1) - Spring과 Spring Boot의 차이점
  • Spring MVC 원리(3) - @Controller, MessageConverter
  • Spring MVC 원리(2) - Tomcat + Spring 상세구조
hapBday
hapBday
hapBday
개발자로 성장하기 위한 기록들
hapBday
전체
오늘
어제
  • 분류 전체보기 (203)
    • CS (12)
      • 컴퓨터네트워크 (11)
      • 운영체제 (0)
      • 분산 시스템 (0)
      • 데이터베이스 (1)
    • Spring (47)
      • Spring 핵심 원리 (13)
      • Spring MVC (15)
      • Spring DB (12)
      • Spring Security (6)
    • JPA (14)
    • 알고리즘 (30)
      • 프로그래머스 (6)
      • 백준 (20)
    • Design Pattern (0)
    • 언어 (5)
      • JAVA (5)
    • ASAC 웹 풀스택 (38)
      • Spring Boot (21)
      • React (0)
      • DevOps (8)
    • 트러블슈팅 (15)
    • DevOps (5)
      • Docker (5)
    • ETC (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • github

공지사항

  • 블로그 이전

인기 글

태그

  • spring boot
  • jwt
  • 구현
  • docker workflow
  • 인프런
  • currency control
  • 프로그래머스
  • S3
  • docker
  • MVC
  • 오블완
  • cookie
  • x-lock
  • aws lambda
  • Java
  • docker best practices
  • CSRF
  • 3-layerd 아키텍쳐 패턴
  • JPA
  • 트랜잭션
  • multi-stage
  • Spring
  • Session
  • basicerrorcontroller
  • 백준
  • 티스토리챌린지
  • spring security
  • CORS
  • 김영한
  • s-lock

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.3.0
hapBday
Spring Bean 원리(1) - 싱글톤, IoC, Bean 등록/사용
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.