[스프링 프레임워크와 스프링 부트] 개념 정리 & 자동 설정(Auto Configuration) 완벽 가이드
스프링(SPRING)은 자바(Java) 기반의 대표적인 프레임워크 중 하나로서, 엔터프라이즈 환경의 웹 애플리케이션을 안정적으로 구축할 수 있도록 다양한 기능을 제공합니다. 하지만 스프링이 점점 무거워지고 복잡해지면서 등장한 것이 바로 스프링 부트(Spring Boot)입니다. 이 글에서는 프레임워크의 개념부터, 스프링 프레임워크, 그리고 스프링 부트(Spring Boot)의 핵심 개념인 자동 설정(Auto Configuration)까지 폭넓게 살펴봅니다.
1. 프레임워크(Framework) 개념
1) 프레임워크의 사전적 의미
- 프레임워크는 ‘뼈대’ 혹은 ‘골격’이라는 사전적 의미를 가지고 있습니다.
- 소프트웨어 개발 관점에서는 애플리케이션을 구축하기 위한 기본 구조와 아키텍처(Architecture)를 제공하여, 개발자가 핵심 비즈니스 로직에 집중할 수 있도록 돕는 역할을 합니다.
2) 프레임워크 사용의 장점
- 아키텍처 제공: 프로젝트 전체 골격(설계)을 미리 갖추고 시작하므로, 개발 속도를 높이고 일관성을 유지할 수 있습니다.
- 중복 로직 최소화: 공통적으로 쓰이는 기능(로그, 보안, 트랜잭션 등)을 프레임워크가 책임져 주어, 개발자의 부담을 줄여줍니다.
2. 스프링 프레임워크(Spring Framework)
1) 스프링의 등장 배경
- 과거 EJB(Enterprise Java Beans)의 무거운 구조에서 탈피하여, POJO(Plain Old Java Object) 기반의 경량 프레임워크로 시작되었습니다.
- 스프링은 공식 홈페이지를 통해 다양한 문서와 자료를 제공하고 있습니다.
2) 스프링의 특징
- 경량성: EJB에 비해 훨씬 가볍고, 모듈화된 구조로 원하는 기능만 선택적으로 사용할 수 있습니다.
- 유연한 통합: 다른 다양한 프레임워크(마이바티스, 하이버네이트 등)와 손쉽게 통합할 수 있으며, 스프링은 이를 지향합니다.
- 방대한 플랫폼화: 초기에는 단순 컨테이너로 시작했지만, 현재는 클라우드, 배치, 보안, 데이터, 웹 등 엔터프라이즈 시스템 전반을 지원하는 거대한 플랫폼이 되었습니다.
3) 스프링의 문제(복잡성 증가)
- 스프링이 너무 많은 기능과 모듈을 지원하다 보니, 종속성(Dependency) 문제와 복잡도가 높아졌습니다.
- 웹 애플리케이션 개발 속도가 중요한 최신 트렌드에서, 많은 설정과 XML 기반 설정 파일이 초심자에게 진입 장벽이 되기도 했습니다.
3. 스프링 부트(Spring Boot)의 필요성
1) 스프링 부트가 해결해주는 것
- 간편한 설정: 자동 설정(Auto Configuration) 기능을 통해 XML 설정 파일을 최소화합니다.
- 라이브러리 관리 자동화: starter 개념을 통해, 관련된 라이브러리를 한 번에 묶어서 가져옵니다.
- 버전 관리 자동화: POM 파일에서 부모 POM을 상속받음으로써, 번거로운 버전 충돌을 줄여줍니다.
2) 스프링 부트의 등장 계기
- 루비 온 레일즈(Ruby on Rails), 노드(Node.js) 등과 같은 경량 프레임워크가 인기를 끌면서, 스프링도 빠른 개발환경을 지원할 필요가 생겼습니다.
- 스프링 부트는 스프링을 처음 접하는 개발자도 빠르게 웹 애플리케이션을 띄울 수 있도록 도와줍니다.
4. 스프링 부트의 주요 장점
- 라이브러리 관리 자동화
- spring-boot-starter-* 의존성 하나만 추가하면, 필요한 라이브러리가 연쇄적으로 설정됩니다.
- 라이브러리 버전 관리 자동화
- 스프링 부트가 제공하는 parent POM을 상속받으면, 여러 라이브러리 버전을 일일이 맞출 필요가 줄어듭니다.
- 자동 설정(Auto Configuration 클래스)
- 웹 애플리케이션 필수 설정(내장 톰캣, 로깅 등)을 자동으로 제공해줍니다.
- 자동화된 테스트 환경 제공
- spring-boot-starter-test를 추가하면, 테스트 라이브러리(JUnit 등)를 자동으로 매핑해줍니다.
- 내장 서버(Tomcat) 사용 가능
- 기존처럼 외부 톰캣을 설정할 필요 없이, 애플리케이션 실행 시 내장 톰캣이 함께 구동됩니다.
- 독립 실행형 JAR
- WAR 파일 대신 JAR 파일로 배포가 가능하므로, 서버 환경에 구애받지 않고 java -jar로 실행할 수 있습니다.
5. 스프링 부트 프로젝트 구조
1) 메이븐(Maven) 디렉토리 구조
- src/main/java: 자바 소스 코드가 위치합니다.
- src/main/resources: 리소스 파일(설정 파일, HTML, CSS, JS 등)이 위치합니다.
- static 폴더: 정적 리소스(HTML, JS, CSS, 이미지 등)를 배치합니다.
- templates 폴더: 뷰 템플릿(Thymeleaf, Freemarker 등)을 배치합니다.
2) 의존성 선언: pom.xml
- 스프링 부트 스타터를 이용하면, 웹 애플리케이션용 의존성을 간편하게 추가할 수 있습니다.
<dependencies>
<!– 웹 관련 스타터 (내장 톰캣 포함) –>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!– 테스트 관련 스타터 –>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
6. 스프링 부트 스타터(Spring Boot Starter)
- 모듈별 스타터 제공: spring-boot-starter-모듈명 형태로, DB, 웹, 보안 등 다양한 기능이 미리 정의되어 있습니다.
- 의존성 자동 관리: 스타터를 추가함으로써 관련 라이브러리들이 함께 포함되므로, 버전 충돌 가능성이 낮아집니다.
7. POM 파일의 상속
- 스프링 부트 프로젝트는 주로 spring-boot-starter-parent를 상속받습니다.
- 이는 내부적으로 spring-boot-dependencies에서 <property>와 <dependency> 설정을, spring-boot-starter-parent에서 <plugin> 설정 등을 상속받는 구조입니다.
- 예시:
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.1.5.RELEASE</version>
- <relativePath/>
- </parent>
- 덕분에 스프링 부트 팀이 검증한 버전 조합을 그대로 가져와 안정적으로 프로젝트를 생성할 수 있습니다.
8. 자동 설정(Auto Configuration)이란?
1) 스프링 부트 메인 클래스
- 스프링 부트 프로젝트에는 보통 @SpringBootApplication이 선언된 메인 클래스가 제공됩니다.
- 이 메인 클래스를 실행하면, 내장 톰캣이 구동되고, 스프링 기반의 웹 애플리케이션이 자동으로 시작됩니다.
- @SpringBootApplication 안에는 다음과 같은 중요한 3가지 어노테이션이 통합되어 있습니다.
- @SpringBootConfiguration
- @EnableAutoConfiguration
- @ComponentScan
2) 자동 설정의 핵심
- 복잡한 XML 설정 없이도 웹 애플리케이션이 실행되는 이유는 @EnableAutoConfiguration이 각종 설정을 자동으로 로딩해주기 때문입니다.
- 예: 파일 업로드를 위해 필요한 MultipartResolver를 알아서 등록해주고, 사용자가 만든 @Controller(업무 로직)도 자동으로 스캔합니다.
9. 자동 설정 단계
- 사용자 정의 빈(컨트롤러, 서비스, 리포지토리 등) 초기화
- @ComponentScan을 통해 @Controller, @Service, @Repository 등의 사용자 객체를 찾아 스프링 컨테이너에 등록합니다.
- 스프링 프레임워크 제공 빈 초기화
- @EnableAutoConfiguration이 MultipartResolver, DataSource, MessageConverter 등 프레임워크 내부 빈들을 자동 등록합니다.
이렇게 두 단계를 거치면서, 스프링 부트가 사용자 로직과 스프링 내부 로직 모두를 초기화하여 애플리케이션을 구성합니다.
10. 자동 설정 파일 위치
- @EnableAutoConfiguration은 내부적으로 spring-boot-autoconfigure JAR 파일(예: spring-boot-autoconfigure-2.1.5.RELEASE.jar) 안에 포함되어 있습니다.
- 이 JAR의 META-INF/spring.factories 파일에 자동 설정 클래스들이 등록되어 있으며, 실행 시점에 해당 클래스들을 로딩하여 필요한 빈을 자동으로 설정해줍니다.
11. 자동 설정 어노테이션
스프링 부트의 다양한 자동 설정(오토컨피규레이션) 클래스에는 조건부로 적용되는 여러 어노테이션이 있습니다:
- @ConditionalOnWebApplication
- 현재 프로젝트가 웹 애플리케이션인지(WebApplicationType) 판단한 뒤, 웹 환경에서만 설정을 적용합니다.
- @ConditionalOnClass
- 특정 클래스가 클래스패스(classpath)에 존재할 경우에만 해당 설정을 적용합니다.
- 예: @ConditionalOnClass(name = “org.springframework.web.servlet.DispatcherServlet”)
- @ConditionalOnMissingBean
- 특정 빈이 이미 스프링 컨테이너에 등록되어 있지 않을 때만 설정 클래스를 적용합니다.
- 예: 기존에 MultipartResolver를 선언하지 않았다면, 자동으로 등록해주는 식입니다.
- @AutoConfigureOrder
- 자동 설정 클래스가 여러 개 있을 때 우선순위를 지정합니다.
- Ordered.HIGHEST_PRECEDENCE + 10처럼, 다른 설정보다 먼저(또는 나중에) 적용될 순서를 정할 수 있습니다.
- @AutoConfigureAfter
- 특정 설정 클래스가 다른 설정 클래스 이후에 적용되도록 순서를 명시할 수 있습니다.
마치며
스프링 부트(Spring Boot)는 복잡한 스프링 설정을 단순화하고, 개발 생산성과 학습 곡선을 크게 개선했습니다.
- @SpringBootApplication으로 시작되는 메인 클래스 하나만 실행해도, 내장 톰캣 서버와 스프링 관련 설정이 자동으로 이루어집니다.
- 라이브러리와 버전의 종속성도 자동 관리되므로, 개발자는 비즈니스 로직에만 더욱 집중할 수 있습니다.
- 프레임워크(Framework)
- 스프링 프레임워크(Spring Framework)
- 스프링 부트(Spring Boot)
- 메이븐(Maven)
- 오토 컨피규레이션(Auto Configuration)
- 자동 설정(EnableAutoConfiguration)
- POM 파일 상속
- 스프링 부트 스타터(Stater)
- 내장 톰캣(Embedded Tomcat)
- @ConditionalOnWebApplication, @ConditionalOnClass, @ConditionalOnMissingBean
위 내용을 통해 스프링 부트가 왜, 어떻게 웹 애플리케이션 개발을 간소화하고 생산성을 높여주는지 이해하셨을 것입니다. 더 깊이 있는 예제와 실습을 해보면서, 여러분의 프로젝트에 스프링 부트를 적용해 보세요!
- 학습 자료: Spring Boot 공식 문서를 참고하면 풍부한 예제와 레퍼런스를 얻을 수 있습니다.
- 버전 관리: 스프링 부트 버전을 올릴 때 톰캣 등 내장 서버 버전도 함께 올라갈 수 있으니, 기존 프로젝트와의 호환성을 미리 점검해야 합니다.
여기까지 읽어주셔서 감사합니다. 궁금한 점이나 의견이 있으시면 언제든지 댓글로 남겨주세요! 스프링 부트와 함께 더욱 편리하고 빠르게 웹 애플리케이션을 개발해보시길 바랍니다.