[토비의 스프링] 8장) 스프링이란 무엇인가? (1)

2021-07-27
  • Java
  • SpringBoot

8장) 스프링이란 무엇인가? (1)

스프링은 단순히 IoC/DI 를 편하게 적용하도록 돕는 단계를 넘어서 엔터프라이즈 애플리케이션 개발의 전 영역에 걸쳐 다양한 종류의 기술에 관여한다. 이 말의 뜻과, 스프링이 무엇이고, 스프링 프레임워크가 만들어진 이유와 존재 목적, 추구하는 가치를 정리해보고자 한다.

8.1) 스프링의 정의

스프링이란 이런 것이다라고 한 마디로 정의하는 것은 쉽지 않다. 스프링에 대해 가장 잘 알려진 정의는 아래와 같다.

자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크

애플리케이션 프레임워크

일반적으로 라이브러리나 프레임워크는 특정 업무 분야나 한 가지 기술에 특화되어있다. 따라서 프레임워크는 보통 애플리케이션의 특정 계층에서 동작하는 한 가지 기술 분야에 집중되는데, 스프링은 이와 다르게 애플리케이션 프레임워크라는 특징을 갖고 있다.

애플리케이션 프레임워크 는 특정 계층이나, 기술, 업무 분야에 국한되지 않은 애플리케이션의 전 영역을 포괄하는 범용적인 프레임워크를 말한다. 애플리케이션 개발의 전 과정을 빠르고 편리하며 효율적으로 진행하는데 일차적인 목표를 둔다. 애플리케이션의 전 영역을 관통하는 일관된 프로그래밍 모델과 핵심 기술을 바탕으로 해서 각 분야의 특성에 맞는 필요를 채워주고 있기 때문에, 애플리케이션을 빠르고 효과적으로 개발할 수 있다.

스프링의 일차적인 존재 목적은, 핵심 기술(IoC/DI, AOP)에 담긴 프로그래밍 모델을 일관되게 적용해서 엔터프라이즈 애플리케이션 전 계층과 전 영역에 전략과 기능을 재공함으로써, 애플리케이션을 편리하게 개발해주는 애플리케이션 프레임워크로 사용되는 것이다.

경량급

스프링이 가볍다고 하는 이유는, 불필요하게 무겁지 않다는 의미이다. 스프링 자체가 아주 가볍다거나, 작은 규모로 이뤄졌다는 의미가 아니다.

기존 EJB가 동작하려면 고가의 느리고 무거운 자바 서버(WAS)가 필요했고, 서버 배치나 설정이 난해하였다.

그에 비해 스프링은 가장 단순한 서버 환경인 톰캣과 제티에서도 완벽하게 동작한다. 단순한 개발툴과 기본적인 개발 환경으로도 엔터프라이즈 개발에서 필요로하는 주요 기능을 갖춘 애플리케이션을 개발하기에 충분하다.

코드는 더 단순하고 개발과정은 편리하면서도, EJB에서조차 불편했던 고급 기능을 더 세련되게 적용할 수 있다.

즉, 경량급이라는 의미는 스프링을 기반으로 제작되는 코드가 기존 EJB나 여타 프레임워크에서 동작하기 위해 만들어진 코드에 비해 상대적으로 작고 단순하다는 뜻이다.

자바 엔터프라이즈 개발을 편하게

스프링은 근본적인 부분에서 엔터프라이즈 개발의 복잡함을 제거해내고 진정으로 개발을 편하게 해주는 해결책을 제시한다.

편리한 애플리케이션 개발이란, 개발자가 복잡하고 실수하기 쉬운 로우레벨 기술에 많은 신경을 쓰지 않으면서도, 애플리케이션의 핵심인 사용자의 요구사항, 즉 비즈니스 로직을 빠르고 효과적으로 구현하는 것이다.

8.2) 스프링의 목적

스프링의 개발 철학과 궁극적인 목표를 구체적으로 정리해보고자 한다.

복잡함을 가중시키는 원인

엔터프라이즈 애플리케이션 개발이 실패하는 주요 원인은 비즈니스 로직의 복잡함과 기술적인 복잡함이다.

비침투적 방식을 통한 효과적인 해결책 - 스프링

