Post

[Spring] CDI(Contexts and Dependency Injection)

‘Jakarta Contexts and Dependency Injection’은 ‘Java EE(Enterprise Edition)’ 환경에서 의존성 주입과 관련된 서비스를 제공하는 애플리케이션 서버의 기능이다. CDI는 애플리케이션 컴포넌트 간의 결합도를 낮추고, 느슨한 결합을 통해 유연성과 재사용성을 향상시키는 것을 목표로 한다.

💡 CDI를 왜 사용하는가?

스프링도 의존성 주입, AOP(Aspect-Oriented Programming), 선언적 트랜잭션 관리등 다양한 기능의 애노테이션을 제공한다. 그럼에도 CDI를 사용하는 이유는 무엇인가?

  1. Java EE 표준 준수

    CDI는 자바 EE의 공식 표준이다. 표준을 준수하는 것은 기술의 호환성과 장기적인 지원을 보장하는 측면에서 중요하다.

  2. 결합도 감소

    CDI는 애플리케이션 컴포넌트 간의 결합도를 줄이는 데 초점을 맞추고 있다. 이를 통해 더 유영하고 확장 가능한 애플리케이션을 구축할 수 있다.

CDI 의존성 추가

1
2
3
4
5
<dependency>
  <groupId>jakarta.inject</groupId>
  <artifactId>jakarta.inject-api</artifactId>
  <version>2.0.1</version>
</dependency>

CDI 사용

  • 의존성 주입 설정

    의존성 주입을 위해 @Inject애너테이션을 사용한다. 이를 통해 필요한 객체를 자동으로 주입받을 수 있다.

  • Bean 정의

    CDI에서 관리할 객체를 빈으로 정의한다. 일반적으로 빈은 @Named또는 @ApplicationScoped, @SessionScoped등의 애너테이션으로 범위를 정의할 수 있다.

  • Producer 메소드

    특정 타입의 객체를 프로그래밍 방식으로 생성하고 싶을 때, @Produces 애너테이션을 사용한 프로듀스 메소드를 정의할 수 있다.

  • 이벤트 처리

    @Onserves 애너테이션을 사용하여 이벤트를 처리할 수 있다. 이벤트는 @Inject와 함께 사용되는 ‘Event’타입을 통해 발행할 수 있다.

  • 인터셉터와 데코레이터 사용

    비즈니스 로직의 분리와 재사용을 위해 인터셉터(@Interceptor)와 데코레이터(@Decorator)을 사용할 수 있다.

CDI 활용 예제

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
@Named
class BusinessService {
	private DataService dataService;
	public DataService getDataService() {
		return dataService;
	}

	@Inject
	public void setDataService(DataService dataService) {
		System.out.println("Setter Inject");
		this.dataService = dataService;
	}
}

@Named
class DataService {	}

@Configuration
@ComponentScan
public class CdiContextLauncherApplication {
	public static void main(String[] args) {
		try (var context = new AnnotationConfigApplicationContext
				(CdiContextLauncherApplication.class)) {
			System.out.println(context.getBean(BusinessService.class).getDataService());
		} catch (BeansException e) {
			e.printStackTrace();
		}
	}
}
This post is licensed under CC BY 4.0 by the author.

© chanho. Some rights reserved.