1. Spring이란?

Spring이란 Java 기반의 엔터프라이즈 애플리케이션 개발을 위한 오픈소스 경량급 애플리케이션 프레임워크다.

 

  • 엔터프라이즈 애플리케이션 
    • 엔터프라이즈 애플리케이션은 기업 또는 정부와 같은 환경에서 작동하도록 설계된 대규모 소프트웨어 시스템이다.
      은행 거래 애플리케이션이나 정부24같은 인터넷 행정 처리 웹사이트 등 전산 시스템이라 불리는 것들이 그 예시이다.
  • 오픈소스
    • 소스코드가 공개되어 있고 특별한 비용지불없이 자유롭게 이용가능하다는 뜻이다.
  • 경량급
    • 스프링이 불필요하게 반복되는 코드없이 작성되었다는 의미이다. 스프링 등장 이전의 엔터프라이즈급 프레임워크는 다양한 경우를 처리하기 위해 다양한 기능을 갖도록 만들다 보니 하나의 기능을 위해 너무 많은 구조가 필요하게 되었다. 그러나 스프링은 이러한 복잡성을 해결했다.
  • 애플리케이션 프레임워크
    • 특정 계층이나 기술에 국한되지 않고 애플리케이션 전 영역을 지원하는 프레임워크를 말한다. 일반적으로 다른 프레임워크들은 웹 영역이나 데이터베이스 영역과 같이 특정한 분야에 대해서만 지원했다. 반면 스프링은 프로젝트 전체를 설계하는 용도로 사용할 수 있다.

2. Spring의 주요 특징

- 의존성 주입

'의존성'을 가진다는 것은 A 객체가 동작하기 위해 B 객체를 필요로 한다는 의미이다. 즉, 두 객체가 서로 결합되어 있는 형태이다. 그리고 '의존성 주입'은 필요한 객체를 직접 생성하는 것이 아니라 외부로 부터 제공받는 방식을 말한다.

그렇다면 어떻게 외부로 부터 필요한 객체를 '주입'받는가? 스프링 프레임워크가 이러한 의존성 주입을 지원한다. 스프링은 객체들 간의 의존관계를 파악해서, 스프링이 직접 객체를 생성하고 제공한다. 스프링의 가장 핵심적인 특징이 의존성 주입이다.

필요한 객체를 직접 생성하는 것이 아닌, 외부로부터 객체를 제공받으면 클래스간의 결합도를 낮출 수 있다. 의존 관계에 있는 두 클래스 중 한 클래스가 수정되어도 다른 클래스는 수정할 필요가 없다는 의미다. 즉, 확장성이 높은 유연한 프로그램을 만들 수 있다. 이것이 의존성 주입을 사용하는 이유이다.

- 제어의 역전

제어의 역전이란 객체의 생명주기를 개발자가 아닌 제 3자가 관리하도록 하는 디자인 패턴이다. 스프링 프레임워크에서는 컨테이너가 그 역할을 수행한다.

위에서 언급했듯이 의존성 주입은 필요한 객체를 스프링 프레임워크로부터 제공받는 것이다. 그래서 의존성 주입은 제어의 역전을 달성하기 위한 방법 중 하나이다.

- 관점지향 프로그래밍 지원

관점지향 프로그래밍이란 프로그램의 공통기능과 핵심기능을 분리시키는 것이다. 로그출력 같은 것이 공통기능의 예시이다. 이를 통해 코드 중복을 피하고 유지보수를 용이하게 할 수 있다.

물론 공통기능을 수행하는 클래스를 따로 만들어 공통기능에 대한 메소드를 필요할 때 마다 호출할 수 있지만, 이것이 관점지향 프로그래밍은 아니다. 관점지향 프로그래밍은 핵심 기능을 수행하는 클래스 내에 공통기능과 관련된 코드가 존재하지 않도록 하는 것이 핵심이다.

- MVC 패턴

 

- POJO 기반의 구성

Plain Old Java Object로 직역하면 순수한 자바 객체이다. POJO 기반의 구성이라는 것은 스프링 프레임워크를 이용할 때, 일반적인 Java 언어로 코드를 작성할 수 있다는 의미이다.

이 점이 중요한 이유는 코드가 특정 기술에 종속되면 객체지향의 장점을 잃어버리기 때문이다. 예를 들어 어떤 프레임워크를 사용하기 위해 그 프레임워크가 제공하는 API를 상속, 구현해해야 한다면 코드의 확장성이 떨어진다.

스프링 이전의 프레임워크들은 이러한 문제점을 갖고 있어 개발자가 해당 프레임워크에 종속되었다. 그러나 스프링 프레임워크는 스프링 기술과 관련된 코드가 애플리케이션 코드에 등장하지 않도록 했다.

- 선언적 트랜잭션 지원

트랜잭션이란 데이터베이스의 상태를 변화시키는 하나의 논리적인 단위이다. 예를 들어 그룹웨어에서 쪽지 기능이 처리된다고 하자. 주고 받은 쪽지는 발신자 측의 보낸 쪽지함에, 수신자 측의 받은 편지함에 동시에 저장되어야 한다. 이 중 어느 한 과정이라도 실패한다면 쪽지 기능이 성공적으로 수행됬다고 할 수 없다. 이처럼 트랜잭션은 여러 번의 데이터베이스 액세스 작업이 묶여있는 논리적인 단위이다.

서비스 클래스의 메서드에는 여러 번의 데이터 베이스 액세스 작업이 포함되어 있는데, 이 중 하나의 작업이라도 실패한다면 나머지 작업도 취소되어야 한다. 그런데 스프링 프레임워크를 사용하면 트랜잭션 처리를 어노테이션이나 xml파일의 설정을 통해 할 수 있다. 개발자가 트랜잭션을 위한 코드를 작성할 필요가 없다는 말이다. 그리고 이러한 방법을 '선언적 트랜잭션'이라고 한다.

 


3. 라이브러리 vs 프레임워크

 라이브러리는 개발에 필요한(자주 사용되는) 기능의 구현체다. 개발자는 필요한 기능이 구현되어 있는 라이브러리를 다운받아서 그 라이브러리의 기능을 사용한다. 반면, 프레임워크는 프로그램의 뼈대나 근간을 이루는 코드들의 묶음이다. 달리 말해, 개발 방식 혹은 개발 패턴의 구현체다. 개발자는 해당 프레임워크가 제시하는 방식에 맞게 클래스나 인터페이스, 환경설정 정보를 구성하면 프레임워크가 지원하는 기능을 제공받을 수 있다.

 

 즉, 라이브러리와 프레임워크의 주요한 차이점은 '누가 제어를 하느냐'이다. 개발자는 라이브러리를 '직접' 호출해서 사용하고, 개발자가 작성한 애플리케이션 코드는 프레임워크에 의해 사용된다. 프레임워크의 경우 처럼 프로그램의 흐름이 개발자가 아닌 제 3자에게 넘어간 것을 '제어의 반전'이라고 하는데, 이 역시 Spring에 반영되어 있다.

+ Recent posts