스프링 입문을 위한 자바 객체 지향의 원리와 이해 (2)
[책리뷰 & Book review]
jsp
스크립트릿 과
스크립트릿 표현식(Expression)
JSP(JavaServer Pages)에서는 HTML 내부에 자바 코드를 삽입할 수 있는데,
이를 스크립트릿(Scriptlet)이라고 합니다.
스크립트릿은 <% %> 안에 작성되며, 서블릿의 service() 메서드 안에 들어가게 됩니다.
예를 들어 아래의 코드는 페이지에 접속한 시간을 출력하는 스크립트릿입니다.
jsp
<% java.util.Date date = new java.util.Date(); %>
현재 시간: <%= date %>
위 코드의 첫 번째 줄이 스크립트릿이며, java.util.Date 객체를 생성하고 있습니다.
그리고 스크립트릿 표현식(Expression)은 <%= %> 안에 작성되며, 이 안에 들어있는 코드의 결괏값이 HTML로 출력됩니다. 위 코드의 두 번째 줄이 스크립트릿 표현식이며, 생성한 date 객체를 문자열로 변환하여 출력하고 있습니다.
스크립트릿과 표현식을 도식화하면 다음과 같습니다:
JSP 파일 ↓
--------------------------------
<% java.util.Date date = new java.util.Date(); %>
현재 시간: <%= date %>
--------------------------------
↓ 컴파일 (JSP -> Servlet)
--------------------------------
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
java.util.Date date = new java.util.Date(); // 스크립트릿
response.getWriter().print("현재 시간: " + date); // 스크립트릿 표현식
}
--------------------------------
↓ 실행 결과
--------------------------------
현재 시간: 2024-02-11 09:00:00
--------------------------------
위 도식에서 보듯, JSP 파일이 컴파일되면 스크립트릿과 표현식이 서블릿의 _jspService() 메서드 안으로 변환됩니다.
그리고 이 메소드는 클라이언트의 요청에 따라 실행되어 HTML을 생성하게 됩니다.
<%@ page import="java.util.Calendar" %>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>JSP - Hello World</title>
<%
Calendar calendar = Calendar.getInstance();
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
%>
</head>
<body>
<h1><%= "Hello World!" %>
</h1>
<br/>
<a href="hello-servlet">Hello Servlet</a>
<h1> 현재 시간 : <%= hour%>시 <%= minute%>분 <%=second %>초 </h1>
</body>
</html>
이 JSP 코드는 HTML 페이지를 생성하며, 페이지 내에 "Hello World!"라는 메시지와 현재 시간을 출력합니다. 코드는 다음과 같은 부분으로 구성되어 있습니다:
<%@ page import="java.util.Calendar" %>:
이 부분은 JSP 페이지에서 'java.util.Calendar' 클래스를 사용하기 위해 필요한 import 문입니다. 'Calendar' 클래스는 날짜와 시간 정보를 처리하는 데 사용됩니다.
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>:
이 부분은 페이지의 콘텐츠 타입과 문자 인코딩을 설정하는 페이지 디렉티브입니다. 여기서는 콘텐츠 타입을 'text/html'로, 문자 인코딩을 'UTF-8'로 설정하였습니다.
<%...%>:
이 부분은 스크립트릿입니다. 여기서는 'Calendar' 객체를 생성하고, 현재 시간의 시, 분, 초를 각각 'hour', 'minute', 'second' 변수에 저장하고 있습니다.
<%= "Hello World!" %>:
이 부분은 표현식입니다. 여기서는 "Hello World!" 문자열을 출력하고 있습니다.
<%= hour%>시 <%= minute%>분 <%=second %> 초:
이 부분도 표현식입니다. 여기서는 앞서 스크립트릿에서 저장한 'hour', 'minute', 'second' 변수의 값을 각각 출력하고 있습니다. 이를 통해 현재 시간을 '시분초' 형태로 출력하게 됩니다.
<a href="hello-servlet">Hello Servlet </a>:
이 부분은 'hello-servlet'이라는 주소로 이동하는 링크를 생성하는 HTML 코드입니다. 이 링크를 클릭하면 'hello-servlet'이라는 주소로 이동하게 됩니다.
이렇게 이 JSP 코드는 HTML을 생성하면서 자바 코드를 통해 동적인 내용(여기서는 현재 시간)을 생성하고 출력하는 역할을 합니다.
서블릿은
1. 반드시 매핑을 해야된다.
2.. java 확장자
3. thread pool을 이용하면 서버의 부하를 줄일 수 있다.
서블릿을 사용하기 위해서는 몇 가지 주요 사항을 알아야 합니다.
서블릿 매핑: 서블릿은 클라이언트의 요청을 처리하기 위해 URL 패턴에 매핑되어야 합니다. 이 매핑은 웹 애플리케이션의 웹 배포 서술자(web.xml)에서 설정하거나, 혹은 서블릿 3.0부터 제공하는 @WebServlet 애노테이션을 사용하여 설정할 수 있습니다.
예를 들어, 아래는 MyServlet 클래스를 "/myServlet" URL 패턴에 매핑하는 예입니다:
java
@WebServlet("/myServlet")
public class MyServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 요청 처리 코드
}
}
.java 확장자: 서블릿은 자바 클래스이므로. java 확장자를 가진 파일에 작성됩니다.
이 파일은 컴파일되어 .class 파일로 변환된 후, 웹 애플리케이션 서버에서 실행됩니다.
Thread Pool: 서블릿은 각 클라이언트 요청을 처리하기 위해 새로운 스레드를 생성하지 않습니다.
대신,
웹 애플리케이션 서버는 요청을 처리하기 위해 스레드 풀을 사용합니다. 이는 서버의 부하를 줄이고, 자원을 효율적으로 활용할 수 있도록 합니다.
아래는 이러한 동작을 도식화한 그림입니다:
클라이언트 요청 ↓
--------------------------------
GET /myApp/myServlet HTTP/1.1
--------------------------------
↓ 웹 애플리케이션 서버
--------------------------------
URL 패턴 '/myServlet'에 매핑된 서블릿을 찾음
--------------------------------
↓ 스레드 풀
--------------------------------
스레드 풀에서 사용 가능한 스레드를 할당받음
--------------------------------
↓ 서블릿 실행
--------------------------------
public class MyServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 요청 처리 코드
}
}
--------------------------------
↓ 응답 반환
--------------------------------
HTTP/1.1 200 OK
Content-Type: text/html
... 응답 내용...
--------------------------------
, 클라이언트 요청이 웹 애플리케이션 서버에 도착하면, 서버는 요청 URL에 매핑된 서블릿을 찾습니다. 그리고 스레드 풀에서 스레드를 할당받아 해당 서블릿의 메서드를 실행하고, 그 결과를 클라이언트에게 반환합니다. 이런 방식으로 서블릿은 효율적으로 클라이언트 요청을 처리하게 됩니다.
@controller와 @WebServlet의 차이점은 무엇인가?
서블릿과 컨트롤러는 웹 애플리케이션에서 클라이언트 요청을 처리하는 역할을 합니다.
그러나 사용 방법과 동작 방식에는 차이가 있습니다.
서블릿: 서블릿은 Java EE(Enterprise Edition) 스펙의 일부로, 웹 애플리케이션에서 클라이언트의 요청을 처리하고 응답을 생성하는 기본적인 기능을 제공합니다.
서블릿은 @WebServlet 애노테이션을 사용하여 URL 패턴에 매핑됩니다.
java
@WebServlet("/myServlet")
public class MyServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 요청 처리 코드
}
}
컨트롤러: 컨트롤러는 MVC(Model-View-Controller) 패턴의 일부로, 클라이언트의 요청을 처리하고 적절한 뷰를 선택하는 역할을 합니다. Spring Framework에서는 @Controller 애노테이션을 사용하여 클래스를 컨트롤러로 선언하고, @RequestMapping 애노테이션을 사용하여 메서드를 URL 패턴에 매핑합니다.
java
@Controller
public class MyController {
@RequestMapping("/myController")
public String handleRequest(Model model) {
// 요청 처리 코드
return "viewName"; // 뷰 이름 반환
}
}
서블릿과 컨트롤러의 주요 차이점은 다음과 같습니다:
서블릿은 웹 애플리케이션의 기본 구성 요소로, 요청을 처리하고 응답을 직접 생성합니다.
반면, 컨트롤러는 MVC 패턴의 일부로, 요청을 처리하고 결과를 뷰에 전달하여 응답을 생성하도록 합니다.
컨트롤러는 보통 Spring 등의 프레임워크에서 사용되며, 서블릿보다 더 고급 기능(예: 데이터 바인딩, 검증, 예외 처리 등)을 제공합니다.
서블릿과 달리 컨트롤러는 스레드에 안전하지 않을 수 있습니다. 이는 컨트롤러의 메소드가 여러 스레드에서 동시에 호출될 수 있기 때문입니다. 따라서 컨트롤러의 상태를 변경하는 코드는 동기화를 고려해야 할 수 있습니다.
4
jsp 의 간단한 통신과
@controller를 통한 통신은 어떤 것인가?
Spring MVC에서 컨트롤러와 JSP를 사용하여 클라이언트 요청을 처리하고 응답을 반환하는 과정은 다음과 같습니다.
클라이언트는 웹 브라우저를 통해 서버에 요청을 보냅니다. 예를 들어, "http://localhost:8080/greeting? name=John"이라는 URL을 요청한다고 가정해 봅시다.
Spring MVC의 DispatcherServlet이 이 요청을 받아서 처리합니다. DispatcherServlet은 요청 URL에 해당하는 컨트롤러를 찾아 요청을 전달합니다.
컨트롤러는 클라이언트의 요청을 처리하고, 그 결과를 Model 객체에 담아 뷰에 전달합니다. 이때, 컨트롤러 메서드의 반환값이 뷰의 이름이 됩니다.
java
@Controller
public class GreetingController {
@RequestMapping("/greeting")
public String greeting(@RequestParam(value="name", defaultValue="Guest") String name, Model model) {
model.addAttribute("message", "Hello, " + name + "!"); // "Hello, John!"을 Model에 담음
return "greeting"; // 뷰 이름 반환
}
}
DispatcherServlet은 컨트롤러가 반환한 뷰 이름을 바탕으로 실제 뷰(JSP 파일 등)를 찾아, Model 객체를 뷰에 전달합니다.
뷰는 Model 객체에 담긴 데이터를 사용하여 HTML을 생성하고, 이를 클라이언트에게 반환합니다.
jsp
<%-- JSP 페이지에서 Model에 담긴 데이터를 사용하여 HTML 생성 --%>
<html>
<body>
<h1>${message}</h1> <%-- "Hello, John!" 출력 --%>
</body>
</html>
이렇게 Spring MVC는 컨트롤러와 JSP, 그리고 Model 객체를 사용하여 클라이언트의 요청을 처리하고 응답을 반환합니다. 이 과정에서 Model 객체는 컨트롤러와 뷰 사이에서 데이터를 전달하는 역할을 합니다.
#개발자취업 #개발자기초 #개발자 #개발자분야 #개발자분류 #개발자종류 #it개발자 #서버개발자 #개발자성장 #신입개발자 #ios개발자 #개발자노트북 #개발자 되는 법 #개발 #앱개발 #웹개발 #개발분야 #it개발 #개발공부 #코딩상식 #개발공부 #개발초보
#개발자취업 #개발자면접 #개발자채용 #백엔드개발자 #백엔드개발자 #백엔드개발자취업 #백엔드개발 #프런트엔드개발자 #개발자상담 #백엔드 #개발자 #앱개발자 #웹개발자 #개발자팁 #앱개발자 #백엔드취업 #백엔드공부 #백엔드강의 #백엔드독학
#전산직면접 #면접 #면접팁 #면접관 #공공기관전산직면접 #공사면접 #면접질문 #면접할 말 #면접준비 #면접준비 #면접답변 #면접질문 #면접기출 #전화면접 #면접복장 #면접답변 #면접꿀팁 #모의면접 #면접후기 #롯데면접 #면접후기 #임원면접 #최종면접 #면접꿀팁
'컴퓨터공부 > 책리뷰 & book review' 카테고리의 다른 글
우울한 이유는 우리가 가지고 있는 슬픈 감정을 해결할 수 없기 때문이다. [정신과의사가 알려주는 조언_02] (0) | 2024.03.17 |
---|---|
스프링 입문을 위한 자바 객체 지향의 원리와 이해 (8)[책리뷰 & Book review] (0) | 2024.02.11 |
Do it! 알고리즘 입문: 자바 편 (28)[책리뷰 & Book review] (1) | 2024.02.06 |
Do it! 알고리즘 입문: 자바 편 (27)[책리뷰 & Book review] (0) | 2024.02.06 |
댓글