스프링과 스프링 부트 (1)

송범·2025년 3월 21일

스프링 부트 3로 백엔드 개발자 되기: 자바편 을 보고 참고해서 작성했습니다.

Spring Framework란?

Spring은 Java기반의 웹 어플리케이션 개발을 위한 프레임워크입니다.
객체 지향 프로그래밍(OOP) 원칙을 따르고, DI(의존성 주입)AOP(관점 지향 프로그래밍) 같은 개념을 지원해서 유지보수성과 확장성이 뛰어납니다.

Spring은 모든 기능의 기반을 제어의 역전(IoC)의존성 주입(DI)에 두고 있습니다.

Spring의 주요 특징

1. IoC(Inversion of Control) 제어의 역전

기본적으로 자바 코드를 작성해 객체를 생성할 때는 객체가 필요한 곳에서 직접 생성을 했습니다. 다음을 보면 클래스 B 객체를 사용하기 위해 클래스 A에서 객체를 직접 생성합니다.

publi class A{
	b = new B(); //클래스 A에서 new 키워드로 클래스 B의 객체 생성
}

IoC는 다른 객체를 직접 생성하거나 제어하는 것이 아니라 외부에서 관리하는 객체를 가져와 사용하는 것을 말합니다. 위 예제에서 IoC를 적용하면 다음과 같이 코드의 형태로 바뀝니다. 이전과는 다르게 클래스 B객체를 직접 생성하는 것이 아니고, 어딘가에서 받아와 사용하고 있다고 추측할 수 있습니다.
실제로 스프링은 스프링 컨테이너가 객체를 관리, 제공하는 역할을 합니다.

public class A {
	privte B b; //코드에서 객체를 생성하지 않음, 어디선가 받아온 객체를 b에 할당합니다.
}

원래는 우리가 클래스 안에서 new 키워드로 객체를 직접 생성하였지만, Spring은 그 제어권을 개발자에서 프레임워크로 "역전" 시켰다.

2. DI(Dependency Injection) 의존성 주입

DI는 어떤 클래스가 다른 클래스에 의존한다는 뜻입니다. 필요한 객체(의존성)를 외부에서 주입(Inject) 해주는 방식입니다. 다음은 Ioc/DI를 기초로 하는 스프링 코드입니다.

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

여기서 @Autowired라는 애너테이션은 스프링 컨테이너에 있는 빈이 라는 것을 주입하는 역할을 하는데요. 빈은 쉽게 말해 스프링 컨테이너에서 관리하는 객체를 말합니다. 이전 코드에서는 개발자가 직접 B 객체를 생성했지만 다음 코드는 어딘가에서 B b;라고 선언했을 뿐 직접 객체를 생성하지는 않고 있습니다. 다시 말해 객체를 주입받고 있습니다.
스프링 컨테이너가 B 객체를 만들어서 클래스 A에게 준 겁니다.

3. 빈과 스프링 컨테이너

스프링 컨테이너란?

스프링 컨테이너는 빈을 생성하고 관리합니다. 즉, 빈이 생성되고 소멸되기까지의 생명주기를 이 스프링 컨테이너가 관리합니다. 또한 개발자가 @Autowired 같은 애너테이션을 사용해 빈을 주입받을 수 있게 DI를 지원합니다.

빈이란?

빈은 스프링 컨테이너가 생성하고 관리하는 객체입니다. 앞에서 본 코드에서 B가 바로 빈인데요, 스프링은 빈을 스프링 컨테이너에 등록하기 위해 XML 파일 설정, 애너테이션 추가 등의 방법을 제공합니다.
예를 들어 MyBean이라는 클래스에 @Component 애너테이션을 붙이면 MyBean 클래스가 빈으로 등록됩니다. 이후 스프링 컨테이너에서 이 클래스를 관리합니다. 이때 빈의 이름은 클래스의 이름의 첫 글자를 소문자로 바꿔 관리해줍니다. MyBean 클래스의 빈 이름은 myBean으로 바꿔줍니다.

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

}

4. AOP(Aspect Oriented Programming) 관점 지향 프로그래밍

AOP는 프로그래밍에 대한 관심을 핵심 관점(Aspect), 부가 관점(Aspect)으로 나누어서 관심 기준으로 공통 관심사(Cross-Cutting Concern)를 모듈화하는 것을 의미합니다. 반복되는 코드(공통 코드)를 깔끔하게 분리해서 비즈니스 로직 집중할 수 있도록 도와주는 핵심 기능입니다.

예를 들어 계좌 이체, 고객 관리하는 프로그램이 있을 때 각 프로그램에는 로깅 로직, 즉 지금까지 벌어진 일을 기록하기 위한 로직과 여러 데이터를 관리하기 위한 데이터베이스 연결 로직이 포함됩니다. 이때 핵심 관점은 계좌 이체, 고객 관리 로직이고, 부가 관점은 로깅, 데이터베이스 연결 로직입니다.

그림을 보면 로깅, 데이터베이스 연결은 모두 계좌 이체와 고객 관리에 필요합니다. 여기에 AOP 관점을 적용하면 부가 관점에 해당하는 로직을 모듈화해 개발을 할 수 있게 해줍니다. 결과로 프로그래머는 핵심 관점 코드에만 집중할 수 있게 될 뿐만 아니라 프로그램의 변경과 확장에도 유연하게 대응할 수 있어서 좋습니다.

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

PSA는 스프링에서 제공하는 다양한 기술(서블릿, 트랜잭션, 데이터 접근, 메시징 등)들을 추상화해 개발자가 통일된 방식으로 쉽게 사용하는 인터페이스를 말합니다.

PSA로 개발자 입장에서 얻는 이점은

  • 기술 변경에도 코드 변경을 최소화 할 수 있습니다.(JDBC -> JPA로 바꾸더라도 @Transaction 같은 코드는 그대로 사용 가능합니다.)

  • 일관된 API 제공 : 다양한 구현체와 환경에서도 같은 방식으로 코딩이 가능합니다.

  • 코드 이식성 향상 : 특정 기술에 종속되지 않는다 -> 유지보수, 마이그레이션에 유리

@Service
@Transactional
public class UserService {
    public void join(User user) {
        userRepository.save(user);
    }
}
  • 위에 코드에서 내부적으로는 DataSourceTransactionManager, JpaTransactionManager 등으로 처리되지만, 개발자는 구현을 몰라도 똑같이 @Transactional 애너테이션을 사용하면 됩니다.

✅ 정리

  • IoC : 객체의 생성과 관리를 개발자가 하는 것이 아니라 프레임워크가 대신 하는 것입니다.

  • DI : 외부에서 객체를 주입받아 사용하는 것입니다.

  • AOP : 프로그래밍을 할 때 핵심 관점과 부가 관점을 나누어서 개발하는 것입니다.

  • PSA : 어느 기술을 사용하던 일관된 방식으로 처리하도록 하는 것입니다.

profile
BackEnd&Data Scientist가 되고 싶은 개발 기록 노트

0개의 댓글