Framework/Spring

[Spring] 스프링 프레임워크가 뭘까?

KOOCCI 2022. 7. 22. 22:50

목표 : 스프링(Spring)이 무엇인지 설명할 수 있다.


더보기

서론이자 내 생각..

스프링을 별도로 공부한 적은 많이 있지만, 글을 적으려고 할 때마다, 그리고 너무 겉핥기로 알고 있다보니 난감한 부분이 있다.

특히나 어려운 부분은, 오랫동안 발전해왔고 그 히스토리를 온전히 공부하면서 쌓아가야하는 건 아닐까 하는 생각이 항상 들어, 어디부터 어떻게 시작해야하는지 감이 잘 잡히지 않는다. 게다가 Spring Security, Data, Batch, Cloud, JPA 등등 너무도 다양해지는 탓에 어떻게 시작해야하는지 모르는 경우가 많았다.

 

무작정 토비의 스프링을 들고 공부하면 될지, 아니면 스프링부트로 API 서버 만드는 법부터 하면 되는 건지, JSP를 비롯한 이제는 점점 Legacy라는 단어로 표현되는 부분부터 차근히 발전한 과정을 쌓아올려야 할지, 어디부터 알면 되는 건지에 대한 부담감에 선뜻 도전하기 어렵고, 그래서 당장 필요한 부분만 보고 흐지부지 된 적도 많았다.

 

사실 지금도 어디부터 봐야할지 잘 모르겠지만, 언젠가는 따라가겠지라는 마음으로 하나씩 진행해 보고자 한다.

Spring 은 프레임워크다.

스프링은 프레임워크다.

 

프레임워크라 함은 쉽게 말해 사용법을 잘 알면 하고자 하는 일을 쉽게 할 수 있게 도와주는 뼈대이다.

즉, 개발자가 사용법에 맞게 작성을 하면, 프레임워크는 Main 함수를 실행시켜 개발자가 작성한 내용을 목적에 맞게 구동시켜 준다.

 

이제 2가지 의문이 나온다.

  1. 스프링은 무엇을 도와주는가?
  2. 스프링의 사용법은 어떻게 되는가?

스프링은 무엇을 도와주는가?

스프링은 웹 프레임워크다.

자바, Kotlin 등의 언어로 웹 서비스를 만들고자 할 때, 좀더 쉽게 만들 수 있도록 도와준다. (자바를 기준으로 설명할 것이다)

조금더 구체적으로 말해보자.

 

스프링은 자바 엔터프라이즈(JAVA EE) 애플리케이션 개발을 쉽게 도와주는 프레임워크다.

 

옛날에 자바를 통한 서버 개발에 필요한 기능을 모아서 J2EE(현재의 Java EE) 표준을 만들었고 특히, 핵심 기술인 EJB를 사용해 왔으나 이에 대한 불편함과 난이도가 매우 높았다.

따라서, 스프링은 이를 해소하고자 하여 나오게 된 프레임워크다.

그 상세한 내용은 이 링크를 확인하도록 하자.

 

자바로 웹 서비스를 만들고자 한다면 Java EE API 중 하나인 서블릿(Servlet)이라는 친구의 도움이 필요하다.

서블릿정적인 HTML의 한계를 극복하고 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 사양을 뜻한다.

쉽게 말하면, 자바로 웹 서비스를 개발하기 위해 만들어진 표준 혹은 그 프로그램이다.

 

표준이라는 점을 먼저 주목하자.

JAVA SE (Standard Edition)에서 Enterprise Edition으로 버전이 달라질 때, 추가되는 javax API들을 보자.

https://docs.oracle.com/javaee/7/api/toc.htm

 

Java(TM) EE 7 Specification APIs

 

docs.oracle.com

 

javax.servlet 라는 친구가 눈에 띌 것이다.

여기 만들어져 있는 Interface들이 앞서 말했던 Servlet, 자바로 웹 서비스를 개발하기 위해 만들어진 표준 인터페이스다.

 

이 스팩을 다양한 벤더들 (Apache Tomcat, 티맥스의 jeus)이 이를 구현하여, 구현체로서 그 구동 환경을 제공하고 있으며, 이를 서블릿 컨테이너라고 한다.

 

그 중, Apache Tomcat은 오픈소스 자바 서블릿 컨테이너로 Servlet 뿐만 아니라 JSP, WebSocket 등 핵심적인 자바 엔터프라이즈 영역을 구현하였으며, 가장 많이 사용하는 WAS 중 하나다.

 

요즘은 서블릿 컨테이너를 별도로 쓰지 않고, 서비스에 내장한 형태의 Embedded Tomcat, Undertow 등을 많이 사용하지만 이전에는 Apache Tomcat을 별도로 설치하고, WAR파일과 연결하기도 했다. (아직 우리 회사에서는 이렇게 쓰는 곳이 많이 있다) 

