Framework란 엔터프라이즈 급 애플리케이션을 만들기 위한 모든 기능을 종합적으로 제공하는 경량화된 솔루션이다.
Spring Framework란 자바로 엔터프라이즈 애플리케이션을 만들 때 포괄적으로 사용하는 프로그래밍 및 컨피그레이션 모델을 제공해 주는 Framework이다.
아래는 Spring 삼각형이다. 이를 통해 Spring Framework의 구조를 파악해보자.
- POJO(Plain Old Java Object)
객체지향적인 원리에 충실하면서, 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트이다.
- PSA(Portable Service Abstraction)
환경의 변화와 관계없이 일관된 방식의 기술로의 접근 환경을 제공하는 추상화 구조이다.
즉, 잘 만든 인터페이스를 의미한다.
- IoC(Inversion of Control) / DI(Dependency Injection)
IoC란 객체 간의 관계가 느슨하게 연결됨을 의미한다. 이를 구현하는 방법 중 하나가 DI 이다.
- AOP(Aspect-Oriented Programming)
OOP를 돕는 보조적인 기술로, 기능 분리의 문제를 해결하기 위해 만들어진 프로그래밍 패러다임이다.
Spring Framework의 모듈은 아래와 같다.
각 모듈의 설명은 아래와 같다.
※ Framework와 Library의 차이는 아래와 같다.
Framework는 프레임워크가 제어권을 가지지만, Library는 개발자가 제어권을 가진다.
IoC란 객체 간의 관계가 느슨하게 연결됨을 의미한다.
IoC의 유형은 아래와 같다. 하나씩 살펴보자.
- Dependency Lookup
컨테이너가 lookup context를 통해서 필요한 자원이나 오브젝트를 얻는 방식이다.
그 중 대표적인 방식이 JNDI이다.
- Dependency Injection
Object에 lookup 코드를 사용하지 않고 컨테이너가 직접 의존 구조를 Object에 설정한다.
setter 삽입, 생성자 삽입, 함수 삽입 방식이 존재한다.
IoC를 지원하는 데 컨테이너가 반드시 필요하다. 컨테이너의 정의는 아래와 같다.
객체의 생성, 사용, 소멸에 해당하는 생명주기를 관리하는 컴포넌트이다.
그 중 Spring DI 컨테이너는 빈이라는 객체의 생명주기를 관리한다. 그래서 빈팩토리라고도 한다. 빈팩토리에 여러 가지 컨테이너 기능을 추가하여 ApplicationContext라고 한다.
자세한 내용은 아래 그림을 참고하자.
빈팩토리와 ApplicationContext의 상속 관계는 아래와 같다.
스프링에서 빈에 대한 설정은 생성범위, 아이디 등 다양하다.
스프링에서 빈에 대한 설정은 3가지 방법으로 가능하다.
- XML 문서
- Annotation
- Java 코드
하나씩 살펴보자.
App에서 사용할 Spring 자원들을 설정하는 파일이 XML 문서이다.
Root tag는 <beans>이며 파일명은 상관없으나 applicationContext.xml을 권장한다.
아래 사진을 참고하자.
빈 객체 생성 및 주입은 <bean> 태그를 통해 이루어진다. 아래 사진을 참고하자.
기본 속성의 의미는 아래와 같다.
name : 주입 받을 곳에서 호출할 이름 설정
id : 주입 받을 곳에서 호출할 유일한 이름 설정
class : 주입할 객체의 클래스
scope : 생성 범위 설정. 기본값은 singleton
scope의 종류는 아래와 같다.
설정한 빈을 java 파일에서 가져오는 방법은 아래와 같다.
스프링 빈의 의존 관계를 설정할 땐 2가지 방법을 사용한다.
첫번째 방법은 생성자를 통해 의존 관계를 설정하는 방법이다. 아래 예시를 살펴보자.
만약 위와 같은 클래스를 bean으로 설정한다고 생각해보자. 그러면 아래와 같이 bean을 생성한다.
순서를 생각하지 않으려면 type, index, name 등으로 유일하게 구분해줘야 한다.
그 방법은 아래와 같다.
만약 주입 받는 매개변수가 참조형일 경우 아래와 같이 설정한다.
이때, PlayerService가 playerDao에 의존된다고 정의한다.
두번째 방법은 속성을 통해 의존 관계를 설정하는 방법이다. 아래 예시를 살펴보자.
아래는 Player 클래스의 setter이다. 이 때, setter 이름을 property에서 name으로 사용한다.
아래 예시를 살펴보자.
만약 주입 받는 매개변수가 참조형일 경우 아래와 같이 설정한다.
이 때는 bean의 id 값을 ref의 값으로 넣는다.
List, Set 등 Collection 계열은 각각의 주입 방식이 존재한다. 하나씩 살펴보자.
- List
- Set
- Map
- Properties
생성자나 setter가 아닌 Annotation으로 빈에 대한 설정을 할 수 있다.
빈의 특성이나 종류를 나타내는 Annotation을 Stereotype Annotation이라 한다.
이를 통해 빈을 자동등록할 수 있다. 자세한 내용은 아래와 같다.
DI를 설정하는 Annotation은 @Autowired, @Resource, @Inject 등이 있다.
자세한 내용은 아래와 같다.
@Autowired의 사용 예시는 아래와 같다.
- 멤버변수 사용 예시
- 생성자 사용 예시
- 일반메서드 사용 예시
Qualifier는 동일 타입의 빈이 여러 개일 경우 이름을 주어 구분할 수 있게 한다.