Spring-개념, 기능

3 분 소요

Framework란?

  • 반제품! → 여기다가 더 꾸미고 해서 완성품을 만들기 직전상태
  • 직접 원재료를 사서 나무를 가공하고 자르고 톱질하고 하는게 아니라 어느정도 규격이 잡혀있는 틀
  • 반제품을 이용해서 완제품을 만들기가 궁극의 목표

Spring Framework란?

  • 엔터프라이즈급 어플리케이션을 구축할 수 있는 가벼운 솔루션이자, 원-스탑-숍(One-Stop-Shop)
  • 원하는 부분만 가져다 사용할 수 있도록 모듈화가 잘 되어 있습니다.
  • IoC 컨테이너입니다.
  • 선언적으로 트랜잭션을 관리할 수 있습니다.
  • 완전한 기능을 갖춘 MVC Framework를 제공합니다.
  • AOP 지원합니다.
  • 스프링은 도메인 논리 코드와 쉽게 분리될 수 있는 구조로 되어 있습니다.
  • 스프링 프레임워크는 약 20개의 모듈로 구성되어 있습니다.
  • 필요한 모듈만 가져다 사용할 수 있습니다.

Spring Framework의 기능

  1. AOP 와 인스트루멘테이션 (Instrumentation)
    • spring-AOP : AOP 얼라이언스(Alliance)와 호환되는 방법으로 AOP를 지원합니다.
    • spring-aspects : AspectJ와의 통합을 제공합니다.
    • spring-instrument : 인스트루멘테이션을 지원하는 클래스와 특정 WAS에서 사용하는 클래스로 더 구현체를 제공합니다. 참고로 BCI(Byte Code Instrumentations)은 런타임이나 로드(Load) 때 클래스의 바이트 코드에 변경을 가하는 방법을 말합니다.
  2. 메시징(Messaging)
    • spring-messaging : 스프링 프레임워크 4는 메시지 기반 어플리케이션을 작성할 수 있는 Message, MessageChannel, MessageHandler 등을 제공합니다. 또한, 해당 모듈에는 메소드에 메시지를 맵핑하기 위한 어노테이션도 포함되어 있으며, Spring MVC 어노테이션과 유사합니다.
  3. 데이터 엑서스(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모듈과의 통합을 제공합니다.
  4. 웹(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)라고 합니다. (용어 중요)
  1. UserBean클래스에 나이, 성별, 이름 필드 만들어놓는다.
  2. 디렉토리 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("같은 인스턴스입니다.");
                    }
            }
    }

카테고리:

업데이트:

댓글남기기