스프링에 대해 가장 잘 알려진 정의는 '자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크'입니다.
애플리케이션 프레임워크는 특정 계층이나, 기술, 업무 분야에 국한되지 않고 애플리케이션의 전 영역을 포괄하는 범용적인 프레임워크를 말합니다. 애플리케이션 프레임워크는 애플리케이션 개발의 전 과정을 빠르고 편리하며 효율적으로 진행하는 데 일차적인 목표를 두는 프레임워크입니다.
엔터프라이즈 개발을 편하게 하려는 이유는 원래 엔터프라이즈 개발이란 편하지 않기 때문입니다. 자바 엔터프라이즈 시스템 개발이 어려운(편하지 않은) 가장 큰 이유는 근본적인 비즈니스 로직과 엔터프라이즈 기술이라는 두 가지 복잡함이 얽혀 있기 때문입니다.
침투적 vs 비침투적
- 침투적인(invasive) 기술 : 어떤 기술을 적용했을 때 그 기술과 관련된 코드나 규약 등이 코드에 등장하는 경우
- 비침투적인(non-invasive) 기술 : 기술의 적용 사실이 코드에 직접 반영되지 않는 경우
스프링이 성공할 수 있었던 비결은 바로 비침투적인 기술이라는 전략을 택했기 때문입니다. 스프링은 침투적인 기술을 사용한 EJB의 실패를 바탕으로 비침투적인 기술을 이용하여 기술적인 복잡함과 비즈니스 로직을 다루는 코드를 깔끔하게 분리할 수 있게 됐습니다. 중요한 점은 그 과정에서 스프링 스스로가 애플리케이션 코드에 불필요하게 나타나지 않도록 하는 것입니다. 꼭 필요한 것 같은 경우조차도 기술 코드가 직접 노출되지 않도록 만들어줬습니다.
스프링을 적용 근본적인 복잡함의 원인이 사라진 건 아니다. 하지만 스프링을 통해 성격이 다른 복잡함들을 깔끔하게 분리해줬기 때문에 각각을 효과적으로 상대할 수 있는 기반이 마련됐습니다.
기술적인 복잡함
스프링은 엔터프라이즈 기술을 적용했을 경우 발생하는 복잡함을 두 가지로 분류하고 각각에 대한 적절한 대응 방법을 제공합니다.
@기술에 대한 접근 방식이 일관성이 없고, 특정 환경에 종속적인 경우
추상화를 통해 로우레벨의 기술 구현 부분과 기술을 사용하는 인터페이스를 분리하고, 환경과 세부 기술에 독립적인 접근 인터페이스를 제공하는 것이 가장 좋은 해결책입니다.
@기술적인 처리를 담당하는 코드가 성격이 다른 코드에 섞여서 등장하는 경우
트랜잭션, 보안 등 기술과 비즈니스 로직의 섞여 있는 경우에 발생하게 됩니다. 이러한 문제를 해결하기 위한 스프링의 접근 방법이 바로 AOP입니다.
애플리케이션의 주요 기능과 비즈니스 로직에 대한 복잡함
기술적인 코드, 침투적인 기술이 가져온 불필요한 흔적 등을 제거하고나면 순수하게 애플리케이션의 주요 기능과 비즈니스 로직을 담은 코드만 독립적으로 존재하게 됩니다. 이 부분은 업무의 변화에 따라 자주 변경되거나 수정되는 부분이기도 합니다. 따라서 대체로 복잡합니다. 기술적인 부분이나 사용자 인터페이스에 관한 오류가 발생했을 경우에는 시스템을 복구하거나 빠르게 대응해주면 당장에 큰 문제가 발생하지는 않습니다. 반면에 비즈니스 로직을 다루는 핵심 코드에 오류가 있으면 엔터프라이즈 시스템을 사용하는 업무 자체에 큰 지장을 주거나 치명적인 손실을 끼칠 수도 있기 때문에 매우 중요합니다.
비즈니스 로직의 복잡함을 상대하는 전략은 자바라는 객체지향 기술 그 자체입니다. 스프링은 단지 객체지향 언어의 장점을 제대로 살리지 못하게 방해했던 요소를 제거하도록 도와줄 뿐입니다.
기술과 비즈니스 로직의 복잡함을 해결하는데 스프링이 공통적으로 사용하는 도구가 바로 객체지향입니다. 자바의 기본인 객체지향에 충실한 설계가 가능하도록 단순한 오브젝트로 개발할 수 있고, 객체지향의 설계기법을 잘 적용할 수 있는 구조를 만들기 위해 DI 같은 유용한 기술을 편하게 적용하도록 도와주는 것이 스프링의 기본 전략입니다.
기술적인 복잡함을 효과적으로 다루게 해주는 기법은 모두 DI를 바탕으로 하고있습니다. 서비스 추상화, 템플릿/콜백, AOP와 같은 스프링의 기술은 DI없이는 존재할 수 없는 존재입니다.
스프링의 특징
- 경량 컨테이너로서 자바 객체를 직접 관리합니다. 각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있습니다.
- POJO 방식의 프레임워크입니다. 일반적인 J2EE 프레임워크에 비해 구현을 위해 특정한 인터페이스를 구현하거나 상속을 받을 필요가 없어 기존에 존재하는 라이브러리 등을 지원하기에 용이하고 객체가 가볍습니다.
- 제어의 역전(Inversion of Control)을 지원합니다. 개발자에 의해 작성된 코드가 프레임워크에 의해 호출되는 것을 의미합니다.
- 의존성 주입( DI : Dependency Injection)을 지원합니다. 각 계층이나 서비스의 의존성을 외부에서 주입받아 독립적인 개발이 가능하도록 합니다. 객체들의 관계를 설정하는 기법입니다.
- 관점 지향 프로그래밍(AOP : Aspect-Oriented Programming)을 지원합니다. 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 경우 해당 기술을 분리하여 관리할 수 있습니다.
참고자료
- 토비의 스프링 3.1
- 12bme's blog
'Domain > Spring' 카테고리의 다른 글
[Spring] 템플릿-콜백 (0) | 2021.07.23 |
---|---|
[Spring] 관점 지향 프로그래밍 (AOP / Aspect Oriented Programming) (0) | 2021.07.14 |
[Spring] 제어의 역전(IoC / Inversion of Control)과 의존성 주입(DI / Dependency Injection) (0) | 2021.07.14 |
[Spring] 컨테이너( Container / IoC Container / BeanFactory / ApplicationContext ) (0) | 2021.07.13 |
[Spring] POJO ( Spring POJO / Spring Triangle / Plain Old Java Object ) (0) | 2021.07.13 |
댓글