[Spring Boot 3 백엔드 개발자 되기] 2장 – 스프링과 부트의 탄생 배경부터 핵심 원리까지

홍승민·2025년 4월 9일
post-thumbnail

스프링과 스프링 부트, 그리고 주요 원리 총정리

1. 스프링(Spring)의 등장

스프링은 엔터프라이즈 애플리케이션을 위한 개발 환경을 제공하고자 만들어졌습니다.
그럼 엔터프라이즈 애플리케이션이란 무엇일까요?

대규모의 복잡한 데이터를 관리하고 많은 사용자의 요청을 동시에 처리해야 하는 애플리케이션을 말합니다.

이런 시스템에서는 서버 성능, 안정성, 보안이 매우 중요하지만, 개발자들이 이런 요소까지 모두 신경 쓰면서 비즈니스 로직까지 구현하기엔 부담이 컸습니다.

이 때 등장한 것이 Spring Framework입니다.
스프링은 서버 성능, 안정성, 보안을 높은 수준으로 제공하여 개발자들이 비즈니스 로직에만 집중할 수 있도록 도와줍니다.


2. Spring vs Spring Boot

스프링은 이렇게 장점이 많은 개발 도구였지만 설정이 매우 복잡했고 이를 보완하고자 스프링부트가 탄생했습니다. 스프링부트는 스프링과 똑같거나 다른 것이 아닌 그냥 스프링을 보다 더 쉽게 사용하게 해 주는 도구입니다.

● 주요 차이점

- 구성의 차이

  • 스프링: 수동으로 설정해야 함
  • 스프링 부트: starter를 이용해 자동 설정 (개발 환경 자동 구성)

- 내장 WAS(Web Application Server)

  • 스프링: 외부 WAS 필요 (톰캣 등)
  • 스프링 부트: 내장 톰캣 포함 → 바로 실행 가능

WAS 구조 그림 출처: goldsony.tistory.com

- 기타

  • XML 설정 없이 사용 가능
  • 인메모리 DB(H2 등) 지원

3. 스프링의 주요 원리 4가지

3.1 IOC (제어의 역전, Inversion of Control)

IOC는 (Inversion of Control)의 줄임말로 말 그대로 제어의 역전입니다. 여러분들이 자바를 공부해 보셨다면 자바에서 객체를 생성할 때는 객체가 필요한 곳에서 직접 생성을 한다는 말을 이해하실 수 있으실 겁니다.

Public class A {
	b = new B(); // 직접 객체 생성
}

클래스B의 객체를 사용하기 위해 클래스 A에서 직접 객체를 만드는 예제입니다.

제어의 역전은 다른 객체를 직접 생성하거나 제어하는 것이 아니라 외부에서 관리하는 객체를 가져와 사용한다는 의미입니다.

이 의미는 위 코드처럼 직접 객체를 만드는 것이 아니라 어딘가에 있는 객체를 받아와서 사용한다는 의미이고 실제로 스프링에서는 스프링 컨테이너가 객체를 관리하고 제공해주는 역할을 수행하고 있습니다.

public class A {
	private B b;
}

위 코드처럼 코드에서 객체를 생성하지 않고 스프링 컨테이너가 객체를 제공하여 클래스 B의 객체를 사용하고 있습니다.


그림 출처 https://buly.kr/8IveRlC


3.2 DI (의존성 주입, Dependency Injection)

IOC를 구현하는 방법 중 하나입니다.
스프링에서는 @Autowired 어노테이션 등을 사용해 빈(Bean)을 주입합니다.

DI는 (Dependency Injection) 의 약자로 어떤 클래스가 다른 클래스에 의존한다는 것을 의미합니다. @Autowired 어노테이션은 스프링 컨테이너에 등록되어 있던 빈이라는 것을 주입해주는 역할을 합니다. 여기서 빈이 무엇이냐면 쉽게 말해 스프링 컨테이너에서 관리하는 객체를 의미합니다.

- Field변수를 사용하는 방법

public class A {
	//A에서 B를 주입받음.
	@Autowired
	B b;
}

위 코드처럼 스프링 컨테이너에서 객체를 만들어서 클래스 A에 주입해주는 것을 DI라고 합니다. 이러한 방법 이외에도 생성자를 이용하거나 setter를 이용하는 방법도 있습니다.

- 생성자를 사용하는 방법

public class A {

	private B b;
	
    public A (B b) {
    	this.b = b;
    }
}

- Setter를 사용하는 방법

public class A {

    private B b;

    @Autowired
    public void setB(B b) {
        this.b = b;
    }

각 방법들의 장단점

  • 생성자 주입: 가장 권장되는 방식. 의존성이 명확하게 보이고, 불변성 보장.

  • 세터 주입: 선택적인 의존성 주입할 때 사용.

