1. POJO 기반의 구성
스프링은 다른 프레임워크들과 달리 관계를 구성할 때 별도의 API을 사용하지 않는 POJO의 구성만으로 가능하도록 제작되어있음
이것이 중요한 이유는 코드를 개발할 때 개발자가 특정한 라이브러리나 컨테이너의 기술에 종속적이지 않다는 것을 의미함
개발자는 가장 일반적인 형태로 코드를 작성하고, 실행할 수 있기 때문에 생산성에서도 유리하고, 코드에 대한 테스트 작업 역시 좀 더 유연하게 할 수있다는 장점이 생김
2. 의존성 주입(DI)를 통한 객체 간의 관계 구성
"제어의 역행"
메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미
개발자는 필요한 부분을 개발해서 '끼워 넣기'의 형태로 개발하고, 실행하면 됨
제어의 역전은 스프링에서만 있는 개념일까?
=> 제어의 역전개념은 사실 이미 폭넓게 적용되어 있다. 서블릿을 생각해보면 일반적인 자바 프로그램은 main() 메소드에서 시작해서 개발자가 미리 정한 순서를 따라 오브젝트가 생성되고 실행된다. 그런데 서블릿은 개발해서 서버에 배포할 수는 있지만, 그 실행을 개발자가 직접 제어할 수 있는 방법은 없다. 서빌릿 안에 main()메소드가 있어서 직접 실행시킬 수 있는 것도 아니다. 대신, 서블릿에 대한 제어 권한을 가진 컨테이너가 적절한 시점에 서블릿 클래스의 오브젝트를 만들고 그 안의 메소드를 호출 한다. 이렇게 서블릿이나 JSP, EJB처럼 컨테이너 안에서 동작하는 구조는 간단한 방식이긴 하지만 제어의 역전 개념이 적용되어 있다고 볼 수있다.
=> 템플릿메소드는 제어의 역전이라는 개념을 활용해 문제를 해결하는 디자인 패턴이라고 볼 수 있다.
"의존성 주입"
의존성 주입은 제어의 역행이 일어날 때 스프링이 내부에 있는 객체(빈)들 간의 관계를 관리할 때 사용하는 기법
의존성(dependency)라는 용어는 어떤 객체가 혼자 일을 처리할 수 없다는 것을 의미
만일 어떤 객체 A가 다른 객체 B의 도움을 받아야만 온전히 일을 처리할 수 있을 때 'A는 B에 의존적이다.'라고 표현
Java에서는 일반적으로 인터페이스를 이용해서 이런 의존적인 객체 관계를 최대한 유연하게 처리할 수 있도록 노력
예)
UserDao가 ConnectionMaker를 사용(의존), DConnectionMaker는 ConnectionMaker를 구현한 구현체
DConnectionMaker가 바뀌어도 UserDao에게는 영향이 없음
=> 인터페이스에 대해서만 의존관계를 만들어두면 인터페이스 구현 클래스와의 관계는 느슨해지면서 변화에 영향을 덜 받는 상태가 됨(결합도가 낮다)
의존성 주입의 종류
- 생성자를 통한 주입
- Set 메소드를 이용한 주입
"개발자가 비즈니스 로직에만 집중할 수 있게 한다"
=> 반복적인 코드의 제거
대부분의 시스템이 공통으로 가지는 보안이나 로그, 트랜잭션과 같이 비즈니스 로직은 아니지만, 반드시 처리가 필요한 부분을 스프링에서는 '횡단 관심사(cross-concern)'이라고 하며, 스프링은 이러한 횡단 관심사를 분리해서 제작하는 것이 가능(AOP 모듈로 분리하는 프로그래밍 패러다임)
- 비즈니스 로직에만 집중
- 각 프로젝트마다 다른 관심사를 적용할 때 코드의 수정을 최소화
- 원하는 관심사의 유지보수가 수월한 코드를 구성
스프링은 트랜잭션 관리를 어노테이션이나 XML로 설정할 수 있기 때문에 개발자가 매번 상황에 맞는 코드를 작성할 필요가 없도록 설계
'프로그래밍 노트 > SPRING' 카테고리의 다른 글
[Spring] IoC(InversionOfControl) 컨테이너 2 (0) | 2018.08.08 |
---|---|
[Spring] IoC(InversionOfControl) 컨테이너 1 (0) | 2018.08.08 |
[Spring] Spring AOP(Aspect Oriented Programming)1 (0) | 2018.07.01 |
[Spring] 필터(filter)와 인터셉터(interceptor)의 차이 (0) | 2018.06.29 |
[Spring] 스프링 @(어노테이션) 종류 (0) | 2018.02.26 |