일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- EC2
- 데이터구조
- 에프랩
- 부트캠프
- F-Lab
- backend
- nGrinder
- 자바
- 후기
- 백엔드
- 자바백엔드
- FLAB
- redis
- grafana
- Flutter
- Spring
- 트러블슈팅
- AWS
- MySQL
- 알고리즘
- github
- 성능테스트
- 코딩테스트
- 플러터
- 도커
- 멘토링
- 로드밸런서
- java
- 레디스
- error
- Today
- Total
민스씨의 일취일장
YdMinS | 스프링 IoC와 DI에 대해서 본문
스프링 IoC와 DI에 대해서 학습한 내용을 기억하기 위한 글이다.
스프링 IoC와 DI에 대해서
스프링 IoC
IoC란?
IoC는 Inversion of Control로 '제어의 역전'을 뜻한다. 원래 객체는 스스로 필요한 의존성을 생성하거나 찾는데 반해, 스프링에서는 해당 역할을 스프링에 위임했다. 이를 보고 제어가 역젼됐다고 말한다.
IoC 컨테이너
객체로 부터 위임받은 객체의 생성, 생명주기 관리는 스프링 컨테이너가 담당한다. 이렇게 객체 관리의 권한을 위임받은 것이 스프링 컨테이너의 중요한 기능이기 때문에, 'IoC 컨테이너'라고도 부른다.
스프링 IoC의 주요 기능
스프링 IoC의 주요 기능은 아래와 같다.
1. 의존성 주입 (DI)
2. 객체 생명주기 관리
3. 애플리케이션 설정 관리
4. AOP 지원
- 스프링 DI
DI란?
DI는 Dependency Injection의 줄임말로 '의존성 주입'을 말한다. 스프링 IoC 컨테이너의 핵심기능이 객체를 관리하는 것이라 위에서 언급했다. 스프링이 애플리케이션의 객체들을 전적으로 관리할 수 있는 이유는 필요한 객체를 필요한 곳에 주입할 수 있기 때문이다. 이렇게 스프링 컨테이너가 객체가 필요한 의존성(필요한 객체)을 제공해주는 것을 '의존성 주입'이라고 부른다.
DI 컨테이너
스프링 컨테이너가 IoC를 실현하기 위해 DI를 수행한다. DI 작업을 수행한다는 관점에서 스프링 컨테이너를 또 DI 컨테이너로 부르기도 한다.
Bean이란?
스프링 컨테이너가 생성하고 관리하는 객체를 일반 Java 객체와 구분할 필요가 있었다. (관리 주체가 다르기 때문에) 따라서 스프링 컨테이너가 관리하는 객체에는 Bean(커피 콩)이라는 이름을 지어주었다.
Bean 주입
의존성 주입이라는 것은 실제로 Bean을 주입하는 것을 뜻한다. 영어로는 Bean Injection이라고 부른다. 그럼 빈은 어떻게 주입할까? 다양한 방법이 있지만 대표적인 3가지 방법을 살펴보려고 한다.
- 생성자 주입
생성자 주입 방식은, 생성자(메서드)의 인자로 필요한 객체를 주입하는 방식이다. 생성자는 객체를 생성할 때 호출되기 때문에, 생성자 주입으로 주입된 객체(의존성)은 객체의 생성 시 결정하는 특징이 있다.
- 기본적으로, 필수적으로 갖고 있어야 하는 의존성을 설정할 때 사용된다.
- Setter 주입
Setter 주입 방식은, 객체 생성 이후 필요한 의존성을 Setter 메서드의 인자로 주입하는 방식이다. 생성 이후에 언제든 필요한 의존 객체를 설정하고 변경할 수 있다는 특징이 있다.
- 생성자 주입으로 설정된 의존성도, setter 메서드가 정의돼 있다면 언제든지 수정할 수 있다.
- Filed 주입
필드 주입 방식은 클래스 내에 의존성을 선언하면서 @Autowired 애너테이션을 작성하는 방식이다. @Autowired 주석이 달린경우 스프링 컨테이너는 애플리케이션 실행 시 적절한 빈을 찾아서 주입해준다. 이때 선언된 객체의 타입을 기반으로 찾아준다.
- 적절한 빈이 존재하지 않을 때 의존성 주입이 안돼 null로 있을 수 있는 위험이 있다.
'Programming Language & Framework > JAVA & Spring' 카테고리의 다른 글
TIssue | JPA | 스프링 부트와 JPA 활용 2 - 김영한 | Fetch Join에 distinct 적용 안해도 중복 제거되는 상황 (0) | 2024.11.28 |
---|---|
Thymeleaf | 재실행 없이 변경사항 반영되도록 하는 방법 (0) | 2024.11.19 |
IntelliJ | Java 프로젝트 생성 후 테스트 코드까지 작성해보기 (0) | 2024.05.01 |
TIssue | Postman에서 요청을 보냈는데 Controller에 도달을 안하는 이슈 (0) | 2024.03.04 |
TIssue | Java | error: reached end of file while parsing (0) | 2023.06.01 |