스프링 프레임워크(Spring Framework)에 대한 간단한 소개
이번 포스팅에서는 스프링 프레임워크가 현재와 같이 많은 인기를 얻게 된 이유와 중요한 특징들에 대해 간단하게 알아보겠습니다.
1. 스프링 프레임워크가 개발의 대세가 된 이유
프레임워크(Framework)는 말 그대로 뼈대나 근간을 이루는 코드들의 묶음이라고 볼 수 있습니다. 여기서 우리는 프레임워크가 왜 필요한지에 대해 생각해볼 필요가 있습니다.
개발자는 개개인의 능력 차이가 큰 직종인데 이러한 개발자들이 모여서 만들어내는 프로젝트의 결과 역시 차이가 클 수밖에 없습니다. 따라서 프레임워크는 이러한 상황을 극복하기 위해 만들어졌으며, 프레임워크는 프로그램의 기본 흐름이나 구조를 정하고 모든 팀원이 이 구조에 자신의 코드를 추가하는 방식으로 개발이 이루어지도록 해줍니다. 즉, 개발의 기본이 되는 공통적인 흐름과 구조를 정한 틀안에서 개발을 할 수 있도록 해줍니다.
프레임워크의 최대 장점은 개발에 필요한 구조를 이미 코드로 만들어 놓았기 때문에 실력이 다소 부족한 개발자라고 하더라도 절반 정도는 완성한 상태에서 필요한 부분만 조립하는 형태로 개발이 가능하다는 점입니다. 프레임워크를 사용하면 회사 입장에서는 일정한 품질이 보장되는 결과를 얻을 수 있고 개발자 입장에서는 완성된 구조에 자신이 맡은 코드를 개발해서 추가하는 형태이므로 개발 시간을 단축하는 장점을 보장받을 수 있습니다.
2000년대 초반부터 시작된 엔터프라이즈급의 개발은 안정된 품질의 개발을 절실하게 필요로 했고 그 결과 많은 프레임워크가 탄생하였습니다. 스프링은 비교적 시작이 늦은 프레임워크였지만 가장 성공적인 경량 프레임워크로 널리 사용되고 있습니다.
※ 경량 프레임워크 (light-weight framework)
90년대 말에 복잡한 구동 환경과 하드웨어적인 구성이 필요한 프레임워크에 반대되는 개념으로 등장했습니다. 이전의 J2EE 기술은 너무나 복잡하고 방대하여 전체를 이해하고 개발하기엔 어려운 점이 많다고 판단하였고, 이러한 문제를 해결하기 위해 특정 기능을 위주로 간단한 jar 파일 등을 이용하여 모든 개발이 가능하도록 구성된 프레임워크를 의미합니다.
스프링이 다른 프레임워크들과 비교하여 갖는 차별성은 다음과 같습니다.
1. 복잡함에 반기를 들어서 만들어진 프레임워크
- 엔터프라이즈급의 시스템이 실패하는 이유를 '복잡성'으로 보고 이를 해결하기 위해 나온 경량화된 프레임워크
- 일반적인 Java 클래스와 인터페이스를 이용하는 구조를 사용하고 EJB에 비해 가벼움
- 진입 장벽이 높지 않고 빠른 시간에 엔터프라이즈급의 시스템 구축이 가능
2. 프로젝트 전체 구조 설계에 유용한 프레임워크
- 이전에 다른 프레임워크들은 웹이나 데이터베이스 등의 전문적인 영역에 대해서만 지원하는 경우가 많았음
- 스프링은 어느 한 분야에만 집중하지 않고 전체를 설계하는 용도로 사용 가능
- 제어의 역행(IoC) 개념
3. 다른 프레임워크들의 포용
- 전체 구조에 집중하여 설계되었기 때문에 다른 프레임워크와 공존하는 방식으로 사용 가능
- 다른 프레임워크들과의 통합을 지원하여 최소한의 수정이 가능
- 기본 뼈대를 흔들지 않고 여러 종류의 프레임워크를 혼용해서 사용 가능
4. 개발 생산성과 도구의 지원
- 스프링은 이론적으로 개발자가 이해해야하는 부분이 많지만 결과적으로 코드의 양은 줄어둠
- XML 설정을 이용하여 유지보수가 용이함
- STS, Eclipse, Intellij 등의 플러그인도 지원하여 새로운 개발 도구에 대한 별도의 적응 없이도 개발이 가능
이러한 특징들과 함께 스프링의 버전별 중요한 변화를 정리하면 다음과 같습니다.
- Spring 2.5 에서 애노테이션(Annotation)이 도입되어 편리한 설정과 개발을 지원
- Spring 3.0 에서 별도의 설정 없이도 Java 클래스만으로 설정 파일을 대신할 수 있도록 지원
- Spring 4.0 에서 모바일과 웹 환경에서 많이 사용되는 REST 방식의 Controller 지원
※ REST (Representational State Transfer)
자원(Resource)의 표현(Representation)에 의한 상태를 전달하는 방식. json과 xml을 통해 데이터를 주고받는 것이 일반적이며 웹의 기존 기술과 HTTP 프로토콜을 그대로 사용하여 client와 server 간의 통신을 위해 사용.
2. 스프링의 주요 특징
스프링에는 다음과 같은 주요 특징을 갖고 있습니다.
- POJO(Plain Old Java Object) 기반의 구성
- DI(Dependency Injection, 의존성 주입)을 통한 객체 간의 관계 구성
- AOP(Aspect Oriented Programming) 지원
- 편리한 MVC 구조
- WAS에 독립적인 개발환경
2.1 POJO 기반의 구성
스프링은 내부적으로 객체 간의 관계를 구성할 때 별도의 API 등을 사용하지 않는 POJO(Plain Old Java Object) 만으로 구성이 가능하도록 되어있습니다. 따라서, 일반적인 Java 코드를 이용하여 객체를 구성하는 방식 그대로 스프링에서 사용 가능합니다.
이것은 특정한 라이브러리나 컨테이너에 기술에 종속적이지 않다는 것을 의미합니다. 이로 인하여 개발자는 가장 일반적인 형태로 코드를 작성하고 실행할 수 있기 때문에 높은 생산성과 유연한 테스트를 할 수 있는 장점을 갖게 됩니다.
2.2 DI(Dependency Injection, 의존성 주입)을 통한 객체 간의 관계 구성
스프링은 그 자체가 구조를 설계할 수 있도록 만들어져 있어서 개발자가 부품을 만들어 조립하는 형태의 개발이 가능합니다. 이렇게 조립된 코드의 최종 호출은 개발자가 결정하는 것이 아니라 프레임워크 내부에서 결정된 대로 이루어지게 되는데 이것을 '제어의 역행(IoC, Inversion of Control)' 이라고 합니다.
'의존성 주입(DI, Dependency Injection)' 은 제어의 역행이 일어나는 것을 전제 조건으로 하여 스프링 내부의 객체(스프링에서는 bean이라는 용어로 표현)들 간의 관계를 관리할 때 사용됩니다. 의존성 주입은 말 그대로 특정 객체에 필요한 객체를 외부에서 결정하여 연결시키는 것을 의미합니다. 좀 더 쉽게 설명하면 자바에서 인터페이스를 사용하여 의존적인 관계를 처리하는 것에 비유할 수 있습니다.
의존성 주입의 종류는 '생성자를 통한 주입'과 'set 메서드를 이용한 주입'으로 구분할 수 있으며, 스프링은 두 방식 모두를 지원하고 이에 대한 처리는 간단한 애노테이션으로 대체할 수 있습니다.
스프링의 의존성 주입에 대한 특징을 정리하면 다음과 같습니다.
- 메서드나 객체(bean)의 호출 작업은 제어의 역행(IoC)를 통해 외부에서 이루어짐 (외부는 객체를 기준으로 봤을 때를 의미)
- 제어의 역행(IoC)을 전제 조건으로 의존성 주입(DI)이 일어남
- 의존성을 가진 객체에 대해 스프링에서 의존성 주입(DI)이 발생하도록 함
- 의존성 주입(DI)의 특징으로 인하여 개발자는 POJO 개발이 가능
2.3 AOP(Aspect Oriented Programming, 관점 지향 프로그래밍) 지원
스프링은 AOP를 통해 반복적인 코드를 줄이고 개발자가 핵심 비즈니스 로직에만 집중할 수 있도록 지원합니다.
대부분의 시스템에서 비즈니스 로직은 아니지만 보안, 로그, 트랜잭션과 같이 반드시 처리가 필요한 부분을 스프링에서는 횡단 관심사(cross-concern)라고 합니다. AOP는 이러한 횡단 관심사를 별도 모듈로 분리하는 프로그래밍 패러다임입니다.
스프링의 AOP는 AspectJ 모듈의 문법을 통하여 작성이 가능하고 이를 이용하여 개발자는 중복 코드를 줄이고 핵심 비즈니스 로직에만 집중하며 원하는 관심사의 유지보수가 수월한 코드를 구성할 수 있습니다.
AOP에 대해 좀더 설명하면 다음과 같습니다.
아래는 OOP 에서의 로직의 흐름을 보여줍니다. 각 로직마다 권한, 로깅, 트랜잭션 처리에 대한 코드를 반복적으로 작성해줘야합니다.
위의 경우처럼 권한, 로깅, 트랜잭션을 관심사로 봤을 때 AOP에서는 이러한 관심사를 아래와 같이 모두 종단으로 삽입해줍니다. OOP에서 각 객체별로 처리했던 공통적인 관심을 분리하여 별도의 모듈로 만든 뒤 필요한 시점에 자동으로 소스코드가 삽입되도록 합니다.
2.4 트랜잭션의 지원
데이터베이스를 연동하여 사용할 때 반드시 신경써야하는 부분은 하나의 업무가 여러 작업으로 이루어지는 경우에 대한 트랜잭션 처리입니다. 트랜잭션 처리는 상황에 따라 코드를 이용하여 적용해줘야 하는데 이는 개발자에게 상당히 피곤한 작업입니다.
스프링에서는 이러한 트랜잭션 처리는 애노테이션이나 XML로 설정할 수 있도록 지원해줍니다. 이로 인하여 개발자가 매번 상황에 따라 코드를 작성해줘야 하는 번거로움이 줄어들게 되었습니다.
이상으로 스프링의 주요 특징에 대해서 알아봤습니다.
※ 참고 문헌
구멍가게 코딩단, 『코드로 배우는 스프링 웹 프로젝트』, 남가람북스(2015), p49 ~ p57. Chapter 1-2. 스프링에 대한 간단 소개
addio3305.tistory.com, 스프링(Spring) 개발 - (16) AOP 설정하기 (부제: Controller에도 AOP 적용하기), https://addio3305.tistory.com/86