언제나 처럼 나의 부족함을 절실하게 느꼈다.
다만, 내가 어떤 방향성을 가지고 가야할지에 대해 어느정도 정리가 되었다.
공부의 방법을 "이렇게 하자!!!"라는 정리가 아니다.
주어진 시간을 어떻게 활용할지에 대하여 어느정도 틀을 잡게 되었다.
나만의 시스템을 확립해 나가자.
그리고 그 시스템 안에서 움직이는 순간만큼은 시스템에 온전히 내 몸을 맡기자.
(의심하며 멈추는 등 아까운 시간을 허비하지 말자.)
DI = 의존성 주입
객체간 의존성을 개발자가 객체 내부에서 직접 호출(new
연사자) 하는 대신, 외부(스프링 컨테이너)에서 객체를 생성해서 넣어주는 방식이다.
외부에서 두 객체 간의 관계를 설정해주는 디자인 패턴으로,
인터페이스를 사이에 두어 클래스 레벨에서는 의존관계가 고정되지 않도록하고,
런타임 시 관계를 동적으로 주입하여 유연성을 확보하고 결합도를 낮출수 있게 한다.
public class Contoller {
private Service service;
service.test();
}
스프링에서 사용하는 의존성 주입에는 3가지의 방법이 있다고 한다.
아래 참고 링크를 이용해 추후에 학습해보도록 하자.
IoC = 제어권 역전
일반적인 의존성에 대한 제어권은 개발자가 직접 의존성을 만든다.
의존성은 쉽게 말해 어떤 객체가 사용해야할 객체라고 할 수 있고,
이것을 직접 new
등을 써서 만들어 쓰면 의존성을 자기가 직접 만들어 쓴다고 할 수 있다.
public class OwnerController {
private OwnerRepository ownerRepository = new OwnerRepository();
}
// OwnerController가, 필요한 OwnerRepository의 객체를 직접 생성하는 경우
IoC(제어권 역전)은 말 자체는 어렵게 들릴 수 있지만,
한마디로 정리하자면 직접적으로 의존성을 만들지 않고, 외부에서 의존성을 가져오는 경우를 뜻한다.
즉, 밖에서 나에게 의존성을 주입해주는 것을 DI(의존성 주입)라고 하는데, DI는 IoC의 일종이라고 생각하면 된다.
public OwnerController(OwnerRepository clinicService, VisitRepository visits) {
this.owners = clinicService;
this.visits = visits;
}
// OwnerController의 생성자에서 OwnerRepository를 인자로 받고, owners에 담고 있다.
// 이는 앞의 예시처럼 객체를 직접 생성하지 않고, 외부의 객체를 받고 있는 것이다.
스프링 IoC 컨테이너가 관리하는 객체들을 Bean이라고 부른다.
스프링은 이러한 Bean들의 의존성을 관리하고,
객체를 만들어 주며,
Bean으로 등록해주고,
이렇게 만들어진 것들을 관리한다.
개발자가 신경쓰지 않아도 프레임워크가 알아서 위의 작업을 해주는 것이다.
이러한 스프릉에서의 의존성 주입은
반드시 Bean으로 등록된 객체들 끼리만 가능하다.
스프링 IoC 컨테이너는 Bean으로 등록되지 않은 객체에는 의존성을 주입해주지 않는다.
Bean으로 등록하는 방법은 @Component
어노테이션을 사용하는 것이다.
내가 직접 사용을 해본적이 있는 @Controller
어노테이션이 정의 된 java 파일을 열어보면 아래와 같이 @Component
어노테이션이 붙어있는 것을 확인할 수 있다.
자세한 내용은 추후에 아래 참고한 자료 부터 시작하여 학습해보자.