프로그래밍/JAVA Spring

[Spring 스프링] 스프링은 뭐지? 왜 스프링을 쓸까?

hectick 2023. 7. 2. 14:54

 

우테코 레벨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를 지킬 수 있도록 도와준다.