fastcampus java 강의를 보면서 정리를 한 것입니다.
Spring IoC의 핵심

의존성 하나 이상의 오브젝트로 실행 되는데, 오브젝트들 간에 함께 의존하고 있음

Di 예제

public Main(){
  public static void main(String []args){
    B b = new B(true);
    A a = new A(b);
    a.println();
  }
}

객체가 객체를 의존하고 있으면, 코드 유지보수가 어려워짐

디커플링 할수록 간결하게 변화함

코드에서 관계를 맺어주는것이 아니다.

의존성을 상위 코드에서 생성하여 객체를 주입하므로 a 에서는 B에 의존하는 값을 가지고 있지 않아도된다.

이것을 framework 화 한것이 IoC Container

  • 설정을 보고 관계를 눈으로 미리 볼수 있다.

  • 비지니스 로직만 집중할 수 있음 .

  • 테스트를 더 쉽게 가능하다.

  • 생성자 주입 / setter 주입

    생성자 주입

    객체가 생성될때 만들어짐

    public class A{
      private B b;
        public void setB(B b){
        this.b=b;
      }
      ...
    }
    <bean id="a" class="kr.co.fastcampus.cli.di.A">
      <constructor-arg ref="b"/>
    </bean>
    <bean id="b" class="kr.co.fastcampus.cli.di.B">
      <constructor-arg value="true"></constructor-arg>
    </bean>

    Setter 주입

    코드가 돌다가 객체가 언제든지 관계가 재설정이 되었을 때

    <bean id="a" class="kr.co.fastcampus.cli.di.A">
      <property name="b" ref="b"/>
    </bean>
    <bean id="b" class="kr.co.fastcampus.cli.di.B">
      <constructor-arg value="true"></constructor-arg>
    </bean>

circulate Dependency

상호 참조 dependecy 서로 참조를 하게 되면 stack overflow가 발생할수 있음.

https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-dependencies

'BackEnd > Spring' 카테고리의 다른 글

Bean Scope  (0) 2020.02.11
ClassPath Scanning and Managed Components  (0) 2020.02.08
Customizing the Nature of a Bean  (0) 2020.02.01
Spring-Core  (0) 2020.01.19
SpringCore - IoC Container(1)  (0) 2020.01.19

Spring-Core

Spring FrameworkOverview

스프링은 Java EE(엔터프라이즈)를 쉽게 만들수 있다.

엔터프라이즈 어플리케이션 Java EE 는 커뮤니티 프로세스가 주도하는 소프트웨어 ,JS360,370...등등을 볼수 있다.

엔터프라이즈 소프트웨어 : 비지니스를 풀려고 할때 모든 셋에 대한 정의가 되어있다는 점

javax 패키지

Java Servlet도 Java EE에 대한 기능

역사

2003년부터 시작, J2EE가 너무 복잡함 , 복합함을 해결하기 위해서 POJO라는 개념이 나오기도함.

무조건 JavaEE Spec에 따라서 해야했는데,

IoC Container

core : ioc, eventresource, ibn validation, databinding, spel, aop..

Spring : Inversion of Control 을 구현한 프레임워크

왜 inversion of Controll이 좋은가?, Di 의 개념은?

ApplicationContext를 통해서 ioc를 진행하고있음

ApplicationContext는 aop, eventpublication, ....등 다양한 것들을 구현하고있다.

interface ApplicationContext 란 ?

여러 구현체들과 설명이 많이 있음 spring의 핵심

spring container를 통해서 pojo비지니스 오브젝트를 configuration 메타 데이터를 만들어놓으면 spring이 자동으로 만들어주고 활용할수 있게 해준다.

Instantiating a Container

구현체를 통해서 applicationContext를 사용할 수 있게 된다.

코드로 객체를 생성하는것이 아니라 xml을통해서 configuration Metadata를 만들고 비지니스 로직을 만들고 spring container를 통해서 동작(실행)이 하게된다.

applicationContext의 인터페이스를 구현한 것이 springcontainer임 !!

Spring Container설정은 아래와같다.

ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");

Dao dao = new Dao()

객체 생성 관련 설정

<beans....>
    <bean class="kr.morris.cli.dao"></bean>
</beans....>

객체의 타입에 맞게 context를 사용해서 객체를 가지고 옴 .

Dao dao = context.getBean(Dao.class);

Configuration Metadata

  • xml
    • 특정 namespace을 가지고 있다.
    • 라는 태그 안에 < bean /> 을 설정 할 수 있다.
  • annotation
  • java

Bean

Naming Bean

기존의 빈

<bean class="kr.morris.cli.Dao"/>
  • id 는 그대로 하나만 가지고 있어야한다.
    unique 하더라도 spring에서 다르게 관리하는 bean을 만들수도 있다.

    <bean id='dao'.../>
  • name으로도 추가가 가능하다

    <bean name='dao1, dao2'.../>
  • 같은 클래스를 가리키더라도 id,name이 다르면 새로운 객체를 만드는 것이기 때문에 둘의 객체의 hash값이 다르게 출력된다.

bean을 지정하면 기본 생성자에대해서 객체를 생성한다.

매개변수를 받는 생성자를 입력받게 된다면 ApplicationContext에서 bean을 불러 올때 에러가난다. (beanCreateionException)

