티스토리 뷰

300x250

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는 IoC, DI, AOP, 트랜잭션 같은 핵심 기능을 제공하는 자바 프레임워크입니다.
Spring Boot는 Spring 설정을 간소화하고, 실행과 배포를 쉽게 만드는 도구입니다.
둘은 경쟁 관계가 아니라 Spring Boot가 Spring Framework를 더 쉽게 쓰게 도와주는 관계입니다.
즉 본질은 Spring Framework이고, Spring Boot는 그 사용성을 크게 높여주는 실전형 시작 도구라고 보면 됩니다.
728x90
쉬운 정의 | Spring은 무엇인가?
먼저 Spring 자체를 짧고 정확하게 잡는 것이 중요합니다.

Spring Framework는 자바 애플리케이션을 더 유연하고 구조적으로 만들기 위한 프레임워크입니다.

예전에는 개발자가 객체를 직접 생성하고 연결하고, 공통 기능도 여기저기 중복해서 넣는 경우가 많았습니다. 그런데 프로젝트가 커질수록 객체 간 의존관계가 복잡해지고, 테스트와 유지보수도 어려워집니다.

Spring은 이런 문제를 줄이기 위해 객체 생성과 관리, 의존관계 주입, 공통 기능 분리 같은 구조를 프레임워크 차원에서 지원합니다.

Spring은 “객체를 더 잘 관리하고, 구조를 더 유연하게 만들기 위한 프레임워크”라고 이해하면 가장 쉽습니다.
Spring Framework와 Spring Boot 차이 | 개념, 구조, 역할 비교
가장 많이 검색하는 핵심 비교 포인트입니다.
구분 Spring Framework Spring Boot
정체 핵심 프레임워크 Spring을 쉽게 시작하게 돕는 도구
중심 역할 IoC, DI, AOP, 트랜잭션, MVC 같은 핵심 기능 제공 자동 설정, starter, 내장 서버, 빠른 실행 환경 제공
설정 난이도 상대적으로 직접 설정할 부분이 많음 기본 설정이 자동화되어 시작이 쉬움
실무 사용감 본질적 기반 대부분의 새 프로젝트 시작점
한 줄로 구분하면
Spring Framework = 기능의 본체
Spring Boot = 그 본체를 더 빠르고 편하게 쓰게 해주는 시작 도구
Spring 특징 | 왜 많이 쓰이는가?
대표적으로 자주 언급되는 특징은 아래와 같습니다.
  • 컨테이너 기반 구조 : 객체의 생성과 생명주기를 Spring 컨테이너가 관리합니다.
  • DI 지원 : 객체 간 의존관계를 직접 만들기보다 주입받는 방식으로 설계할 수 있습니다.
  • AOP 지원 : 로깅, 트랜잭션, 보안처럼 공통 기능을 핵심 로직과 분리해서 적용할 수 있습니다.
  • POJO 기반 개발 : 특정한 무거운 상속 구조 없이 일반 자바 객체 중심으로 개발할 수 있습니다.
  • 일관된 트랜잭션 처리 : 다양한 기술 위에서도 비슷한 방식으로 트랜잭션을 다룰 수 있습니다.
  • 다양한 데이터 접근 기술 연동 : JPA, MyBatis 같은 기술과 함께 많이 사용됩니다.
소스코드 예시 | Spring Boot 시작 코드는 이렇게 많이 봅니다
Spring Boot가 왜 시작을 쉽게 만든다고 하는지 코드로 보면 더 이해가 쉽습니다.
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

이 코드는 아주 짧아 보이지만 내부적으로는 아래 같은 흐름을 포함합니다.

  • Spring 애플리케이션 시작
  • 컴포넌트 스캔
  • 자동 설정 적용
  • 내장 톰캣 같은 서버 기동 가능

즉 Boot는 Spring의 핵심 기능을 없앤 것이 아니라, 실무에서 반복되는 설정을 줄여서 바로 개발에 들어가기 쉽게 만든 것입니다.

Spring 기능 요소 | 모듈 구조는 어떻게 보면 될까?
기능 요소는 너무 외우려 하기보다 역할 기준으로 나눠보는 편이 좋습니다.
기능 요소 설명
Core Container Bean 생성, 설정, 관리 같은 Spring의 핵심 기능을 담당합니다. IoC와 DI의 중심입니다.
AOP 트랜잭션, 로깅, 보안처럼 공통 관심사를 분리하는 데 사용됩니다.
Data Access / Integration JDBC, ORM, 트랜잭션, 메시징 같은 데이터 접근과 연동 기능을 지원합니다.
Web Spring MVC, REST API, 웹 기반 처리 기능을 포함합니다.
Context Bean 관리 외에도 이벤트, 국제화, 검증 등 확장 기능을 제공합니다.
기능 요소를 쉽게 이해하면
Core Container = 객체를 관리하는 중심
AOP = 공통 기능을 분리하는 도구
Data Access = DB와 연동하는 영역
Web = 실제 요청과 응답이 오가는 웹 처리 영역
Spring 구조 및 동작 | 요청은 보통 어떻게 흐를까?
입문자가 구조를 이해할 때 가장 많이 보는 웹 요청 흐름입니다.

Spring 웹 애플리케이션의 대표적인 요청 흐름은 아래처럼 이해하면 됩니다.

Client 요청
   ↓
DispatcherServlet
   ↓
HandlerMapping
   ↓
Controller
   ↓
Service
   ↓
Repository(DAO)
   ↓
DB
   ↓
Repository → Service → Controller
   ↓
