1. 스프링 부트(Spring Boot)란?
Spring Boot는 Java 애플리케이션 개발을 쉽게 하기 위해 설계된 오픈 소스 엔터프라이즈급 프레임워크이다. 이는 엔터프라이즈급 애플리케이션을 구축하기 위한 주요 기능과 단순화된 방법을 제공한다. Spring Boot의 핵심은 개발자가 종속성 주입, 트랜잭션 관리 등과 같은 인프라 문제를 처리하면서 비즈니스 논리에 집중할 수 있도록 하는 것이다.
2. 스프링 부트의 주요 개념
2.1 제어 반전(IoC)
IoC(Inversion of Control)는 Spring을 기존 Java 개발 방법과 구별하는 원칙이다. 개발자가 객체 생성 및 관리를 제어하는 대신 IoC는 제어를 Spring 컨테이너에 위임한다.. 이는 Spring이 객체 수명주기와 종속성 주입을 관리하는 보다 깔끔한 코드 구조로 이어지게 된다.
기존 Java 개발의 예
@RestController
class NoDIController {
private MyService service = new MyServiceImpl();
@GetMapping("/no-di/hello")
public String getHello() {
return service.getHello();
}
}
여기서 개발자는 MyService 인스턴스를 수동으로 생성하고 관리한다.
2.2 의존성 주입(DI)
종속성 주입(DI)은 객체를 직접 생성하는 대신 자신이 의존하는 다른 객체를 주입받는 디자인 패턴입니다. 이를 통해 모듈성이 향상되고 테스트가 쉬워집니다. Spring은 @Autowired와 같은 주석을 사용하여 DI를 구현할 수 있다.
Spring에는 세 가지 유형의 DI가 있다.
- 생성자 기반 (권장)
- 필드 기반 (권장하지 않음)
- Setter 기반 (내가 원할 때 주입할 수 있다는 장점이 있음)
DI 예시
@RestControllerpublic
class DIController {
@Autowired
private MyService myService; // 필드 주입
@GetMapping("/di/hello")
public String getHello() {
return myService.getHello();
}
}
기존 Java 개발의 예시와는 다르게 사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입받아 사용한다.
필드 주입 보단, 아래처럼 생성자 주입을 권장한다.
@RestController
class DIController {
private final MyService myService;
// 생성자 주입
public DIController(MyService myService) {
this.myService = myService;
}
@GetMapping("/di/hello")
public String getHello() {
return myService.getHello();
}
}
2.3 관점 지향 프로그래밍(AOP)
Spring의 관점 지향 프로그래밍(AOP)을 사용하면 핵심 비즈니스 로직에서 로깅, 보안, 트랜잭션 관리와 같은 교차 문제를 분리할 수 있다.
AOP는 관점을 기준으로 묶어 개발하는 방식을 의미한다. 여기서 관점(aspect)이란 어떤 기능을 구현할 때 그 기능을 '핵심 기능'과 '부과 기능'으로 구분해 각각을 하나의 관점으로 보는 것을 의미한다.
핵심 기능
비즈니스 로직을 구현하는 과정에서 비즈니스 로직이 처리하는 목적 기능
부가 기능
핵심 기능이 어떤 기능인지에 무고나하게 로직이 수행되기 전 또는 후에 수행되기만 하면 된다.
AOP
여러 비즈니스 로직에서 반복되는 부가 기능을 하나의 공통 로직으로 처리하도록 모듈화해 삽입하는 방식을 AOP라 한다.
3. Spring Boot 프레임워크 모듈
Spring Boot는 데이터 액세스, 메시징, 웹 개발 등과 같은 작업을 위해 사용 가능한 수많은 모듈을 제공하여 개발 프로세스를 단순화한다.
일부 주요 모델
Web: RESTful 서비스 및 웹 애플리케이션 개발
Data Access/Integeration: 데이터베이스 상호 작용을 위한(JDBC, ORM 등) 도구
Core Container: IoC 컨테이너, 종속성 주입, SpEL(Spring Expression Language) 등 Spring의 필수 기능 포함
4. Spring Framework와 Spring Boot 비교
Spring Framework는 엔터프라이즈 애플리케이션 개발을 위한 다양한도구를 제공하지만, 너무 많은 구성으로 인해 상당히 복잡해질 수 있다. 이 문제를 해결하기 위해 Spring Boot가 도입되어 개발 프로세스가 더욱 간단하고 간소화되었다.
주요 차이점
종속성 관리
Spring Framework: 개발자는 모듈을 선택 및 구성하고 모듈 간의 호환성을 확인하여 종속성을 수동으로 관리해야 한다.
Spring Boot: 일반적으로 사용되는 모듈을 번들로 묶고, 호환 가능한 버전인지 확인하는 "스타터" 세트(예: spring-boot-starter-web)를 제공하여 이를 단순화할 수 있다.
자동 구성
Spring Framework: 대부분의 기능에 대해 명시적인 작성이 필요하다.
Spring Boot: 자동 완성 기능을 제공하여 포함된 종속성을 기반으로 애플리케이션에 필요한 구성 요소를 자동으로 감지하고 구성한다. 이를 통해 직접 작성하는 코드의 양이 크게 줄어들 수 있다.
내장 웹 애플리케이션 서버(WAS):
Spring Framework: 웹 애플리케이션을 실행하려면 외부 WAS 구성(예: Tomcat 또는 Jetty)이 필요하다.
Spring Boot: 내장된 Tomcat 서버(spring-boot-starter-web을 통해)와 함께 제공되므로 애플리케이션 서버에 배포하지 않고도 애플리케이션을 최소한의 구성으로 실행할 수 있다.
의존성 관리
스프링 프레임워크: 개발에 필요한 모듈의 의존성을 직접 설정 및 호환되는 버전을 직접 명시
스프링 부트: 'spring-boot-starter'라는 의존성을 제공하여 각 라이브러리의 기능과 관련하여 자주 사용되고 서로 호환되는 버전의 모듈 조합을 제공
자동 설정
스프링 부트는 스프링 프레임워크의 기능을 사용하기 위한 자동 설정(Auto Configuration)을 지원한다. 자동 설정은 애플리케이션에 추가된 라이브러리를 실행하는 데 필요한 환경 설정을 알아서 찾아준다.
즉, 애플리케이션을 개발하는 데 필요한 의존성을 추가하면 프레임워크가 이를 자동으로 관리해준다.
내장 WAS
스프링 부트의 각 웹 애플리케이션에는 내장 WAS(Web Application Server)가 존재한다. 웹 애플리케이션을 개발할 때 가장 기본이 되는 의존성인 'spring-boot-starter-web'의 경우 톰캣을 내장한다.
스프링 부트의 자동 설정 기능은 톰캣에도 적용되므로 특별한 설정 없이도 톰캣을 실행할 수 있다.
출처: 이 글의 출처는 책 '스프링 부트 핵심 가이드'를 참고하여 작성하였습니다.
'Spring' 카테고리의 다른 글
| 스프링 부트와 ORM (5) | 2024.10.03 |
|---|---|
| API를 작성하는 다양한 방법 (1) | 2024.09.27 |
| 스프링 부트 애플리케이션 개발하기 (0) | 2024.09.27 |
| Spring Boot 개발 환경 구성 (0) | 2024.09.22 |
| Spring Boot 개발을 위한 필수 지식 (2) | 2024.09.22 |