Spring Framework의 등장 배경
웹사이트가 점점 커지면서 엔터프라이즈급의 서비스가 필요하게 됨에 따라 자바 진영에서는 EJB가 각광을 받았다. 하지만 EJB는 EJB스펙에 정의된 인터페이스에 따라 코드를 작성해야 하기 때문에 기존에 작성된 POJO를 변경해야 했다.
그리고 컨테이너에 배포를 해야 테스트가 가능해서 개발 속도가 느리고 배우기가 어렵고 설정해야 할 것들이 많았다.
Rod Johnson의 'Expert One-on-One J2EE Development without EHB'라는 책에서 EJB를 사용하지 않고 엔터프라이즈급 서비스를 개발하는 방법을 소개하였고 이것이 스프링의 모태가 되었다.
점차 경량 프레임워크와 POJO를 사용하기 시작하였다.
이때 POJO는 Plain Old Java Object의 약자로 Plain은 컴포넌트 인터페이스를 상속받지 않는 특징이 있고 Old는 EJB 이전의 자바 클래스를 의미한다.
즉, 특정 프레임워크나 기술에 의존적이지 않은 자바 객체를 뜻하고 특정 기술에 의존적이지 않기 때문에 생산성과 이식성이 향상된다.
스프링 프레임워크에 대해서 다시 한번 간단히 정리하자면 엔터프라이즈급 서비스를 만들기 위한 모든 기능을 제공하는 경량화된 솔루션이다.
스프링의 특징에는 대표적으로 DI, AOP, POJO, IOC 등이 있다.
DI (Dependency Injection) 의존성 주입
DI는 느슨한 결합 (Loose Coupling)이 주요 강점이다.
객체는 인터페이스에 의한 의존 관계만 알고 있고 이 의존 관계는 구현 클래스에 대한 차이를 모르는 채 서로 다른 구현으로 대체가 가능하다.
IoC (Inversion of Control) 제어의 역행
객체지향 언어에서 Object 간의 연결 관계를 런타임에 결정한다.
객체 간의 관계가 느슨하게 연결되어있다.
IoC의 구현 방법 중 하나가 DI이다.
Container
객체의 생성, 사용, 소멸에 해당하는 라이프사이클을 담당한다.
라이프사이클을 기본으로 애플리케이션 사용에 필요한 주요 기능을 제공한다.
스프링 빈은 기본적으로 싱글톤으로 만들어진다. 즉, 컨테이너가 제공하는 모든 빈의 인스턴스는 동일하다.
싱글톤으로 만들지 않고 항상 새로운 인스턴스를 얻고 싶다면 scope="prototype" 설정을 해주면 된다.
빈의 생성 범위 지정
singleton - 스프링 컨테이너당 하나의 인스턴스 빈만 생성
prototype - 컨테이너 빈을 요청할 때마다 새로운 인스턴스 생성
request - HTTP Request 별로 새로운 인스턴스 생성
session - HTTP Session 별로 새로운 인스턴스 생성
스프링 빈 설정
1. XML
XML 문서 형태로 빈의 설정 메타 정보를 기술한다.
단순하고 사용하기 쉽다. 가장 많이 사용하는 방식이다.
<bean> 태그를 이용해 세밀한 제어가 가능하다.
2. Annotation
애플리케이션의 규모가 커지고 빈의 개수가 많아질 경우 XML 파일을 관리하는 것이 번거롭다.
빈으로 사용할 클래스에 상황에 맞는 Annotation을 부여해주면 자동으로 빈 등록이 가능하다.
'오브젝트 빈 스캐너'로 '빈 스캐닝'을 통해 자동 등록된다.
빈 스캐너는 기본적으로 클래스 이름을 빈의 아이디로 사용한다.(정확히는 클래스 이름의 첫 글자만 소문자로 바꾼 것을 사용한다.)
Annotation으로 빈을 설정할 경우는 반드시 component-scan을 설정해야 한다.
Stereotype 적용 대상
@Repository
- Data Access Layer의 DAO 또는 Repository 클래스에 사용한다.
DataAccessException 자동변환과 같은 AOP의 적용 대상을 선정하기 위해서 사용된다.
@Service
- Service Layer의 클래스에 사용한다.
@Controller
- Presentation Layer의 MVC Controller에 사용한다.
스프링 웹 서블릿에 의해 웹 요청을 처리하는 컨트롤러 빈으로 선정된다.
@Component - 위의 Layer 구분을 적용하기 어려운 일반적인 경우에 설정한다.
빈 자동인식을 위한 annotation 종류가 여러 가지인 이유는 계층별로 빈의 특성이나 종류를 구분하고 AOP Pointcut 표현식을 사용하면 특정 annotation이 달린 클래스만 설정이 가능하다. 그리고 특정 계층의 빈에 부가 기능을 부여할 수 있다.
'개발 > Spring' 카테고리의 다른 글
[Spring] MyBatis, MyBatis-Spring 특징과 역할 (0) | 2022.05.31 |
---|---|
[Spring] 스프링 부트 (Spring Boot) 특징 및 구조 (0) | 2022.05.18 |
[Spring] 스프링 MVC 아키텍처의 이해 (Spring MVC Architecture) (0) | 2022.05.17 |
[Spring] 스프링에서 많이 사용하는 어노테이션 정리 (Annotation) (0) | 2022.05.16 |
[Spring] REST, REST API, RESTful API, OPEN API란? (0) | 2022.05.13 |