Spring IoC(제어의 역전) 컨테이너는 말 그대로 프로그램에서 객체를 관리해주는 베이비시터 역할을 하는 시스템이다.
여기서 'IoC'는 "제어의 역전"을 의미하는데, 즉 개발자가 객체를 직접 만들어서 관리하는 것이 아니라, Spring 프레임워크가 이 모든 일을 대신 해준다는 것이다.
생각해보자. 요리사를 고용해서 요리를 하는 상황! 🧑🏻🍳 🍳
우리가 요리사에게 필요한 재료를 주고 요리를 요청하는 것처럼, Spring도 필요한 객체를 설정하면 이를 관리하고 제공해주는 것이다. 우리는 직접 요리할 필요 없이 좋은 음식을 받을 수 있다.
IoC 컨테이너의 작동 원리
- 객체 정의: 필요한 객체들을 클래스로 정의한다.
- 의존성 지정: 객체들 간의 관계를 설정한다. 이때 Spring에서는 설정 파일이나 어노테이션을 사용해서 어떤 객체가 다른 객체에 의존하는지 알려준다.
=================== ⬆️ 준비 완료!
3. 객체 생성 및 주입: IoC 컨테이너는 앞서 설정한 정보를 기반으로 객체를 생성하고, 필요한 곳에 주입하게 된다.
이 과정을 통해 POJO(Plain Old Java Object, 순수한 자바 객체) 기반 개발을 가능하게 하며, 복잡한 라이브러리나 프레임워크에 구애받지 않고 일반적인 자바 객체로 비즈니스 로직을 구현할 수 있도록 한다.
예시로 보는 UserService
여기서 UserService라는 클래스를 보자
public class UserService {
private UserRepository userRepository;
// 의존성 주입 방법 = 생성자
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User findUserById(Long id) {
return userRepository.findById(id);
}
}
- 설명: UserService는 UserRepository라는 객체에 의존하고 있으며, 이는 스프링이 자동으로 이 객체를 주입해준다. 그래서 개발자는 복잡하게 객체를 만들 필요 없이 간단하게 비즈니스 로직을 작성할 수 있다.
빈(Bean)
- Spring에서 빈은 Spring 컨테이너가 관리하는 자바 객체를 의미한다. ApplicationContext.getBean()을 통해 가져올 수 있다.
- Spring은 서로 의존하는 객체들 간의 관계를 설정하고 관리해준다.
객체 생성 방식
- 자바 객체를 직접 생성할 때의 방식:
UMC8thMember umc8thMember = new UMC8thMember(22, "리아","KAU", "Server(SpringBoot)");
→ 개발자가 직접 다 관리해야 됨 😱
여기서 스프링을 통해 객체를 생성하게 되면, 개발자는 더 이상 이런 작업에 신경 쓸 필요가 없다!
빈으로 등록하는 방법
- @Component와 @Autowired: Spring이 자동으로 빈으로 등록하게 하도록 해준다.
- @Configuration와 @Bean: 설정 파일에 빈을 명시적으로 정의한다.
@Component
클래스가 Spring의 빈으로 등록되도록 한다.
Spring이 이 클래스를 관리하게 하여, 필요한 경우 다른 클래스에서 주입받을 수 있게 한다.
(마치 학교에서 학생들이 수업을 듣기 위해 등록하는 것과 비슷해요. 학생이 수업에 등록하면, 학교는 그 학생을 관리하게 된다.)
@Autowired
Spring에게 의존성 주입을 요청한다.
필요한 빈을 찾아서 해당 필드나 생성자에 주입한다.
(수업에서 교사가 필요한 자료를 학생들에게 자동으로 배포하는 것과 같다. 교사는 학생들에게 필요한 자료를 따로 요청할 필요 없이, 자동으로 제공해준다.)
예시
@Component
public class UMC7thMember {
private int age;
private String nickname;
// 생성자와 메서드 생략
}
여기서 @Component를 붙이면 Spring이 자동으로 UMC7thMember를 빈으로 등록하고, 다른 클래스에서는 @Autowired로 주입 받을 수 있다.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service // 비즈니스 로직을 담고 있는 서비스 클래스
public class UserService {
private final UserRepository userRepository;
@Autowired // UserRepository를 자동으로 주입
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
// 비즈니스 로직 메서드
'Dev > Backend' 카테고리의 다른 글
| [PostgreSQL] psql 접속 시 role does not exist 에러 해결 (Docker + PostgreSQL) (3) | 2025.07.17 |
|---|---|
| GraphQL이란? (3) | 2025.07.03 |
| RESTful API란? (0) | 2025.03.31 |
| [Spring] 이메일 전송 로직 구현하기 (0) | 2025.01.24 |
| [Node.js / TypeScript] 발생한 문제와 해결 방법들 (2) | 2024.08.26 |