어떤 기술을 적용했을 때 그 기술과 관련된 코드나 규약 등이 코드에 등장하는 경우를 침투적인 기술 이라고 한다. 그런데 꼭 필요한 기능을 사용하는 것도 아니면서, 단지 어떤 기술을 바탕으로 만들어진다고 해서 특정 클래스, 인터페이스, API 등의 코드에 마구 등장한다면 그것은 침투적인 기술이 되어 복잡함을 가중시킨다.

반면에 비침투적인 기술 은 기술의 적용 사실이 코드에 직접 반영되지 않는다는 특징이 있다. 애플리케이션 코드 여기저기에 불쑥 등장하거나, 코드의 설계와 구현 방식을 제한하지 않는 다는 것이 비침투적인 기술의 특징이다.

스프링이 성공한 이유 중 하나는 비침투적 기술이기 때문이다. 스프링을 이용하면 기술적임 복잡함과 비즈니스 로직을 다루는 코드를 깔끔하게 분리할 수 있다. 스프링 스스로가 애플리케이션 코드에 불필요하게 나타나지 않도록 하는 것이다.

8.2.3) 복잡함을 상대하는 스프링의 전략

기술적 복잡함을 상대하는 전략

첫 번째 문제 : 기술에 대한 접근 방식이 일관성이 없고, 특정 환경에 종속적이다.

목적이 유사하지만 호환이 안되는 표준, 비표준, 오픈소스, 사용 제품이 제공하는 각기 다른 API를 사용하도록 코드를 일일이 변경해야 하는 번거로움이 생긴다. 이렇게 일관성 없는 기술과 서버 환경의 변화에 대한 스프링의 공략 방법은 바로 서비스 추상화이다.

기술적인 복잡함은 일단 추상화를 통해 로우레벨의 기술 구현 부분과, 기술을 사용하는 인터페이스를 분리하고, 환경과 세부 기술에 독립적인 접근 인터페이스를 제공하는 것이 가장 좋은 해결책이다.

핵심 도구 : 객체지향과 DI

기술과 비즈니스 로직의 복잡함을 해결하는 데 스프링이 공통적으로 사용하는 도구는 객체지향 이다.

기술적인 복잡함을 효과적으로 다루게 해주는 모두 DI를 바탕으로 한다. 서비스 추상화, 템플릿/콜백, AOP와 같은 스프링 기술은 DI 없이 존재할 수 없다.

또한 DI는 객체지향 설계 기술이 없이는 그 존재 의미가 없다. DI란 특별한 기술이라기 보단, 유연하게 확장할 수 있는 오브젝트 설계를 하다 보면 자연스레 적용할 수 있는 객체지향 프로그래밍 기법 일 뿐이다. 스프링은 단지 그 것을 좀 더 편하고 쉽게 사용할 수 있도록 도와주는 것이다. DI는 자연스럽게 객체지향적인 설계와 개발로 이끌어주는 좋은 동반자이다.

좋은 DI는 좋은 오브젝트 설계의 결과물이기도 하지만, 반대로 DI를 열심히 적용하다 보면 객체지향 설계의 원칙을 잘 따르고, 그 장점을 살린 설계가 나올 수 있다. 그런 면에서 객체지향과 DI는 서로 떼고 생까할 수 없다.

기술적인 복잡함을 해결하는데 DI가 사용된다고 한다면, 비즈니스 로직 자체의 복잡함을 해결하려면 DI 보다는 객체지향 설계 기법이 더 중요하다.

순수한 비즈니스 로직만을 담고 있는 코드에는 객체지향의 분석과 설계에서 나온 도메인 모델을 쉽게 적용할 수 있기 때문이다. 객체지향적인 특성을 잘 살린 설계는 상속과 다형성, 위임을 포함하여 많은 객체지향 디자인 패턴과 설계 기법이 잘 녹아들어갈 수 있다.

결국, 모든 스프링의 기술과 전략은 객체지향이라는 자바 언어가 가진 강력한 도구를 극대화하여 사용하도록 돕는 것이다.

Profile picture

2yeseul

트리플에서 백엔드 개발을 맡고 있습니다. 무한 삽질을 기록합니다. ⚒️