스프링을 쓰는 이유

왜 스프링을 쓸까?

국내에서 가장 많이 쓰이는 백엔드 프레임워크는 단연 Spring Framework(이하 스프링)일 것이다. 그런데 왜 스프링을 사용했냐고 물어보면 이 질문에 대해 답할 수 있는 사람은 별로 없다는 것을 깨닫게 될 것이다. 이는 스프링이 제시하는 핵심 가치나 특징을 모르기 때문에 그런 것이다. 그렇다면 위의 질문에 대답할 수 있도록, 이제부터 스프링의 핵심 가치 및 특징에 대해 알아보도록 하자.


스프링의 핵심 가치

스프링 공식 사이트인 https://spring.io 에서는, 왜 스프링을 사용해야 하는지에 대해 다음과 같이 설명하고 있다.

"스프링은 모든 사람들이 빠르고, 쉽고, 그리고 안전하게 자바프로그래밍을 할 수 있게 해줍니다. 스프링은 속도, 단순함, 그리고 생산성에 중점을 둔 세계에서 가장 인기 있는 자바 프레임워크 입니다."

길게 적어 놓기는 했지만, 핵심은 다음과 같다.

"개발자는 오직 비즈니스 로직에만 신경 써라"

스프링은 이를 위해 POJO를 기반으로 스프링 삼각형이라 불리는 3대 프로그래밍 모델을 기반으로 만들어진 프레임워크라고 볼 수 있다. 그렇다면 이제 이 스프링 삼각형이 무엇인지 알아보도록 하자.


스프링 삼각형

스프링 삼각형은 아래 사진과 같이 POJO를 기반으로 AOP, DI, PSA라는 3대 프로그래밍 모델을 도식화 한 것이다.

스프링 삼각형

그러면 각각의 개념이 무엇을 의미하는지 하나하나 확인해 보자.

POJO (Plain Old Java Object)

POJO는 의 약자로 쉽게 말해 그냥 순수한 자바 객체를 의미하는 것이다. 달리 말하면 특정 기술이나 환경에 종속되어 의존하지 않는 자바 객체를 의미한다. 소프트웨어 개발 시 POJO를 지향해야 하는 이유는 소프트웨어가 특정 기술이나 환경에 종속되는 순간 객체지향 언어의 장점을 잃어버릴 수 있기 때문이다.

💡
그러면 특정 기술과 환경에 종속되지만 않으면 모두 POJO 인가?
토비의 스프링에서는 진정한 POJO를 다음과 같이 정의했다.
"진정한 POJO란 객체 지향적인 원리에 충실하면서, 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트를 말한다."

IoC/DI (Inversion of Control / Dependency Injection)

DI는 의존성 주입 이라는 의미로, 이에 대해 설명하기 위해서는 IoC라는 개념을 먼저 설명할 필요가 있다. IoC는 제어의 역전이란 의미인데, 이 개념의 핵심은 객체를 개발자가 직접 생성하거나 관리하는 것이 아니라 이 책임을 외부에 위임하는 것을 의미한다. 여기서 말하는 '외부' 란 스프링에서는 스프링 컨테이너 혹은 IoC 컨테이너를 의미한다. 이렇게 컨테이너에 의해 생성되는 객체를 특별히 빈(Bean) 이라고 부른다. Di는 제어 역전의 방법 중 하나로 사용할 객체를 개발자가 직접 생성하지 않고 외부에서 생성한 객체를 주입 받아 사용하는 방식을 의미한다. 이렇게 객체 생성과 관리에 대한 책임을 개발자가 아닌 제 삼자에게 위임하고 외부에 의해 생성된 빈을 받아서 쓰는 이유는, 개발자는 오로지 비즈니스 로직에만 신경 쓸 수 있도록 하기 위함이며 또한 객체 간의 결합을 느슨하게 만들기 위해서다.

AOP (Aspect Oriented Programming)

AOP는 관점 지향적 프로그래밍 이라는 의미다. 여기서 관점(Aspect)이란 어떤 기능을 구현할 때 그 기능을 핵심 기능과 부가 기능으로 구분해 각각을 하나의 관점으로 보는 것을 의미한다. 여기서 핵심 기능은 비즈니스 로직을 말하며, 부가 기능은 이 비즈니스 로직에서 부가적으로 사용되는 기능들을 의미한다. 이 부가 기능에는 대표적으로 로깅, 트랜잭션, 보안과 같은 기능들이 존재한다. 이런 부가 기능들은 대부분의 비즈니스 로직에서 사용되기 때문에 중복 코드가 양산될 가능성이 높다. 이렇게 비즈니스 로직에 흩어진 부가 기능 코드들을 흩어진 관심사라고 부른다. AOP는 이렇게 흩어진 관심사를 하나로 모아 모듈화 하고 핵심 기능으로부터 분리해 재사용성을 높일 수 있다.

PSA (Portable Service Abstractions)

PSA는 휴대용 서비스 추상화 라는 의미다. 이는 환경의 변화와 관계없이 일관된 방식의 기술 접근 환경을 제공하는 추상화 구조를 의미한다. 가장 대표적으로 @Transactional 어노테이션을 예로 들 수 있는데, 이 어노테이션은 개발자가 JDBC를 직접 사용해 DB를 접근하든, Hibernate나 MyBatis를 사용해 접근하든 일관된 방식으로 트랜잭션을 처리할 수 있도록 도와준다. 실제 내부적으로는 서블릿 기반의 코드가 동작하지만 추상화 계층에 의해 숨겨져 있기 때문에 PSA는 잘 구현된 인터페이스라고 표현하기도 한다.


정리하며

스프링을 쓰는 이유라고 적어 놓고는 스프링 삼각형에 대해 2/3를 다루었다. 스프링 삼각형에 대해 길게 적어 놓기는 했지만, 결국 스프링 삼각형의 핵심 내용은 스프링을 쓸 경우 생산성이 높아진다는 것이다. 하지만 면접 같은 곳에서 '왜 스프링을 썼느냐?' 라는 질문이 들어 왔을 때, 단순히 생산성이 좋아서 라는 대답은 좋은 답변이 아닐 것이다. 즉, 왜 생산성이 좋아지는지에 대해 이러한 배경을 알아 둬야 좋은 답변을 할 수 있을 것이다.


참고한 문헌 및 블로그 글

  1. 스프링 부트 핵심 가이드 - 장정우 저