DI : Dependency Injection

지종권(JiJongKwon)·2024년 1월 17일
1
post-thumbnail

DI

의존성 주입, 외부 객체를 주입하는 것, 즉 new 생성을 마구잡이로 안하고 동일 객체를 사용한다

  • 객체간의 결합도를 낮춤 → 유지보수성 증가
  • 테스트 용이성이 높음
  • 동일한 의존객체를 사용하기 때문에 메모리를 효율적으로 사용

예시코드

public class MemberService {
...
}

 public class MemberController {
     private final MemberService memberService;

     @Autowired
     public MemberController(MemberService memberService) {
         this.memberService = memberService;
     }
}

Controller에 Service를 객체를 외부에서 가져온다.

@AutoWired

스프링이 스프링 컨테이너에서 해당 빈을 찾아서 주입한다.

위의 코드에서 @AutoWired를 통해 memberController → memberService 와 같이 연결한다.


그럼 개발자가 직접 의존성을 주입하는 것과 @AutoWried 사용해서 주입하는 것에 차이는 무엇일까?

@AutoWried를 설정해둔 메서드가 자동으로 호출되고 인스턴스가 자동으로 주입된다.

따라서 개발자는 빈을 명시적으로 주입 코드를 작성하지 않아도 된다.

→ 시간 절약, 간결성, 유연성등등이 높아짐

@Component

위의 코드에서 @AutoWried를 사용하면 아마 오류가 날 것이다

이유는

빈등록 X → @AutoWried 수행 → 빈 찾을 수 없음 → 오류발생

바로 @Component 를 사용해서 스프링 컨테이너에 빈을 등록하면 된다.
이때 빈은 Singleton pattern으로 관리한다.

@Service
public class MemberService {
...
}

@Controller
 public class MemberController {
     private final MemberService memberService;

     @Autowired
     public MemberController(MemberService memberService) {
         this.memberService = memberService;
     }
}

스프링 컨테이너에 해당 빈이 들어가서 이제는 오류가 발생하지 않을 것이다.

근데 왜 @Component를 사용하지 않고 @Service, @Controller 를 사용할까 ?

Controller의 어노테이션을 보면 @Component 가 이미 포함되어 있다

따라서 controller 역할에 맞게 더욱 잘 수행할 수 있는 @Controller를 사용하는 것이다

Service도 마찬가지!!


DI에 대해서 알아보았다.

0개의 댓글

관련 채용 정보