티스토리 뷰

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, 관심사 분리
'Web > Spring' 카테고리의 다른 글
새로운 채팅 메세지 표시 (0) | 2024.04.12 |
---|---|
[Websocket/Stomp] 채팅 메세지 알림 (0) | 2024.04.09 |
[스프링부트] 어노테이션을 사용한 api 작성 방법 (0) | 2024.04.01 |
[Domain/Repository] 간단한 회원 관리 예제 (0) | 2024.03.25 |
[SpringFramework] 정적 컨텐츠 / MVC와 템플릿 엔진 / API (0) | 2024.03.18 |
- Total
- Today
- Yesterday
- 동덕여대
- 백준 1004
- 코틀린
- 리트코드 1768
- 백준 2108
- 프로그래밍
- 스프링 강의
- 컴과
- 안드로이드
- RDD
- 자바
- 스파크
- 웹
- 컴공
- 개발
- 코딩
- 백준
- 스프링부트
- bcrypaswordencoder
- 백준9375번
- 아이엘츠
- 자바 9375
- 동덕여대 컴퓨터학과
- BFS
- 생활코딩
- 알고리즘
- 컴퓨터학과
- 그리디 알고리즘
- 리트코드 1768 해석
- 자바 1004번
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |