(1-1) 자바 웹 개발 환경 만들기
브라우저 or 클라이언트 프로그램
- 서버엣서 전송한 결과를 화면에 보여주고(렌더링) 사용자의 화면 조작을 이용해서 서버에 원하는 데이터를 보내고(request) 받는(response) 프로그램
- 관련 기술) HTML/CSS/자바 스크립트 등
웹 서버 or WAS
- 웹 서버: 이미지와 같은 고정된 데이터를 제공
- WAS(Web Application Server): 동적으로 매번 새로운 데이터를 만들어 낼 수 있음 ex) Nginx, Tomcat
- 관련 기술) 서블릿/JPS, 각종 프레임워크와 언어들
데이터베이스
- 영구적으로 데이터를 보관/운영하기 위한 프로그램
- 기본적으로 관계형(relational) 패러다임을 이용한 관계형 데이터베이스를 사용
- 관련 기술) SQL, 데이터베이스 설계/구현
서블릿/JSP/스프링 프레임워크에 대한 학습은 Ultimate ver을 사용해야 함
후에 스프링 부트의 경우는 커뮤니티 버전으로도 가능
톰캣 설정과 웹 프로젝트 생성
9 버전 다운로드
톰캣 경로에는 한글이 들어가는 경로는 피할 것 -> 오류 발생 가능성 있음
Java Enterprise 프로젝트 생성
책에서는 Java Enterprise 항목을 이용해 프로젝트를 생성하라고 했지만 Jakarta EE로 이름이 변경되었다고 함
-> Jakarta EE 선택
jkd11 버전 사용
톰캣 서버 실행
=> 로그 한글 깨지는 문제 해결 방법
Help -> Edit Custom VM Options
-Xmx2048m
-Dfile.encoding=UTF-8
-Dconsole.encoding=UTF-8
인텔리제이 재시작
프로젝트의 경로 설정
위처럼 길고 복잡하게 뜨는 주소를 수정한다.
톰캣 중지
Edit Configuration -> Deployment
기존의 war 설정을 삭제하고 새로 추가(+) 할 때 Artifact를 exploded로 설정하고 context를 / 로 설정
변경된 코드의 반영
일반 자바 프로그램과 다르게 그레이들을 이용해 컴파일 등의 작업이 처리되고 프로젝트의 build/libs 폴더 안의 내용은 톰캣을 통해서 실행하기 때문에 코드를 변경한 후에는 톰캣을 재시작해야 함
-> 톰캣의 재시작을 최소화하기 위한 설정
Edit configuration에서 설정 바꾸기
index.jsp에서 수정해 보면 서버를 재시작하지 않고 브라우저에서 새로고침만 해도 반영된다.
index.jsp 파일은 브라우저에서 잘 열리지만 서블릿 파일로 들어가면 404 오류 발생
-> 프로젝트를 새로 생성하고 생성 두 번째 단계에서 자카르타 8 버전으로 설정해 줘서 해결했다
자카르타와 톰캣의 버전 호환 문제
서블릿 페이지는 새로고침 하는 것만으로 반영되지 않는다.
서비스 탭에서 Deploy All을 눌러줄 것
Deploy All을 실행해서 현재 코드를 다시 빌드하고 build/libs 폴더의 내용물을 수정하게 된다
서블릿 코드 작성하기
HelloServlet과 같은 경로에 MyServlet 생성
// 브라우저의 경로와 해당 서블릿을 연결
@WebServlet(name = "myServlet", urlPatterns = "/my")
public class MyServlet extends HttpServlet {
// doGet: 브라우저의 주소를 직접 변경해서 접근하는 경우 호출되는 메소드
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("<html><body>");
out.println("<h1>MyServlet</h1>");
out.println("</html></body>");
}
}
브라우저에서 /my 경로로 제대로 나오는지 확인
JSP 코드 작성하기
JSP는 화면을 구성하는데 사용
index.jsp와 같은 위치에 test.jsp 생성
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>Test JSP Page</h1>
</body>
</html>
http://localhost:8080/test.jsp 경로에서 확인
(1-2) 웹 기본 동작 방식 이해하기
Request / Response
브라우저에서 get, post 등의 방식으로 요청을 보내면 서버는 이에 대한 응답 데이터를 만들어서 브라우저로 보낸다.
- 정적(static) 데이터: 주로 파일로 고정된 html, css, 이미지 파일 등의 데이터
- 동적(dynamic) 데이터: 매번 필요할 때마다 상황에 따라 동적으로 서버에서 데이터를 만들어 보내는 방식
서버 사이드 프로그래밍이라고 한다.
- 웹 서버: 항상 같은 정적 데이터를 보내는 역할만 수행하는 서버
- WAS: 동적 데이터를 만들어 보내는 경우
대부분의 WAS는 웹 서버 기능도 같이 포함한다.
HTTP라는 약속
프로토콜: 브라우저 요청과 서버의 응답 사이의 데이터 교환 약속
웹에서는 http라는 방식으로 데이터를 주고받는다.
https는 http에 보안이 좀 더 강화된 프로토콜
http 메시지는 헤더(편지 봉투)와 바디(편지의 내용물)로 구분된다.
비연결성
하나의 요청과 응답을 처리한 후에 연결을 종료하는 것 -> 최대한 많은 사용자에게 서비스를 제공하기 위해
자바 서버 사이드 프로그래밍
서버 사이드 프로그래밍을 개발할 때는 고려해야 할 점이 많다.
이런 처리들을 JavaEE(현재는 JakartaEE)라는 기술 스펙으로 정리해 두었고, 서블릿과 JSP는 JavaEE의 여러 기술 중 하나이다.
서블릿 기술
- 서블릿: 서버에서 동적으로 요청과 응답을 처리할 수 있는 API들을 정의한 것
- JSP: 근본적으로 서블릿과 같은 원리지만 좀 더 html을 쉽게 이용할 수 있는 방식
- 서블릿 컨테이너: 서블릿을 실행할 수 있는 환경, 서블릿/JSP 객체를 생성하고 생명주기를 관리
ex) 톰캣
'서블릿으로는 코드를 이용한 처리, JSP로는 화면 개발'과 같이 역할을 분담해서 개발하는 것이 일반적
JSP(Java Server Pages) 기술
서블릿 기술과 동일하게 서버에서 동적으로 데이터를 구성하는 기술
내부적으로 서블릿과 같은 방식의 코드로 변환된다.
서블릿과 다른 점:
html 코드를 그대로 이용하고 필요할 때 약간의 자바 코드를 넣는 반면에
서블릿은 자바 코드를 이용해서 html 문자열을 만들어낸다.
JSP는 html 내에 자바 코드를 추가하는 방식
서블릿은 자바 코드 안에 html 코드를 추가하는 방식
JSP를 이용해서 GET/POST 처리하기
GET 방식은 입력과 조회
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form>
<input type="number" name="num1">
<input type="number" name="num2">
<button type="submit">SEND</button>
</form>
</body>
</html>
http://localhost:8080/calc/input.jsp 확인
POST 방식은 처리를 위한 용도
폼태그 수정
<form action="calcResult.jsp" method="post">
POST 방식은 주소와 전달하고자 하는 데이터를 분리해서 전송하는 방식
url에서 쿼리스트링을 확인할 수 없고 개발자 도구의 페이로드에서 전달한 값을 확인할 수 있다.
calcResult.jsp
<h1>NUM1 ${param.num1}</h1>
<h1>NUM2 ${param.num2}</h1>
EL: ${____}
서버에서 데이터를 출력하는 용도
param이라는 지정된 객체를 이용해서 현재 요청에 전달되는 파라미터를 쉽게 추출할 수 있다.
웹의 파라미터는 모두 문자열
<h1>SUM ${Integer.parseInt(param.num1) + Integer.parseInt(param.num2)}</h1>
전달되는 모든 데이터가 문자열로 처리되기 때문에 결과 데이터를 처리하기 위해서 Integer.parseInt()를 적용해서 다시 ${}로 감싸야한다.
-> 복잡한 코드를 넣는 데 적합하지 X
JPS의 올바른 사용법
1. 만약 숫자를 입력하지 않고 바로 calcResult.jsp를 GET 방식으로 호출한다면? => 500 에러 발생하는 문제
2. input.jsp 대신 input2.jsp와 같이 다른 JSP 파일로 변경했을 경우 과거의 input만 알고 있는 사용자들에게 주소 변경을 알려야 하는 작업이 발생 => 유지 보수 측면의 문제
이러한 문제를 해결하기 위해 웹 MVC 방식이 등장한다.
=> JSP는 결과만 출력, 처리는 서블릿 이용
'공부' 카테고리의 다른 글
Windows에서 IE11 실행시키는 방법 (0) | 2024.03.20 |
---|---|
ES5 문법 호환을 위한 Webpack, Babel 설치와 사용 (0) | 2024.03.12 |
[JAVA] JWT (JSON Web Token) - Cookie, Session, Token (1) (0) | 2023.11.09 |
[Spring] MapStruct 사용하기 (ModelMapper -> mapstruct 변환) (0) | 2023.11.08 |
[Logging] @RestControllerAdvice를 이용한 에러 핸들링 (0) | 2023.11.05 |