Spring-개념, 기능
Framework란?
- 반제품! → 여기다가 더 꾸미고 해서 완성품을 만들기 직전상태
- 직접 원재료를 사서 나무를 가공하고 자르고 톱질하고 하는게 아니라 어느정도 규격이 잡혀있는 틀
- 반제품을 이용해서 완제품을 만들기가 궁극의 목표
Spring Framework란?
- 엔터프라이즈급 어플리케이션을 구축할 수 있는 가벼운 솔루션이자, 원-스탑-숍(One-Stop-Shop)
- 원하는 부분만 가져다 사용할 수 있도록 모듈화가 잘 되어 있습니다.
- IoC 컨테이너입니다.
- 선언적으로 트랜잭션을 관리할 수 있습니다.
- 완전한 기능을 갖춘 MVC Framework를 제공합니다.
- AOP 지원합니다.
- 스프링은 도메인 논리 코드와 쉽게 분리될 수 있는 구조로 되어 있습니다.
- 스프링 프레임워크는 약 20개의 모듈로 구성되어 있습니다.
- 필요한 모듈만 가져다 사용할 수 있습니다.
Spring Framework의 기능
- AOP 와 인스트루멘테이션 (Instrumentation)
- spring-AOP : AOP 얼라이언스(Alliance)와 호환되는 방법으로 AOP를 지원합니다.
- spring-aspects : AspectJ와의 통합을 제공합니다.
- spring-instrument : 인스트루멘테이션을 지원하는 클래스와 특정 WAS에서 사용하는 클래스로 더 구현체를 제공합니다. 참고로 BCI(Byte Code Instrumentations)은 런타임이나 로드(Load) 때 클래스의 바이트 코드에 변경을 가하는 방법을 말합니다.
- 메시징(Messaging)
- spring-messaging : 스프링 프레임워크 4는 메시지 기반 어플리케이션을 작성할 수 있는 Message, MessageChannel, MessageHandler 등을 제공합니다. 또한, 해당 모듈에는 메소드에 메시지를 맵핑하기 위한 어노테이션도 포함되어 있으며, Spring MVC 어노테이션과 유사합니다.
- 데이터 엑서스(Data Access) / 통합(Integration)
- 데이터 엑세스/통합 계층은 JDBC, ORM, OXM, JMS 및 트랜잭션 모듈로 구성되어 있다.
- spring-jdbc : 자바 JDBC프로그래밍을 쉽게 할 수 있도록 기능을 제공합니다.
- spring-tx : 선언적 트랜잭션 관리를 할 수 있는 기능을 제공합니다.
- spring-orm : JPA, JDO및 Hibernate를 포함한 ORM API를 위한 통합 레이어를 제공합니다.
- spring-oxm : JAXB, Castor, XMLBeans, JiBX 및 XStream과 같은 Object/XML 맵핑을 지원합니다.
- spring-jms : 메시지 생성(producing) 및 사용(consuming)을 위한 기능을 제공, Spring Framework 4.1부터 spring-messaging모듈과의 통합을 제공합니다.
- 웹(Web)
- 웹 계층은 spring-web, spring-webmvc, spring-websocket, spring-webmvc-portlet 모듈로 구성됩니다.
- spring-web : 멀티 파트 파일 업로드, 서블릿 리스너 등 웹 지향 통합 기능을 제공한다. HTTP클라이언트와 Spring의 원격 지원을 위한 웹 관련 부분을 제공합니다.
- spring-webmvc : Web-Servlet 모듈이라고도 불리며, Spring MVC 및 REST 웹 서비스 구현을 포함합니다.
- spring-websocket : 웹 소켓을 지원합니다.
- spring-webmvc-portlet : 포틀릿 환경에서 사용할 MVC 구현을 제공합니다.
컨테이너란?
- 컨테이너는 인스턴스의 생명주기를 관리하며, 생성된 인스턴스에게 추가적인 기능을 제공합니다.
- 예를 들어, Servlet을 실행해주는 WAS는 Servlet 컨테이너를 가지고 있다고 말합니다.
- WAS는 웹 브라우저로부터 서블릿 URL에 해당하는 요청을 받으면, 서블릿을 메모리에 올린 후 실행합니다.
- 개발자가 서블릿 클래스를 작성했지만, 실제로 메모리에 올리고 실행하는 것은 WAS가 가지고 있는 Servlet 컨테이너입니다.
- Servlet컨테이너는 동일한 서블릿에 해당하는 요청을 받으면, 또 메모리에 올리지 않고 기존에 메모리에 올라간 서블릿을 실행하여 그 결과를 웹 브라우저에게 전달합니다.
- 컨테이너는 보통 인스턴스의 생명주기를 관리하며, 생성된 인스턴스들에게 추가적인 기능을 제공하는 것을 말합니다.
IoC란?
- Inversion of Control → 제어의 역전
- 컨테이너가 코드 대신 오브젝트의 제어권을 갖고 있어 IoC(제어의 역전)이라 합니다.
- 예를 들어, 서블릿 클래스는 개발자가 만들지만, 그 서블릿의 메소드를 알맞게 호출하는 것은 WAS입니다.
- 이렇게 개발자가 만든 어떤 클래스나 메소드를 다른 프로그램이 대신 실행해주는 것을 제어의 역전이라고 합니다.
- S_TV객체와 L_TV객체를 따로 따로 만들어서 다른 참조변수로 같은 기능들을 사용하는건 불편하다.
- 인터페이스의 기능이 TV tv = new S_TV(); 이런 식으로 위의 불편함을 해소하는 것이다.
- 하지만 new S_TV();이것조차 S와 L을 바꾸는 것이 개발자가 매번 해야하는데 이걸 해결하는게 Ioc기술이다.
- IoC기술은 TV tv = TVFactory.getTV(“S”); 이런 식의 공장을 만들어서 이걸 고정시키고 개발자는 이용만하면 되게끔 해주는 기술이다.
DI란?
- Dependency Injection
- DI는 의존성 주입이란 뜻을 가지고 있으며, 클래스 사이의 의존 관계를 빈(Bean) 설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것을 말합니다.
- 위의 IoC가 공장으로 인스턴스를 만들었다면 그걸 실제로 우리가 사용을 해야하는데 그걸 도와주는게 DI의 기능이다. 그 인스턴스를 객체화시켜서 객체를 주입시키는 기능이다.
-
DI가 적용이 안되었으면 개발자가 직접 인스턴스를 Engine v5 = new Engine()이런 식으로 만들어야하지만 Spring의 DI를 사용한다면 약속된 어노테이션들만 지키면 Spring이 알아서 인스턴스를 객체화시켜준다.
- IoC : 프로그램이 개발자에게 틀을 강요해서 그 형식으로 만들게 하는것
- DI : 강요하는 내용들 ex) 박스를 만들때 높이는 4cm, 너비는 10cm로 해라 등등
- 장점 : 모양이 정형화 됨으로 유지및 관리가 쉽다.
Spring에서 제공하는 IoC/DI 컨테이너
- BeanFactory : IoC/DI에 대한 기본 기능을 가지고 있습니다.
- ApplicationContext : BeanFactory의 모든 기능을 포함하며, 일반적으로 BeanFactory보다 추천됩니다. 트랜잭션처리, AOP등에 대한 처리를 할 수 있습니다. BeanPostProcessor, BeanFactoryPostProcessor등을 자동으로 등록하고, 국제화 처리, 어플리케이션 이벤트 등을 처리할 수 습니다.
- BeanPostProcessor : 컨테이너의 기본로직을 오버라이딩하여 인스턴스화 와 의존성 처리 로직 등을 개발자가 원하는 대로 구현 할 수 있도록 합니다.
- BeanFactoryPostProcessor : 설정된 메타 데이터를 커스터마이징 할 수 있습니다.
Bean class란?
- 예전에는 Visual 한 컴포넌트를 Bean이라고 불렀지만, 근래 들어서는 일반적인 Java클래스를 Bean클래스라고 보통 말합니다.
- Bean클래스의 3가지 특징
- 기본생성자를 가지고 있습니다.
- 필드는 private하게 선언합니다.
- getter, setter 메소드를 가집니다. → getName() setName() 메소드를 name 프로퍼티(property)라고 합니다. (용어 중요)
- UserBean클래스에 나이, 성별, 이름 필드 만들어놓는다.
- 디렉토리 src - main - resources 파일을 생성 후 거기에다가 applicationContext.xml 파일을 만들어서 아래 소스를 추가시킨다. → UserBean을 spring을 통해 쓰겠다는 정의
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userBean" class="kr.or.connect.diexam01.UserBean"></bean>
</beans>
3, 그럼 ApplicationContextExam01.java파일을 만들어서 메인메소드 올려서 실행시키는데 아래와 같은 방식으로 사용한다.
package kr.or.connect.diexam01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ApplicationContextExam01 {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); // 인자값을 이용해 공장세우기
System.out.println("초기화 완료!!");
UserBean userBean = (UserBean) ac.getBean("userBean");
// getBean 메소드는 오브젝트타입으로 리턴하기때문에 캐스팅 필수
userBean.setName("kim");
System.out.println(userBean.getName());
UserBean userBean2 = (UserBean) ac.getBean("userBean");
if(userBean == userBean2) {
System.out.println("같은 인스턴스입니다.");
}
}
}
댓글남기기