티스토리 뷰
📌 231005 TIL : [Spring] Bean, IoC, DI
1. Spring Bean이란?
쉽게 생각하면 스프링에서 관리하는 객체이다.
2. IoC / DI
IoC : Inversion of Control의 약자로 제어의 역전을 뜻한다.
Inverse : 뒤집다. (명) inversion
Control : 제어
뜻을 정리하자면, 프로그램의 흐름을 제어하는 주체가 정반대로 뒤집힌다.
여기서 프로그램 흐름은 객체의 흐름을 제어하는 주체.
객체의 흐름이란 객체의 생성, 사용, 라이플 사이클 등을 의미한다.
DI : Dependency Injection의 약자로 의존성 주입을 뜻한다.
Dependency : 의존
inject : 주입하다. 사용하다. (명) Injection
의존성을 주입한다.
= 객체의 의존성을 사용한다.
즉 외부에서 생성된 객체를 사용한다는 뜻이다. "IoC의 기능이 DI이다" 라는게 이해하기 쉬울 것 같다.
스프링에서 사용하는 방법에는
@Autowird 어노테이션을 이용해 생성자를 가져와서 사용하거나,
setter를 통해 사용하거나,
인터페이스를 사용하는 방법 (@Autowired가 인터페이스다)이 있다.
스프링에서는 생성자를 사용해 가져오는 방법을 권장한다. (참고 : @ohzzi 님 블로그)
객체를 외부에서 주입시킴 으로 인하여, 의존성을 역전 시킨다.
이로 인해 객체 간의 결합도를 줄이고 유연한 코드를 작성할 수 있게 하여 가독성이 좋아지고 코드 중복이 감소할 수 있다.
3. 예시
public class MemberService {
public void welcome(String name) {
System.out.println(name + "님 환영합니다.");
}
}
여기 MemberService 클래스가 있다.
IoC / DI를 사용하지 않으려면 메인에서는
public class Main {
public static void main(String[] args) {
MemberService ms = new MemberService();
ms.welcome("gamja");
}
}
바로 객체를 만들어서 사용하면 된다.
그렇지만 IoC / DI 를 이용하면, 외부(AppConfig)에서 생성된 객체를 이용하여 값을 설정할 수 있다.
만약 코드가 길어질 경우, 가독성 및 코드 중복을 생각하면 이 방법이 훨씬 깔끔해진다.
여기서 AppConfig 클래스는 IoC 컨테이너 역할을 한다.
public class AppConfig {
public MemberService memberService() {
return new MemberService();
}
}
public class Main {
public static void main(String[] args) {
//MemberService ms = new MemberService();
/** IoC && DI **/
AppConfig ac = new AppConfig();
MemberService ms = ac.memberService();
ms.welcome("gamja");
}
}
4. 스프링에서 IoC / DI?
그렇다면 스프링에서 IoC, 컨테이너, DI가 무엇을 뜻할까?
- 스프링 빈?
스프링에서 관리하는 객체
cf. 자바 빈은 자바에서 관리하는 객체이다.
- IoC / DI?
스프링이 주도권을 가지어 객체(빈)을 개발자 대신에 주입해준다.
스프링이 객체를 주입하는 행위를 DI라고 하면 이해가 될 것 같다.
- 컨테이너 ?
IoC 컨테이너라고도 하는데 스프링에서 빈을 생성, 관리하도록 빈을 모아놓은 공간이다.
스프링에서는 Bean을 관리하기 위해 IoC 컨테이너인 BeanFectory 와 ApplicationContext가 존재한다.
결론적으로, 스프링은 IoC 컨테이너에서 관리하는 스프링 빈을 꺼내다가 빈을 DI 시켜주는 기능을 한다.
따라서 스프링이 모든 의존성 객체를 스프링이 실행될 때 다 만들어주고 필요한 곳에 주입시켜줌으로써
Bean들은 싱글톤 패턴의 특징을 가지며,
제어의 흐름을 사용자가 컨트롤하는 것이 아니라 스프링에게 맡겨 작업을 처리하게 된다.
5. Bean 등록 방법 / 주입 시키는 방법
등록 방법 :
@Configuration + @Bean : 스프링에게 해당 객체를 빈으로 등록하라는 의미를 가진 어노테이션.
주입시키는 방법 :
@Autowired : 스프링에게 빈을 주입시켜 달라는 어노테이션.
스프링에서 객체를 주입시키는 (DI) 하는 방법
- 개발자는 @Autowired 를 사용하여 따로 객체를 생성하지 않아도, 스프링 빈을 관리하는 IoC 컨테이너에서 객체를 주입시켜준다.
'백엔드 공부하기 > TIL' 카테고리의 다른 글
231017 TIL : [Spring-boot] 개발자 키우기 프로젝트 : 날짜 자동으로 테이블에 값 넣는 방법. (JPA) (0) | 2023.10.18 |
---|---|
231017 TIL : [Spring-boot] 개발자 키우기 프로젝트: H2 데이터베이스, ENUM 클래스 (1) | 2023.10.18 |
231002 TIL : 알고리즘 트라이 (Trie) (1) | 2023.10.02 |
230922 TIL : Spring boot로 게시판 만들기 - 2. 게시글 삽입, 조회, 삭제 구현 (0) | 2023.09.23 |
230921 TIL : Spring boot로 게시판 만들기 - 1. MySQL 다이어그램 제작 및 테이블 만들기, Entity 설정 (0) | 2023.09.21 |
- Total
- Today
- Yesterday
- 과정중간회고
- 커리어멘토링
- TiL
- 패스트캠퍼스강의
- 국비지원취업
- 야놀자
- 국비지원
- qjzl
- #국비지원취업
- springboot
- 채팅기능개발
- 백준
- 백엔드부트캠프
- 그룹스터디
- 부트캠프
- 국비지원캠프
- be
- 프로젝트후기
- 데이터베이스
- 자료구조 #스택 #큐 #덱 #선형자료구조
- 야놀자X패스트캠퍼스부트캠프
- 자료구조
- Java
- 카카오API
- boj
- 그룹스터디워크샵
- 백엔드개발자
- 스터디후기
- 백엔드
- 패스트캠퍼스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |