본문으로 바로가기

스프링의 특징과 의존성 주입

크게 살펴볼내용 3가지 

1 - java관련 프레임워크들이 추구했던 목표 

2 - 스프링 프레임워크가 살아남는 이유

3 - 스프링의 가장 중요한 특징으로 말하는 '의존성 주입'


1)스프링 프레임워크의 간략한 역사 


스프링이 인기는 프레임워크가 된이유 

프레임워크는 말그대로 '뼈대나 근간을 이루는 코드들의 묶음'이라고함. 그럼 빼대가 왜 필요할까?  

개발자는 각개개인의 능력이 크기때문에 크로젝트결과 차이역시 크다.프레임워크는 이러한 상황을 극복하기 위한 코드의결과 물이라 할 수 있다. 프레임 워크를 사용한다는 것은 프로그램의 기본흐름이나 구조를 정하고 ,모든 팀원이  이 구조에 코드를 추가하는 방식으로 개발하게 된다.

 최대의 장점 =  개발에 필요한 구조를 이미 코드로 만들어 놨기 때문에 필요한 부분을 조립하는 형태의 개발이 가능하다.

회사는 일정한 품질을 보장되는 결과물을 얻고 ,필요 코드 부분만 추가하크로 시간을 단축시킬수 있습니다 


2000년 초반 엔터프라이즈급 개발은 안정된 품질의 개발이 절실 했고 프레임워크의 전성시대가 열리게되고 ,스프링은 시작은 늦었지만 가장 성공적인 '경량 (light-weight)프레임워크'입니다.

 (light-weight Framework=기능을 위주로 간단한 jar파일 등을 이용해서 모든 개발이 가능하도록 구성된 프레임워크.


스프링과 다른 프레임워크의 차별성 


■복잡함에 반기를 드어서 만들어진 프레임워크

-하나의 기능을 위해서 많은 구조가 필요한 상태 또는 복잡성을 보이는 해결해주는 경량화된 프레임워크 스프링 .

java의 클래스와 인터페이스를 이용하는 구조여서 진임 장벽이 높지않고 ,가볍다 .


■프로젝트의 전체 구조를 설계할 때 유용한 프레임워크

-어느 한부야 집중하지 않고 , 전체를 설계하는 용도로 사용될 수 있다.web이라는 제한된 영역에서 많이 사용되지만 

OOP구조를 뒷 받침하고 구조를 설계하는 사상이다 . 


■다른 프레임워크들의 포옹

-전체구조에 집중했기 때문에 특정한 영역의 프레임워크와 공존 하는 방식으로 사용할 수 있다.

다른 프레임워크들과 통합을 지원했기 때문에 최소한의 수정이 가능하고 ,최대 장점 기본 뼈대를 흔든지않고 여러종류의 프레임워크를 혼용해서 사용가능.


■개발 생산성과 개발도구의 지원

-이론적으로는 개발자가 제대로 이햏해야하는 부분이 많았지만 ,코드의 양을 줄일 수 있고 ,유지보수가 유용하다 

플러그인의 지원역시 빠른 업데이트가 되었기 때문에  새로운 개발 도구 적응이 없다 .


위에것과 참고 그냥 읽어보세요 

Spring 2.5 버전 : 어노테이션 을 활용하는 설정을 도입하면서 편리한 설정과 개발이 가능하도록 지원

Spring 3.0 버전 : 별도의 설정  없어도 java클래스만으로 설정파일을 대신할 수 있게 지원

Spring 4.0 버전 : 모바일 환경과 웹 환경에서 많이  사용되는 REST방식 컨트롤러 지원

Spring 5.0 버전 : Reactor를 이용한 Reactive 스타일의 개발 환경 지원 


2)스프링의 주요 특징 

1-POJO 기반의 구성 

2-의존성 주입(DI)을 통한 객체 간의 관계구성 

3-AOP(Aspect-Oriented-Programming)지원 

4-편리한 MVC구조 

5-WAS의 종송적이지 않은 개발환경 



POJO 기반의 구성 

-성격이 가벼운 프레임워크지만 ,그 내부에는 객체간의 관계를 구성할 수 있는 특성이 있음.이 관계 구성할 때 API 등 필요없이 POJO(Plain Old Java Object)의 구성 만으로 제작이 가능하게 만들어짐.일반 적인 java코드를 이용해서 객체를 구성하는 방식을 그대로 

스프링에서 사용할 수 있다는것.(java를 좀더 있어보이게)

이것이 중요한 이유 =코드를 개발할 때 개발자가 특정한 라이브러리나 컨테이너의 기술에 종속적이지 않다는 것을 의미하기 때문. 생산성에서 유리하고 ,코드 테스트작업 또한 좀더 유연하게 할 수 있다.


