-
스프링 - 의존성 주입카테고리 없음 2024. 2. 16. 17:51
스프링을 처음 접하게 됬다.
코딩을 배울 때 어떤 도구를 처음 배우게 되면, 부담감을 느끼게 되는 이유중 하나가 갑작스럽게 마주하는 낯선 단어들 인 것 같다.
처음 스프링을 해본 오늘 봐도, 뭔가 자주 쓸 것 같은 Annotation과, bean에 대한 단어의 설명을 봐도 이해가 제대로 되지 않았다.
그래서 특히 이해가 가지 않았던 키워드들 중 하나인 "의존성 주입"에 대해서 깊이 파헤쳐서, 가장 작은 단위들로 만들어 이해해 보려고 한다.
의존성 주입이란 단어를 봤을때, 주입 자체의 뜻은 알지만, 국어사전 내용을 안다고 해서 이해할 수 있는 단어는 아닌 것 같았다. 그에 대한 이해를 위해 조사를 진행해봤다.
먼저 , 아래 코드들을 통해 "의존적" 인게 무엇이고, "주입"이 무엇을 의미하는지 좀 더 쉽게 알 수 있었다.
public interface MyService { void doSomething(); } public class MyServiceImpl implements MyService { @Override public void doSomething() { System.out.println("Doing something!"); } }public class MyApp { private MyService myService; // @Autowired 어노테이션을 사용하여 의존성 주입 @Autowired public void setMyService(MyService myService) { this.myService = myService; } public void run() { myService.doSomething(); } }일단 당장 저 @Autowired 어노테이션은 무시해보자. 자바를 배운 내 기준으로는, MyApp 클래스의 setMyService 메서드는, 실행하기 위해서 MyService타입의 매개변수가 필요하다는 것을 볼 수 있다.
그리고 그 매개변수를 전달받았을 때만 this.myService = myService; 코드가 실행될 것이다.
다음으로, MyApp에서 아무 값 없이 선언하여 Null값이었던 변수에 매개변수로 받은 myService가 들어간다.
그런 다음에야 public void run() 메서드에서, 매개변수를 받아서 값을 넣어주었던 private MyService myService 인스턴스의 doSomething() 메서드를 실행할 수 있을 것이다.
이렇게 MyApp 클래스의 기능들을 사용하려면, 결국 MyService 타입의 변수가 필요한데, 이때를 "MyApp 클래스는 MyService 타입의 객체에 의존적이다" 라고 말할 수 있다.
그리고 이렇게 MyApp 클래스의 기능들을 사용하기 위해 setMyService 메서드에 "MyService 타입의 객체" 매개변수를 넣어주는 것을 "주입 한다" 라고 한다.
"스프링에서 의존성 주입을 자동으로 이행한다" 는 말은, 이렇게 풀어서 이해하면 좋을 것 같다.
자바에서 내가 직접 매개변수가 필요한 메서드를 사용하려면, 해당 메서드를 가진 클래스 객체를 생성하고, 생성한 객체에 매개변수를 전달해서 해당 메서드를 실행해야 한다. 하지만 스프링에서는 이 과정을 자동으로 할 수 있다.
이렇게 풀어서 설명하다 보니, 막상 저 "의존성 주입"이라는 단어에 머리가 아팠던게 이상하게 느껴진다.
그냥 이젠 자바를 쓸때 당연하게 느껴지는 " 메서드에 매개변수 넣어서 쓴다 " 는 개념이었는데.
다음엔 이렇게 풀어서 설명하다 보면 Annotation을 스스로 이해하는데도 도움이 될 것 같다.
화이팅!