static factory method를 사용해서 만들 수도 있다.

Dao 설정에 factory-method 속성에 createDao라는 매서드를 입력해주주면된다.

<bean id="dao" class="kr.morris.cli.Dao" factory-method="createDao"></bean>

public class Dao {
    public stataic Dao createDao(){
          return new Dao();
    }
}

instance Factory method

인스턴스 Method를 이용해 bean 객체를 생성이 가능하다

Factory bean 인터페이스를 구현한 팩토리 빈이 바로 팩토리 빈 오브젝트의 메소드를 이용해 bean 객체를 생성하는 대표적인 방법

두 개의 bean이 필요함.

  • 하나는 빈을 만들어줄 클래스가 정의된 빈 (Dao.class)

  • 우리가 사용할 빈 (DaoFactory)
    특정외부 자원들을 사용할때 팩토리 매서드를 사용해서 보는 경우가 있음

    public class DaoFactory{

    public Dao createDao(){
      return new Dao();
    }

    }

    public class Dao{

    }

동작을 해보면 팩토리메서드를 통해서 실제로 daofactory를 통해서 bean이 생성된 것을 알 수 있다.

참고 :

패스트 캠퍼스 Java Spring 강의중 Spring-Core

https://cornswrold.tistory.com/101

'BackEnd > Spring' 카테고리의 다른 글

Bean Scope  (0) 2020.02.11
ClassPath Scanning and Managed Components  (0) 2020.02.08
Customizing the Nature of a Bean  (0) 2020.02.01
DI (Dependency Injection)  (0) 2020.02.01
SpringCore - IoC Container(1)  (0) 2020.01.19

IoC Container

Spring IoC Container

ApplicationContext 인터페이스는 Spring IoC 컨테이너를 나타내며, 인스턴스 구성 및 bean 조립을 담당

아래는 Spring의 작동 방식을 개략적으로 보여줌

Springframework 용어 정리

Bean 빈 또는 빈 오브젝트는 스프링이 IOC 방식으로 관리하는 오브젝트를 말함 Spring Application에서 사용하는 모든 오브젝트가 빈이라고 불리는것이 아니라, 스프링이 직접 생성과 제어를 담당하는 오브젝트를 빈이라고 부른다.

빈 팩토리 스프링의 ioc 를 담당하는 컨테이너를 가리킴 빈을 등록하고, 생성하고 조회하고 부가적인 관리 기능을 담당 beanFactory를 바로 사용하지 않고, 확장한 application context를 이용한다.

애플리케이션 컨텍스트 빈 팩토리를 확장한 IOC 컨테이너, 빈을 등록하고 관리하는 기본적인 기능은 빈팩토리와 동일하다. 스프링에서 빈팩토리기능 말고도 부가적인 서비스를 추가로 제공함. 빈 팩토리라고 부를때는 주로 빈의 생성과 제어의 관점, 애플리케이션 컨텍스트라고 할 때는 스프링이 제공하는 애플리케이션 지원 기능을 모두 포함해서 이야기 하는 것이라고 보면된다.

applicationContext는 beanFactory를 상속한다.

설정정보/설정 메타 정보 스프링 애플리케이션 컨텍스트 또는 빈 팩토리가 ioc를 적용하기 위해 사용되는 메타정보 (xml이 될수도있고, java 어노테이션, java 코드 로 표기 될 수 있다.)

컨테이너 또는 ioc 컨테이너 IoC 방식으로 빈을 관리한다는 의미에서 애플리케이션 컨텍스트나 빈 팩토리를 컨테이너 또는 IoC container라고 한다.

스프링 프레임워크 스프링 프레임워크는 IoC 컨테이너, 애플리케이션 컨텍스트를 포함해서 스프링이 제공하는 모든 기능을 통틀어 말할 때 주로 사용

Spring Java API

API를 찾아서 들어가게 되면 아래와 같이 확인을 할 수 있다.

ApplicationContext API

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/ApplicationContext.html

BeanFactory API

All Known Implementing Classes들은 아래와 같다. AbstractApplicationContext, AbstractAutowireCapableBeanFactory, AbstractBeanFactory, AbstractRefreshableApplicationContext, AbstractRefreshableConfigApplicationContext, AbstractRefreshableWebApplicationContext, AbstractXmlApplicationContext, AnnotationConfigApplicationContext, AnnotationConfigWebApplicationContext, ClassPathXmlApplicationContext, DefaultListableBeanFactory, FileSystemXmlApplicationContext, GenericApplicationContext, GenericGroovyApplicationContext, GenericWebApplicationContext, GenericXmlApplicationContext, GroovyWebApplicationContext, ResourceAdapterApplicationContext, SimpleJndiBeanFactory, StaticApplicationContext, StaticListableBeanFactory, StaticWebApplicationContext, XmlBeanFactory, XmlWebApplicationContext

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/BeanFactory.html

참고 :

토비의 스프링
[https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html]

'BackEnd > Spring' 카테고리의 다른 글

Bean Scope  (0) 2020.02.11
ClassPath Scanning and Managed Components  (0) 2020.02.08
Customizing the Nature of a Bean  (0) 2020.02.01
DI (Dependency Injection)  (0) 2020.02.01
Spring-Core  (0) 2020.01.19

+ Recent posts