Spring DI & IoC

zeze·2023년 8월 1일
0

study

목록 보기
4/10

DI (Dependency Injection) : 의존성 주입

  • 사용자가 직접 객체를 생성하는 것이 아니라 스프링 컨테이너가 객체를 생성한 후 의존성을 주입시켜주는 것을 의미

  • 생성자, 필드, setter로 주입 가능

    1. 필드 주입
      @Controller
       public class Controller{
          @Autowired
          private Service service;
      }
    • 변수 선언부에 @Autowired 선언
    • 단일 책임의 원칙 위반
    • 의존 관계를 정확히 파악하기 힘듦
    • 필드 주입 시 final 키워드 선언 불가

    1. setter 주입

      @Controller
       public class Controller{
          private Service service;
      
          @Autowired
          public setService(Service service){
              this.service = service;
          }
      }
    • setter로 의존 관계 주입
    • 선택적인 의존성을 사용할 때 유용 -> 상황에 따라 의존성 주입 가능
    • 주입이 필요한 객체가 주입이 되지 않아도 객체를 생성할 수 있다는 문제가 존재

    1. 생성자 주입

       @Controller
        public class Controller{
            private Service service;
      
            @Autowired
            public Controller(Service service){
                this.service = service;
            }
        }
    • Spring Frameword Reference에서 생성자 주입을 권장
    • 객체 불변성 확보
    • 테스트 용이
    • 순환참조 에러 방지
  • 장점

    • 객체간의 결합도, 의존성 줄어듬
    • 코드 재활용성 높아짐
    • 테스트 용이
    • 가독성 높아짐

IoC (Inversion of Control) : 제어의 역전

  • 프로그램의 제어 흐름을 개발자가 직접 제어하는 것이 아니라 외부에서 관리하는 것!
  • 객체의 대한 제어권이 스프링 컨테이너로 역전되기 때문에 xml, annotation 방식으로 Bean(객체)를 스프링 컨테이너에 등록하면, Bean의 생명주기를 모두 관리함(생성, 의존성 설정, 초기화, 소멸)
  • 장점
    • 객체간의 결합도 줄이고 유연한 코드 작성 가능
    • 코드 재사용성이 좋아지고 유지보수 편해짐
    • 개발자는 객체 관리 대신 다른 부분 집중 가능

참고
https://bestinu.tistory.com/47
https://cheershennah.tistory.com/227

1개의 댓글

comment-user-thumbnail
2023년 8월 1일

잘 봤습니다. 좋은 글 감사합니다.

답글 달기