  • 필드 주입: 편하지만 테스트하기 어렵고 유지보수에 불리함.

여기서 스프링 컨테이너와 빈에 대해서 간단하게 다시 집고 넘어가겠습니다.


그림 출처 https://ittrue.tistory.com/220#google_vignette

  • 스프링 컨테이너
    스프링에서 제공하는 것으로 빈을 생성하고 관리해줍니다. 즉 빈이 생성되고 소멸하기 까지의 생명주기를 스프링 컨테이너가 관리하는 것입니다. 그리고 @AutoWired 어노테이션을 사용해 원하는 위치에서 빈을 주입받을 수 있게 DI를 지원해 주는 역할을 합니다.

  • 스프링 빈
    앞에서 봤듯이 스프링 컨테이너에서 생성하고 관리하는 객체입니다. 위 코드에서는 B가 빈인데 빈을 등록하는 방법에는 어노테이션이나 XML 파일 설정 등등 여러가지 방법이 있습니다.

@Component // 클래스 MyBean 빈으로 등록됨.
public class MyBean{
}

위처럼 @Component 어노테이션을 사용해 빈으로 등록할 수 있고 이렇게 등록된 빈은 제일 첫글자가 소문자로 바뀌어서 myBean이라는 빈 이름으로 클래스가 등록이 됩니다.


3.3 AOP (관점 지향 프로그래밍)

AOP란 Aspect Oriented Programming의 줄임말로 직역하면 관점 지향 프로그래밍입니다. 프로그래밍을 핵심관점과 부가관점으로 나누어서 이를 기준으로 모듈화하는 것을 의미합니다.


그림 출처 https://imbf.github.io/spring/2020/03/23/AOP.html

예를 들어,

  • 핵심 관점: 계좌이체, 고객 관리

  • 부가 관점: 로깅, 보안, 트랜잭션

AOP는 이 부가 로직들을 공통 모듈로 분리하여 유지보수성과 재사용성을 높여줍니다.한마디로 부가관점 코드를 분리하여 개발자가 핵심관점의 개발에 보다 더 집중할 수 있도록 하고 프로그램의 변경과 확장에 있어 유연하게 대응할 수 있도록 해줍니다.


3.4 PSA (이식 가능한 추상화 서비스, Portable Service Abstraction)

PSA는 이식 가능한 추상화 서비스로 (Portable Service Abstraction)의 약자로 스프링에서 제공하는 다양한 기술들을 추상화 하여 개발자가 쉽게 사용할 수 있는 인터페이스를 의미합니다.

대표적인 PSA로는 클라이언트의 매핑과 클래스, 메서드의 매핑을 위한 어노테이션 등이 있습니다. 그리고 스프링에서 DB에 접근하려면 JPA, MyBatis, JDBC등 다양한 기술을 사용할 수 있는데 여기에서 어떤 기술을 사용하든 일관된 방식으로 DB에 접근할 수 있도록 인터페이스를 지원합니다.


그림 출처 https://velog.io/@bernard/Spring-PSA

마지막으로 정리하자면

  • IOC : 객체의 생성과 관리를 개발자가 하는 것이 아니라 프레임워크가 대신 하는 것
  • DI : 외부에서 객체를 주입받아 사용하는 것
  • AOP : 프로그래밍을 할 떄 핵심 관점과 부가 관점을 구분하여 개발하는 것
  • PSA : 어떤 기술을 사용하든 일관된 방식으로 처리되도록 하는 것

추가적인 개념으로

POJO란 무엇일까?

POJO는 Plain Old Java Object의 약자로,특별한 규약이나 상속 없이 작성된 순수한 자바 객체를 의미합니다. 즉 POJO는 어떤 프레임워크나 라이브러리에도 의존하지 않고, 단순히 필드와 메서드만으로 구성된 자바 객체라고 할 수 있습니다.

POJO의 특징으로는

  • 상속 없음
    - javax.persistence.Entity나 org.springframework.Component 같은 특정 클래스를 상속받지 않아도 됨

  • 어노테이션 없음
    - 프레임워크의 어노테이션에 의존하지 않아도 됨

  • 간단한 구조
    - 대부분은 필드 + getter/setter + toString + equals/hashCode 정도만 가짐

Spring 같은 프레임워크는 POJO를 관리 대상으로 등록해 다양한 기능을 부여할 수 있습니다. 또한 유지보수가 쉽고 유연함을 지니고 있기 때문에 스프링은 이 POJO 기반 프로그래밍을 지향합니다.


마무리하며

오늘은 스프링과 스프링부트의 차이점과
스프링의 핵심 개념인 IOC, DI, AOP, PSA를 정리해보았습니다.

특히 PSA와 POJO 개념은 처음 접해보는 용어라 더 흥미로웠고,
스프링의 추상화 구조와 개념을 이해하는 데 큰 도움이 되었습니다.

감사합니다!

profile
열심히 배워가는 중..

0개의 댓글