Spring의 핵심?

길셔·2021년 12월 9일
0

스프링(Spring)

목록 보기
3/10
post-thumbnail

IOC(Inversion of Control _ 제어의 역전)

  • IOC : 개발자가 코드를 직접 호출하는게 아니라 framework가 내 코드를 대신 호출해 주면서 제어가 역전됐다 표현한다.
  • interface로 둔 여러 구성요소에서 여러가지를 호출과 return을 할 수 있지만 정해진 로직을 수행해 주면서 제어를 하니까 제어의 역전이 되는구나 라고 생각하면 된다.

- 근데 프레임워크와 라이브러리에 따라 IOC인지 아닌지가 나뉜다.

  • 프레임워크는 내가 프레임워크 안에서 필요한 부분을 개발하면 프레임워크가 알아서 적절한 타이밍에 호출하는 것이다
  • 내가 작성한 코드가 직접 제어의 흐름을 담당한다면 그것은 라이브러리이다.(예를 들어 JAVA를 JSON형태로 바꾼다? 그건 라이브러리를 불러서 직접 작성하기 때문에 라이브러리에서는 제어를 직접한다.)

DI (Dependency Injection_의존관계 주입)

  • 의존관계는 정적인 클래스 의존관계와, 실행 시점에 결정되는 동적인 객체(인스턴스) 의존 관계를 분리해서 생각해야한다.

1. 정적인 클래스 의존관계

  • 클래스만 봐도 알 수 있는 것 즉, 클래스가 사용하는 import 코드만 보고 의존관계를 쉽게 판단할 수 있는, 애플리케이션을 실행하지 않아도 분석할 수 있는 것

2. 동적인 객체 인스턴스 의존관계

  • 애플리케이션 실행 시점에 실제 생성된 객체 인스턴스의 참조가 연결된 의존 관계이다. (객체 인스턴스를 생성하고 그 참조값을 전달해서 연결된다.)
  • 애플리케이션의 런타임에 외부에서 실제 구현 객체를 생성하고 클라이언트에 전달해서 클라이언트와 서버의 실제 의존관계가 연결되는 것을 "의존관계 주입"이라 한다.
  • 의존관계 주입을 사용하면 클라이언트 코드를 변경하지 않고, 클라이언트가 호출하는 대상의 타입 인스턴스를 변경할 수 있다.
  • 의존관계 주입을 사용하면 정적인 클래스 의존관계를 변경하지 않고, 동적인 객체 인스턴스 의존관계를 쉽게 변경할 수 있다.(애플리케이션 코드를 건들지 않고, 관계만 변경할 수 있다.)

IOC 컨테이너, DI 컨테이너

  • 객체를 생성하고 관리하면서 의존관계를 연결해 주는 것을 IOC 컨테이너 or DI 컨테이너라고 한다.
  • 의존관계 주입에 초점을 맞춰 최근에는 주로 DI 컨테이너라고 한다.
  • 또한 여러 기능들을 여기저기 만들어 놓고 조립한다 해서 '어샘블러'라고 부르기도 하고, 오브젝트를 만들어야 해서 '오브젝트 팩토리' 등으로 불리기도 한다.

SPRING Container

  • 애플리케이션을 구성하는 설정정보가 담긴 곳에 @Configuration 을 붙이고, 각 메소드들에 @Bean을 붙이면 Spring 컨테이너에 등록이 된다.
  • ApplicationContext == spring 컨테이너 (여기서 bean이나 모든 것을 관리해준다.)
  • 생성할 때 : ApplicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
    이렇게 작성하면 파라미터로 전달한 AppConfig.class에 bean으로 등록돼 있는 모든 것을 spring이 spring 컨테이너에 등록 후 관리해 준다.
  • result type aaa = applicationContext.getBean("name", "result type");
    이렇게 작성하면 name으로 등록된 bean 객체를 실행해서 return을 받아와 aaa에 담을 수 있다.

ApplicationContext = new AnnotationConfigApplicationContext(AppConfig.class);

applicationContext.getBean("name", "return type");


  • ApplicationContext'를 스프링 컨테이라 한다.
  • 기존에는 개발자가 'AppConfig'를 직접 사용해서 직접 객체를 생성하고 DI를 했지만, 이젠 스프링 컨테이너를 통해 사용한다.
  • 스프링 컨테이너는 @Configuration이 붙은 'AppConfig'를 설정(구성)정보로 사용한다. 여기서 '@Bean'이라 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다. 이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라 한다.
  • 스프링 빈은 '@Bean'이 붙은 메서드의 명을 스프링 빈의 이름으로 사용한다.
  • 스프링 빈은 'applicationContext.getBean()' 메서드를 사용해서 찾을 수 있다.
  • 기존에는 개발자가 직접 자바코드로 모든 것을 했다면 이제부터는 스프링 컨테이너에 객체를 스프링 빈으로 등록하고, 스프링 컨테이너에서 스프링 빈을 찾아 사용하도록 변경되었다.
profile
까먹지말자

0개의 댓글