✔Spring
1. Spring Framework
- 엔터프라이즈 급 애플리케이션을 만들기 위한 모든 기능을 종합적으로 제공하는 경량화된 솔루션.
- JEE(Java Enterprise Edition)가 제공하는 다수의 기능 지원. JEE를 대체하는 Framework로 자리잡고 있음.
- JEE가 제공하는 기능 뿐 아니라, DI(Dependencty Injection), AOP(Aspect Oriented Programming)과 같은 기능 지원.
- Programming 및 Configuration Model을 제공해 주는 Framework.
- Low Levle에 신경 쓰지 않고 Business Logic 개발에 전념할 수 있도록 해줌.
2. Spring 구조.
◾Spring 삼각형
- Enterprise Application 개발시 복잡함을 해결하는 spring의 핵심.
◾ POJO(Plain Old Java Object)
- 특정 환경이나 기술에 종속적이지 않은 객체지향 원리에 충실한 자바 객체.
- 테스트하기 용이. 객체지향 설계를 자유롭게 적용 가능.
◾ PSA(Portable Service Abstraction)
- 환경과 세부 기술의 변경과 관계없이 일관된 방식으로 기술에 접근할 수 있게 해주는 설계 원칙.
- 트랜잭션 추상화. OXM 추상화, 데이터 액세스의 Exception 변환 기능... 등 기술적인 복잡함은 추상화를 통해 Low Level의 기술 구현 부분과 기술을 사용하는 인터페이스로 분리.
- 예) 데이터베이스에 관계없이 동일하게 적용할 수 있는 트랜잭션 처리 방식.
◾ IoC/DI(Dependency Injection)
- DI는 유연하게 확장 가능한 객체를 만들어 두고 객체 간의 의존관계를 외부에서 다이나믹하게 설정.
◾ AOP(Aspect Oriented Programming)
- 관심사의 분리를 통해서 소프트웨어의 모듈성 향상.
- 공통 모듈을 여러 코드에 쉽게 적용 가능.
3. Spring 특징.
◾ 경량 컨테이너
- 스프링 : 자바 객체를 담고 있는 컨테이너.
- 자바 객체 생성과 소멸과 같은 라이프 사이클을 관리.
- 언제나 스프링 컨테이너로부터 필요한 객체를 가져와 사용가능.
◾ DI(Dependency Injection-의존성 지원) 패턴 지원.
- 설정 ㄹ파일이나, 어노테이션을 통해 객체 간의 의존 관계 설정 가능.
- 의존한고 있는 객체를 직접 생성하거나 검색할 필요가 없음.
◾ AOP(Aspect Oriented Programming-관점 지향 프로그래밍) 원
- AOP : 문제를 바라보는 관점을 기준으로 프로그래밍하는 기법.
- 핵심 관심 사항과 전체에 적용되는 공통관심 사항을 기준으로 프로그래밍 함으로서 공통 모듈을 여러 코드에 쉽게 적용할 수 있도록 지원.
- 자체적으로 프록시 기반의 AOP 지원. 트랜잭션, 로깅, 보안과 같이 여러 모듈에서 공통으로 필요로 하지만 실제 모듈의 핵심이 아닌 기능들을 분리하여 각 모듈에 적용 가능.
◾ POJO(Plain Old Java Object) 지원.
- 특정 인터페이스를 구현하거나 또는 클래스를 상속하지 않는 일반 자바 객체 지원.
- 스프링 컨테이너에 저장되는 자바 객체는 특정한 인터페이스를 구현하거나, 클래스 상속 없이도 사용 가능.
- 일반적인 자바 객체를 칭하기 위한 별칭 개념.
◾Ioc(Inversion of Control-제어의 반전)
- 자바의 객체 생성 및 의존 관계에 있어 모든 제어권은 개발자에게 있음.
- Servlet과 EJB가 나타나면서 기존의 제어권이 Servlet Container 및 EJB Container에 넘겨짐.
- 단, 모든 객체의 권한이 넘겨진것이 아니고 Servlet, EJB에 대한 제어권을 제외한 나머지 객체 제어권은 개발자가 담당.
- 스프링에서도 객체에 대한 생성과 생명 주기를 관리할 수 있는 기능 제공.
- 이런 이유로 Spring Container또는 IoC Container라고 부름.
◾ 트랜잭션 처리를 위한 일관된 방법 제공.
- JDBC, JTA 또는 컨테이너가 제공하는 트랜잭션을 사용하든, 설정 파일을 통해 트랜잭션 관련 정보를 입력하기 때문에 트랜잭션 구현에 상관없이 동일한 코드를 여러 환경에서 사용 가능.
◾ 영속성과 관련된 다양한 API 지원.
- JDBC를 비롯하여 iBatis, MyBatis, Hibernate, JPA 등 DB 처리를 위해 널리 사용되는 라이브러리와 연동 지원.
◾ 다양한 API에 대한 연동 지원.
- JMS, 메일, 스케쥴링 등 엔터프라이즈 어플리케이션 개발에 필요한 다양한 API를 설정 파일과 어노테이션을 통해 손쉽게 사용 가능.
5. Spring Module
✔IoC & Container
1. IoC(Inversion of Control, 제어의 반전)
◾ IoC
- IoC/DI
- 객체 지향 언어에서 Object 간의 연결 관계를 런타임에 결정.
- 객체 간의 느슨하게 연결됨(loose coupling)
- IoC의 구현 방법 중 하나가
DI(Dependency Injection)
◾ IoC 유형
- Dependency Lookup
- 컨테이너가 lookup context를 통해 필요한 Resource나 Object를 얻는 방식.
- JNDI 이외의 방법을 사용한다면 JNDI 관련 코드를 오브젝트 내에서 일일이 변경해주어야 함.
- Lookup 한 Object를 필요한 타입으로 Casting해야함.
- Naming Exceptiond을 처리하기 위한 로직 필요.
- Dependency Injection
- Object에 lookup 코드를 사용하지 않고 컨테이너가 직접 의존 구조를 Object에 설정할 수 있도록 지정해주는 방식.
- Object가 컨테이너의 존재 여부를 알 필요가 없음.
- Lookup 관련된 코드들이 Object 내에서 사라짐.
- Setter Injection과 Constructor Inject.
2. Container
◾ Container
- 객체의 생성, 사용, 소멸에 해당하는 라이프사이클 담당.
- 라이프사이클을 기본으로 애플리케이션 사용에 필요한 주요 기능 제공.
◾ Container 기능
- 라이프사이클 관리.
- Dependency 객체 제공.
- Thread 관리.
- 기타 애플리케이션 실행에 필요한 환경.
◾ Container 필요성
- 비즈니스 로직 외에 부가적인 기능들에 대해 독립적으로 관리되도록 하기 위함.
- 서비스 look up이나 Configuration에 대한 일관성을 위함.
- 서비스 객체를 사용하기 위해 각각 Factory 또는 Singleton 패턴을 직접 구현하지 않아도 됨.
◾ Container - IoC Container
- 오브젝트의 생성, 관계설정, 사용, 제거 등의 작업을 애플리케이션 코드 대신 독립된 컨테이너가 담당.
- 컨테이너가 코드 대신 오브젝트에 대한 제어권을 갖고 있어 IoC라고 부름.
- 스프링 컨테이너를 IoC 컨테이너라고 부름.
- 스프링에서 IoC를 담당하는 컨테이너에는 BeanFactory, ApplicationContext가 있음.
◾ Container - Spring DI Container
- Spring DI Container가 관리하는 객체를 빈(Bean)이라 하고, 이 빈들은 생명주기를 관리하는 의미로 빈팩토리(BeanFactory)라 한다.
- Bean Factory에 여러 가지 컨테이너 기능을 추가하여 ApplicationContext라 함.
- <<interface>> BeanFactory
- Bean 등록, 생성, 조회, 반환 관리.
- 일반적으로 BeanFactory보다 이를 확장한 ApplicationContext를 사용.
- getBean() method가 정의되어 있음.
- <<interface>> ApplicationContext
- Bean 등록, 생성, 조회, 반환 관리는 BeanFactory와 동일.
- Spring의 각종 부가 서비스 추가 제공.
3. IoC 개념.
◾ IoC 개념
- 객체 제어 방식
- 기존 : 필요한 위치에서 개발자가 필요한 객체 생성 로직 구현.
- IoC : 객체 생성을 Container에 위임하여 처리.
- IoC 사용에 따른 장점 : 객체 간의 결합도를 떨어트릴 수 있음(loose coupling)
- 결합도가 높으면 유지보수에 클래스와 결합된 다른 클래스도 유지보수 되어야할 가능성이 높음.
◾ 객체 간의 강한 결합
- 클래스 호출 방식.
- 클래스내에 선언과 구현이 모두 되어있기 대문에 다양한 형태로 변화 불가능.
- 다형성을 이용해 느슨한 결합 가능.
◾ 다형성을 이용한 결합도 낮춤.
- 인터페이스 호출 방식.
- 구현 클래스 교체 용이. 다양한 형태로 변화 가능.
- 하지만, 인터페이스 교체 시 호출 클래스도 수정되어야 함.
◾ Factory를 이용한 결합도 낮춤.
- 팩토리 호출 방식.
- 팩토리가 구현 클래스를 생성하므로 클래스는 팩토리를 호출.
- 인터페이스 변경시 팩토리만 수정하면 됨. 호출 클래스에는 영향을 미치지 않음.
- 하지만, 클래스에 팩토리를 호출하는 소스가 들어가야함. 그것 자체가 팩토리에 의존함을 의미.
◾ Assembler를 통한 경합도 낮춤.
- IoC 호출 방식.
- 팩토리 패턴의 장점을 더하여 어떠한 것에도 의존하지 않는 형태.
- 실행시점(Runtime)에 클래스 간의 관계 형성.
- 각 Service의 LifeCycle을 관리하는 Assembler 사용.
- Spring Container가 외부 조립기(Assembler)역할.
✔DI(Dependency Injection)
1. DI
◾ 빈 생성 범위 - 싱글톤(Sigleton Bean)
- 기본적으로 싱글톤 패턴
- 새로운 인스턴스를 반환하게 만들고 싶은 경우 scope를 prototype으로 변경.
@scope("singleton")
@scope("prototype")
<bean id=".." .. scope="prototype"></bean>
◾ 빈 생성 범위 지정
- singleton : 스프링 컨테이너당 하나의 인스턴스 빈만 생성. (default)
- prototype : 컨테이너에 빈을 요청할 때마다 새로운 인스턴스 생성.
- request : HTTP Request별로 새로운 인스턴스 생성.
- session : HTTP Session별로 새로운 인스턴스 생성.
◾ 스프링 빈 설정
◾ 스프링 빈 설정 : XML
- XML 문서 형태로 빈의 설정 메타 정보 기술.
- 단순하며 사용하기 쉬움.
- <bean>태그를 통해 세밀한 제어 가능.
◾ 스프링 빈 설정 : Annotation
- 어플리케이션의 규모가 커지고 빈의 개수가 많아질 경우 XML 파일을 관리하는 것이 번거로움.
- 빈으로 사용될 클래스에 특별한 annotation을 부여해 자동으로 빈 등록 가능.
- "오브젝트 빈 스캐너"로 "빈 스캐닝"을 통해 자동 등록.
- 빈 스캐너는 기본적으로 클래스 이름을 빈의 아이디로 사용.
- 정확히는 클래스 이름의 첫 글자만 소문자로 바꾼 것을 사용
- Annotation으로 빈을 설정할 경우 반드시 component-scan 설정.
- Stereotype annotation
- 빈 자동등록에 사용할 수 있는 annotation
- 빈 자동인식을 위한 annotation이 여러가지인 이유
- 계층별로 빈의 특성이나 종류 구분.
- AOP Pointcut 표현식을 사용하면 특정 annotation이 달린 클래스만 설정 가능.
- 특정 계층의 빈에 부가기능 부여.
- 종류
- @Repository : Data Access Layer의 DAO 또는 Repository 클래스에 사용. DataAccessException 자동변환과 같은 AOP의 적용 대상을 선정하기 위해 사용.
- @Servie : Service Layer의 클래스에 사용.
- @Controller : Presentation Layer의 MVC Controller에 사용. 스프링 웹 서블릿에 의해 웹 요청을 처리하는 컨트롤러 빈으로 선정.
- @component : 위의 Layer 구분을 적용하기 어려운 일반적인 경우에 설정.
◾ Dependency Injection
- 객체 간의 의존관계를 자신이 아닌 외부의 조립기가 수행.
- 제어의 역행(Inversion of Control)이라는 의미로 사용.
- DI를 통해 시스템에 있는 각 개체를 조정하는 외부 객체가 객체들에게 생성시에 의존관계가 주어짐.
- 느슨한 결합(loose coupling)의 주요 강점.
- 객체는 인터페이스에 의한 의존 관계만 알고 있으며, 이 의존 관계는 구현 클래스에 대한 차이를 모르는채 서로 다른 구현으로 대체 가능.
◾ 스프링의 DI 지원
- Spring Container가 DI 조립기 제공.
- 스프링 설정 파일을 통하여 객체 간의 의존관계 설정.
- Spring Container가 제공하는 API를 이용해 객체 사용.