
자바를 공부하다 보면 Spring이라는 단어가 종종 들린다.
그런데 뭔가 거리감이 느껴진다?랄까?
Java를 공부하고 있는데 Spring을 사용한다는데... 이거 언어인가?
그래서 이번에는 Spring이 무엇인지 정리해보려고 한다.
Spring 공식 사이트를 보면 정말 많은 프로젝트가 존재한다.


이렇게 많이 있다....
Spring은 하나의 기술만을 의미하기도 하지만, 보통은 Spring Framework를 중심으로 한 여러 프로젝트의 생태계를 의미한다.
예를 들어
등이 있다.
즉 넓게 보면 Spring 생태계, 좁게 보면 Spring Framework를 의미한다고 생각하면 된다.
Spring Framework는 Java 기반 애플리케이션을 만들 때 필요한 여러 기능과 구조를 제공하는 Framework이다.

어떠한 목적을 쉽게 달성할 수 있도록 관련된 코드와 구조를 미리 만들어 둔 틀
자동차를 만든다고 생각해보자.

처음부터 자동차 전체를 만드는 것이 아니라, 기본 틀은 이미 있으니까 그 위에 내가 필요한 것을 만드는 것! 이것이 Framework이다.
즉, Spring은 우리가 Java로 실제 서비스를 만들 때 반복적으로 필요한 기능들을 미리 제공한다.
예를 들어 회원가입 기능을 만든다고 생각해보자.
우리가 실제로 만들고 싶은 것은
public void join(Member member) {
// 회원가입 로직
}
이런 비즈니스 로직이다.
하지만 실제 웹 서비스에서는 이것만 있으면 끝나는 것이 아니다.
HTTP 요청 받기
DB 연결
Transaction 관리
객체 생성과 관리
예외 처리
응답 반환
등 다양한 기반 기능이 필요하다.

Spring은 이런 과정들을 보다 편리하게 처리할 수 있도록 도와준다.
즉,
Spring은 Java로 실제 애플리케이션을 만들 때 필요한 구조와 기능을 제공하는 Framework이다.
라고 생각하면 된다.
Java만으로도 프로그램을 만들 수 있다.
하지만 프로그램의 규모가 커지면 직접 관리해야 하는 것들이 많아진다.
예를 들어
회원가입
로그인
상품 조회
주문
결제
와 같은 기능을 구현하면서 동시에
HTTP 요청 처리
객체 관리
DB 연결
Transaction 관리
테스트
까지 직접 처리해야 한다.
Spring은 이러한 반복적인 기반 작업을 줄이고, 개발자가 비즈니스 로직에 집중할 수 있도록 하기 위해 등장한 Framework라고 이해하면 된다.
이 부분이 가장 궁금했다.
Spring이 도대체 어디에서 사용되는 건데?
아래처럼 상품을 구매하는 상황을 생각해보자.

대략적인 흐름은 다음과 같다.
사용자
↓
HTTP 요청
↓
Controller
↓
Service
↓
Repository
↓
Database
Spring은 이 중간에 하나의 프로그램처럼 들어가는 것이 아니다.
이 전체 흐름의 여러 부분에서 Spring이 사용된다.
예를 들어
HTTP 요청과 Controller 연결
→ Spring MVC
객체 생성과 관리
→ Spring Container
객체 간 연결
→ DI
DB 접근
→ Data Access
Transaction 관리
→ Spring Transaction
이런 식이다.
Spring Framework가 제공하는 기능은 매우 많다.

근데, 내가 설명하는 것만 해도 충분하지 않을까?
Spring의 핵심 기능이다.
웹 애플리케이션에서 HTTP 요청을 처리하고 Controller와 연결해주는 역할을 한다.
예를 들어
@Controller
public class OrderController {
@PostMapping("/orders")
public String order() {
return "orderComplete";
}
}
처럼 사용할 수 있다.
DB와 관련된 기능을 제공한다.
Spring을 사용하는 코드를 테스트할 수 있도록 여러 기능을 제공한다.
Messaging, Scheduling 등 다른 기술과 연결하기 위한 기능도 제공한다.
Spring의 특징을 공부하다 보면 POJO라는 단어가 등장한다.
말 그대로 평범한 Java 객체이다.
public class Member {
private String name;
}
특정 Framework의 클래스를 반드시 상속하지 않아도 되는 일반적인 Java 객체이다.
Spring은 이러한 일반 Java 객체를 중심으로 애플리케이션을 구성할 수 있도록 도와준다.
한국어로는 제어의 역전이다.
일반적인 Java 코드에서는 필요한 객체를 직접 만든다.
OrderRepository repository = new OrderRepository();
하지만 Spring에서는 객체의 생성과 관리를 Spring에게 맡길 수 있다.
Spring Container
↓
OrderRepository 생성
↓
OrderService에 전달
즉 객체를 생성하고 관리하는 제어권이 개발자 코드에서 Framework 쪽으로 이동한다.
그래서 제어의 역전이라고 한다.
DI는 Dependency Injection, 즉 의존성 주입이다.
예를 들어
public OrderService(OrderRepository repository) {
this.repository = repository;
}
OrderService는 OrderRepository가 필요하다.
그런데 직접 생성하지 않고 외부에서 전달받는다.
Spring Container
↓
OrderRepository
↓
OrderService
이렇게 필요한 객체를 외부에서 넣어주는 것이 DI이다.
아직까지 Spring이라는 개념이 명확하게 이해된 것은 아니지만 Spring 이라는 거대한 바다에 이제 들어갈 준비가 되었다? 다음에는 Container과 Bean에 대해서 한번 공부해 보는 것이 어떨까 싶다.