■의존성 주입(DI)과 스프링

-스프링에 빠지면 안되는 '의존성 주입'


의존성(Dependency)이란 = 하난의 객체가  다른 객체없이 제대로 된 역할을 할 수 없다는 것을 의미 .

음식점을 예로들면 서빙하는 담당 직원이 갑자기 못나와도 장사는 할수 있지만 주방장이 빠지게 되면 장사를 할 수없다 

하나의 객체가 다른 객체가 다른 객체의 상태에 따라 영향을 받는 것을 의미한다 .흔히 A객체가 B객체없이 동작이 불가능한 상황을 'A가 B에 의존적이다 ' 라고 한다.


-주입(Injection)이란 =  말그대로 외부에서 "밀어넣는  것"을 의미합니다.외부에서 주입하는 것과 그렇지 않는 것.

예시 음식점의 재료   -어떤 음식점은 매일 가게를 열기전에 직접 식재료를 위해 시장을 가지만   

         -프랜차이즈 식당들은 본사가 트럭을 이용해서 식재료를 공급한다 

이두가지방법은 필요한 객체를 구하기위해 주체가 능동적인지 수동적인지 대한문제.


의존성과 주입을 결합하면'어떤 객체가 필요한 객체를 외부에서 밀어넣는다.'는 것을 의미.


-왜 외부에서 객체를 주입하는 방식을 사용할까?

음식점을 계속 예로들어보자 직접 재료를 사지않는 대해업체에서 배송해 주는 것을 사용하는 경우 장점은 '편리하다!','장사에 집중할 수 있다'이를 코드에 대입해서 살펴보면  '주입받는 입장에서는 어떤 객체인지 신경 쓸 필요가 없다.','언떤 객체에 의존하든 자신의 역할은 변하지 않는다'와 같은 의미로 볼 수 있다.


-그림으로 표현-

1 번                                                                                    2번                                                   



'의존성 주입'  방식을  사용하려면 2번 도형처럼 추가적인 하나의 존재가 필요하게 된다. 이 존재는 의존성이 필요한 객체에 필요한 객체를 찾아서 

'주입'하는 역할을 한다.이러한 적합한 구조로 설계된 것이 '스프링'이다.


'ApplicationContext' 존재가 필요한 객체들을 생성,주입하는 역할을 하는 구조 .따라서 스프링을 이용하면 객체와 객체를 분리해서 생성하고 ,이러한 객체들을 엮는(wiring) 작업을 하는 형태의 개발을 하게 된다.

ApplicationContext가 관리하는 객체들=빈(bean)이라부름 빈과 빈 사이의 의존관계를 처리하는 방식으로 xml설정 ,어노테이션 설정 ,JAVA설정 방식을 이용이 가능. 


■AOP의 지원

-좋은 개발환경의 중요 원칙 =개발자가 비즈니스 로직에만 집중할 수 있게 하는것 .

이 목표를 이루기위한 몇가지  원칙  

'반복적인 코드 제거'=스프링은 반복적인 코드를 줄여주고, 핵심 비즈니스 로직에만 집중할 수 있는 방법을 제공함.

반드시 처리가 필용한 부분=횡단 관심사 (cross-concern) 스프링은 횡단 관심사를 분리해서 제작하는 것이 가능 .

AOP는 이러한 횡단 관심사를 모듈로 분리하는 프로그램밍의 패러다임 .


스프링은 AOP를 Aspect의 문법을 통해서 작성할 수 있다 .

이를통해 얻는것!

1)핵심 비즈니스 로직에만 집중해서 코드개발 할 수있게됨.

2)각 프로젝트 마다 다른 관심사를 적용할 때 코드의 수정을 최소화할 수 있다.

3)원하는 관심사의 유지보수가 수월한 코드를 구성할 수 있다.


■Ioc(Inversion of Controller,제어의 역전)=객체에 대한 제어권 

-기존에는 개발자에게 제어권이 있었다.(new 연산자오 객체생성)

-객체의 제어권을 스프링에게 넘김 (개발자에게 편리함을 제공,코드의 최소화)

-인스터스의 라이프 사이클(생성->소멸)을 개발자가아닌 스프링 컨테이너가 담당


■트렉잭션의 지원

-데이터베이스 이용시 하나의 업무를 여러 작업으로 이루어지는 경우의 트랜잭션 이다. 상황에 따라 복잡한 구성일 수 도 있고 아닐 수 도 있다 이러한 상황은 개발자에게 피곤한 일이 된다.but 스프링은 트랜잭션 관리를 어노텐션이나 xml로 설정할 수 있어서 매번 상황에 맞는 코드를 작성할 필요가 없도록 설계되어있다 .