스프링 프레임워크에 대해 알아보기에 앞서 프레임워크란 무엇인지 알아보겠습니다.
프레임워크는 프로그래밍 환경에서 발생할 수 있는 다양한 문제를 쉽고 빠르게 해결할 수 있도록 도와주는 미리 정의된 기능의 집합입니다.
스프링 프레임워크란(정확히는 자바 기반 애플리케이션 전반에서) 개발자가 구현해야하는 다양하고 복잡한 문제들을 이미 구현해두었고, 개발자는 이를 활용해서 웹을 포함한 애플리케이션을 쉽고 빠르게 구축할 수 있도록 도와주는 프레임워크 입니다.
그렇다면 스프링 프레임워크는 어떻게 애플리케이션을 쉽고 빠르게 구축할 수 있도록 도와줄까요? 이는 스프링 프레임워크의 특징을 살펴보면 이해할 수 있습니다.
일반적으로 스프링 프레임워크의 특징을 이야기 할 때, IoC container, DI, AOP 등을 이야기합니다.
IoC는 Inversion Of Control의 축약어로 ‘제어의 역전’을 의미합니다. 일반적인 프로그래밍 환경에서 개발자는 직접 객체를 생성하고 객체간의 의존 관계를 정의하며 기능을 구현해냅니다. 하지만 스프링을 사용하면 객체 생성과 의존 관계 연결 같은 공통 작업을 프레임워크가 대신 관리해주기 때문에, 개발자 입장에서는 대부분의 경우 객체의 생명주기 자체를 일일이 관리하기보다 비지니스 로직 작성에 더 집중할 수 있게 됩니다.
이런 ‘제어의 역전’을 구현하는 대표적인 방식이 IoC Container와 DI(의존성 주입) 입니다. 개발자가 비지니스 로직 작성에 필요한 컴포넌트들을 등록해두면, Spring은 이를 Bean으로 관리하고 자체 컨테이너 안에 보관합니다. 이 컨테이너를 IoC Container 라고 합니다.
개발자는 컴포넌트 사용을 위해 매번 새로운 객체를 생성할 필요 없이, IoC 컨테이너가 관리하는 Bean을 주입(DI) 받는 형태로 간단하게 가져와서 사용할 수 있게됩니다.
다음으로 AOP(관점 지향 프로그래밍)에 대해 알아보겠습니다. 프로그램을 구현하다 보면 핵심 기능에 해당하는 비지니스 로직 뿐만 아니라 사용자 요청과 응답의 기록(Logging), 권한 검증 등 다양한 부가 로직들도 함께 작성이 됩니다.
만약 하나의 메소드에 핵심 비지니스 로직 이외의 부가적인 역할을 하는 부가 로직이 같이 작성된다면, 단일 책임 원칙을 위반할 뿐만 아니라 코드 가독성이 저해되고 유지보수가 힘들어지는 상황을 초래할 수 있습니다.
AOP는 이런 부가 로직을 핵심 로직과 분리해서 적용할 수 있게 도와줍니다. 보통 애노테이션 등을 활용해서 “어디에 적용할지”를 선언할 수 있고, 스프링은 그 지점에 부가 기능이 실행되도록 연결해줍니다.
결국 비지니스 로직은 핵심 책임에 더 집중할 수 있고, 부가 로직은 공통 기능으로 관리할 수 있어서 유지보수가 쉬워지며 기능 확장도 더 수월해집니다.