1.1 자바 웹 개발 환경 만들기
1.2 웹 기본 동작 방식 이해하기
1.3 Web MVC 방식
1.4 HttpServlet
1.5 모델(Model)
<% %>를 사용하면 HTML문서 중간에 Java코드를 삽입하여 동적인 코드로 변경이 가능🔸브라우저와 서버의 관계 이해
🔸서블릿과 JSP가 브라우저에 데이터를 전달하는 과정,
🔸브라우저에서 사용되는 과정
브라우저에 원하는 정보를 전달하는 방식 GET, POST
GET
주소와 필요한 데이터를 한번에 같이 보내기 때문에 단순 링크로 처리된다.
ex) https://velog.io/@liy_se00/posts?tag=000000
POST
주소와 데이터를 따로 보내는 방식.
ex) /api/members/news/{newsId}/read
✨브라우저와 서버의 데이터 전달 과정

✨프로토콜(protocol) : 브라우저의 요청과 서버의 응답 사이에서 한 데이터 교환 약속. 웹에서는 HTTP나 보안이 강화된 프로토콜인 HTTPS 프로토콜 방식으로 데이터를 주고받는다.
개발자도구 -> Network -> 오가는 데이터 확인 가능(Headers, Response, Cookies...)
✨비연결성(Connectionless)
웹의 특성상 여러 사용자가 브라우저를 통해 서버를 호출하는 구조이기 때문에 서버에서는 최대한 많은 사용자에게 서비스를 제공하기 위한 고민이 필요하다.
-> HTTP는 이를 위해 '비연결성' 방식을 택하는데, 이는 요청과 응답을 처리한 후 연결을 종료하는 것이다. ex) 새로고침
서버 사이드 프로그래밍: 서버 쪽에서 프로그래밍을 통해 데이터를 처리할 수 있도록 구성하는 것을 의미
자바의 경우 위와 같은 처리를 JavaEE라는 기술 스펙으로 정리해 두었고, Servlet과 JSP는 JavaEE의 여러 기술 중 가장 기본적인 기술이다.
✨서블릿(Servlet) 기술
서버에서 동적으로 요청과 응답을 처리할 수 있는 API들을 정의한 것

🔸톰캣이란(Tomcat)?
톰캣은 아파치 소프트웨어 재단의 웹 어플리케이션 서버(와스)로서, 자바 서블릿을 실행키고 JSP코드가 포함되어 있는 웹 페이지를 만들어준다.
출처: https://cheershennah.tistory.com/54
JSP는 근본적으로 서블릿과 같은 원리이지만 좀 더 HTML을 쉽게 이용할 수 있는 방식으로 코드를 작성할 수 있기 때문에 '서블릿으로는 코드를 이용한 처리, JSP로는 화면 개발'과 같이 역할을 분담해서 개발하는 것이 일반적이다.
서블릿 컨테이너: 서블릿의 실행은 서블릿을 실행할 수 있는 환경에서 실행이 가능하다.(톰캣) 이를 '서블릿 컨테이너'라 부르며 과거에는 '서블릿 엔진'이라고 불렀다.
서블릿 코드를 실행하는 주체는 서블릿 컨테이너(톰캣)이므로, 일반 자바 프로그램과 아래와 같은 점들이 달라진다.
import에 javax로 시작하는 서블릿 관련 API가 java.io.*와 함께 사용된 것을 볼 수 있다.서블릿 라이프 사이클: init(), doGet(), destory()등 서블릿 API에서 지정된 메소드들을 서블릿 컨테이너가 호출하고 관리하는 것
✨ JSP 기술
서블릿이 있는데도 JSP가 제공되는 이유?
👉🏻 두 기술의 목적 자체가 다르기 때문
JSP 파일도 서블릿 코드로 변환되어 컴파일되고 실행된다. JSP 파일은 필요한 순간에 자바 파일로 생성되고, 컴파일하여 class 파일로도 만들어진다.
HTML <head> 코드 -> 모두 out.write("<head>\n"); 형태의 코드로 변환된다.
🔸서블릿/JSP 공통점
✨JSP 특징
${}: JSP에서 사용하는 EL 기술. 서버에서 데이터를 출력하는 용도Integer.parseInt() 적용JSP 올바른 사용법
-> 이러한 문제를 해결하기 위해 등장한 것이 웹 MVC

요청이 들어오면
-> 서블릿은 준비한 데이터를 JSP로 전달
-> JSP는 EL을 이용해 최종적인 결과 데이터 생성
-> 생성된 결과 화면은 톰캣을 통해 브라우저로 전송
: Model - View - Controller 역할을 분리해서 처리하는 구조

- RequestDispatcher를 이용한 요청(Request) 배포
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws
ServletException, IOException {
System.out.println("InputController...doGet...");
RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/calc/input.jsp");
dispatcher.forward(req, resp);
}
👉🏻 WEB-INF 란?
WEB-INF는 브라우저에서 직접 접근이 불가능한 특별한 경로입니다.WEB-INF밑에 jsp 파일을 둔다는 것은 브라우저에서 jsp로 "직접" 호출이 불가능하다는 것을 의미합니다.(따라서 jsp 파일이 호출될 때는 controller를 필수적으로 거치게 됩니다.)
✨RequestDispatcher
RequestDispatcher를 이용하면 InputController는 jsp파일로 가는 중간 경유지가 됩니다.
✨ reponse.sendRedirect("/....")
PRG 패턴은 POST 방식의 처리 후에 바로 다른 주소로 브라우저가 이동하기 때문에 반복적으로 POST 호출이 되는 상황을 막을 수도 있습니다.

Servlet 클래스의 상속 구조

주로 '읽는' 기능 제공

🔹 getParameter()
?name=AAA&age=20과 같은 쿼리 스트링에서 키를 이용해 값을 얻을 때 사용getParameter() 결과값은 항상 String 🔹 getParameterValues()
🔹 setAttribute()
🔹 RequestDispatcher
forward() : 현재까지의 모든 응답 내용은 무시하고 JSP가 작성하는 내용만을 브라우저로 전달주로 '쓰는' 기능 제공

웹 MVC 구조에서 주로 JSP에서 처리되기 때문에 sendRedirect()를 이용하는 경우가 많다.

3티어와 같이 계층을 분리하는 경우에는 반드시 계층이나 객체들 간에 데이터 교환이 이루어지기 때문에 여러 개의 데이터를 묶어서 하나의 객체로 전달하는 것을 DTO라고 한다.
Java Beans 구성
public enum TodoService {
INSTANCE;
}
enum 타입으로 클래스를 작성하는 경우, 정해진 수만큼만 객체를 생성할 수 있다는 장점이 있다. TodoService.INSTANCE와 같이 간단하게 객체를 하나만 생성해서 사용 가능하다. 이를 싱글톤 패턴이라고 한다.
싱글톤 패턴?
왜 싱글톤 패턴을 사용할까?
- 인스턴스가 하나만 필요할 때
예를 들어, 설정 정보(환경 설정 클래스), 로깅 클래스, DB 커넥션 풀 관리 클래스 등은 여러 개의 객체가 필요하지 않다.
- 메모리 낭비 방지
매번 new 키워드로 객체를 생성하지 않고 하나의 인스턴스를 재사용함으로써 메모리를 절약할 수 있다.
- 전역 접근
어디서든지 동일한 인스턴스를 사용할 수 있어, 공유 리소스 관리에 유용하다.
enum class로 INSTANCE를 만든 이유는 Java의 Enum이 JVM 차원에서 싱글톤을 보장하기 때문