본문 바로가기
WebProgramming/SPRING

spring framework 정리

by Dogf 2019. 4. 30.
반응형

자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크로서 동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공하고 있다. 대한민국 공공기관의 웹 서비스 개발 시 사용을 권장하고 있는 전자정부 표준프레임워크의 기반 기술로서 쓰이고 있다

 

< 스프링의 주요 특징 >

POJO(Plain Old Java Object) 기반의 구성

의존성 주입(DI : Dependency Injection)을 통한 객체 간의 관계 구성

AOP(Aspect-Oriented-Programming) 지원

편리한 MVC 구조

WAS에 종속적이지 않은 개발 환경

 

POJO(Plain Old Java Object) 기반의 구성

스프링의 성격 자체가 가벼운(light-weight) 프레임워크지만, 그 내부에는 객체 간의 관계를 구성할 수 있는 특징을 가지고 있습니다.

스프링은 다른 프레임워크들과 달리 이관계를 구성할 때 별도의 API 등을 사용하지 않는 POJO기반의 구성의 구성만으로도 가능하도록 제작되어 있습니다.

쉽게 말해서 여러분이 일반적인 Java 코드를 이용해서 객체를 구성하는 방식을 그대로 스프링에서 사용할 수 있다는 얘기입니다.

 

개발자가 특정한 라이브러리나 컨테이너 기술에 종속적이지 않다는 것을 의미하기 때문입니다. 개발자는 가장 일반적인 형태로 코드를 작성하고, 실행할 수 있기 때문에 생산성에서도 유리하고, 코드에 대한 테스트 작업 역시 좀 더 유연하게 할 수 있다는 장점이 생깁니다.

 

 

의존성 주입(DI : Dependency Injection)을 통한 객체 간의 관계 구성

스프링 하면 사람들이 가장 먼저 떠올리는 단어가 의존성 주입이라는 용어와 IoC(Inversion Of Control – 제어의 역행)이라는 단어입니다.

제어의 역행이라는 의미는 말 그대로 메서드나 객체의 호출 작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미합니다. 이 방식은 대부분의 프레임워크에서 사용하는 방법으로, 개발자는 필요한 부분을 개발해서 끼워 넣기의 형태로 개발하고 실행하게 됩니다.

 

예를 들어 컴퓨터를 조립한다면 메인보드를 결정하고, 그에 맞는 부품들을 구매하게 됩니다. 각 부품 간의 연결이나 호출은 메인보드에서 컨트롤하기 때문에, 각 부품은 이전과 다음의 관련 부품에 대한 고민 없이 제작이 가능합니다.

 

프레임워크 역시 이러한 구조를 가지기 때문에, 개발자는 프레임워크에 필요한 부품을 개발하고, 조립하는 방식의 개발을 하게 됩니다. 이렇게 조립된 코드의 최종 호출은 개발자에 의해서 이루어지지 않고, 프레임워크의 내부에서 결정된 대로 이루어지게 되는데, 이런 현상을 제어의 역행’이라고 표현합니다.

 

스프링은 그 자체가 구조를 설계할 수 있도록 만들어졌다’는 뜻이므로, 개발자가 부품을 만들어 조립하는 형태의 개발이 가능하다는 것을 의미합니다.

 

의존성 주입’은 제어의 역행이 일어날 때 스프링이 내부에 있는 개체들 간의 관계를 관리할 때 사용하는 기법입니다.

(스프링에서는 빈(Bean)이라는 용어를 사용합니다.)

 

의존성(Dependency)이라는 용어는 어떤 객체가 혼자 일을 처리할 수 없다는 것을 의미합니다.

 

만일 어떤 객체 A가 다른 객체 B의 도움을 받아야만 온전히 일을 처리할 수 있을 때 'A는 B에 의존적이다.'라고 표현합니다. Java에서는 일반적으로 인터페이스를 이용해서 이런 의존적인 객체의 관계를 최대한 유연하게 처리할 수 있도록 노력합니다.

 

의존성 주입은 말 그대로 이런 의존적인 객체를 직접 생성하거나, 제어하는 것이 아니라, 제어의 역행으로 특정 객체에 필요한 객체를 외부에서 결정해서 연결시키는 것을 의미합니다. 외부에서 필요한 객체를 ㄱㄹ정하기 때문에 개발자는 의존적인 객체들과의 관계를 직접 처리할 필요가 없고, 인터페이스를 활용해서 유연한 구조를 사용할 수 있습니다. 

 

스프링은 의존성 주입을 프레임워크에서 처리하기 때문에 개발자는 자신이 만드는 객체나 클래스 외에는 신경 쓰지 않고 코드를 만들고, 자신의 코드에 필요한 객체는 스프링을 통해서 주입받는 구조로 작성됩니다.

 

의존성 주입의 종류는 1) 생성자를 통한 주입과 2) set 메서드를 이용한 주입으로 구분할 수 있습니다.

스프링은 두 방식 모두를 사용할 수 있고, 이에 대한 처리 역시 간단한 애노테이션으로 처리할 수 있습니다.

 

 

 AOP(Aspect-Oriented-Programming) 지원

좋은 개발환경의 중요 원칙은 ''개발자가 비즈니스 로직에만 집중할 수 있게 한다'입니다.

이 목표를 이루기 위해서는 몇 가지 중요한 원칙이 있겠지만, 가장 쉽게 생각할 수 있는 것이 '반복적인 코드의 제거'라고 할 수 있습니다. 스프링은 프레임워크를 이용한 개발에도 이러한 반복적인 코드를 줄이고, 핵심 비즈니스 로직에만 집중할 수 있는 방법을 제공합니다.

 

대부분의 시스템이 공통으로 가지는 보안이나 로그, 트랜잭션과 같이 비즈니스 로직은 아니지만, 반드시 처리가 필요한 부분을 스프링에서는 '횡단 관심사(cross-concern)'라고 하며, 스프링은 이러한 횡단 관심사를 분리해서 제작하는 것이 가능합니다. AOP는 이러한 횡단 관심사를 모듈로 분리하는 프로그래밍의 패러다임입니다.

 

스프링은 AOP를 AspectJ의 문법을 통해서 작성할 수 있는데, 이를 통해서 개발자는 1) 핵심 비즈니스 로직에만 집중해서 코드를 개발할 수 있게 되었고, 2) 각 프로젝트마다 다른 관심사를 적용할 때 코드의 수정을 최소화시킬 수 있었으며, 3) 원하는 관심사의 유지보수가 수월한 코드를 구성할 수 있습니다.

 

트랜잭션의 지원

데이터베이스를 이용할 때 반드시 신경 써야 하는 부분은 하나의 업무가 여러 작업으로 이뤄지는 경우의 트랜잭션 처리입니다. 이 트랜잭션의 처리는 상황에 따라서 복잡하게 구성될 수 도 있고, 아닐 수도 있는데, 그때마다 코드를 이용해서 처리하는 작업은 개발자에게는 상당히 피곤한 일입니다. 스프링은 이런 트랜잭션의 관리를 애노테이션이나 XML로 설정할 수 있기 때문에 개발자가  매번 상황에 맞는 코드를 작성할 필요가 없도록 설계되었습니다.

반응형

댓글