더보기

요즘엔 대부분 Spring Boot로 하거나, 최소 Spring 3.0 이상인 프로젝트가 많다보니 잘 쓰지 않지만, servlet을 만들어 Controller 로서 요청을 처리할 수 있게 만들고, web.xml을 통해서 servlet 이름, 클래스를 매핑하는 작업이 필요했다. (이제는 어노테이션으로 다 처리한다)

아무튼 Spring서블릿 컨테이너를 통해 훨씬 간편하게 배포할 수 있고, 이전 EJB때보다 Dependency도 매우 많이 해소가 된 것이다. 

 

Servlet Container 를 잠시 정리하고 가자.

서블릿 컨테이너 servlet Interface의 method에 의해서 정의된 Life Cycle (Init, service, destroy)을 구현하였고, 자연스럽게 서블릿을 관리하게 된다.

 

조금 상세하게 풀어서 순서를 정리해보자.

  1. 서블릿 컨테이너가 시작할 때 해당 프로젝트에 대한 모든 서블릿을 가지고 있는다. (서블릿 인스턴스를 싱글턴으로 갖고 있다 - 서블릿 컨테이너가 살아있는 한, 메모리에서 해제되지 않는다.)
  2. 클라이언트로부터 요청이 들어왔을 때, Request(HttpServletRequest)와 Response(HttpServletResponse) Instance 를 생성한다.
  3. 사용자의 요청 URL을 분석하여, 어떤 서블릿이 담당인지 찾아내고, 해당 서블릿 스레드를 생성하여 앞서 생성한 Request, Response객체를 전달한다. 
  4. 이 때, 컨테이너는 서블릿의 service() 메소드를 호출해 request, response 객체를 전달하고 메소드에 따라, doGet, doPost 등의 메서드가 호출된다.
  5. 해당 메서드에서는 response에 응답하고자 하는 내용을 작성한다.
  6. 서블릿 컨테이너는  response 객체를 클라이언트로 전달하고, request, response 객체를 소멸시킨다.
  7. 서블릿 인스턴스는 사라지지 않고, 여러 요청에 대한 처리를 서블릿 컨테이너가 멈추기 전까지 계속 진행한다.

 

그럼 Servlet과 Spring Framework 는 무슨 관계가 있는가?

열심히 servlet이라는 것과 servlet container에 대해 알아보았다.

이제 Spring Framework와 연결시켜 보도록 하자.

 

Javax.servlet 인터페이스는 상속관계로 서블릿 컨테이너부터 Spring까지 이어지게 된다.

https://velog.io/@jakeseo_me/%EC%9E%90%EB%B0%94-%EC%84%9C%EB%B8%94%EB%A6%BF%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90.-%EA%B7%BC%EB%8D%B0-%ED%86%B0%EC%BA%A3%EA%B3%BC-%EC%8A%A4%ED%94%84%EB%A7%81%EC%9D%84-%EC%82%B4%EC%A7%9D-%EA%B3%81%EB%93%A4%EC%9D%B8

 

Tomcat을 기준으로, 서블릿 인터페이스는 HttpServlet까지 구현이 되었다.

그리고, Spring에서는 DispatcherServlet까지 이를 그대로 받아서 구현한다.

 

이제 다시 주제로 돌아가자.

정리하자면 다음과 같다.

 

  • 최초에 서버 개발을 위한 Java EE 표준이 나왔을 때는 표준에 포함된 Servlet, JSP등으로 인해 각광을 받았다.
  • 수많은 서버가 Java EE 표준에 맞추어 어플리케이션 서버를 개발하였으나, EJB 중심의 서버에 대한 불편함과 난이도가 높아, Spring이 등장하였다.
  • 특히, EJB 없이 개발하는 방법에 대한 내용이 주가 되었으며 그 핵심이 DI 등 현재 Spring에 중심이 되는 컨셉들이다.

 

그럼, 스프링은 무엇을 도와주는가?

 

기존에 어렵던 서버 통신, 트랜젝션과 같은 기능들을 조금의 학습만 한다면, 이제는 잊혀질 정도로 어려웠던 사항을 쉽고 간편하게 개발할 수 있도록 도와주는 프레임워크다.

 

결론

스프링 프레임워크가 주는 의문 두가지,

  1. 스프링은 무엇을 도와주는가?
  2. 스프링의 사용법은 어떻게 되는가?

중에서 첫번째, 스프링은 무엇을 도와주는가? 에 대해 알아보았다.

그리고, 다음에는 그 사용법에 대해 알아볼텐데 몇가지 용어 정리가 필요할 것이다.

IoC, Bean 등의 개념부터 잡고 가도록 하자.