2022-04-14(목)

Jeongyun Heo·2022년 4월 14일
0

스프링 부트를 안 쓰면 이렇게 나눠야 됨
서블릿 컨테이너 별도 다운
프로젝트 배치
지정된 장소에 떨어뜨린다
서블릿으로 CRUD 만들어봤음
어제는 서블릿 include, forward 함

JSP를 사용하여 MVC 모델1 방식으로 전환

MVC 모델1과 모델2의 차이

JSP 구동 원리

웹 브라우저 <---응답--- 서블릿

웹브라우저가 실행할 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 파일을 바로 실행시켰구나 라고 오해하지 말기

바이트 코드와 JIT 컴파일

바이트 코드(.class) --- 로드 ---> JVM --- 실행 ---> OS --- 명령을 전달 - 실행 ---> CPU

.class
바이트 코드
-> 기계어가 아니다.
기계어: CPU 명령을 OS의 형식에 맞춰서 작성된 것
같은 CPU를 써도 어떤 OS를 설치했느냐에 따라 기계어가 달라진다

JVM (바이트코드 인터프리터)

JVM --- 실행 ---> OS

OS에서 제공하는 API를 사용해 명령을 처리

OS --- 명령을 전달 - 실행 ---> CPU

.class 파일을 실행할 때마다 바이트 코드를 읽어서 명령을 해석하고 OS에 맞춰서 명령어를 변환하여 실행한다
⇒ 동일한 바이트 코드라도 실행할 때마다 매번 OS에 맞춰서 변환해야 한다.
⇒ 변환하는 데 시간 소요됨
⇒ 그래서 기계어(.exe)를 바로 실행하는 것보다 느리다!

JIT 컴파일과 바이트 코드 실행

JIT : 'Just-in-time'의 약어로 '즉시'라는 뜻이다.

JIT 컴파일 또는 동적 번역은 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법이다.

.class --- ① load ---> JVM --- ② 컴파일 ---> 기계어

JIT 컴파일러

JVM --- ② (JIT 컴파일러) 컴파일 ---> 기계어

실행하려는 일부 바이트코드를 기계어로 컴파일 해둔다.

기계어를 OS에 넘겨서 실행

기계어 --- ③ 실행 ---> OS

전체를 넘기는 게 아니라 실행 시점에
일부 코드에 대해서만 기계어로 (JVM 안 거침)

애플리케이션 런타임(실행속도)를 향상시킬 수 있다

바이트코드를 실행하는 것보다 기계어를 직접 실행하는 것이 실행속도가 더 빠르다
= 기계어를 바로 실행하는 방식과 거의 속도가 같아진다.

JIT 컴파일 방식의 문제점
실행할 때 일부코드를 기계어로 변환한다
⇒ 변환하는 데 시간 소요
⇒ 처음부터 기계어로 만들어 놓고 실행하는 방식보다는 속도가 느리다

처음부터 기계어로 바꿔놓고 시작하자!

AOT 컴파일과 바이트코드 실행

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

웹애플리케이션 배치 - Eclipse IDE에서 배치

이클립스 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

JSP 엔진이 만드는 서블릿 클래스

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

MVC 모델 1 = MVC 아키텍처의 초기 유형

VC가 합쳐짐

hello.jsp : UI 처리 (Controller, View)

BoardService : 업무 수행 (Model)

BoardDao : 데이터 처리 (Model)

0개의 댓글