Spring이란?
스프링은 자바 엔터프라이즈 애플리케이션 개발에 사용되는 애플리케이션 프레임워크
'자바 엔터프라이즈 애플리케이션', '프레임워크' 이 두개의 단어 읽을 때는 대략 이런 단어겠구나로 유추하고 위의 글을 이해했다고 생각했지만 좀 더 자세히 살펴보자.
자바 엔터프라이즈 애플리케이션(Java EE applications)
Java EE사양을 준수하는 응용 프로그램으로 Java EE 이전에는 사양 이름이 J2EE(Java 2 Platform, Enterprise Edition)였다. Java EE라는 용어에는 Java EE 및 J2EE 사양이 포함된다.
Java EE(Java Enterprise Edition)
자바 EE 플랫폼은 자바 SE 플랫폼을 기반으로 확장되었다. 자바 EE 플랫폼에서는 다계층, 확장성, 신뢰성 그리고 보안 네트워킹 어플리케이션의 개발과 실행을 위한 API 및 환경을 제공한다.
Java SE(Java Standard Edition)
Java SE의 API는 자바 프로그래밍 언어의 핵심 기능들을 제공한다. 기초적인 타입부터 네트워킹, 보안, 데이터베이스 처리, 그래픽 사용자 인터페이스 개발은 물론 XML 파싱에 이르는 고수준의 클래스들을 모두 다룰 수 있다.
코어 API에 더하여 자바 SE 플랫폼에서는 가상 머신, 개발도구, 배포 기술 그리고 자바 기술을 사용하는 어플리케이션에서 일반적으로 사용되는 부가적인 클래스 라이브러리들과 툴킷까지 제공하고 있다.
Enterprise Application
기업이나 정부와 같은 기업환경에서 작동하도록 설계된 대규모 소프트웨어 시스템플랫폼.
애플리케이션 프레임워크
프레임워크는 뼈대나 기반구조를 뜻하는데, 애플리케이션 개발 시 개발 시 필수적인 코드, 알고리즘, 데이터베이스 연동 등과 같은 기능들을 위해 어느정도 뼈대(구조)를 제공해주는 것
흔히 면접시 프레임워크와 라이브러리의 차이를 물어보는데 보통 프레임워크를 틀이라하고 라이브러리를 도구라 말하며 시작한다.(정말 많이 봤다...나도 그랬다.) 앞의 대답에서 추가해보자면 프레임워크와 라이브러리의 가장 큰 차이는 제어권이 어디에 있느냐이다. 라이브러리의 경우 개발자가 필요한 여러기능을 구현하기 때문에 제어권이 개발자에 있다면 프레임워크의 경우 프로그램의 흐름을 프레임워크가 제어함으로써 제어권이 프레임워크에 있다는 차이가 있다. (정리가 잘 되어있는 블로그)
Spring의 등장배경
스프링은 EJB의 실패를 교훈삼아서 시작되었다. EJB는 개발자가 비즈니스 로직에 집중 할 수 있는 환경을 갖추었지만, 하나의 기능을 구현하기 위해 클래스 간 상속, 인터페이스의 구현 등 각 클래스 간의 의존도가 커짐으로 배보다 배꼽이 더 큰 상황에 부딪혔다.
그래서 마틴 파울러는 EJB에 반발해 "순수한 자바 오브젝트로 돌아가자."는 말을 했고,
POJO("Plain Old Java Object")라는 용어의 기원이 된다.
2002년 로드 존슨이 EJB의 문제점을 지적하면서 고품질의 확장 가능한 애플리케이션을 개발할 수 있음을 보여주고, 30,000 라인 이상의 기반 기술 예제 코드를 선보이면서 시작되었다.
30,000라인의 예제 코드에는 현재 스프링의 핵심 개념과 기반 코드인 BeanFactory, ApplicationContext, POJO, IoC(제어의 역전) , DI(의존성 주입)등이 포함되었다.
제어의 역전 IoC(Inversion of Control)
객체의 생성부터 소멸까지 객체의 모든 생명주기를 개발자가 아닌 컨테이너가 담당하는 것
단순 자바를 사용하다가 스프링을 사용하게 될 경우 객체를 생성할 때 new라는 키워드를 더 이상 사용할 필요가 없어지게 된다. 개발자가 구현하고자 하는 기능을 코드(java에서는 클래스)로 작성하면 프레임워크의 컨테이너가 자동으로 객체의 라이프 사이클을 관리해준다. 이렇게 원래 개발자가 가지고 있어야 할 객체의 생명주기 제어권이 컨테이너에게 넘어갔다는 의미에서 제어가 역전되었다라 한다.
IoC의 분류
의존성 검색 DL(Dependency Lookup)
저장소에 저장되어 있는 Bean에 접근하기 위해 컨테이너가 제공하는 API를 이용하여 Bean을
Lookup하는 것.
의존성주입 DI(Dependency InJection)
스프링 프레임워크가 어떻게 내가 작성한 코드를 호출하고 동작시키는지를 보려면 DI 의존성주입을 만나게 된다.
컨테이너에서 관리할 객체를 지정해주고, 코드내에서는 컨테이너에서 객체를 받아 사용하는 방식을 말한다.
빈을 정의할 때 객체 간 의존관계를 명시해 코드에서 사용 시 자동으로 주입 받도록한다.
-> DI의 종류로는 Setter Injection / Constructor Injection / Method Injection 이 있다.(다른 포스트로 좀더 자세히 설명하겠다.)
Application Context
스프링에서는 빈의 생성과 관계설정같은 제어를 담당하는 IoC컨테이너인 빈팩토리(Bean Factory)가 존재한다. 하지만 실제로는 빈의 생성과 관계설정 외에 추가적인 기능이 필요한데, 이러한 이유로 컨테이너는 빈팩토리를 상속받아 확장한 애플리케이션 컨텍스트를 주로 사용한다.
참고
'스프링' 카테고리의 다른 글
Spring Bean (0) | 2022.02.20 |
---|---|
[SpringBoot] PasswordEncoder 적용하기 (0) | 2022.02.18 |
스프링 삼각형과 설정 정보 - AOP / PSA (0) | 2022.02.09 |
의존성주입 DI(Dependency InJection)의 종류 (0) | 2022.02.09 |
1장 오브젝트와 의존관계 (0) | 2021.12.01 |