[Spring Boot] 스프링 콘셉트에 대해 알아보자
스프링의 콘셉트 IoC, DI, Bean&Container, AOP, PSA에 대해 알아보자.
Apr 08, 2024
✅ Spring이란?
Spring은 대규모의 복잡한 데이터를 관리하는 엔터프라이즈 애플리케이션에서 '기능 개발'에만 집중할 수 있도록 설계된 프레임워크이다.
Spring에서 가장 중요한 개념은 다음과 같다.
- IoC: 제어의 역전
- DI: 의존성 주입
- Bean & Container: 빈과 컨테이너
- AOP: 관점 지향 프로그래밍
- PSA: 이식 가능한 서비스 추상화
✅ IoC
IoC는 Inversion of Control의 줄임말이다. 직역하면 제어의 역전이다. 그렇다면 제어의 역전이 무슨 말일까?
지금까지 자바 코드를 작성해 객체를 생성할 때는 객체가 필요한 지점에서 직접 생성했을 것이다. 아래 코드를 보면 클래스 B 객체를 사용하기 위해 클래스 A에서 객체를 직접 생성한다.
public class A { b = new B(); }
제어의 역전은 다른 객체를 직접 생성하거나 제어하는 것이 아니라 외부에서 관리하는 객체를 가져와 사용하는 것을 의미한다. 위 코드에서 제어의 역전을 적용하면 아래 코드의 형태로 바뀐다.
public class A { private B b; // 외부에서 가져옴 }
이전과는 다르게 클래스 B 객체를 직접 생성하는 것이 아니므로, 어딘가에서 받아와 사용하고 있다고 추측해볼 수 있을 것이다. 실제로 스프링 컨테이너에서 객체를 관리하고 제공하는 역할을 대신 수행하고 있다.
✅ DI
위와 같이 스프링은 IoC를 통해 객체들을 관리한다. 이 IoC를 구현하기 위해 사용하는 방법이 DI인 것이다. DI는 Dependency Injection의 약자로 직역하면 의존성 주입을 의미한다.
DI는 어떤 클래스가 다른 클래스에 의존한다는 뜻이다. 아래 코드처럼
@Autowired
라는 어노테이션을 통해 스프링 컨테이너에 있는 빈(객체 B)을 클래스 A에 주입할 수 있다.빈은 쉽게 말해 스프링 컨테이너에서 관리하는 객체를 말한다.
public class A { @Autowired B b; // DI를 통해 주입받음. }
위 코드에서 객체 b는
B b
라고 선언했을 뿐, 직접 객체를 생성하지는 않았다. 어디선가 주입받았다는 뜻이다! 기존의 자바 코드에서는 클래스 A가 객체 B를 사용하고 싶다면 직접 생성해야 했지만, 스프링은 객체를 직접 생성하는 것이 아닌 스프링 컨테이너에서 객체를 주입받아 사용할 수 있다. ← 이것이 스프링의 핵심이라고 할 수 있다!!
✅ Bean & Container
스프링 컨테이너?
위에서 말했듯 스프링은 스프링 컨테이너를 제공한다. 스프링 컨테이너는 빈을 생성하고 관리한다. 즉, 빈이 생성되고 소멸되기까지의 생명주기를 스프링 컨테이너가 관리하는 것이다.
빈?
빈은 스프링 컨테이너가 생성하고 관리하는 객체이다. 위의 DI 코드에서 본
B
가 바로 빈이다. 스프링은 빈을 스프링 컨테이너에 등록하려면 XML 파일 설정, 어노테이션 추가 등의 방법을 사용할 수 있다. 예를 들어,
UserService
라는 클래스에 @Component
라는 어노테이션을 붙이면 UserService
클래스는 빈으로 등록된다. 이때, 빈의 이름은 클래스 이름의 첫 글자를 소문자로 바꿔 관리한다. 따라서 UserService
클래스의 빈 이름은 userService
가 되는 것이다.@Component // 빈으로 등록 public class UserService { }
@Component
이외에도 @Service
, @Repository
등 다양한 빈 어노테이션이 존재한다.✅ AOP
스프링의 또 다른 중요한 개념인 AOP가 있다. AOP는 Aspect Oriented Programming의 약자로, 직역하면 관점 지향 프로그래밍이다. 프로그래밍에 대한 관심을 핵심 관점과 부가 관점으로 나누어서 관심 기준으로 모듈화하는 것을 의미한다.
예를 들어 계좌 이체와 고객 관리를 하는 프로그램이 있을 때 각 프로그램은 로깅과 데이터베이스 연결 등의 로직이 존재한다. 이때 핵심 관점은 계좌이체와 고객 관리이며 부가 관점은 로깅과 데이터베이스 연결이다.
여기에 AOP관점을 적용하면 부가 관점에 해당하는 로직을 모듈화하여 핵심 관점과 분리할 수 있다. 이는 프로그래머가 핵심 관점의 로직 코드 개발에만 집중할 수 있게 해주며 프로그램의 변경과 확장에도 유연하게 대응할 수 있게 해준다.
✅ PSA
PSA는 Portable Service Abstraction의 약자로, 이식 가능한 서비스 추상화를 의미한다. 이식 가능한 서비스 추상화가 도대체 무슨 말일까?
스프링에서 제공하는 다양한 기술들을 추상화하여 개발자가 쉽게 사용하는 인터페이스를 의미한다. 예를 들어 스프링에서 데이터베이스에 접근하기 위해 JPA, MyBatis, JDBC 등을 사용하는데, 어떤 기술을 사용하더라도 일관된 방식으로 데이터베이스의 접근할 수 있도록 인터페이스를 지원해준다.
WAS(Web Application Server)도 PSA의 한 예시이다. 왜냐하면 코드는 그대로 두고 WAS를 톰캣이 아닌 네티와 같은 다른 곳에서 실행해도 기존 코드를 그대로 사용할 수 있기 때문이다.
✅ 한 줄 요약
- IoC: 객체의 생성과 관리를 개발자가 하는 것이 아닌, 프레임워크가 대신한다.
- DI: 외부에서 객체를 주입받아 사용한다.
- Bean&Container: 스프링 컨테이너에서 관리하는 객체를 빈이라고 부른다.
- AOP: 프로그래밍을 할 때 핵심 관점과 부가 관점을 나누어 개발한다.
- PSA: 어느 기술을 사용하던 일관된 방식으로 처리할 수 있도록 한다.
[참고 문헌] 스프링 부트 3 백엔드 개발자 되기: 자바 편 (2판)
Share article