
* 개념 복습과 학습 정도를 파악하고자 포스팅합니다!
* Claude, ChatGPT를 활용하여 이미지를 생성하고 활용합니다.
Spring의 기본 동작 원리
1. IoC(Inversion of Control), 제어의 역전
일반적인 Java 코드에서는 객체가 필요하면 개발자가 직접 new로 만들죠?
// 일반 Java
public class OrderService {
private UserRepository userRepository = new UserRepository(); // 직접 생성
}
이러면 OrderService가 UserRepository에 강하게 묶여서 테스트하기 어렵고 유연성이 떨어집니다.
Spring은 이걸 뒤집습니다.
객체 생성과 관리를 개발자가 아니라 Spring 컨테이너가 담당합니다. 이게 바로 제어의 역전(IoC, Inversion of Control)입니다!
// Spring — 컨테이너가 생성하고 주입
@Service
public class OrderService {
private final UserRepository userRepository; // 직접 생성 안 함
public OrderService(UserRepository userRepository) { // 컨테이너가 넣어줌
this.userRepository = userRepository;
}
}

2. DI(Dependency Injection), 의존성 주입
DI(Dependency Injection)은 IoC를 구현하는 구체적인 방법입니다.
컨테이너가 필요한 객체(의존성)을 찾아서 알아서 주입해줍니다.
Spring에서 DI 방법은 세 가지입니다. 그 중에서도 권장하는 방식은 생성자 주입입니다.
// 1. 생성자 주입 (권장) — 의존성이 명확하고 불변성 보장
@Service
public class OrderService {
private final UserRepository userRepository;
public OrderService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
// 2. 필드 주입 (비권장) — 테스트하기 어려움
@Service
public class OrderService {
@Autowired
private UserRepository userRepository;
}
// 3. Setter 주입 — 선택적 의존성에만 사용
@Service
public class OrderService {
private UserRepository userRepository;
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
생성자 주입이 권장되는 이유는 final 키워드로 불변성을 보장하고, 테스트할 때 직접 객체를 넣기 편하기 때문입니다.
3. Bean, Spring이 관리하는 객체
Spring 컨테이너가 생성하고 관리하는 객체를 Bean 이라고 불러요.
개발자가 어노테이션으로 "이거 Bean으로 등록해"라고 알려주면 됩니다.
@Component // 일반 컴포넌트
@Service // 서비스 레이어 (의미상 구분)
@Repository // DB 접근 레이어
@Controller // 웹 컨트롤러
// 위 넷은 모두 @Component의 특수화 버전 — Bean으로 등록됨
@Configuration
public class AppConfig {
@Bean // 직접 Bean 등록
public PasswordEncoder encoder() {
return new BCryptPasswordEncoder();
}
}

4. Spring Boot 기동 원리
Spring Boot 를 실행하면 내부에서는 어떻게 동작하는지 순서대로 같이 공부해봅시다!
@SpringBootApplication // 이 한 줄이 모든 걸 시작
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
@SpringBootApplication 어노테이션은 내부에서 세 개의 어노테이션이 합쳐진 것 입니다.
@SpringBootConfiguration // = @Configuration, 이 클래스가 설정 클래스
@EnableAutoConfiguration // 자동 설정 활성화
@ComponentScan // 현재 패키지부터 Bean 스캔 시작

5. Auto Configuration은 어떻게 동작하는거지?
자동 설정이 어떻게 되는 걸까? 라는 궁금증을 저도 처음 Spring을 학습하면서 가지게 되었습니다.
Spring Boot는 내부적으로 spring.factories , AutoConfiguration.imports 파일에 수백 개의 자동 설정 클래스 목록을 가지고 있습니다. 그 중 @ConditionalOn~ 어노테이션으로 조건이 맞을 때만 설정을 적용하죠.
// Spring Boot 내부 코드 (이런 식으로 동작)
@Configuration
@ConditionalOnClass(DataSource.class) // DataSource 클래스가 있을 때만
@ConditionalOnMissingBean(DataSource.class) // 개발자가 직접 등록 안 했을 때만
public class DataSourceAutoConfiguration {
@Bean
public DataSource dataSource() {
// application.yml의 설정으로 자동 DataSource 생성
}
}
개발자가 직접 Bean을 등록하면 자동 설정은 진행하지 않고,
등록하지 않으면 자동으로 처리하는 방식입니다.
그래서 필요할 때만 커스터마이징하면 되는 구조라고 볼 수 있죠!
핵심 정리
| 개념 | 핵심 |
| Spring | Java 백엔드 프레임워크. IoC·DI·AOP로 객체지향 개발 지원 |
| Spring Boot | Spring + 자동 설정 + 내장 Tomcat. 빠르게 시작 가능 |
| IoC | 객체 제어권을 개발자 → 컨테이너로 역전 |
| DI | 컨테이너가 의존 객체를 찾아서 주입. 생성자 주입 권장 |
| Bean | 컨테이너가 관리하는 객체. 기본적으로 싱글톤 |
| Auto Config | 클래스패스 감지 + 조건 충족 시 자동 Bean 등록 |
'Backend > Spring' 카테고리의 다른 글
| [Spring] 간단한 게시판 기능 구현 - 1 (0) | 2026.04.25 |
|---|---|
| [Java] Spring Boot와 Web MVC 파헤치기 (0) | 2026.04.25 |
| [Spring] AOP 원리와 코드로 실습하며 파헤치기 (0) | 2026.04.25 |
| [Spring] IoC/DI 코드로 실습하며 파헤치기 (0) | 2026.04.25 |
| [Spring] Spring, Spring Boot는 무엇일까? (0) | 2026.04.24 |