스프링 프레임워크의 가장 핵심적인 기능은 IoC(Inversion of Control, 제어의 역전)와 DI(Dependency Injection, 의존성 주입) 입니다.
이 외에도 AOP(Aspect-Oriented Programming), 트랜잭션 관리, MVC(Model-View-Controller) 웹 프레임워크 등이 중요한 기능입니다.
제어의 역전(IoC, Inversion of Control)은 객체의 생성 및 흐름 제어를 개발자가 직접 관리하는 것이 아니라, 스프링 프레임워크와 같은 컨테이너가 대신 관리하는 방식을 의미합니다.
기존에는 객체를 직접 생성하고, 필요한 곳에서 호출하여 사용해야 했지만, IoC를 사용하면 객체의 생성과 관리 권한을 프레임워크가 담당하게 됩니다.
개발자가 직접 객체를 생성하고 사용해야 합니다.
public class Car {
private Engine engine;
public Car() {
this.engine = new Engine(); // 직접 객체를 생성함
}
public void start() {
engine.run();
}
}
Car 클래스가 Engine 객체를 직접 생성하므로, Car와 Engine이 강하게 결합되어 있음 (높은 결합도).Engine 객체가 변경되면 Car 코드도 수정해야 함.이제 객체의 생성과 관리 권한을 스프링 컨테이너가 담당하게 만듭니다.
@Component // 스프링이 객체를 관리하도록 함
public class Engine {
public void run() {
System.out.println("Engine is running...");
}
}
@Component
public class Car {
private final Engine engine;
@Autowired // 스프링이 자동으로 Engine 객체를 주입
public Car(Engine engine) {
this.engine = engine;
}
public void start() {
engine.run();
}
}
✅ 객체의 생성과 관리를 프레임워크(Spring 컨테이너)가 담당 → 개발자가 직접 객체를 생성하지 않아도 됨.
✅ 의존성 주입(DI)과 함께 사용하면 결합도를 낮추고 유지보수성을 높일 수 있음.
✅ 객체의 변경이 필요할 때도 코드 수정이 최소화됨 (확장성 향상).
의존성 주입이란 객체를 직접 생성하지 않고 외부에서 필요한 객체를 주입받는 방식을 의미합니다.
@Component
public class Car {
private final Engine engine;
// 생성자 주입 (의존성 주입)
@Autowired
public Car(Engine engine) {
this.engine = engine;
}
}
위 코드에서 Car 클래스는 Engine 객체를 직접 생성하지 않고, 외부에서 주입받음으로써 결합도를 낮추고 유지보수성을 높일 수 있음.
| 개념 | 설명 |
|---|---|
| IoC (제어의 역전) | 객체의 생성과 관리를 개발자가 직접 하지 않고, 스프링 컨테이너가 대신 담당하는 것 |
| DI (의존성 주입) | IoC의 한 방법으로, 필요한 객체를 스프링 컨테이너가 자동으로 주입해 주는 것 |
즉, IoC는 객체의 생성과 흐름 제어를 프레임워크가 담당하는 개념이고,
DI(의존성 주입)는 IoC를 실현하는 방법 중 하나입니다. 🚀
@Component, @Service, @Repository, @Controller 등의 어노테이션이 붙은 객체(Bean)를 ApplicationContext에 저장하고 관리합니다.ApplicationContext는 스프링 컨테이너로서, Bean을 생성하고 필요한 곳에 주입해주는 역할을 합니다.// Bean 등록
@Component
public class MyComponent { }
// ApplicationContext에서 Bean 가져오기
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
MyComponent myComponent = context.getBean(MyComponent.class);
📌 참고: pom.xml의 역할
pom.xml은 Maven 프로젝트의 설정 파일로, 의존성을 선언하는 역할을 합니다.spring-boot-starter-web과 같은 의존성을 추가하면 스프링 관련 라이브러리를 자동으로 다운로드하여 사용할 수 있습니다.<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
@SpringBootApplication을 사용하면 필요한 설정이 자동으로 적용됩니다.spring-boot-starter를 사용하면 필요한 라이브러리를 쉽게 관리할 수 있습니다.| 항목 | Spring Framework | Spring Boot |
|---|---|---|
| 설정 방식 | 수동 설정 (XML 설정 또는 Java 설정 필요) | 자동 설정 (@SpringBootApplication) |
| 웹 서버 | 없음 (Tomcat 등 외부 WAS 별도 설정 필요) | 내장 웹 서버 제공 (Tomcat, Jetty 등) |
| 의존성 관리 | 수동 추가 | spring-boot-starter-*를 사용해 자동 관리 |
| 실행 방식 | 배포 후 실행 | 독립 실행 가능 (java -jar) |
| 사용 편의성 | 복잡한 설정 필요 | 설정 최소화 |
| 기본 프로젝트 구조 | 사용자가 직접 설정 | spring-boot-starter 사용으로 기본 구조 제공 |
| 목적 | 유연하지만 설정이 많음 | 빠르게 개발 가능하도록 지원 |
즉, Spring Boot는 Spring을 더 쉽게 사용할 수 있도록 도와주는 프레임워크이며, 별도의 설정 없이도 빠르게 애플리케이션을 개발하고 실행할 수 있습니다.
❌ 불가능합니다.
Spring Boot는 Spring Framework를 기반으로 동작하는 프레임워크이기 때문에, Spring 없이 Spring Boot만 따로 존재할 수 없습니다.
Spring Boot는 내부적으로 Spring Framework를 포함한 라이브러리 모음입니다.
즉, Spring Boot를 설치하면 Spring도 자동으로 따라오기 때문에, 따로 Spring을 설치할 필요는 없습니다.
📦 Spring Boot의 주요 구성 요소:
1. Spring Core → IoC 컨테이너, 의존성 주입(DI) 기능 포함
2. Spring Web (Spring MVC) → 웹 개발을 위한 기능 제공
3. Spring Data → 데이터베이스 연동을 쉽게 해주는 기능
4. Spring Security → 인증 및 보안 관련 기능
5. Spring Boot Starter → 위의 기능들을 쉽게 가져올 수 있도록 도와주는 패키지
이처럼 Spring Boot는 Spring의 기능을 자동 설정하고 쉽게 사용할 수 있도록 확장한 것입니다.
만약 Spring 없이 Spring Boot 같은 걸 만들고 싶다면?
👉 결국 Spring의 IoC 컨테이너, DI, 트랜잭션 관리, AOP, MVC 같은 기능을 직접 구현해야 하는데
👉 그러면 사실상 Spring을 다시 만드는 것과 다름없다.
📌 결론:
✔ Spring Boot는 Spring 없이 동작할 수 없음.
✔ 하지만 Spring Boot를 설치하면 Spring이 포함되므로, 따로 Spring을 설치할 필요는 없음.
✔ "Spring 없는 Spring Boot"는 결국 존재할 수 없고, 있다면 그것은 Spring이 아닌 완전히 다른 프레임워크일 것.