프론트엔드 슈슈슈슈슈슈슉 달려나가기. 레츠기이이릿!
: 자바로 작성된 웹 서버용 프로그램
역할) Java 코드로 요청을 받아 처리하고, HTML로 응답을 생성한다.
-> 동적인 웹 페이지를 생성하기 위해 만들어졌다.
: HTML 코드 안에 Java 코드를 삽입할 수 있도록 해주는 기술.
-> HTML만으로는 동적인 페이지를 만들 수가 없어서 만들어짐.
서블릿은 자바 언어로 동적인 페이지를 구현해야 한다.
Why??) .html 파일은 누가 방문하더라도, 항상 같은 내용만 보여준다.
사용자 맞춤 정보, DB 연동 등 상황에 따라 바귀는 동적인 페이지가 필요하다.
JSP는 HTML 코드 안에서 스크립트 형태로 자바 언어를 사용하여, 동적인 페이지를 구현한다.
JSP의 목표는 서블릿의 비즈니스 로직으로부터 화면 로직을 분리하는 것을 목표로 한다.
Why??) 비즈니스 로직 = "서버에서 해야 할 일", 화면 로직 = "사용자에게 보여주는 HTML"을 말한다. 서브릿이 비즈니스 로직을 구현하고, JSP가 화면 로직을 구현한다.
1) 웹 컨테이너는 클라이언트로부터의 요청이 JSP에 대한 요청일 경우, 먼저 JSP 파일을 자바 코드로 변환한다.
-> 웹 컨테이너가 뭐야? 클라이언트의 정의는? 요청이라고 하는 건? 먼저 JSP를 변환하는 거면, 그 다음엔 뭐해?
- 웹 컨테이너
: JSP나 서블릿 같은 웹 애플리케이션을 실행시켜주는 자바 서버의 일부분.- 클라이언트
: 웹에 요청을 보내는 사용자 or 프로그램.- 요청
: 클라이언트가 서버에게 "이거 해줘"라고 보내는 메시지.
2) 변환된 자바 코드를 컴파일하고, 서블릿 인스턴스를 생성한다.
-> 왜 서블릿 인스턴스를 생성해? 다른 건 안 만들어? 그렇다면 왜?
JSP는 결국 서블릿으로 바꿔서 동작한다. 마치, HTML처럼 보이지만, 내부적으로는 Java 서블릿 코드로 변환된다. 따라서 서블릿 객체(인스턴스)가 필요한 것이다. 그래서 서블릿 인스턴스로만 바꾼다.
3) 서블릿 인스턴스가 생성되면, 서블릿의 라이프 사이클을 거치면서 클라이언트의 요청을 처리해준다.
-> 라이프 사이클이라는 게 뭔데? 클라이언트 요청말고 다른 것도 있어?
: 서블릿이 생기고, 요청 받고, 죽을 때까지의 과정.
- 클라이언트 요청이 대부분이다. 그러나 서버 내부에서 간접적인 요청도 처리할 수 있다.
자바의 언어를 이용하기 때문에, 대부분의 운영체제에서 사용이 가능하다.
서버 자원을 효율적으로 사용한다. (요청을 스레드 단위로 처리)
-> 스레드는 CPU가 작업을 처리하는 가장 작은 실행 단위다. 동시에 많은 요청을 빠르게 처리하기 위해, 스레드 단위로 처리한다. (멀티스레딩 기반 처리 모델)
MVC 패턴을 쉽게 적용할 수 있다.
-> MVC는 Model, View, Controller로 나누는 설계 방식. 역할을 나눠서 코드를 관리하는 프로그래밍 설계 방식이다.
- Model: 데이터, 로직. DB와 연결해서 데이터를 처리한다.
- View: 화면 표시, JSP, HTML 등
- Controller: 요청, 응답 중간 처리. 서블릿, Spring Controller
=> 1) 역할을 분리하기에, 협업이 쉽다. 2) 역할이 나눠져있어서, 유지보수가 쉽다. 3) 코드가 깔끔하고 재사용 가능하다.
JSP 파일의 배포 위치는 HTML 파일과 동일하다.
-> 기본적으로 JSP나 HTML은 웹 서버의 webapp 폴더에 들어간다. 왜냐하면, "보여주기 위한 파일"이기 때문에, 웹 서버가 클라이언트에게 직접 접근 가능한 곳에 넣어준다.
웹 서버는 webapp 폴더를 웹 루트라고 인식한다.
cf) 웹 루투: 인터넷 주소를 타고, 들어왔을 때 가장 먼저 찾아보는 폴더.
Why??) 1) 보안(외부 접근 불가) 2) 관리 편의: 프론트와 백엔드 자원을 구분해서 정리할 수 있다.
JSP 페이지 전체에 영향을 미치는 정보를 기술할 때 쓰인다.
=> "JSP야, 이렇게 행동하다록!" 라고 명령하는 선언문
-> page, include, taglib 지시자로 나뉜다.
page 지시자는 JSP 페이지에 대한 속성을 지정한다.
page 지시자는 JSP 파일 어느 위치에 와도, 상관 없으나 가장 첫 부분에 작성한다.
-> JSP가 실행될 때, 지시자는 가장 먼저 적용되어야 한다. 그래서 관례적으로 가장 위에 사용한다. 자바에서 import문이 맨 위에 있는 것과 같다.
<%@ page contentType="text/html; charset=UTF-8" %>
.. contentType: 응답이 HTML이고, 문자 인코딩은 UTF-8임을 서버에게 알려준다.
<%@ page import="java.util.Date" %>
// import: 자바 클래스를 JSP에서 쓰게 해준다.
<%@ include file="common/header.jsp" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
// taglib은 JSP를 좀 더 HTML스럽게 작성하게 도와주는 태그 도구 세트
// 위 코드를 작성해야, <c:forEach> 태그를 사용할 수 있다.
// taglib 지시자는 HTML 태그가 아니라, JSTL 도구 상자구나. 그럼 JSTL에서 꺼내 쓸게.라고 통역해준다.
// 코드 해석: JSTL 라이브러리에 있는 반복문 태그구나, 오류가 아니네~!
cf) <c:forEach>: HTML처럼 보이는데, 실제로는 Java의 for 반복문이다.
cf) JSTL의 여러 도구(태그)
| JSTL 태그 | 설명 |
|---|---|
<c:forEach> | 반복문 |
<c:if> | 조건문 (if문) |
<c:choose>, <c:when>, <c:otherwise> | 다중 조건문 (if-else 구조) |
<c:out> | 값을 출력 (HTML 특수문자도 안전하게) |
<c:set> | 변수 저장 |
<c:import> | 외부 페이지 또는 파일 불러오기 |
: 서블릿 클래스의 필드와 메소드를 선언할 때, 사용한다.
-> 서블릿 클래스 전체에 변수나 함수 만듦.
=> 도구를 미리 준비해두는 작업
: _jspService() 메소드의 로컬 변수와 자바 코드를 작성할 때 사용한다.
-> 함수 안에 Java 코드 씀. (로직 처리용)
=> 실제로 도구를 써서, 작업하는 구간
: 서블릿 코드에서 out.print()의 역할 수행하는 태그로 클라이언트로 데이터를 출력하는 코드를 작성할 때 사용한다.
-> 화면에 값 출력하기. (out.print() 역할)
=> 결과물을 보여주는 창문
: JSP에서 기본적으로 제공하는 객체들로 request, response, out 등 스크립트릿 태그와 표현식 태그에서 사용할 수 있게 선언된 객체이다.
-> 자바 함수들 처럼, 도구를 미리 만들어준거임.
| 내장 객체 | 역할 | 비유 |
|---|---|---|
request | 사용자의 요청 정보 | 손님이 “아메리카노 주세요”라고 말한 메모지 |
response | 서버가 응답할 정보 | 손님에게 내보낼 커피 |
out | HTML을 출력하는 도구 | 손님한테 말을 거는 마이크 |
session | 사용자마다 저장되는 개인 캐비넷 | 손님 개인 사물함, 예: 로그인 상태 유지 |
application | 서버 전체에서 공유되는 저장소 | 매장 전체 공용 사물함 |
config | JSP 설정 정보 | 매장 매뉴얼 또는 알바교육책자 |
pageContext | JSP 페이지 전체 정보 | 알바 노트 – 페이지 전체 정리 도구 |
page | 현재 JSP 페이지 객체 자체 | 나 자신 (이 JSP 파일) |
exception | 예외 상황 정보 (에러 처리용) | 손님 컴플레인 쪽지 (에러 페이지 전용) |
: Page < Request < Session < Application 영역 순으로 범위가 넓다.
| 영역 | 언제까지 유지돼? | 어디까지 쓸 수 있어? | 비유 |
|---|---|---|---|
| Page | 현재 JSP 실행 중 | 이 JSP 파일 안에서만 | 나 혼자만 쓰는 쪽지 |
| Request | 요청이 끝날 때까지 | 같은 요청 안에 있는 모든 JSP/서블릿 | 손님이 주문할 때까지 들고 있는 쪽지 |
| Session | 브라우저 종료 or 타임아웃 전까지 | 같은 사용자(브라우저) 전체 페이지 | 손님 개인 사물함 |
| Application | 서버가 꺼질 때까지 | 모든 사용자, 모든 JSP에서 | 매장 공용 사물함 |