Today I learned/Online Courses
Spring Core (Back End) ... Part 1
dev-song
2020. 4. 14. 18:38
강의: [edwith 부스트코스] 웹 프로그래밍 챕터 3, 웹 앱 개발: 예약서비스 1/4
학습일: 2020년 4월 14일
7. Spring Core - BE
Spring이란?
- Framework란?
- 일종의 반(半)제품
- 이미 어느 정도의 기본 뼈대가 구성되어 있는 제품에, 사용자가 추가적으로 살을 덧붙여 제품을 완성할 수 있음
- 사용자가 뼈대까지 모두 만들려면 시간과 능력이 필요하므로, 프레임워크를 써서 보다 쉽게 만들 수 있음
- Spring Framework의 특징
- 엔터프라이즈급의 대규모 어플리케이션을 구축할 수 있는 가벼운 솔루션
- One-Stop-Shop: 모든 과정을 한꺼번에 해결할 수 있는 서비스
- 원하는 부분만 가져다 사용할 수 있도록 모듈화가 잘 되어 있음
- 예시) LEGO 블록
- IoC 컨테이너
- 선언적으로 transaction을 관리할 수 있음
- 완전한 기능의 MVC Framework를 제공
- AOP 지원
- 도메인 논리 코드와 쉽게 분리될 수 있는 구조
- Spring Framework 모듈
- 약 20개의 모듈로 구성되어 있으며, 필요한 모듈만 가져와 사용할 수 있음
- AOP와 Instrumentation
- spring-AOP: AOP Alliance와 호환되는 방법으로 AOP를 지원
- spring-aspects: AspectJ와의 통합을 지원
- spring-instrument: instrumentation을 지원하는 클래스와 특정 WAS에서 사용하는 클래스로더 구현체를 제공
- ※ BCI (Byte Code Instrumentations): 런타임이나 로드 때 클래스의 바이트 코드를 변경하는 방법
- ! 부스트코스에선 다루지 않으나, Spring 개발에서 유용한 기능이므로 추후 개인적으로 공부하는 것을 권장
- 메시징 (Messaging)
- spring-messaging
- 메시지 기반 어플리케이션을 작성할 수 있는 Message, MessageChannel, MessageHandler 등을 제공
- 메서드에 메시지를 mapping하기 위한 annotation이 포함되어 있음
- Spring MVC annotation과 유사
- ! 부스트코스에선 다루지 않음
- spring-messaging
- 데이터 액세스 (Data Access) / 통합 (Integration)
- JDBC, ORM, OXM, JMS 및 Transaction 모듈로 구성됨
- spring-jdbc: JDBC 프로그래밍을 쉽게 할 수 있는 기능 제공
- 데이터베이스에 데이터를 추가, 수정, 삭제
- spring-tx: 선언적으로 transaction을 관리할 수 있는 기능 제공
- spring-orm: JPA, JDO 및 Hibernate를 포함한 ORM API 통합 레이어를 제공
- spring-oxm: JAXB, Castor, XMLBeans, JiBX 및 XStream 등의 Object/XML mapping을 지원
- spring-jms: 메시지를 생성(producing)하고 사용(consuming)하는 기능을 제공
- Spring Framework 4.1부터 spring-messaging 모듈과의 통합을 제공함
- spring-jdbc: JDBC 프로그래밍을 쉽게 할 수 있는 기능 제공
- JDBC, ORM, OXM, JMS 및 Transaction 모듈로 구성됨
- 웹 (Web)
- Web, WebMVC, WebSocket, webMVC Portlet 모듈로 구성됨
- spring-web
- Multi-part 파일 업로드, Servlet 리스너 등 웹 지향 통합 기능을 제공
- Http 클라이언트와 Spring의 원격 지원을 위한 웹 관련 부분 제공
- spring-webmvc: Spring MVC 및 REST 웹 서비스 구현을 포함하며, web-servlet 모듈로도 불림
- spring-websocket: 웹 소켓을 지원
- spring-webmvc-portlet: Portlet 환경에서 사용할 MVC 구현을 제공
- spring-web
- Web, WebMVC, WebSocket, webMVC Portlet 모듈로 구성됨
- ※ Framework와 Library의 차이
- Framework: 완제품의 뼈대가 되는 반제품
- Library: 완제품을 만들기 위한 작업 도구
Spring IoC/DI 컨테이너
- 컨테이너(Container)란?
- 인스턴스의 life cycle을 관리하고 생성된 인스턴스에 추가적인 기능을 제공하는 프로그램
- 예시) Servlet을 실행할 때 쓰이는 WAS의 Servlet 컨테이너
- Servlet 클래스는 개발자가 만들지만, 실제 메모리에 올리고 실행하는 것은 WAS의 Servlet 컨테이너
- IoC (Inversion of Control, 제어의 역전)
- 어플리케이션 코드를 작성하는 경우, 일반적으로 개발자가 작성한 코드가 프로그램의 흐름을 제어하게 되나,
프레임워크 기반 개발에서는 프레임워크가 흐름을 제어하며, 필요할 때만 어플리케이션 코드를 호출하여 사용 - 프레임워크의 '컨테이너'가 흐름에 대한 제어권을 가지게 됨
- 컨테이너가 넘어감에 따라 객체 생성부터 life cycle 관리까지 담당
- 객체에 대한 제어권이 개발자로부터 컨테이너에게 넘어가면서, 일반적인 흐름이 바뀌었다고 IoC라고 함
- 참고자료: Spring - IoC & DI - 92Hz
- 어플리케이션 코드를 작성하는 경우, 일반적으로 개발자가 작성한 코드가 프로그램의 흐름을 제어하게 되나,
- DI (Dependency Injection, 의존성 주입)
- 클래스 사이의 의존 관계를 Bean 설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것
- 공장이 만든 인스턴스 객체를 어플리케이션에서 사용하기 위해 가져오는 방법 중 하나
- 예시 코드)
- DI가 적용되지 않은 경우
- 자동차 인스턴스에서 엔진 인스턴스를 생성 후 사용
- 개발자가 인스턴스를 직접 생성
- DI가 적용된 경우
- 자동차 인스턴스가 엔진 인스턴스를 사용하고, 이에 기반해 IoC 컨테이너가 엔진 인스턴스를 주입
- engine 타입의 변수 v1에 인스턴스가 할당되지 않았으므로, 컨테이너가 v1에 인스턴스를 할당
- DI가 적용되지 않은 경우
- 클래스 사이의 의존 관계를 Bean 설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것
- Spring에서 제공하는 IoC/DI 컨테이너
- BeanFactory
- 기본적인 IoC/DI 기능만을 제공
- ApplicationContext
- BeanFactory의 모든 기능을 포함하므로, 일반적으로 BeanFactory보다 많이 쓰임
- Transaction, AOP 등을 처리할 수 있음
- BeanPostProcessor , BeanFactoryPostProcessor 등을 자동으로 등록할 수 있음
- BeanPostProcessor:
개발자의 의도대로 인스턴스화와 의존성 처리 로직을 구현하도록 컨테이너 기본 로직을 Override함 - BeanFactoryPostProcessor: 설정, metadata 등을 커스터마이징할 수 있게 해줌
- BeanPostProcessor:
- 국제화 처리, 어플리케이션 이벤트 등을 처리할 수 있음
- BeanFactory