ViewResolver 또는 Response Body 처리
   ↓
응답 반환

이 흐름은 “Spring 전체가 다 이 순서다”라는 뜻은 아니고, Spring MVC 기반 웹 요청이 처리되는 대표적인 구조로 이해하면 됩니다.

소스코드 예시 | 구조를 코드로 보면 더 쉽게 보인다
Controller, Service, Repository가 왜 나뉘는지도 같이 연결됩니다.
@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가 맡는 흐름이 자연스럽게 보입니다.

자주 헷갈리는 포인트 | 기초는 알지만 실전에서 막히는 부분
용어를 외운 뒤 실제 프로젝트 구조를 보면서 많이 혼동하는 지점들입니다.
1) Boot가 설정을 해주면 Spring 구조를 몰라도 된다고 생각하는 경우
왜 헷갈릴까 프로젝트는 잘 실행되는데 내부에서 Bean이 어떻게 등록되고, 의존관계가 어떻게 연결되는지는 보이지 않기 때문입니다.
실제로 막히는 지점 빈 주입 충돌, 순환 참조, 설정 우선순위, 테스트 슬라이스, 자동 설정 제외 같은 문제를 만나면 구조 이해가 부족한 상태에서 바로 한계가 드러납니다.
정리 Boot는 설정을 줄여주지만, 문제를 해결할 때는 결국 Spring 컨테이너와 Bean 등록 구조를 이해해야 합니다.
2) Controller, Service, Repository를 단순 폴더 구분 정도로만 보는 경우
왜 헷갈릴까 예제 프로젝트에서는 각 계층이 짧고 단순해서 역할 차이가 크게 안 느껴질 수 있습니다.
실제로 막히는 지점 비즈니스 로직이 Controller에 몰리거나, Service가 데이터 접근 세부사항까지 다 알게 되면 테스트와 유지보수가 급격히 어려워집니다.
정리 계층 분리는 보기 좋게 나누는 것이 아니라 변경 영향도를 줄이고 책임을 분리하기 위한 설계입니다.
3) Spring MVC 요청 흐름과 Spring 전체 아키텍처를 같은 레벨에서 이해하는 경우
왜 헷갈릴까 실무에서는 대부분 웹 프로젝트부터 접하기 때문에 DispatcherServlet 흐름이 곧 Spring 전체라고 느끼기 쉽습니다.
실제로 막히는 지점 보안 필터, 트랜잭션, 이벤트, Bean 생명주기, 테스트 컨텍스트처럼 MVC 밖에서 동작하는 영역을 이해하지 못하면 문제 원인을 잘못 짚게 됩니다.
정리 MVC는 Spring의 웹 요청 처리 계층이고, Spring 전체는 그보다 훨씬 넓은 컨테이너와 인프라 구조를 포함합니다.
설정/이해 체크리스트
  • 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 개념을 이해해야 구조가 보입니다.
FAQ
  • Q. 실무에서는 결국 Spring Boot만 쓰는데 Spring Framework까지 깊게 알아야 하나요?
    → 네. 개발 초반에는 Boot만으로도 진행되지만, 설정 충돌, Bean 주입 문제, 자동 설정 오동작, 테스트 분리 같은 이슈를 해결하려면 결국 Spring Framework의 컨테이너와 동작 원리를 이해해야 합니다.
  • Q. @SpringBootApplication 하나면 끝나는 것 같은데 내부에서는 실제로 무엇이 일어나나요?
    → 컴포넌트 스캔, 자동 설정, 설정 클래스 등록, 컨텍스트 초기화가 함께 일어납니다. 즉 코드 한 줄로 보이지만 내부에서는 Spring 컨테이너가 애플리케이션 전체 구조를 준비합니다.
  • Q. Controller, Service, Repository는 꼭 나눠야 하나요?
    → 작은 예제는 한 클래스에 몰아도 동작하지만, 실무에서는 책임 분리가 무너지면 테스트와 변경 대응이 빠르게 어려워집니다. 계층 분리는 관습이 아니라 유지보수 비용을 줄이기 위한 구조입니다.
  • Q. Spring MVC 흐름만 이해하면 Spring 구조를 안다고 볼 수 있나요?
    → 부족합니다. MVC는 요청 처리 흐름을 이해하는 데 중요하지만, 실제 Spring은 Bean 생명주기, 트랜잭션, AOP, 이벤트, 보안 필터, 데이터 접근 계층까지 함께 봐야 구조가 제대로 보입니다.
결론 | Boot를 쓰더라도 결국 이해해야 하는 것은 Spring 구조다

Spring Framework와 Spring Boot의 차이를 이해할 때 핵심은 기능 비교표를 외우는 데 있지 않습니다. 실제로 중요한 것은 Spring Boot가 개발 시작을 빠르게 만들어 주더라도, 애플리케이션의 구조와 동작 원리는 결국 Spring Framework 위에서 돌아간다는 점입니다.

그래서 프로젝트를 조금만 깊게 다루게 되면 아래 세 가지가 중요해집니다.

  • Bean이 어떻게 등록되고 주입되는가
  • 요청이 어떤 계층을 거쳐 처리되는가
  • 자동 설정이 어디까지 해주고, 어디서부터 직접 이해해야 하는가

즉 이 글의 핵심은 단순히 Spring = 프레임워크, Boot = 편의 도구라고 외우는 것이 아니라, Boot를 사용하더라도 결국 Spring의 컨테이너, 계층 구조, 요청 흐름을 이해해야 실무에서 흔들리지 않는다는 점입니다.

728x90
댓글