본문 바로가기

Development/Spring

[Spring] JSP/Servlet부터 Spring, 그리고 Springboot 까지

JSP/Servlet

  • 초기의 웹 개발에서는 Java Servlet을 통해 웹 애플리케이션을 개발하였습니다.
  • Servlet이란 웹 어플리케이션을 생성하는 데 사용되며, 서버 측에 위치하며 동적인 웹 페이지를 생성합니다.
  • Servlet은 클라이언트의 요청을 처리하고 그 결과를 다시 클라이언트에게 전송하는 Servlet 클래스의 구현을 통해 이루어지게 됩니다.
  • Servlet API에는 Servlet, GenericServlet, HttpServlet, ServletRequest, ServletResponse 등과 같은 많은 인터페이스와 클래스가 있습니다. 
  • Servlet 이전에는 CGI(Common Gateway Interface) 스크립팅 언어가 서버 측 프로그래밍 언어로서 일반적이었습니다.
  • 그러나 이 기술에는 많은 단점이 있었습니다.

CGI (Common Gateway Interface)

CGI 기술은 웹 서버가 외부 프로그램을 호출하고, HTTP 요청 정보를 해당 외부 프로그램에 전달하여 요청을 처리하게 합니다. 각 요청에 대해 새로운 프로세스를 시작합니다.


CGI와 Servlet의 비교

 

CGI의 단점 

  1. 클라이언트의 수가 증가하면 응답을 보내는 데 더 많은 시간이 걸립니다.
  2. 각 요청마다 프로세스를 시작하며, 웹 서버는 프로세스를 시작하는 데 제한이 있습니다.
  3. 플랫폼에 종속적인 언어를 사용합니다. 예를 들어, C, C++, Perl 등입니다. 

CGI에 비해 Servlet의 장점들은 다음과 같습니다.

  1. 성능: 각 요청마다 쓰레드를 생성하므로, 프로세스를 생성하는 것보다 성능이 뛰어납니다.
  2. 이식성: Java 언어를 사용하기 때문에 이식성이 좋습니다.
  3. 강건함: JVM이 Servlet을 관리하므로, 메모리 누수나 가비지 컬렉션 등에 대해 걱정할 필요가 없습니다.

Servlet을 사용한 웹 애플리케이션 동작은 다음과 같습니다.

웹 컨테이너는 Servlet에 대한 다수의 요청을 처리하기 위해 쓰레드를 생성합니다. 쓰레드는 공통 메모리 영역을 공유한다는 점, 가벼움, 쓰레드 간의 통신 비용이 낮다는 점 등에서 프로세스보다 많은 이점을 가지고 있습니다.

 

하지만 Servlet 코드 안에 Java 코드와 HTML이 섞여 있어서 코드의 가독성과 유지보수가 어렵다는 단점이 있었습니다. 이를 해결하기 위해 나온 기술이 JSP(Java Server Pages)입니다. JSP는 HTML 코드 안에 Java 코드를 넣는 방식으로, 웹 페이지를 쉽게 만들 수 있게 도와줍니다.

 

JSP 기술은 Servlet 기술과 같이 웹 어플리케이션을 생성하는 데 사용됩니다. 이는 표현 언어, JSTL 등 Servlet보다 더 많은 기능을 제공하므로 Servlet의 확장으로 생각할 수 있습니다. JSP 페이지는 HTML 태그와 JSP 태그로 구성됩니다. JSP 페이지는 디자인과 개발을 분리할 수 있으므로 Servlet보다 유지 관리가 더 쉽습니다.

 

JSP를 사용한 간단한 예제입니다.

 

index.jsp

<!DOCTYPE html>
<html>
<head>
    <title>이름 입력</title>
</head>
<body>
    <form action="welcome.jsp">
        이름: <input type="text" name="name" />
        <input type="submit" value="제출" />
    </form>
</body>
</html>

 

welcome.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <title>환영합니다</title>
</head>
<body>
    <%
        // 사용자가 입력한 이름을 가져옵니다.
        String name = request.getParameter("name");
    %>
    <h1>환영합니다, <%= name %>님!</h1>
</body>
</html>

이 예제를 실행하려면 웹 서버에 두 개의 JSP 파일을 배포하고, 웹 브라우저에서 `index.jsp` 페이지를 열어 이름을 입력하고 제출하면 됩니다. 그러면 `welcome.jsp` 페이지에서 입력한 이름을 포함한 환영 메시지가 출력됩니다. 

Spring Framework

그러나 Servlet이나 JSP만으로는 큰 프로젝트를 진행하기에는 무리가 있었습니다.

이를 해결하기 위해 등장한 것이 Spring Framework입니다.

 

2003년에 Rod Johnson에 의해 개발되었습니다. Spring Framework는 JavaEE 애플리케이션 개발을 쉽게 만들어 줍니다.

Spring Framework는 IOC, AOP, DAO, Context, ORM, WEB MVC 등 여러 모듈로 구성되어 있습니다. 

 

특히 Spring은 IoC(Inversion of Control), DI(Dependency Injection), AOP(Aspect-Oriented Programming) 등 다양한 기능을 제공하여 개발자가 보다 편리하게 개발할 수 있도록 도와주는 프레임워크입니다.

Inversion of Control and Dependency Injection

제어 역전(Ioc)과 의존성 주입(DI)은 프로그래밍에서 의존성을 제거하기 위해 사용되는 디자인 패턴들입니다.

이들은 코드를 더 쉽게 테스트하고 유지보수하는 데 도움이 됩니다.

다음 코드를 통해 이를 이해해봅시다.

class Employee{  
    Address address;  
    Employee(){  
	    address=new Address();  
    }  
}

이 경우, Employee와 Address 사이에 의존성이 있습니다(tight coupling).

 

제어 역전(IoC) 시나리오에서는 이를 다음과 같이 처리합니다

class Employee{  
	Address address;  
	Employee(Address address){  
		this.address=address;  
	}  	
}

따라서, IoC는 코드를 느슨하게 결합(loose coupling)시킵니다.

이 경우, 로직이 새로운 환경으로 이동하더라도 코드를 수정할 필요가 없습니다.

 

예를 들어, Address를 생성하기 위해 특정 인자를 필요로 한다고 수정되었다면 Address 객체를 직접 생성하는 모든 클래스에

인자를 추가해야합니다. 그런데 외부에서 객체를 주입 받는다면 그 객체의 수정에 대해 신경 쓸 필요가 없어집니다.

이를 통해 코드의 유연성을 높이고 유지보수를 용이하게 만듭니다.

 

Spring Framework에서, IoC 컨테이너가 의존성을 주입하는 역할을 담당합니다.

개발자는 XML 파일이나 어노테이션을 통해 IoC 컨테이너에 메타데이터를 제공합니다.

 

또한, MVC(Model-View-Controller) 패턴을 쉽게 적용할 수 있도록 도와줍니다. 이를 통해 개발자는 비즈니스 로직에 집중할 수 있게 되었고, 코드의 재사용성과 유지보수성이 향상되었습니다.

Spring AOP(Aspect Oriented Programming)

AOP는 모듈성(modularity)을 제공함으로써 객체 지향 프로그래밍(OOP)을 보완합니다.

모듈성의 핵심 단위는 클래스보다는 관점(aspect)입니다. AOP는 프로그램 로직을 분명하게 분리한 부분들(관심사라고 부름)로 나눕니다. 이는 관심사의 횡단적인 분리를 통해 모듈성을 높이는데 사용됩니다.

 

AOP의 주요 관심사는 전체 애플리케이션에 영향을 줄 수 있는 기능을 가능한 한 코드의 한 위치에서 집중화해야 하는 것입니다.

예를 들어, 트랜잭션 관리, 인증, 로깅, 보안 등이 있습니다.

Springboot

Spring Framework를 이용하여 개발할 때, 설정을 위한 XML 작성, 라이브러리 의존성 관리 등 복잡한 설정이 필요하다는 단점이 있었습니다. 이러한 문제를 해결하기 위해 나온 것이 Springboot입니다.

 

Spring Boot는 Spring에서 반복적으로 사용되는 설정을 자동화하여 개발자가 빠르게 웹 애플리케이션을 개발할 수 있도록 도와주는 도구입니다. 또한, 내장 Tomcat, Jetty 등의 WAS를 포함하고 있어 별도의 WAS 설치 없이 웹 애플리케이션을 실행할 수 있습니다.

예를 들어, Spring Boot는 Spring MVC, Spring Data JPA, Spring Security 등의 기능을 자동으로 설정하며, 개발자가 별도로 설정 파일을 작성하지 않아도 사용할 수 있습니다.

참고 자료

https://www.javatpoint.com/servlet-tutorial

 

Learn Servlet Tutorial - javatpoint

Learn Servlet Tutorial - java servlet tutorial, Servlet API, servlet Interface, Generic servlet, advantage of servlet, what is servlet

www.javatpoint.com

https://www.geeksforgeeks.org/introduction-to-jsp/

 

Introduction to JSP - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

https://www.javatpoint.com/spring-tutorial

 

Learn Spring Tutorial - javatpoint

Learn Spring Tutorial. This spring tutorial for beginners and professionals provides in depth learning of DI, AOP, Data Access, MVC, Remoting, ORM and Integration.

www.javatpoint.com

https://www.inflearn.com/blogs/3315

 

spring 과 springBoot의 차이점 - 고승조님의 블로그 - 인프런 | 커뮤니티

spring 과 springBoot의 차이점 - Spring과 Spring Boot는 모두 스프링 프레임워크를 기반으로 한 자바 웹 개발 프레임워크입니다. 둘 간에는 몇 가지 차이점이 있습니다.Spring은 스프링 프레임워크의 핵심

www.inflearn.com