티스토리 뷰

 

DI는 스프링 프레임워크의 핵심 개념으로 소프트웨어 컴포넌트 간의 결합도를 줄이고 유연성을 향상시키는 데 중요한 역할을 한다. 스프링이 제공하는 DI 기능은 개발자가 객체 간의 의존성으로 명시적으로 정의하여 코드의 유지보수성과 테스트 용이성을 향상시키는 데 도움이 된다.

 

 

Java Code 기반 설정 (JavaConfig)

// Java Code 기반 DI 설정 기본 예제

@Congifuration
public class SpringConfig {
    // (1)
    @Bean
    public Poem sonnet29() {		
    	return new Poem();		
    }
    
    // (2)
    @Bean(name="duke")
    public PoeticJuggler juggler() {
    	return new PoeticJuggler(5, sonnet29());	
    }
    
    // (3)
    @Bean
    public OneManBand hank() {
        Map<String, Instrument> instrMap = new HashMap<String, Instrument>();
        instrMap.put("SAXOPHONE", saxophone());
        instrMap.put("PIANO", piano());
        OneManBand omd = new OneManBand();
        omb.setInstruments(instrMap);	
        return omb;
    }
}

 

 

@Configuration: 클래스가 Bean 구성 정보를 포함하고 있다는 것을 알려준다.

@Bean: 메서드가 스프링 컨테이너에 의해 관리되는 Bean을 생성하는 메서드임을 나타낸다.

 

(1) Poem 타입의 sonnet29 빈 생성 (메서드 이름 -> bean ID)

(2) PoeticJuggler 타입의 duke 빈 생성 (name 속성 -> beanID), 생성자 통해 의존 관계 주입 

(3) OneManBand 타입의 hank 빈 생성, Map 객체 생성 및 초기화 후 setter 통해 의존 관계 주입

 

!!주의!!

생성되는 bean들은 기본적으로 singleton 객체다.

같은 @Bean 메서드를 여러번 호출해도 객체는 내부적으로 한 번만 생성되고 공유된다.

 

 

Java Code 기반 설정 사용 방법

// AnnotationConfigApplicationContext 사용 예제

public class SpringPracticeMain {
	public static void main(String[] args) {
        ApplicationContext context =
            new AnnotationConfigApplicationContext(SpringConfig.class);
        SpringPractice springPractice = context.getBean("springPractice", SpringPractice.class);
        springPractice.run();
		...
	}
}

 

 

AnnotationConfigApplicationContext:

스프링에서 사용되는 컨테이너로 자바 어노테이션을 활용하여 스프링 빈을 설정하고 관리한다.

 

+) 여러 개의 JavaConfig 클래스 사용 방법?

방법 1: @Autowired를 이용해 설정 클래스 bean 자체를 자동 주입

방법 2: @Autowired를 통해 필요한 의존 객체들을 직접 자동 주입

방법 3: @Import annotation을 이용한 설정 정보 결합

 

 


Annotation 기반 설정

@Required

  • setter method 앞에 사용
  • 의존 객체나 값이 반드시 주입되어야 함을 의미

 

@Autowired

  • field, setter method, constructor, 일반 method에 사용 가능
  • Bean들 사이의 의존 관계를 type을 이용하여 자동 설정
  • 할당 가능한 타입의 bean 객체 존재하지 않을 경우 → NoSuchBeanDefinitionException 발생
  • 할당 가능한 타입의 beann 객체가 여러개일 경우 → NoUniqueBeanDefinitionException 발생
  • required=false 지정하면 할당 가능한 bean이 존재하지 않을 경우 DI 실행 X

 

@Nullable

  • @Autowired와 함께 사용 시, 할당 가능한 bean이 존재하지 않을 경우 null 주입

 

@Qualifier

  • 한정자(별명) 정의해 여러 bean을 한번에 주입(@Autowired)할 수 있음

 

@Value

  • field, setter method, constructor, 일반 method에 사용 가능
  • Java primitive type 값 주입

Bean Scan

  • 특정 package들에 속한 클래스들을 모두 검색하여 특정 annotation이 붙은 클래스들에 대해 자동으로 bean을 등록하는 기능
  • @Component, @Controller, @Service, @Repository, @Aspect, @Configuration

 

Bean Scan 설정 방법?

XML 설정

<context:component-scan base-package="springproject"/>

 

JavaConfig 설정

@ComponentScan(basePackages=("springproject", ...))

 

 


Spring DI 설정 방식의 장단점

XML

type-safe 하지 않음 (오타)

 

Annotation 기반 + Bean Scan

type-safe 하지만 설정 클래스들과 결합 및 분산되어 전체적인 설정 관리나 관심사 분리 어려움

 

Java code 기반

type-safe, 관심사 분리

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함