토비의 스프링

Lee1231234·2023년 7월 4일
1

스프링

목록 보기
3/3

제어의 역전(IOC)

Inversion of Control 프로그램의 제어 흐름 구조가 뒤바뀌는 것
기존이라면 프로그램이 시작되는 지점에서 다음 사용할 오브젝트를 결정하고 생성하고 호출한다.
제어의 역전은 이러한 흐름을 거꾸로 뒤집는것 스프링에서는 관계설정같은 제어를 담당하는 오브젝트를 빈 팩토리(bean factory)라고 부른다. 대부분 이를 확장한 애플리케이션 컨텍스트를 주로 사용한다.

설정정보를 담은 클래스

@Configuration
public class test{
	@Bean
   public Dao dao(){
   	return new Dao(connection()); 
   }
   @Bean
   public Connection connection(){
   	return new DConnetcion();
   }

}

애플리케이션 컨텍스트를 적용한 Test

public class daoTest {
	public static void main(String[] args ) throws ClassNotFoundException,SQLException{
		ApplicationContext context = new AnnotationConfigApplicationContext(test.class);
		Dao dao = context.getBean("Dao",daoTest.class);
	}
}

애플리케이션 컨텍스트를 사용했을 때 얻을 수 있는 장점

  • 클라이언트가 구체적인 팩토리 클래스를 알 필요가 없음
  • 애플리케이션 컨텍스트는 종합 IoC 서비스를 제공
  • 애플리케이션 컨텍스트는 빈을 검색하는 다양한 방법을 제공

빈이 싱글톤인 이유

스프링이 주로 적용되는 대상이 자바 엔터프라이즈 기술을 사용하는 서버환경이기 때문.
매번 클라이언트 요청이 올때마다 오브젝트가 만들어진다면 엄청나게 많은 오브젝트가 생성되므로 이러한 문제를 해결하기위해 사용자의 요청을 담당하는 여러 스레드에서 하나이 오브젝트를 공유해 사용하는 싱글톤 패턴을 사용한다.

싱글톤 패턴의 한계
  1. private 생성자를 가지고 있기때문에 상속할수 없음
  2. 테스트 하기가 어려움. (만들어지는 방식이 제한적이기 때문)
  3. 서버환경에서 싱글톤이 하나라는것을 보장하지 못함
  4. 싱글톤의 사용이 전역 상태를 만들 수 있어 바람직 하지 못함.

의존관계 주입(DI)

DI(Dependency Injection)는 오브젝트 레퍼런스를 외부로부터 제공받고 이를 통해 동적으로 의존관계가 만들어지는 것이 핵심.

예를 들어 A가 B에게 의존하고있다는 것은 B의 변경에 따라서 A에게 영향이 간다.

의존관계 주입의 3가지 조건

  1. 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지않음. (인터페이스에만 의존하고 있어야함)
  2. 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제3의 존재가 결정한다.
  3. 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공(주입)해줌으로써 만들어진다.

스프링에서 메소드를 이용한 의존관계 주입

  • 수정자 메소드를 이용한 주입
    파라미터로 전달된 값을 내부의 인스턴스 변수에 저장하는것 부가적으로 입력값의 대한 검증 그밖의 작업을 수행할수도 있음.

  • 일반 메서드를 이용한 주입
    한번에 여러 개의 파라미터를 받을 수있음 따라서 타입이 여러개라면 실수하기도 쉬워지는 주입방식. 외부에서 값이 변경될 수 있다.

다른 방식의 의존관계 주입

  • 생성자를 생성할때 하는 주입
    생성자를 통해서 의존관계를 주입받는 방법. 생성자는 객체를 생성 할때 한번 불러와지는 메소드로 클래스의 초기값을 설정하는 부분을 담당한다.
    의존관계를 주입할 때는 생성자 주입을 권장하며 가장 많이 사용되는 방법이다.
  • 필드 주입
    실제 필드에서 바로 주입하는 방법, 외부에서 변경이 불가능해서 테스트하기 힘들다는 치명적인 단점이 있다.

스프링 IoC 용어정리

빈 : 스프링이 IoC 방식으로 관리하는 오브젝트라는 뜻 스프링이 직접 생성과 제어를 담당하는 오브젝트만 빈이라고 한다.

빈 팩토리 : 스프링의 IoC를 담당하는 핵심 컨테이너를 말함 빈의 등록,생성,조회 그외의 부가적인 빈을 관리하는 기능을 담당함 빈을 생성하고 관계를 설정하는 IoC의 기본 기능에 초점을 맞춤

애플리케이션 컨텍스트 : 빈 팩토리를 확장한 IoC 컨테이너 스프링이 제공하는 각종 부가 서비스를 추가한 빈 팩토리. ApplicationContext는 애플리케이션 컨텍스트가 구현해야하는 기본 인터페이스를 가리킴.
애플리케이션 전반에 걸쳐 모든 구성요소의 제어 작업을 담당하는 IoC 엔진이기도 함.

설정정보/설정 메타정보 : 애플리케이션 컨텍스트 또는 빈 팩토리가 IoC를 적용하기 위해 사용하는 메타정보를 말한다 영어로 configuration를 뜻하며 대부분 IoC 컨테이너에 의해 관리되는 애플리케이션 오브젝트를 생성,구성할 때 사용된다.

@Configuration : 스프링이 빈 팩토리를 위한 오브젝트 설정을 담당하는 클래스라고 인식할수 있도록 하는 애노테이션
@Bean : 오브젝트 생성을 담당하는 IoC용 메소드라는걸 인식할수 있도록하는 애노테이션

profile
not null

0개의 댓글