본문 바로가기

Frame Work/Spring

Spring FrameWork 특징

 

1) 경량 프레임 워크 

 

크기 측면에서 가볍고 POJO 형태로 객체를 관리합니다.

 

2) 제어의 역행 (Inversion of Control)

 

우리가 비지니스 컴포넌트를 개발할 때 항상 신경 쓰는 것이 낮은 결합도와 높은 응집도입니다. 

 

제어의 역행은 결합도와 관련된 특징으로 객체 사이의 의존 관계를 만들고 처리하는 권한이 원래는 개발자에게 있었지만 이러한 일련의 작업들을 소스코드로 처리하지 않고 컨테이너에게 처리를 하게 하는 것을 의미합니다.

 

즉, 결합도가 높다는 것은 하나의 클래스가 다른 클래스와 얼마나 많이 연결되어 있는지를 나타내며 유지보수가 어렵습니다. 반대로 낮다는 것은 객체의 생성과 의존관계에 대한 코드가 사라지기 때문에 결합도가 낮아지고 이는 유지보수 하기가 수월하다는 것을 의미합니다. 

 

따라서 제어의 역행을 사용하면 결과적으로 낮은 결합도의 컴포넌트를 구현할 수 있으며 스프링은 객체 간의 DI(Dependancy Injection) 방식을 통해 느슨한 결합(낮은 결합도)을 유지 시킬 수 있습니다.

 

 

3) 관심지향 프로그래밍(Aspects Oriented Programming, AOP )

 

AOP 방식을 통해 공통된 기능을 분리하면서 응집도가 높은 프로그램을 개발할 수 있도록 합니다.

 

 

4) 컨테이너

 

애플리케이션의 운용에 필요한 객체를 생성하고 객체 간의 의존관계를 관리한다는 점에서 스프링도 일종의 컨테이너라고 할 수 있습니다. 스프링을 이해하는데 가장 중요한 역할을 하는 것 또한 컨테이너입니다.

 

간단한 예제를 만들어서 스프링의 컨테이너 동작 방식의 이해를 돕고자 합니다. 

 

* src/main/java 밑에 glory.spring.servlet 생성

 

Class 생성이 아닌 Servlet 생성을 클릭해야 합니다.

 

package glory.spring.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public HelloServlet() {
    	System.out.println("HelloServlet 객체 생성");
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doGet() 메서드 호출");
	}


}

- Get 방식을 사용

 

* src /WEB-INF/ web.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="5.0">
  <display-name>myfirst</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>default.htm</welcome-file>
  </welcome-file-list>
  <servlet>
    <description></description> // 설명이라 의미없음
    <display-name>HelloServlet</display-name> // display는 의미없는 설명이다.
    // 이 아래의 name의 해당하는 servlet-class로 찾아간다.
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>glory.spring.servlet.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    // 아래 url 패턴으로 접속하면 위의 servlet-name에 해당하는 servlet으로 Mapping 한다.
    <url-pattern>/HelloServlet</url-pattern>
  </servlet-mapping>
</web-app>

 

* 확인하기 

 

해당 url 접속 시 메소드가 자동적으로 실행되는 모습 확인

 

※ 여기서 중요한 것은 HelloServlet class의 코드에서 객체를 생성한 흔적도, doGet 메소드를 호출한 적도 없는데 웹에 접근하면 해당 객체를 생성하고 메소드를 실행했다는 것입니다. 

 

그렇다면 이것을 누가 불렀을까? 바로 서블릿 컨테이너(Tomcat)에서 호출 한 것입니다.  

 

* 서블릿 컨테이너 동작 순서 

 

1) WEB-INF/web.xml 파일을 로딩하여 구동

 

2) 브라우저로부터 /hello.do 요청을 수신

 

3) tommy.spring.servlet.HelloServlet 클래스를 찾아서 객체를 생성하고 doGet() 메서드 호출

 

4) doGet() 메서드의 실행 결과를 브라우저로 전송

 

 

위와 같은 동작 방식과 유사하게 스프링의 컨테이너도 동작합니다. 자세한 동작 방식은 다음 포스팅에서 자세히 다루어 보겠습니다. 

 

 

'Frame Work > Spring' 카테고리의 다른 글

Spring JDBC  (0) 2022.10.21
Spring AOP  (0) 2022.10.20
Spring DI  (0) 2022.10.19
Spring FrameWork 목적 및 POJO 방식  (2) 2022.10.14
Spring FrameWork 정의  (0) 2022.10.13