[Spring] Ioc 컨테이너와 의존성 주입

세상을 바꾸는 개발자·2023년 3월 15일
0

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

  • 객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀌었다는 것을 의미한다.


IoC 컨테이너

  • 객체의 생성을 책임지고 의존성을 관리한다.

    HomeController도 MemberService가 필요한 상황일 때, 같은 객체가 2개 이상 생성되면 낭비가 발생한다.
    이를 해결하기 위해, MemberService 클래스를 Ioc컨테이너에 등록한 후, 필요한 곳에서 @Autowired를 사용하여 리모콘을 공유받는다.

@Component

  • 클래스에 선언하는 것 만으로 해당 클래스를 스프링 빈 객체로 사용할 수 있다.
  • @Service, @Repository의 역할을 대신할 수 있다. 같은 의미지만 가독성을 높이기 위해 사용
  • @Controller@Component의 일종이지만 @Controller를 대체할 수는 없다.


@Controller

  • 고객과의 요청, 응답을 주고 받는 역할을 한다.
    • HttpServelet의 기능 수행
    • URL(호출) - 클래스(서버) - 화면(응답)이 서로 연결
      → 위의 두 기능을 수행하기 위해 @RequestMapping 사용
  • @Controller = @Component + @RequestMapping 이라 볼 수 있다.



DI(Dependency Injection : 의존성 주입)

  • 각 클래스간의 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것을 말한다.

1. 필드 주입

  • @Autowired 를 필수로 붙여야 한다.
  • final 선언이 불가능하다.
  • 외부에서 변경이 불가능하다.
  • 편하다는 장점밖에 없다.
@Service
public class MemberService {
    // ...
}

public class HomeController {
    private int count;
    private final List<Person> people;
    
    @Autowired //필드 주입
    private MemberService memberService; //final 불가능

    public HomeController() {
        count = -1;
        people = new ArrayList<>();
    }
}



2. 생성자 주입

  • @Autowired 생략 가능
  • 의존관계 설정이 되지 않으면 객체생성 불가 -> 컴파일 타임에 인지 가능, NPE 방지
  • 의존성 주입이 필요한 필드를 final 로 선언가능
  • 순환참조 에러 방지
  • 테스트 코드 작성 용이
  • NullPointerException 을 방지할 수 있다.
@Service
public class MemberService {
    
    private final MemberRepository memberRepository;
    
		// 생성자 주입 예시
    @Autowired  // 생략 가능
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

    public RsData tryLogin(String username, String password) {
  • 위 같은 경우 @AllargsConstructor 어노테이션으로 코드를 더 간결하게 만들 수 있다.
@Service
@AllArgsConstructor
public class MemberService {
    
    private final MemberRepository memberRepository;

    public RsData tryLogin(String username, String password) {



=> 생성자 주입을 사용하는 것을 권장한다!

profile
초심 잃지 않기

0개의 댓글