스프링 기본 개념 정리2 - 제어의 역전, 의존성 주입, AOP, 이식 가능한 서비스 추상화

진용완·2025년 5월 13일
0

이 포스팅은 신선영 저, 『스프링 부트 3 백엔드 개발자 되기』(골든래빗, 2023)를 공부하면서 핵심 개념들을 정리하기 위해 작성하였습니다.

2장. 스프링 부트 3 시작하기

  웹 애플리케이션을 만들기 위한 도구들은 크게 라이브러리와 프레임워크로 나뉘어진다고 앞 장에서 이야기한 바 있다. 스프링(Spring)과 스프링 부트(Spring boot)는 가장 널리 쓰이는 프레임워크들 중 하나이다.

□ 스프링 (Spring)
  스프링은 대규모의 복잡한 데이터를 처리하는 애플리케이션인 엔터프라이즈 애플리케이션을 개발하기 위해 만들어진 프레임워크이다. 엔터프라이즈 애플리케이션을 개발하려면 좋은 서버 성능, 안정성, 그리고 높은 수준의 보안이 필요하다. 스프링은 이 세가지를 모두 제공해준다. 그래서 스프링으로 엔터프라이즈 애플리케이션을 개발하면 온전히 기능 개발에만 집중할 수 있다.

□ 스프링 부트 (Spring boot)
  스프링 부트는 스프링을 좀 더 쉽게 사용할 수 있도록 개정한 프레임워크이다. 기존의 스프링은 설정이 너무 복잡하다는 문제점을 가지고 있었다. 스프링 부트는 스프링의 각종 설정을 쉽고 빠르게 할 수 있다. 스프링과 차별화되는 스프링 부트의 특징들은 다음과 같다.
  ○ 개발 환경을 자동으로 설정해준다.
  스프링 코어와 스프링 MVC의 모든 기능을 자동으로 로드해주므로 개발 환경을 수동으로 구성할 필요가 없다.
  ○ 자체적으로 WAS(Web Application Server, 웹 애플리케이션 서버)가 내장되어있다.
  톰캣, 제티, 언더토우 같은 WAS가 내장되어 있으므로 WAS를 별도로 설치할 필요가 없다.
  ○ XML을 사용하지 않는다. Java 언어로 모든 것을 작성할 수 있다.
  ○ 인메모리 데이터베이스를 지원한다.
  ○ JAR를 이용해서 자바 옵션만으로도 배포가 가능하다.

   스프링은 다음과 같은 4가지 핵심 개념들에 근거하여 구동된다.

□ 1. 제어의 역전(IoC, Inversion of Control)
  제어의 역전이란 객체의 생성과 관리를 개발자가 직접 하는 것이 아니라 스프링 컨테이너라는 클래스에서 대신 해주는 것을 의미한다. 객체가 필요할 때에는 객체의 생성자를 사용하지 않고 선언만 해주어도 스프링 컨테이너에서 자동으로 객체의 생성주기를 관리해준다.
  제어의 역전을 사용하는 이유는 클래스 간의 결합도가 약해져서 프로그램을 유지 및 확장 하기에 용이해지기 때문이다. 클래스A에서 클래스B의 객체가 필요할 때에 클래스A에서 클래스B의 객체를 직접 생성하는 것을 강한 결합도라고 한다. 결합도가 강할 경우에는 클래스B가 교체될 때에 클래스 A에서 변경해야할 코드들이 많아진다. 그러나 인터페이스를 통해서 클래스A가 클래스B의 객체를 직접 생성하지 않는 것을 약한 결합도라고 한다. 이 경우 클래스B가 교체되더라도 클래스A의 코드에 미치는 영향이 줄어든다.

□ 2. 의존성 주입(DI, Dependency Injection)
  의존성 주입이란 제어의 역전을 구현하기 위한 기술이다. 객체를 선언하고 난 곳에 @Autowired라는 에너테이션을 사용하면 그 객체를 필요로 하는 클래스에 스프링 컨테이너가 대신 만들어준 객체를 주입한다. 이 때 스프링 컨테이너가 대신 생성하고 관리하는 객체를 빈(Bean)이라고 부른다.

□ 3. 관점 지향 프로그래밍(AOP, Aspect Oriented Programming)
  관점 지향 프로그래밍은 핵심 기능과 부가 기능을 따로 나누어서 보는 관점을 통해서 프로그래밍을 한다는 의미이다. 로그 관리나 데이터베이스 접근 등의 기능들은 비즈니스 로직에서 핵심은 아니지만 공통적으로 쓰이는 기능들이다. 이러한 기능들을 따로 분리하여 모듈화하여 각각 비즈니스 로직에서 필요로할 때에 그대로 가져다가 쓸 수 있다.
  관점 지향 프로그래밍은 개발자가 핵심 기능을 개발하는데에 집중할 수 있도록 하고, 또한 프로그램을 확장하고 변경할때에도 유연하게 대처할 수 있다는 장점이 있다.

□ 4. 이식 가능한 서비스 추상화(PSA, Portable Service Abstraction)
  이식 가능한 서비스 추상화란 인터페이스를 제공함으로써 기능을 다른 기술로 교체하더라도 동일하게 작동하도록 하는 것을 의미한다. 덕분에 코드를 변경하지 않아도 데이터베이스나 WAS 등을 다른 것으로 교체할 수 있다.

0개의 댓글