IT's 우

[Spring] IoC, DI 본문

CS/Spring & JPA

[Spring] IoC, DI

디우 2023. 7. 18. 02:47
728x90

주입방식

을 먼저 알고 가보자!

 

수정자 주입

@Service
public class UserService {

    private UserRepository userRepository;
    private MemberService memberService;

    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Autowired
    public void setMemberService(MemberService memberService) {
        this.memberService = memberService;
    }
}
  • 대부분 의존 관계 주입은 한 번 일어나면 종료시점까지 변경할 일이 거의 없다.
  • Setter를 통해 주입하게 되면 변경될 위험이 존재
  • setter을 public으로 열어야 함

 

필드 주입

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;
    @Autowired
    private MemberService memberService;

}
  • 외부에서 변경이 불가능해서 테스트하기 어렵다.

 

생성자 주입(Constructor Injection)

@Service
public class UserService {

    private UserRepository userRepository;
    private MemberService memberService;

    @Autowired
    public UserService(UserRepository userRepository, MemberService memberService) {
        this.userRepository = userRepository;
        this.memberService = memberService;
    }
    
}
 

[Spring] 다양한 의존성 주입 방법과 생성자 주입을 사용해야 하는 이유 - (2/2)

Spring 프레임워크의 핵심 기술 중 하나가 바로 DI(Dependency Injection, 의존성 주입)이다. Spring 프레임워크와 같은 DI 프레임워크를 이용하면 다양한 의존성 주입을 이용하는 방법이 있는데, 각각의 방

mangkyu.tistory.com


 

loC (Inverse of Control, 제어의 역전)

제어의 역전의 의존성 주입의 상위 개념

스프링 컨테이너가 필요에 따라 개발자 대신 Bean들을 관리(제어)해주는 행위

객체의 생성부터 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀐 것을 의미

 

개발자는 프레임워크에 필요한 부품을 개발하고 조립하는 방식으로 개발하고

최종 호출은 개발자가 아니라 프레임워크의 내부에서 결정된 대로 이워지게 되는데 이런 현상을 제어의 역전이라고 한다.

 

 

일반적 상황: 개발자가 직접 객체를 제어해야 했다. new 연산자를 통해 객체를 생성하고, 객체의 의존성을 맺어주고, 초기화를 해주고 등등…

 

하지만 Spring에서는 xml파일 또는 어노테이션 방식으로 스프링 컨테이너에 Bean(객체)를 등록하기만 하면, 스프링 컨테이너에서 Bean의 생명주기(생성 -> 의존성 설정 -> 초기화 -> 소멸)를 전부 관리해 준다.

2023.07.18 - [CS/Spring & JPA] - [Spring] 스프링 컨테이너(Spring Container)

 

[Spring] 스프링 컨테이너(Spring Container)

스프링 컨테이너(Spring Container) 스프링 컨테이너는 스프링 프레임워크의 핵심 컴포넌트이다. 스프링 컨테이너는 자바 객체(Bean)의 생명 주기를 관리하며, 생성된 자바 객체들에게 추가적인 기능

kjk04021.tistory.com

 

즉, 객체에 대한 제어권이 컨테이너로 역전되기 때문에 제어의 역전이라고 하는 것이다.

 


 

DI (Dependency Injection)

 👉 DI는 스프링 프레임워크에서 지원하는 IoC의 형태
클래스 사이의 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결해 주는 것이다

 

의존성 주입을 적용하지 않는 경우

<Gun.java>

public class Gun {
    ...
    ...
}

 

<Soldier.java>

public class Soldier {
    private Gun gun;

    public Soldier() {
        gun = new Gun();
    }
}

위 코드의 경우에는 Soldier 클래스 내부에서 Gun 객체를 생성하였기 때문에 의존성을 주입받은 것이 아닌, 의존성을 스스로 만든 것이라고 볼 수 있다.

 

의존성 주입을 적용한 경우

<Gun.java>

@Component // 스프링 컨테이너에 Bean으로 등록
public class Gun {
    ...
    ...
}

<Soldier.java>

public class Soldier {
    @Autowired // 스프링 컨테이너에 있는 Gun 타입의 Bean을 주입
    private Gun gun;
}

위 코드의 경우에는 Gun 객체(Bean)를 스프링 컨테이너에 등록하고, 스프링 컨테이너에서 Soldier의 gun 멤버 변수에 Bean을 주입할 수 있게 해 준 것이다.

  • 장점
    • 스프링 자체에서 설정을 통해 연관 관계를 맺어줌으로써 객체 간 결합도를 낮춰준다.
    • 클래스의 재사용성을 높이고, 유지보수가 편리해진다.
    • 의존성 주입으로 인해 stub, mock 객체를 사용해 unit 테스트의 이점이 생긴다.
  • 단점
    • 의존성 주입으로 인한 선행 작업이 필요해 간단한 프로그램에서는 번거롭다.
    • 코드 추적이 어렵다.

참고

https://mangkyu.tistory.com/125

https://github.com/backtony/Backend_Interview_for_Beginner/blob/master/Spring %26 JPA.md

https://velog.io/@damiano1027/Spring-의존성-주입-제어의-역전

 

728x90
반응형

'CS > Spring & JPA' 카테고리의 다른 글

[Spring] Annotation  (0) 2023.07.24
[Spring] 람다식(Lambda Expression)  (0) 2023.07.19
[Spring] 스프링 컨테이너(Spring Container)  (0) 2023.07.18
[Spring] Spring 이란?  (0) 2023.07.08
[Spring] MVC 패턴  (0) 2023.06.27