이전 포스팅에서 자바의 다형성 만으로는 SOLID 원칙을 모두 지키기 어렵다고 했었죠?
그래서 스프링이 나왔고,
어떻게 객체지향을 지키기 위해 설계 되었는지 보시면 좋을 것 같네요. 🙃
그럼 스프링은 어떻게 이문제를 해결하려고 하는거야 ?
다형성 만으로는 SOLID 원칙을 모두 지키면서 개발하려면 할일이 너무 많아져 버렸어요.
역시 귀찮은 것을 병적으로 싫어하는 개발자는 이것을 한방에 해결할 수 있는 툴을 만들어버렸습니다.
이게 바로 스프링 프레임워크 ㅎㅎ
클라이언트 코드의 변경없이 확장할 수 있도록 구현체를 의존하지 않고 역할만 의존하도록, 그래서 다형성을 지키며 OCP, DIP를 쉽게 피할 수 있도록, 결국 스프링의 태생은 객체지향 원칙을 지킬 수 있도록 도와주기 위해 생겨 난 것입니다. 그것도 아주 쉽게.!! 어떻게 Dependency Injection (의존관계 주입), DI 컨테이너 기술을 활용해서 😝
DI가 중요하다며 ?
그러면 스프링의 핵심 기술 중 하나인 DI (Dependency Injection)는 뭘까요?
어떻게 객체 지향을 도와줄까요?
의존관계란 토비의 스프링의 이일민님은 "의존대상 B가 변하면, A에 영향을 미친다" 라고 정의 했어요.
참조하는 대상이 변하면 그 대상을 참조하는 녀석도 변한다는 거에요.
그 의존관계를 외부에서 설정해 준다고 해서 Dependency Injection 의존관계 주입이라고 합니다.
예를 들어 Computer가 keyboard를 활용하기위해 의존관계를 맺는다고 해볼게요.
class Computer {
private final Keyboard keyboard;
public Computer(Keyboard keyboard){
this.keyboard = keyboard
}
}
Computer가 생성될 때 Keyboard를 누군가 외부에서 설치해주면 Computer는 Keyboard의 구현체를 직접 선택하지 않아도 되겠죠? 키보드가 리얼포스 키보드든 해피해킹 키보드이든 간에 Computer는 Keyboard의 역할만 의존하면 되는 거에요. Computer는 키보드가 무엇인지 몰라도 되고, 실행 시점에서 외부에서 구현된 키보드를 전달받아서 연결만 하는 거죠.
스프링은 이처럼 computer같은 클라이언트 코드가 추상화된 인터페이스만 바라보도록 해서 코드가 변경되지 않도록, 또한 OCP, DIP를 위반하지 않도록 의존관계 주입을 제공합니다. 어떻게? DI 컨테이너를 이용해서
그럼 DI 컨테이너는 ?
ioc 컨테이너, spring 컨테이너라고도 불리는데 의존관계 주입에 중점을 두는 말인 DI 컨테이너가 가장 와닫는 것 같아요. 스프링에서 제공하는 DI 컨테이너는 의존관계를 주입할 수 있도록 별도의 공간에서 객체를 관리하는 것을 말하는데요. 의존관계를 가진 객체를 Config 클래스에서 생성한다고 가정했을때 Computer 클래스에서 keyboard를 주입해줄때 직접 keyboard를 생성하지 않고 Config에서 해당 클래스를 생성하고, 어떤 구현체를 사용할 것인지 설정만 해주고 스프링에서 관리하는 DI컨테이너에서 보관하면 해당 객체를 원할때마다 꺼내서 사용하도록 설계한 것입니다.
스프링은 DI컨테이너라는 공간에 객체를 보관해서 의존관계를 주입할 때 꺼내서 사용하도록 만들어 객체지향의 원칙을 지킬 수 있도록 도와준다라고 이해하시면 좋을 것 같네요.
spring을 알기 위해서는 객체지향설계, 다형성 정말 여러가지 개념을 알아야 하는 것 같아요.
재밌지 않으신가요? ㅎㅎ 🙃
점차 꼬리에 꼬리를 무는 개념을 차근차근 공부하시다보면 어느순간
아! 유레카 하실 거라고 믿고 있습니다.
이번 글을 쓰면서 제가 이해하는 방향으로 쉽게 설명하고자 했는데 부족하다는 것을 많이 느끼게 되는 것 같네요.
저 역시 쉽게 설명할 수 있도록 더 깊고 올바르게 공부해 나가도록 하겠습니다.
읽어 주셔서 감사드리고 잘못된 내용 있으면 지적해주시면 감사하겠습니다. 🙏
Reference
https://www.baeldung.com/spring-dependency-injection - 스프링의 의존관계 주입
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8 - 스프링 핵심원리 - 기본편 (김영한)
'Spring' 카테고리의 다른 글
JPA n+1 문제는 왜 생기는걸까? (0) | 2023.05.06 |
---|---|
서블릿(Servlet)이 뭔지 궁금해? (0) | 2023.03.09 |
SOLID에 대해서 쉽게 알려줄게 with spring #2 (0) | 2023.01.23 |
좋은 객체 지향 설계란? with spring #1 (0) | 2023.01.15 |
Spring Boot에서 GraphQL 활용법 (1) | 2022.05.22 |