- IoC는 설계원칙, DI는 디자인 패턴에 해당.
- 스프링은 좋은 코드를 위해 IoC, DI를 제공
Spring Docs 발췌 내용 >> " DI패턴을 사용해 IoC 설계원칙을 구현하고 있다. "
❓ 좋은 코드란 무엇일까?
- 논리 간단
- 중복 제거 & 표현 명확
- 이해하기 쉽고 수정에 용이
- 의존성 최소화
- 새로운 기능 추가시 크게 구조 변경 없어야 함.
의존성이 높으면 강한 결합. 강한 결합은 수정이 많이 필요함.
🤔 그럼 의존성을 어떻게하면 떨어뜨릴 수 있을까?
➡️ 다형성의 원리(ex; 인터페이스를 사용)를 통해 강하게 결합되어 있는 것을 바꾸고 의존성을 낮출 수 있음.
🤔 강한 결합을 해결할 수 있는 방법이 있을까?
1️⃣ 각 객체에 대한 객체 생성은 1번만
2️⃣ 생성된 객체는 모든 곳에서 재사용
3️⃣ 생성자 주입을 사용하여 필요로 하는 객체에 해당 객체 주입
주입(Injection)
: 여러 방법을 통해 필요로 하는 객체를 해당 객체에 전달하는 것
주입 방법
- 필드에 직접 주입
- 클래스가 인터페이스를 필드로 가지고 있는 것
- 메서드를 통한 주입
- setter 등의 메서드를 통해서 주입받는 것
- 생성자를 통한 주입
- 생성자를 통해 주입을 해 클래스 생성할 때 인자로 구현체를 넣어주는 것
제어의 역전(IoC)
- 밥을 직접 하는 대신, 식당에 가서 다른 사람이 해주는 음식을 사먹는 것을 제어의 역전이라고 함.
(식당에서 가서 다른 사람이 해주는 음식을 먹는 것 🟰 필요로 하는 객체를 외부에서 만들어서 주입해주는 것) - DI(의존성 주입)을 통해 IoC(제어의 역전)을 이루어낸 것.
💡 참고
https://velog.io/@virtualplastic/Spring-%EC%A0%9C%EC%96%B4%EC%9D%98-%EC%97%AD%EC%A0%84-IOC-Inversion-of-Control
Spring은 필요한 객체를 생성하고 관리하는 역할을 해줌.
Bean
: 스프링이 관리하고 있는 객체
Bean 등록 방법
- Bean 으로 등록하고자 하는 클래스 위에 @Component 설정
@Component public class MemoService { ... }
- @Component만 달면 어떻게 해당 클래스를 찾아서 Bean으로 등록하는걸까?
➡️ component를 찾아주는 annotation인 @ComponentScan이 존재. componentScan이 설정되어있는 패키지 위치와 하위 패키지들을 전부 확인하여 @Component annotation이 설정되어있는 클래스를 전부찾아 bean으로 등록해줌 - 어떻게 저장이 될까?
➡️클래스의 이름의 맨 앞 글자만 소문자로 바꿔(ex; MemoService => memoService) IoC Container에 저장됨. - JdbcTemplate도 기본적으로 bean으로 설정되어있기 때문에 받아와서 사용 가능
- @Component만 달면 어떻게 해당 클래스를 찾아서 Bean으로 등록하는걸까?
Bean 사용 방법
- @Autowired
- 주입하려는 생성자나 메서드 혹은 필드에 해당 annotation을 달아주면 됨.
- IoC 컨테이너에 의해 관리되는 클래서에서만 적용 가능
- 스프링 4.3버전 이후부터는 해당 annotation 생략 가능. (단, 생성자 선언이 한 개일때만 생략 가능!)
- 주입하려는 생성자나 메서드 혹은 필드에 해당 annotation을 달아주면 됨.
- ApplicationContext
- BeanFactory등을 상속하여 기능을 확장한 Container
- 스프링 IoC 컨테이너에서 'Bean'을 수동으로 가져오는 법
@Component public class MemoService { private final MemoRepository memoRepository; public MemoService(ApplicationContext context) { // 1.'Bean' 이름으로 가져오기 MemoRepository memoRepository = (MemoRepository) context.getBean("memoRepository"); // 2.'Bean' 클래스 형식으로 가져오기 // MemoRepository memoRepository = context.getBean(MemoRepository.class); this.memoRepository = memoRepository; } ... }
3 Layer Annotation
: Controller, Service, Repository 의 역할로 구분된 클래스들을 'Bean'으로 등록할 때 역할을 명시하기 위해 사용
- @Controller, @RestController
- @Service
- @Repository
💡 Spring 3 Layer Annotation은 모두 @Component가 추가되어 있음.
용어 정리
- BeanFactory
: 'Bean'의 생성, 관계설정 등의 제어를 담당하는 IoC 객체
'내일배움캠프(Sparta) > Spring' 카테고리의 다른 글
[Spring] Entity / Persistence Context / Transaction (0) | 2023.11.07 |
---|---|
[Spring] ORM / JPA / Hibernate (0) | 2023.11.07 |
[Spring] 3 Layer Architecture (0) | 2023.11.03 |
[Spring] JDBC (1) | 2023.11.03 |
[Spring] Database / SQL (0) | 2023.11.03 |