Servlet? JSP? JavaBeans? 평소 헷갈렸던 개념들을 쭉 나열하고 하나씩 이해해 보았습니다. 나아가 이를 통해 스프링 프레임워크가 얼마나 큰 개념들을 함께 내포하고 있는지도 간략히 살펴보았습니다.
자바 웹 애플리케이션을 이해하기 위한 개념들에 대해 알아봅시다.
Java Servlet은 Java를 이용하여 웹 어플리케이션을 작성할 수 있는 인터페이스(API)를 제공합니다. Java Servlet API를 이용하면 웹 클라이언트의 요청과 응답을 처리하고, 데이터베이스 연결, 파일 업로드, 보안 인증 등 다양한 웹 개발에 필요한 기능을 구현할 수 있습니다.
javax.servlet
, javax.servlet.http
패키지안에 서블릿 작성을 위한 인터페이스와 클래스가 있습니다. 아래의 “서블릿 구성요소”에서 후술합니다. 특히 HttpServlet
클래스는 HTTP 관련 서비스를 처리하기 위해 doGet
및 doPost
와 같은 메서드를 제공합니다.
JSP는 Java Servlet 기술을 확장하여, HTML 문서 안에 Java 코드를 삽입할 수 있도록 해줍니다. 이렇게 함으로써, 웹 개발자는 더욱 쉽게 동적인 웹 페이지를 생성하고, 데이터베이스와의 상호작용 등을 수행할 수 있습니다.
Spring Framework는 Java Servlet API를 기반으로 하며, 의존성 주입, AOP(Aspect-Oriented Programming), MVC(Model-View-Controller) 패턴, 데이터 액세스, 보안 등 다양한 기능을 제공합니다. Spring Framework를 사용하면 Java 기반의 웹 어플리케이션을 더욱 빠르고 효율적으로 개발할 수 있습니다.
따라서, JSP와 Spring Framework는 Java Servlet을 기반으로 하고 있으며, 이를 이용하여 웹 개발을 보다 쉽게하고, 효율적으로 할 수 있도록 도와줍니다.
서블릿의 기본 구성 요소는 다음과 같습니다. 논의하면서 주로 HTTP 서블릿에 대해 이야기할 것입니다.
javax.servlet
패키지에 정의되어 있으며, 서블릿 클래스가 구현해야 하는 메서드를 정의합니다. 서블릿 클래스는 반드시 이 인터페이스를 구현해야 합니다.init
메소드를 호출하여 서블릿 인스턴스를 초기화합니다. 초기화는 서블릿 초기화에서 다룹니다.destroy
메소드를 호출하여 서블릿을 종료합니다. 종료는 서블릿 종료에서 설명합니다.ServletRequest
인터페이스는 HTTP 요청에 대한 다양한 메타데이터(메서드, URI, 헤더, 쿠키 등)를 포함합니다.
ServletResponse
인터페이스는 HTTP 응답에 대한 다양한 메타데이터(상태 코드, 헤더 등)를 포함합니다.
ServletConfig
인터페이스는 서블릿 초기화 파라미터와 서블릿 이름을 포함합니다.ServletContext
인터페이스는 웹 어플리케이션의 루트 디렉토리 경로, 서블릿 컨텍스트 초기화 파라미터 등의 정보를 포함합니다.
참고: 그 외에 세션 유지 및 Finalize 관련 요소에 대한 설명은 생략합니다.
이러한 서블릿의 기본 구성 요소를 활용하여 웹 어플리케이션을 구현할 수 있습니다. 서블릿은 또한 자바 EE(Java Enterprise Edition) 표준 기술의 일부이며, 다양한 웹 개발 프레임워크와 라이브러리를 포함하여 대규모 웹 어플리케이션을 개발하는 데 필수적인 기술입니다.
JavaServer Pages (JSP)는 서블릿 기술을 확장하여 웹 어플리케이션 개발을 보다 쉽게 할 수 있도록 해주는 기술입니다. JSP는 HTML 코드와 자바 코드를 혼합하여 웹 페이지를 생성할 수 있도록 합니다.
JSP의 핵심 요소는 다음과 같습니다.
Scriptlets
: <% %>
태그 내에 자바 코드를 작성하는 것으로, JSP 페이지를 생성하는 데 필요한 로직을 처리할 수 있습니다.<%! %>
태그 내에 전역 변수 및 메서드를 선언하는 것으로, JSP 페이지 내에서 재사용 가능한 코드를 작성할 수 있습니다.<%@ %>
태그 내에 JSP 페이지의 속성을 설정하는 것으로, import 문, 에러 페이지 지정, 캐시 설정 등을 할 수 있습니다.<%= %>
태그 내에 자바 표현식을 작성하는 것으로, JSP 페이지에서 계산된 값을 출력할 수 있습니다.jsp:*
태그로 표시되며, JSP 컨테이너에서 실행되는 특수 태그로, JavaBean 객체의 값을 출력하거나, 페이지 이동 및 조건 분기 등의 로직을 처리할 수 있습니다.AFAIK, 요즘은 JSP를 쓰기보단 아래 조합들이 더 쓰인다고 하더군요.
Spring Boot + Thymeleaf
Spring Boot + Freemarker
Spring Boot + Mustache
JavaBeans 구성 요소는 쉽게 재사용하고 응용 프로그램으로 함께 구성할 수 있는 Java 클래스입니다. 특정 디자인 규칙을 따르는 모든 Java 클래스는 JavaBeans 구성 요소입니다.
JavaBeans 클래스는 다음과 같은 규칙을 따릅니다.
getName()/setName()
메서드가 있다면 속성 이름은 name이 됩니다.Serializable
인터페이스를 구현해야 합니다.JavaBeans는 재사용성이 높은 컴포넌트를 개발할 때 유용합니다. 예를 들어, 데이터베이스에서 데이터를 가져와 웹 페이지에 표시하는데 사용될 수 있는 데이터 모델 클래스를 개발할 때 JavaBeans 규약을 따르면, 이를 JSP나 서블릿과 쉽게 연동할 수 있습니다.
주 - 웹 응용 프로그램에서 사용할 때 MVC 아키텍처는 종종 모델-2 아키텍처라고 합니다. 프레젠테이션과 비즈니스 로직을 혼합하는 4장, Java Servlet 기술에서 논의된 서점의 예는 모델-1 아키텍처로 알려진 것을 따릅니다. Model-2 아키텍처는 웹 애플리케이션 설계에 권장되는 접근 방식입니다.
Spring Framework에서는 JavaBeans를 매우 활발하게 사용합니다. Spring Framework에서는 자바 객체를 컨테이너에서 관리하기 위해 JavaBeans 규약을 따르는 POJO(Plain Old Java Object) 클래스를 사용합니다.
Spring Framework에서는 POJO 클래스를 컨테이너에 등록하고, 필요한 객체를 DI(Dependency Injection)를 통해 주입하여 사용합니다. DI는 객체 간의 의존성을 줄이기 위해 사용되며, 객체를 생성하고 관리하는 작업을 프레임워크가 대신 처리합니다.
Spring Framework에서는 POJO 클래스가 JavaBeans 규약을 따르면, 컨테이너에서 해당 클래스의 객체를 생성하고 DI를 적용할 수 있습니다. 따라서, Spring Framework에서는 POJO 클래스의 멤버 변수를 private으로 선언하고, getter/setter 메서드를 제공하여 JavaBeans 규약을 따르도록 작성합니다.
예를 들어, 다음은 Spring Framework에서 사용할 수 있는 간단한 POJO 클래스입니다.
public class User {
private String name;
private int age;
public User() {}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
위의 코드에서는 JavaBeans 규약을 따르기 위해 속성을 private으로 선언하고, getter/setter 메서드를 제공합니다.
Spring Framework에서는 이 POJO 클래스를 다음과 같이 등록하고 DI를 적용할 수 있습니다.
@Configuration
public class AppConfig {
@Bean
public User user() {
User user = new User();
user.setName("John");
user.setAge(30);
return user;
}
}
@Service
public class UserService {
@Autowired
private User user;
public void printUser() {
System.out.println(user.getName() + ", " + user.getAge());
}
}
위의 코드에서는 AppConfig
클래스에서 User 객체를 Bean으로 등록하고, UserService
클래스에서 Autowired
어노테이션을 사용하여 User 객체를 DI 받습니다. 이렇게 등록된 User 객체는 UserService
클래스에서 사용되어 출력됩니다.
따라서, Spring Framework에서는 JavaBeans 규약을 따르는 POJO 클래스를 사용하여 객체를 생성하고 DI를 적용하므로, 객체 간의 의존성을 줄이고 코드의 재사용성을 높일 수 있습니다.
사실상 스프링 프레임워크를 간략하게 이해하기 위해 여기까지 왔습니다.
그래서, 스프링 프레임워크의 런타임으로 정말 핵심적인 컴포넌트들을 소개하면 아래 요소들이 나오는 것이었습니다.
이상으로 헷갈렸던 개념들을 모두 정리할 수 있었습니다. 글을 한번 되짚어봅시다.
긴 글 읽어주셔서 감사합니다.
참고문서
@Configuration
Annotation