2020-12-14 TIL

2 minute read

spring webMVC 핵심 엔진

  • Front controller
    • Dispatcher Servlet
  • IoC container
    • Application Context

IoC(Inverwon of Control, 역제어)

  • IoC -> Inversion of Control (역제어)
    • 일반적인 명령어 실행은 위 —> 아래 순차적으로 실행
    • IoC는 역순차적으로 실행함
      • 외부에서 사용할 객체를 제공하고 사용하는 쪽에서 객체를 준비.
  • 객체의 생성부터 소멸까지의 생명주기 관리 및 책임을 개발자가 아닌 스프링 컨테이너에서 하는 것.
    • 컨테이너란? 객체의 생명주기 관리. 생성된 객체들에게 추가적인 기능을 제공하도록 하는 것으로 개발자가 작성한 코드의 처리 과정을 위임받은 독립적인 존재이다.
      • 빈팩토리 = 스프링에서 생성하는 자바 객체
  • 객체 관리를 효율적으로 하고 실행 흐름을 효율적으로 관리하기 위해서 등장한 방법이다.

DI(Dependency injection, 의존적 주입)

  • 역제어의 대표적인 예
  • 이미 생성된 객체를 다른 클래스에 주입하는 것이 의존적 주입이다.
    • 스프링 빈이 개발자 대신 객체를 생성(IoC)
    • ref를 통해 이미 생성한 객체를 다른 클래스에 주입하여 객체 자체를 매개 변수로 사용하는 것(DI)

Spring IoC에서 사용하는 기술

  • Spring WebMVC
    • Front Controller
    • IoC Container
      • 이 두 개를 받치고 있는 기술
        • Reflection API
        • Annotation

Reflection API

  • https://woowacourse.github.io/javable/2020-07-16/reflection-api

  • 구체적인 클래스 타입을 알지 못해도 그 클래스의 정보(메서드, 타입, 변수 등등)에 접근할 수 있게 해주는 자바 API

Annotation

  • 프로그램에 추가적인 정보를 제공해주는 메타데이터

Spring IOC 컨테이너 사용

  • https://chunjyu.tistory.com/23
    • IoC(Inversion Of Control) 컨테이너

      • bean container 라고도 부른다.

      • 인스턴스의 생성과 관리를 담당한다.

      • 각 객체가 의존하는 객체(dependency)를 주입한다.

        • “의존 객체 주입(dependency injection; DI)”이라 부른다.

        • 그래서 “DI 컨테이너”라고도 부른다.

  • Spring IoC 컨테이너

    • spring.io 사이트에서 제공하는 프레임워크이다.

    • 프로젝트에 Spring IoC 컨테이너 포함하기

    • mvnrepository.com 또는 search.maven.org에서spring-context 로 라이브러리를 검색한다.

    • build.gradle 에 의존 라이브러리 정보를 추가한다.

    • ’$ gradle eclipse’를 실행하여 라이브러리 파일을 다운로드 받고

    • 이클립스 설정 파일을 갱신한다.

      • 이클립스에서 프로젝트 정보를 갱신한다.
  • ApplicationContext 인터페이스

  • 스프링 IoC 컨테이너의 사용 규칙을 정의한 인터페이스이다.

  • 모든 스프링 IoC 컨테이너는 이 규칙에 따라 정의되어 있다.

  • ApplicationContext 구현체(implements, 인터페이스를 구현한 클래스 또는 그 클래스의 인스턴스)의 종류
    • 1) XML 파일에서 설정 정보를 읽어들이는 IoC 컨테이너
    • ClassPathXmlApplicationContext : 설정 파일을 자바 CLASSPATH 경로에서 찾는다.
    • FileSystemXmlApplicationContext : 설정 파일을 OS 경로에서 찾는다.
    • 2) 자바 클래스 파일의 애노테이션에서 설정 정보를 읽어 들이는 IoC 컨테이너
    • AnnotationConfigApplicationContext : 설정 정보를 자바 클래스에서 찾는다.
  • 1) 자바 CLASSPATH 에서 설정 파일을 찾는 IoC 컨테이너

    => 자바 CLASSPATH?

    예를 들면 /Users/eomjinyoung/git/bitcamp-study/java-basic/bin/main

    즉, JVM이 자바 클래스 파일(.class)을 로딩하기 위해 찾는 경로이다.

    보통 JVM을 실행할 때 -classpath 옵션이나 -cp 옵션으로 경로를 지정한다.

    물론 JVM이 클래스 파일을 찾을 JVM의 기본 경로($JAVA_HOME/lib)를 가장 먼저 뒤진다.

    => 설정 파일 경로를 지정할 때 자바 패키지 경로를 지정한다.

    파일 경로이기 때문에 패키지와 패키지 사이에는 . 대신에 /를 사용해야 한다.

// 스프링 IoC 컨테이너 사용
package com.eomcs.spring.ioc.ex01.a;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Exam01 {
  public static void main(String[] args) {

    ApplicationContext iocContainer = new ClassPathXmlApplicationContext(//
        "com/eomcs/spring/ioc/ex01/a/application-context.xml");

    System.out.println("실행 완료!");
  }
}
package com.eomcs.spring.ioc.ex01.c;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Exam01 {
  public static void main(String[] args) {
    // 3) 자바 클래스 파일의 애노테이션으로부터 설정 정보를 추출한다.
    // => 자바 클래스로 설정 정보를 다루는 것을 'Java Config' 라 부른다.
    // => 생성자 파라미터로 Java Config 클래스의 타입 정보를 넘긴다.
    ApplicationContext iocContainer = new AnnotationConfigApplicationContext(//
        AppConfig.class);

    System.out.println("실행 완료!");
  }
}
package com.eomcs.spring.ioc.ex01.d;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.eomcs.spring.ioc.SpringUtils;

public class Exam01 {
  public static void main(String[] args) {
    ApplicationContext iocContainer = new ClassPathXmlApplicationContext(//
        "com/eomcs/spring/ioc/ex01/d/application-context.xml");

    // 현재 IoC 컨테이너에 들어 있는 객체를 출력해 보자.
    SpringUtils.printBeanList(iocContainer);

    System.out.println("실행 완료!");
  }
}
// IoC 컨테이너에 보관된 객체를 확인하기
package com.eomcs.spring.ioc.ex01.d;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.eomcs.spring.ioc.SpringUtils;

public class Exam02 {
  public static void main(String[] args) {
    ApplicationContext iocContainer = new AnnotationConfigApplicationContext(//
        AppConfig.class);

    // 현재 IoC 컨테이너에 들어 있는 객체를 출력해 보자.
    SpringUtils.printBeanList(iocContainer);

/* 결과값
--------------------------------
빈 개수: 5
org.springframework.context.annotation.internalConfigurationAnnotationProcessor = org.springframework.context.annotation.ConfigurationClassPostProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor = org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor
org.springframework.context.event.internalEventListenerProcessor = org.springframework.context.event.EventListenerMethodProcessor
org.springframework.context.event.internalEventListenerFactory = org.springframework.context.event.DefaultEventListenerFactory
appConfig = com.eomcs.spring.ioc.ex01.d.AppConfig
--------------------------------
실행 완료! */

    // AnnotationConfigApplicationContext는
    // 애노테이션 처리에 필요한 도구를 기본 포함하고 있다.
    // 또한 Java Config 클래스(AppConfig)의 객체도 포함한다.


    System.out.println("실행 완료!");
  }
}

xml config와 java config

인덱스 번호로 아규먼트 순서를 제어한다.

Categories:

Updated: