티스토리 뷰
Spring을 처음 공부할 때 가장 많이 헷갈리는 질문 중 하나가 바로 Spring Framework와 Spring Boot는 무엇이 다르고 어떤 관계인가입니다. 검색하다 보면 어떤 글은 둘을 거의 같은 말처럼 설명하고, 어떤 글은 Boot를 전혀 다른 프레임워크처럼 소개해서 입문자 입장에서는 개념이 더 흐려지기 쉽습니다.
특히 예전 글이나 요약형 자료를 보면 Spring, Spring Boot, Spring Cloud, Spring Batch, MVC 구조가 한 글 안에 한꺼번에 섞여 있는 경우가 많습니다. 그런데 실제로는 먼저 Spring Framework가 무엇인지, 그리고 Spring Boot가 Spring 위에서 어떤 문제를 해결해주는지를 분리해서 보는 편이 훨씬 이해가 쉽습니다.
결론부터 말하면 Spring Framework는 자바 애플리케이션 개발을 위한 핵심 프레임워크이고, Spring Boot는 그 Spring을 더 빠르고 편하게 시작하고 운영할 수 있게 도와주는 도구 세트에 가깝습니다. 이 글에서는 Spring 특징, 기능 요소, 구조와 동작 흐름까지 포함해 한 번에 정리하겠습니다.
- Spring은 정확히 무엇인가?
- Spring Framework와 Spring Boot는 어떻게 다른가?
- Spring의 특징과 기능 요소는 무엇인가?
- Spring 구조와 동작은 어떤 흐름으로 이해하면 될까?
Spring Framework는 자바 애플리케이션을 더 유연하고 구조적으로 만들기 위한 프레임워크입니다.
예전에는 개발자가 객체를 직접 생성하고 연결하고, 공통 기능도 여기저기 중복해서 넣는 경우가 많았습니다. 그런데 프로젝트가 커질수록 객체 간 의존관계가 복잡해지고, 테스트와 유지보수도 어려워집니다.
Spring은 이런 문제를 줄이기 위해 객체 생성과 관리, 의존관계 주입, 공통 기능 분리 같은 구조를 프레임워크 차원에서 지원합니다.
Spring은 “객체를 더 잘 관리하고, 구조를 더 유연하게 만들기 위한 프레임워크”라고 이해하면 가장 쉽습니다.
- 컨테이너 기반 구조 : 객체의 생성과 생명주기를 Spring 컨테이너가 관리합니다.
- DI 지원 : 객체 간 의존관계를 직접 만들기보다 주입받는 방식으로 설계할 수 있습니다.
- AOP 지원 : 로깅, 트랜잭션, 보안처럼 공통 기능을 핵심 로직과 분리해서 적용할 수 있습니다.
- POJO 기반 개발 : 특정한 무거운 상속 구조 없이 일반 자바 객체 중심으로 개발할 수 있습니다.
- 일관된 트랜잭션 처리 : 다양한 기술 위에서도 비슷한 방식으로 트랜잭션을 다룰 수 있습니다.
- 다양한 데이터 접근 기술 연동 : JPA, MyBatis 같은 기술과 함께 많이 사용됩니다.
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
이 코드는 아주 짧아 보이지만 내부적으로는 아래 같은 흐름을 포함합니다.
- Spring 애플리케이션 시작
- 컴포넌트 스캔
- 자동 설정 적용
- 내장 톰캣 같은 서버 기동 가능
즉 Boot는 Spring의 핵심 기능을 없앤 것이 아니라, 실무에서 반복되는 설정을 줄여서 바로 개발에 들어가기 쉽게 만든 것입니다.
Spring 웹 애플리케이션의 대표적인 요청 흐름은 아래처럼 이해하면 됩니다.
Client 요청
↓
DispatcherServlet
↓
HandlerMapping
↓
Controller
↓
Service
↓
Repository(DAO)
↓
DB
↓
Repository → Service → Controller
↓
ViewResolver 또는 Response Body 처리
↓
응답 반환
이 흐름은 “Spring 전체가 다 이 순서다”라는 뜻은 아니고, Spring MVC 기반 웹 요청이 처리되는 대표적인 구조로 이해하면 됩니다.
@RestController
@RequestMapping("/members")
public class MemberController {
private final MemberService memberService;
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
@GetMapping
public List<MemberResponse> getMembers() {
return memberService.getMembers();
}
}
@Service
public class MemberService {
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
public List<MemberResponse> getMembers() {
return memberRepository.findAll()
.stream()
.map(MemberResponse::new)
.toList();
}
}
@Repository
public interface MemberRepository extends JpaRepository<Member, Long> {
}
이 구조를 보면 요청은 Controller에서 받고, 실제 비즈니스 로직은 Service에서 처리하고, 데이터 접근은 Repository가 맡는 흐름이 자연스럽게 보입니다.
- Spring Framework와 Spring Boot를 구분해서 설명할 수 있는가?
- Spring 특징으로 IoC, DI, AOP를 말할 수 있는가?
- 기능 요소를 Core / AOP / Data Access / Web 기준으로 나눌 수 있는가?
- 웹 요청 구조를 DispatcherServlet → Controller → Service → Repository 흐름으로 이해하는가?
- Spring Boot가 Spring의 본체를 대체하는 것이 아니라 시작과 운영을 쉽게 만드는 도구라는 점을 이해하는가?
- 대부분의 새 프로젝트는 Spring Boot로 시작하지만, 내부 기반은 여전히 Spring Framework입니다.
- 실무에서 중요한 것은 Boot를 쓰더라도 Spring 핵심 개념을 이해하는 것입니다.
- 문제가 생길 때는 결국 컨테이너, DI, 설정, 요청 흐름 이해가 필요해집니다.
- 즉 Boot만 외우면 한계가 오고, Spring Framework 개념을 이해해야 구조가 보입니다.
- Q. 실무에서는 결국 Spring Boot만 쓰는데 Spring Framework까지 깊게 알아야 하나요?
→ 네. 개발 초반에는 Boot만으로도 진행되지만, 설정 충돌, Bean 주입 문제, 자동 설정 오동작, 테스트 분리 같은 이슈를 해결하려면 결국 Spring Framework의 컨테이너와 동작 원리를 이해해야 합니다. - Q. @SpringBootApplication 하나면 끝나는 것 같은데 내부에서는 실제로 무엇이 일어나나요?
→ 컴포넌트 스캔, 자동 설정, 설정 클래스 등록, 컨텍스트 초기화가 함께 일어납니다. 즉 코드 한 줄로 보이지만 내부에서는 Spring 컨테이너가 애플리케이션 전체 구조를 준비합니다. - Q. Controller, Service, Repository는 꼭 나눠야 하나요?
→ 작은 예제는 한 클래스에 몰아도 동작하지만, 실무에서는 책임 분리가 무너지면 테스트와 변경 대응이 빠르게 어려워집니다. 계층 분리는 관습이 아니라 유지보수 비용을 줄이기 위한 구조입니다. - Q. Spring MVC 흐름만 이해하면 Spring 구조를 안다고 볼 수 있나요?
→ 부족합니다. MVC는 요청 처리 흐름을 이해하는 데 중요하지만, 실제 Spring은 Bean 생명주기, 트랜잭션, AOP, 이벤트, 보안 필터, 데이터 접근 계층까지 함께 봐야 구조가 제대로 보입니다.
Spring Framework와 Spring Boot의 차이를 이해할 때 핵심은 기능 비교표를 외우는 데 있지 않습니다. 실제로 중요한 것은 Spring Boot가 개발 시작을 빠르게 만들어 주더라도, 애플리케이션의 구조와 동작 원리는 결국 Spring Framework 위에서 돌아간다는 점입니다.
그래서 프로젝트를 조금만 깊게 다루게 되면 아래 세 가지가 중요해집니다.
- Bean이 어떻게 등록되고 주입되는가
- 요청이 어떤 계층을 거쳐 처리되는가
- 자동 설정이 어디까지 해주고, 어디서부터 직접 이해해야 하는가
즉 이 글의 핵심은 단순히 Spring = 프레임워크, Boot = 편의 도구라고 외우는 것이 아니라, Boot를 사용하더라도 결국 Spring의 컨테이너, 계층 구조, 요청 흐름을 이해해야 실무에서 흔들리지 않는다는 점입니다.
'IT > Spring' 카테고리의 다른 글
| Spring Boot JWT 로그인 구현 방법 | Spring Security 설정부터 Access Token·Refresh Token 발급·검증까지 (0) | 2026.04.02 |
|---|---|
| [Spring Boot] GET, POST, PUT, PATCH, DELETE 차이와 CRUD 구현 방법 (0) | 2026.03.20 |
| [Spring] SpringBoot + JUnit5 단위테스트 (0) | 2022.09.05 |
| Spring Boot + MariaDB JPA 설정 방법 | Hibernate naming 오류와 테이블 대소문자 이슈까지 (0) | 2022.08.26 |
| Spring Boot + MariaDB 연동 방법 | Docker로 DB 띄우고 JDBC·MyBatis 설정까지 (0) | 2022.08.24 |
