스프링 부트를 안 쓰면 이렇게 나눠야 됨
서블릿 컨테이너 별도 다운
프로젝트 배치
지정된 장소에 떨어뜨린다
서블릿으로 CRUD 만들어봤음
어제는 서블릿 include, forward 함
JSP를 사용하여 MVC 모델1 방식으로 전환
MVC 모델1과 모델2의 차이
웹 브라우저 <---응답--- 서블릿
웹브라우저가 실행할 HTML
출력할 콘텐트가 많은 경우 코드 작성이 번거롭다
웹 브라우저에 보낼 코드만 작성하자
그리고 이 코드를 자동생성하게 하자
JSP 등장
JSP 파일 : 웹 브라우저로 보낼 콘텐트 작성 (HTML, CSS, JavaScript, Text)
JSP 엔진(JSP 컴파일러)에 의해서 변환을 한다 (자바 코드 생성)
-> 서블릿 자바 코드 (자바 소스 파일)
jsp 파일은 webapp 밑에 만들어야 한다
jsp 파일은 첫번째 줄에 이거 있어야 됨 ↓
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
JSP 엔진 : JSP 파일을 가지고 서블릿 자바 코드를 생성
JSP 파일 ---JSP 엔진---> 자바 코드 생성 -> 자바 소스 파일 (.java)
자바 소스 파일 (.java) ---컴파일---> 클래스 파일(.class)
A 코드에서 B 코드로 바꾸는 걸 '변환(compile)'이라고 한다
compiler = 엔진
인터프리터도 엔진이라고 부를 때가 있다
자바스크립트를 실행하는 인터프리터를 자바스크립트 엔진이라고 한다
서블릿 컨테이너 앞에 웹 서버 생략한 거
① hello.jsp 요청
Web Browser --- ① hello.jsp 요청 ---> Servlet Container
② 위임
요청한 JSP의 서블릿 객체가 없다면 또는 JSP 파일이 변경되었다면 위임
Servlet Container --- ② 위임 ---> JSP 엔진
③ 서블릿 자바 코드 생성
hello.jsp --- JSP 엔진 ---> 서블릿 자바 코드
④ 컴파일
서블릿 자바 코드 --- ④ 컴파일 ---> 서블릿 클래스
⑤ 실행
요청한 JSP의 서블릿 클래스가 있다면 실행
Servlet Container --- ⑤ 실행 ---> 서블릿 클래스
객체 생성 --> init() --> service()
http://localhost:8080/jsp/hello.jsp
서블릿 컨테이너가 jsp 파일을 바로 실행시켰구나 라고 오해하지 말기
바이트 코드(.class) --- 로드 ---> JVM --- 실행 ---> OS --- 명령을 전달 - 실행 ---> CPU
.class
바이트 코드
-> 기계어가 아니다.
기계어: CPU 명령을 OS의 형식에 맞춰서 작성된 것
같은 CPU를 써도 어떤 OS를 설치했느냐에 따라 기계어가 달라진다
JVM (바이트코드 인터프리터)
JVM --- 실행 ---> OS
OS에서 제공하는 API를 사용해 명령을 처리
OS --- 명령을 전달 - 실행 ---> CPU
.class 파일을 실행할 때마다 바이트 코드를 읽어서 명령을 해석하고 OS에 맞춰서 명령어를 변환하여 실행한다
⇒ 동일한 바이트 코드라도 실행할 때마다 매번 OS에 맞춰서 변환해야 한다.
⇒ 변환하는 데 시간 소요됨
⇒ 그래서 기계어(.exe)를 바로 실행하는 것보다 느리다!
JIT : 'Just-in-time'의 약어로 '즉시'라는 뜻이다.
JIT 컴파일 또는 동적 번역은 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법이다.
.class --- ① load ---> JVM --- ② 컴파일 ---> 기계어
JIT 컴파일러
JVM --- ② (JIT 컴파일러) 컴파일 ---> 기계어
실행하려는 일부 바이트코드를 기계어로 컴파일 해둔다.
기계어를 OS에 넘겨서 실행
기계어 --- ③ 실행 ---> OS
전체를 넘기는 게 아니라 실행 시점에
일부 코드에 대해서만 기계어로 (JVM 안 거침)
애플리케이션 런타임(실행속도)를 향상시킬 수 있다
바이트코드를 실행하는 것보다 기계어를 직접 실행하는 것이 실행속도가 더 빠르다
= 기계어를 바로 실행하는 방식과 거의 속도가 같아진다.
JIT 컴파일 방식의 문제점
실행할 때 일부코드를 기계어로 변환한다
⇒ 변환하는 데 시간 소요
⇒ 처음부터 기계어로 만들어 놓고 실행하는 방식보다는 속도가 느리다
처음부터 기계어로 바꿔놓고 시작하자!
AOT 컴파일 (ahead-of-time compile)
⇒ 먼저 컴파일을 수행
① load
.class --- load ---> JVM
② 바이트코드 실행 전에 전체 바이트 코드를 컴파일한다
.class --- JVM ---> 기계어
③ 실행
기계어 --- 실행 ---> OS
= C/C++의 컴파일 방식과 실행속도가 같다.
• Android의 경우 플레이스토어에서 앱을 다운로드 받는 즉시 AOT 컴파일 실행
⇒ 이전 방식보다 앱 실행 속도가 빠르다
⇒ 앱을 설치할 때 AOT 컴파일을 수행하기 때문에 이전보다 앱 설치 시간이 더 걸린다
⇒ 처음 설치할 때 컴파일하기 때문에 실행할 때마다 컴파일하는 JIT 방식보다 배터리를 더 소모한다.
• 참고
Adroid JVM -> Dalvik(JIT) -> ART(AOT) -> ART(AOT+JIT)
컴파일된 파일 보려면 이클립스에서 어디에 배치했는지 알아야 됨
웹프로젝트 --- build ---> .war
Tomcat 설치 폴더
bin <- 서버 실행 파일
conf <- 설정 파일
lib <- 톰캣 서버의 자바 클래스 라이브러리
logs <- 실행 기록
temp <- 업로드 파일을 임시적으로 두는 등의 임시 폴더
webapps <- 웹 애플리케이션 배치 폴더
work <- JSP를 가지고 생성한 자바 코드(소스+클래스파일)를 두는 폴더
.war ---배치---> webapps
이클립스 IDE에서 관리하는 톰캣 배치 폴더
eclipse IDE의 Servers 뷰에서 서버 인스턴스 생성
conf 폴더의 설정파일을 가져온다
lib 폴더의 라이브러리를 사용한다
/Users/nana/eclipse-workspace
/Users/nana/eclipse-workspace/.metadata/.plugins
/Users/nana/eclipse-workspace/.metadata/.plugins/org.eclipse.wst.server.core
/Users/nana/eclipse-workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0
/Users/nana/eclipse-workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/conf
conf <- eclipse IDE에서 편집할 설정파일을 둔다
이클립스에서 편집하면 tmp0 폴더에 있는 conf 폴더로 복사된다
eclipse-workspace
편집하고 배치하는 순간 tmp0 폴더에 있는 conf 폴더로 복사된다
/Users/nana/eclipse-workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps
여기 배치된다
JSP 파일을 가지고 만든 서블릿 자바 소스 파일/클래스 파일이 놓인다.
/Users/nana/eclipse-workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/work/Catalina/localhost/ROOT/org/apache/jsp/jsp
hello_jsp.java
/Users/nana/apache-tomcat-9.0.62-src/java/org/apache/jasper/runtime/HttpJspBase.java
HttpJspBase
HttpServlet
HttpJspPage
JspPage
JSP 엔진이 만든 서블릿 클래스는 반드시 이 메서드를 구현해야 한다.
_jspService
http://localhost:8080/jsp/board/list.jsp
<%@page import="com.eomcs.mylist.service.BoardService"%>
@ 붙어있어도 상관없음
/Users/nana/eclipse-workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/work/Catalina/localhost/ROOT/org/apache/jsp/jsp/board/list_jsp.java
변수 이름은 모두 같다
다른 이름 쓰면 안 됨
<%@page import="com.eomcs.mylist.domain.Board"%>
<%@page import="java.util.List"%>
<%@page import="com.eomcs.mylist.service.BoardService"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
BoardService boardService = (BoardService) application.getAttribute("boardService");
List<Board> boards = boardService.list();
for (Board board : boards) {
%>
<tr>
<td>30</td>
<td><a href='detail?no=30'>다라마바</a></td>
<td>user2</td>
<td>0</td>
<td>2022-04-13</td>
</tr>
<%
}
%>
<%
BoardService boardService = (BoardService) application.getAttribute("boardService");
List<Board> boards = boardService.list();
for (Board board : boards) {
%>
<tr>
<td><%=board.getNo()%></td>
<td><a href='detail?no=<%=board.getNo()%>'><%=board.getTitle()%></a></td>
<td><%=board.getWriter().getName()%></td>
<td><%=board.getViewCount()%></td>
<td><%=board.getCreatedDate()%></td>
</tr>
<%
}
%>
/Users/nana/eclipse-workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/work/Catalina/localhost/ROOT/org/apache/jsp/jsp/board/list_jsp.java
VC가 합쳐짐
hello.jsp : UI 처리 (Controller, View)
BoardService : 업무 수행 (Model)
BoardDao : 데이터 처리 (Model)