관리 메뉴

너와 나의 스토리

Spring DI, CI 본문

개발/Spring Boot

Spring DI, CI

노는게제일좋아! 2020. 8. 23. 01:28
반응형

Spring DI

  • 객체들 간의 의존성을 줄이기 위해 사용되는 Spring의 IoC 컨테이너의 구체적인 구현 방식
  • 객체 자체가 아니라 프레임워크에 의해 객체의 의존성이 주입되는 설계 패턴
  • 객체간의 의존성을 자신이 아닌 외부에서 주입하는 개념 
    • 객체를 주입 받는다는 것은 외부에서 생성된 객체를 넘겨받는 것이다. 이렇게 하면 결합도를 낮출 수 있고, 런타임시에 의존관계가 결정 되기 때문에 유연한 구조를 가진다.  
    • 왜? 모듈 간의 결합도를 낮춰서 유연한 변경을 가능하도록 하기 위해서

* 런타임 & 컴파일 타임

- 컴파일 타임: 작성된 소스코드를 기계어코드로 변환 되어 실행 가능한 프로그램으로 만듦

- 런타임: 컴파일 과정을 마친 프로그램은 사용자에 의해 실행되어 지며, 이러한 응용프로그램이 동작되어지는 때를 런타임이라고 부른다.

 

객체 자체가 아니라 프레임워크에 의해 객체의 의존성이 주입되는 설계 패턴

  • Framework에 의해 동적으로 주입되므로 여러 객체 간의 결합이 줄어든다.
  • 컨테이너가 bean 객체를 생성하고, 종속성 주입을 수행한다.

 

  • 스프링의 의존 주입은 이전략 패턴을 사용하여 구현 됨

 

 

 

Dependency Injection과 Inversion of Controler는 같은 의미로 사용된다.

  • IoC(제어의 역전)는 DI를 통해 달성된다.

 

IoC: 프로그램 제어권을 프레임워크가 가져가는 것

  • 개발자가 모든 제어의 중심이지만 코드 전체에 대한 제어는 프레임워크가 한다.
  • DI란 IoC container가 xml 파일에 정의된대로 bean 객체를 생성하고 의존성을 대신 주입하는 것을 의미한다. IoC란 사용자가 직접 객체를 생성하고 관리하던 것을 spring의 IoC Container가 대신 해준다는 말이다.
  • 개발자가 설정(xml, annotation 등)만 하면 container가 알아서 처리한다.
  • 즉, 우리는 Framework 속에서 프로그래밍을 하는 것.
  • 객체의 생명주기 관리를 컨테이너가 컨트롤하기 때문에 제어권의 흐름이 바뀌었다고 하여 제어의 역전이라고 표현합니다.
  • 제어권이 컨테이너로 넘어옴으로써 DI나 AOP 등이 가능하게 된다.
    • IoC가 없다면 Autowired를 통한 의존성 주입을 할 수 없다.

* Bean: 스프링이 관리하는 객체

 

@Configuration

  • @Configuration은 스프링 IOC Container에게 해당 클래스를 bean 구성 클래스임을 알려주는 것
  • @Configuration이 붙은 클래스는 Spring IoC Container에 의해 사용되는 클래스로 정의할 수 있다. 이 어노테이션도 @Component의 확장형이므로, @Autowired로 찾을 수 있다.

@Bean vs @Component

  • @Bean과 @component 둘 다 spring(IoC) container에 bean을 등록하도록 하는 메타데이터를 기입하는 어노테이션이다. 
  • @Bean은 개발자가 직접 제어가 불가능한 외부 라이브러리등을 bean으로 만들려고 할 때 사용된다.
    • Bean(name="myarray") 이런 식으로 이름 지정해주면 자신이 원하는 id로 bean을 등록 할 수 있다. 
    • 어노테이션 안에 값(name)을 입력하지 않을 경우 메소드의 이름을 camelcase로 변경한 것이 bean의 id가 된다.

  • @Component는 개발자가 직접 작성한 클래스를 bean으로 등록하기 위한 어노테이션이다. 아래의 예제를 보자.

  • component를 사용한 bean의 의존성 주입은 @Autowired 어노테이션을 이용하여 할 수 있다. 
  • 요약
    • @Component는 개발자가 직접 작성한 class를 bean으로 만드는 것이고, @Bean은 개발자가 작성한 method를 통해 반환되는 객체를 bean으로 만드는 것이다. 
    • 개발자가 생성한 클래스에 @Bean 선언은 불가능

 

 

의존성 주입 방법

  1. 생성자 주입
    • 필요한 의존성을 모두 포함하는 클래스의 생성자를 만들고 그 생성자를 통해 의존성을 주입한다.
  2. setter 주입
    • 의존성을 입력받는 setter 메소드를 만들고 이를 통해 의존성 주입
  3. Field 주입
    1. Autowired

 

Spring Container

  • Spring Framework의 핵심 컴포넌트
    • Container는 DI를 사용하여 응용 프로그램을 구성하는 bean 객체를 관리하다.
  • 역할
    • bean 객체를 생성하고
    • 객체들을 함께 묶고
    • 객체들을 구성하고
    • 객체들의 전체 수명주기(lifecycle)를 관리
  • 설정 방법
    • XML
      • bean 객체 정의
      • 의존성 주입(DI)
    • Java Annotation
    • Java code
  • Spring container의 2가지 유형
    • BeanFactory
      • 주로 단순한 DI에서만 사용
    • ApplicationContext
      • Resources가 제한되어 있지 않은 모든 곳에서 사용

 

Spring  CI(Continuous Integration)

  • 지속적으로 품질관리를 적용하는 프로세스를 실행하는 것
  • 코드 버전 관리를 하는 VCS 시스템에 PUSH가 되면 자동으로 Test, Build가 수행되고 Build 결과를 운영 서버에 배포까지 자동으로 진행되는 이 과정을 CI (지속적 통합)이라고 합니다.

단순히 CI 툴을 도입했다고 해서 CI를 하고 있는 것은 아닙니다.
마틴 파울러의 블로그를 가보시면 CI에 대해 다음과 같은 4가지 규칙을 이야기합니다.

  • 모든 소스 코드가 살아있고(현재 실행되고) 어느 누구든 현재의 소스를 접근할 수 있는 단일 지점을 유지할 것
  • 빌드 프로세스를 자동화시켜서 어느 누구든 소스로부터 시스템을 빌드하는 단일 명령어를 사용할 수 있게 할 것
  • 테스팅을 자동화시켜서 단일 명령어를 통해서 언제든지 시스템에 대한 건전한 테스트 수트를 실핼할 수 있게 할 것
  • 누구나 현재 실행 파일을 얻으면 지금까지 최고의 실행파일을 얻었다는 확신을 하게 만들 것

여기서 특히나 중요한 것은 테스팅 자동화입니다.
지속적으로 통합하기 위해선 무엇보다 이 프로젝트가 완전한 상태임을 보장하기 위해 테스트 코드가 구현되어 있어야만 합니다.

반응형
Comments