우테코 레벨2를 시작하는 처음에 궁금했던 내용인데, 스프링 사용법과 미션 구현에 쫓기다가 궁금증을 해결하지 못하고 레벨2가 끝나버렸다. 거기다가 레벨 인터뷰때 도기가 이 질문을 해줘서 나의 빈공간을 잘 찔러주었다. 이렇게 궁금증 해소를 미루던 와중에! 이번 방학때 인프런에서 김영한님의 강의를 듣다가 어느정도 가닥이 잡힌 것 같아서, 생각난김에 이번에 알게된 내용을 정리 해보려 한다.
스프링은 뭐지?
🧐 스프링?
스프링은 여러가지 기술들의 모음이다.
스프링에서 핵심이 되고, 필수적으로 사용되는 기술로는 스프링 프레임워크와 스프링 부트가 있고,
선택적으로 더 많은 기술들을 적용할 수 있다.
스프링 사이트에서 다른 기술들로는 뭐가 있는지 확인할 수 있다.
🧐 스프링 프레임워크?
스프링에서 핵심이 되는 것이 스프링 프레임워크이다.
아래의 기술들을 통합해서 스프링 프레임워크라고 한다.
핵심 기술: 스프링 DI 컨테이너, AOP, 이벤트, 기타
웹 기술: 스프링 MVC, 스프링 WebFlux
데이터 접근 기술: 트랜잭션, JDBC, ORM 지원, XML 지원
기술 통합: 캐시, 이메일, 원격 접근, 스케줄링
테스트: 스프링 기반 테스트 지원
언어: 코틀린, 그루비
🧐 스프링 부트?
스프링을 편리하게 사용할 수 있도록 지원하는 기술로, 최근에는 기본으로 사용한다.
웹서버 톰캣을 내장하고 있어서 배포할 때 별도의 웹 서버를 설치하지 않아도 된다는 점, 라이브러리 하나를 사용하려고 하면 연관된 다른 라이브러리도 같이 제공한다는 점, 라이브러리의 버전을 알아서 판단해서 개발자가 버전을 판단하지 않아도 된다는 점 등 스프링 부트를 사양하면 다양한 이점을 얻을 수 있다.
왜 스프링을 쓸까?
😎 스프링의 핵심 개념
스프링은 자바 언어 기반의 프레임워크이다.
그리고 자바 언어의 가장 큰 특징인 객체지향을 잘 살려내는 프레임워크이다.
즉, 좋은 객체 지향 어플리케이션을 개발할 수 있도록 도와주는 프레임워크인 것이다.
(과거의 EJB라는 프레임워크는 순수한 객체 지향과는 멀어지는 경향이 있었다.)
어떻게 좋은 객체 지향 어플리케이션을 개발할 수 있도록 도와주나면,
스프링은 객체지향의 핵심인 다형성을 극대화해서 사용할 수 있게 해주고,
뿐만 아니라, 좋은 객체지향 설계 원칙인 SOLID 원칙 중 OCP와 DIP가 지켜지도록 지원한다.
🧐 다형성(Polymorphism)?
다형성이란 하나의 형태로 여러가지 동작을 할 수 있는것이다.
자바에서는 인터페이스와, 인터페이스를 구현한 클래스를 통해 다형성을 구현한다.
즉, 역할(인터페이스)과 구현(인터페이스를 구현한 클래스)을 명확히 분리하는 것이다.
역할과 구현을 분리함으로써 세상이 단순하고 유연해지며, 변경도 편리해진다.
- 클라이언트는 대상의 역할(인터페이스)만 알면 된다.
- 클라이언트는 구현 대상의 내부 구조를 몰라도 된다.
- 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않는다.
- 클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않는다.
역할과 구현을 구분한 예시로 다음 그림을 보면,
자동차의 구현이 K3, 아반떼, 테슬라 모델3로 바뀌어도 운전자에게 영향이 없는 형태를 확인할 수 있다.
운전자는 자동차 역할이라는 인터페이스만 아는 것이고, 자동차의 내부 구현은 몰라도 되는 것이다.
이런 형태라면, 자동차 세상이 무한이 확장 가능해진다.
새로운 자동차가 나오더라도 자동차 구현만 하나 더 추가하고, 필요하면 바꿔주면 되는 것이다.
다른 자동차 구현으로의 대체 가능성이 생긴다는 것, 그것이 곧 유연하고 변경가능함이다.
위의 예시에서 운전자와 자동차가 협력 관계를 가진 다는 것을 볼 수 있듯이, 프로그래밍을 하다보면,
혼자 있는 객체는 없고, 모든 객체는 협력 관계를 가지게 되는 것을 알 수 있다.
마찬가지로 서버와 클라이언트도 협력 관계를 가진다.
여기에 다형성을 이용한다면, 클라이언트를 변경하지 않고도, 서버의 구현 기능을 유연하게 변경할 수 있게 된다.
그러니까 다형성의 본질을 잘 지키기 위해선, 역할과 구현을 분리하고, 역할(인터페이스)을 안정적으로 잘 설계하는 것이 중요하다.
(인터페이스를 잘못 설계해서 인터페이스를 바꾸어야 하는 상황이 오면 서버와 클라이언트도 변경될 수 있다 ㅠㅠ)
🧐 SOLID 원칙?
SOLID 원칙은 총 5가지로 다음과 같다.
- SRP(단일 책임 원칙)
- OCP(개방-폐쇄 원칙): 소프트웨어 요소는 확장에는 열려있으나, 변경에는 닫혀 있어야 한다.
- LSP(리스코프 치환원칙)
- ISP(인터페이스 분리 원칙)
- DIP(의존관계 역전 원칙): 구체화에 의존하면 안되고, 추상화에 의존해야 한다.
자바 언어로 아무리 다형성을 지킬 수 있게 코딩을 하더라도, OCP와 DIP를 지키기는 쉽지 않다.
왜냐하면 코드의 어디선가는 직접 구현 클래스를 바꾸어줘야 하기 때문에 변경이 발생한다. -> OCP 깨짐
그리고 직접 구현 클래스를 바꿔준다는 것은, 구현 클래스(구체화)를 알고 있다는 뜻이기도 하다. -> DIP 깨짐
이렇게 OCP와 DIP가 깨지는 문제 상황을 해결하려면,
객체를 생성하고, 연관 관계를 맺어주는 별도의 조립, 설정자가 필요하다.
그 역할을 스프링이 의존 관계 주입 기술을 이용해 해주는 것이다.
😎 정리!
스프링은 객체지향의 핵심인 다형성 이용을 극대화하면서 OCP, DIP를 지킬 수 있도록 도와준다.
'프로그래밍 > JAVA Spring' 카테고리의 다른 글
버저닝 ... (5) | 2023.10.15 |
---|---|
Servlet과 DispatcherServlet (0) | 2023.09.25 |
[Spring 스프링] 외부 파일을 이용한 Configuration 그런데 이제 @PropertySource와 @Value를 곁들인 (0) | 2023.05.15 |
[Spring 스프링] Java기반 Configuration (0) | 2023.05.15 |
[Spring 스프링] xml기반 Configuration (0) | 2023.05.15 |