본문 바로가기
내일배움캠프(Sparta)/Spring

[Spring] IoC / DI / Bean

by mmm- 2023. 11. 7.
  • 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으로 설정되어있기 때문에 받아와서 사용 가능

 

Bean 사용 방법

  • @Autowired
    • 주입하려는 생성자나 메서드 혹은 필드에 해당 annotation을 달아주면 됨.
      • IoC 컨테이너에 의해 관리되는 클래서에서만 적용 가능
      • 스프링 4.3버전 이후부터는 해당 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'으로 등록할 때 역할을 명시하기 위해 사용

  1. @Controller, @RestController
  2. @Service
  3. @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