Spring boot 01-1. Bean과 IoC&DI

Geun Nam Park·2026년 4월 25일

Spring Boot

목록 보기
2/4

Bean이란?

Bean : Spring의 관리 시스템(IoC 컨테이너) 안에 등록된 자바 객체.
준비되어 있는 객체를 가져다 사용할 수 있음. → new 키워드로 수동 생성 및 구현을 하지 않아도 됨.

Bean의 생성 및 주입 과정

  1. 설정 읽기

  2. Bean 생성

  3. 의존성 주입(DI)

  4. 초기화

  5. 사용

  6. 종료 및 소멸


1️⃣ 설정 정보 읽기
Spring이 어떤 객체를 만들지 파악함.

대상
@SpringBootApplication
@ComponentScan
@configuration

예시

@SpringBootApplication
public class Application {
}

@CompunentScan 실행
지정된 패키지 탐색

찾는 대상

@Component
@Service
@Repository
@Controller

얘네는 Bean으로 만들기


2️⃣ Bean 생성
Spring은 찾은 클래스들을 객체로 생성한다.

예시

@Service
public class UserService {
}

내부적으로

UserService userService = new UserService();

Spring이 생성 : 직접 생성(new 사용) X


3️⃣ 의존성 주입 (DI)

예시

@Service
public class UserService {
	private final UserRepository userRepository;
    
    public UserService(UserRepository userRepository) {
    	this.userRepository = userRepository;
    }
}

동작 과정
1. Spring이 UserService 생성하려고 시도
2. 생성자 확인
3. UserRepository가 필요하다는 것을 발견
4. 컨테이너에서 찾아서 넣어줌

만약 없다면 에러


4️⃣ Bean 초기화
객체 생성 및 주입이 끝나면 초기화 작업 수행

방법

@PostConstruct
public void init() {
	System.out.println("초기화 완료");
}

Bean 생성 직후 실행됨


5️⃣ Bean 사용

@Autowired
UserService userService;

어디서든 꺼내서 사용 가능

Bean은 기본적으로 Singleton
: 한 번 생성 → 계속 재사용


6️⃣ Bean 소멸
Spring 종료 시 소멸

@PreDestroy
public void destroy() {
}

정리 작업 수행


등록하는 법 : xml에 직접 등록 / @Bean 사용 / @Component, @Controller, @Service, @Repository 등을 이용

가져다 쓰는 법 : @Autowired 사용(Spring 4.3 이후는 생성자가 하나이면 생략 가능) 혹은 생성자 주입



IoC (제어의 역전) & DI (의존성 주입)

IoC(Inversion of Control)

이전의 개발 방식 : 객체를 직접 생성(new Service())하는 것
객체의 생성과 생명주기 관리 권한을 Spring 컨테이너에 넘겨, 객체를 요구(@Autowired)하는 것을 선언.

Bean 생성의존성 주입보관(Map 형태)필요할 때 꺼내쓰기

  • 기존방식
public class UserService {
	private UserRepository userRepository = new UserRepository();
}

UserService가 직접 UserRepository를 생성함
강한 결합


  • IoC 적용
public class UserService {
	private UserRepository userRepository;

    public UserService(UserRepository userRepository) {
    	this.userRepository = userRepository;
    }
}

Spring이 대신 객체를 만들어서 넣어줌

객체 간 의존성 낮아짐.
구현체 사이의 변경이 용이.
프로그램의 진행 흐름과 구체적인 구현을 분리시킬 수 있음.


DI(Dependency Injection)

IoC를 구현하기 위한 디자인 패턴으로, DI를 사용한다.

// 예시
@Service
public class UserService {
	private final UserRepository userRepository;
    >
    public UserService(UserRepository userRepository) {
    	this.userRepository = userRepository;
    }
}

필요한 객체를 외부에서 넣어주는 것으로
Spring이 자동으로 UserRepository를 생성하고
UserService에 넣어준다.


DI의 방식 3가지

  1. 생성자 주입
public UserService(UserRepository userRepository) {
	this.userRepository = userRepository;
}
  1. 필드 주입
@Autowired
private UserRepository userRepository; 
  1. setter 주입
@Autowired
public void setUserRepository(UserRepository userRepository) {
	this.userRepository = userRepository;
}

0개의 댓글