-
자바 웹을 다루는 기술 정리REVIEW/BOOK 2023. 1. 10. 09:33
하루입니다.
공부 이유 : servlet, context 등 개념이 불명확하게 잡혀있어서 추가로 공부하기 위함. 또한 spring 개념 이해에도 도움이 될 것이라 생각.
[ 1장 : 프로그램의 발전 과정 ]
1.1. 클라이언트 PC 기반 프로그램
- 클라이언트가 직접 설치해서 사용하는 것. 변경사항이 있다면 일일히 PC에 다시 설치하거나 업데이트 해야 했다.
1.2. 클라이언트-서버 기반 프로그램 동작 방식
- 클라이언트가 수행했던 기능을 서버에서 수행한다. 클라이언트는 처리할 데이터를 네트워크를 통해 서버에 전달하고, 서버가 처리한 결과를 네트워크를 통해 다시 받아 출력하는 역할만 한다. 하지만 변경사항이 생기면 로직과 클라이언트 프로그램을 수정해야 하는 것은 같다.
1.3. 웹 기반 프로그램 동작 방식
- 클라이언트는 웹브라우저로 HTML 문서(데이터)를 서버에 요청한다. 서버는 요청받은 HTML 문서(데이터)를 처리 후 브라우저에 전송하여 해당 기능을 담당하는 화면을 보여준다.
[ 2장. 웹프로그래밍과 JSP ]
1. 웹프로그래밍의 기본
- JSP 이전의 웹 페이지 조회 방식은 정적 웹프로그래밍이었다.
웹 서버
- 클라이언트에게 서비스를 제공하는 컴퓨터를 의미한다.클라이언트
- 서버로부터 서비스를 제공받는 컴퓨터를 의미한다.HTTP 프로토콜
- Hypertext Transfer Protocol
- www 서비스를 제공하는 통신 규약을 의미한다.
- 웹서버와 클라이언트는 이 프로토콜을 사용하여 정보를 주고받는다.HTML
-Hypertext Markup Language
- www 서비스를 제공하기 위한 표준 언어이다.자바스크립트
- HTML에 동적인 기능을 제공하는 스크립트 언어이다.CSS
- HTML에 디자인 관련 기능을 제공한다.2. 정적 웹프로그래밍
- 웹 서버에 미리 HTML, PAGE, IMG, CSS 등을 저장하고 브라우저에서 요청할 경우 그대로 전달하는 방식이다.
- 정보 수정시 관리자가 직접 HTML 소스를 수정하여 사용자에게 정보를 제공한다.
3. 동적 웹프로그래밍
- 관리자가 하던 역할을 웹 애플리케이션 서버(AWS)가 대신한다. 정확히는 AWS에서 실행되는 애플리케이션이 대신한다.
- 클라이언트의 요청이 있을 때마다 데이터베이스에 접근하여 실시간 정보를 클라이언트에게 제공한다.
- CGI(Common Gate Interface)는 처음으로 동적 방식 프로그램을 제공했다. 클라이언트가 웹 서버에서 정보를 요청하면 AWS에서 요청 기능 수행 프로세스를 메모리에 생성한다. 그리고 데이터베이스와 연동하여 클라이언트에게 요청 정보를 반환한다. 다른 클라이언트가 같은 정보를 요청하면 위의 과정을 반복한다. 요즘같은 환경은 메모리에 과부하가 걸릴 수 있다.
- 이러한 문제점을 개선하여 나온 것이 JSP, ASP, PHP와같은 동적 웹 프로그래밍 기술이다.
4. JSP 프로그램의 특징
- JSP는 기본적으로 스레드 방식으로 실행되기에 CGI보다 효율적이다.
- 클라이언트가 웹 서버에서 정보를 요청하면 AWS에서 요청 기능을 메모리에 생성한다. 그리고 데이터베이스와 연동하여 클라이언트에게 요청 정보를 반환한다. 다른 클라이언트가 같은 기능을 요청하면 기존의 요청 기능을 이용해서 정보를 반환한다. 그렇기에 각각의 기능을 메모리에 따로 로드하지 않아도 된다.
- 즉, 클라이언트의 요구를 처리하는 기능을 최초 한 번만 메모리에 로드된다. 동일 기능을 요구한다면 기존에 사용한 기능을 재사용한다.
- 스레드로 실행하면 프로그램을 외부 장치에서 메모리로 로드할 필요가 없기에 빠르게 동작한다.
[ 3장. 개발 환경 설정하기 ]
1. JDK 설치
- 자바 관련 개발 도구는 jdk의 위치를 환경 변수로 인식하기에 반드시 환경 변수를 설정해야 한다.
- 이클립스는 자동으로 인식함.
2. 톰캣 설치
- 톰캣은 웹컨테이너이다.
- 웹 컨테이너는 데이터베이스같은 다른 기능과 연동할 수 있도록 동작한다.
- 톰캣이 서블릿이나 JSP를 실행하여 웹페이지에 정보를 동적으로 표시한다.
3. 이클립스 설치
4. VSCODE 설치
5. ORACLE DBMS 설치
- 정보는 오라클 같은 데이터베이스에 저장된 후 사용자의 요청이 있을 때 표시된다.
- DBMS : Database Management System, 데이터베이스 관리 시스템
6. SQL Developer 설치
- SQL Developer는 윈도우 기반으로 오라클과 연동하는 도구 중 하나이다. (무료임)
7. exERD 설치
- 이클립스로 설치한다.
[ 4장. 웹 애플리케이션 이해하기 ]
1. 웹 애플리케이션
- 웹 컨테이너에서 실행되는 서블릿, jsp, 자바 클래스들을 추가하여 정적 웹 프로그래밍 방식의 단점을 보완한 동적인 서비스를 제공하는 프로그램을 말한다.
2. 웹 애플리케이션의 기본 구조
웹 애플리케이션 이름
|
|
------ WEB-INF
|
|
--------- classes
|
|
--------- lib
|
|
--------- web.xml
웹 애플리케이션 구성 요소의 기능webShop
- 웹 애플리케이션의 루트 디렉토리(최상위 디렉토리)이다.
- 다른 웹 애플리케이션의 이름과 중복을 허용하지 않는다.
- jsp html 파일이 저장된다.WEB-INF
- 웹 애플리케이션에 관한 정보가 저장된다.
- 외부에서 접근 불가하다.classes
- 웹 애플리케이션이 수행하는 서블릿과 일반 클래스들이 위치한다.lib
- 여러가지 라이브러리 압축 파일(jar)이 저장되는 곳이다.
- DB 연동 드라이버, 프레임워크 관련 jar 파일 등이 여기에 저장된다.
- lib 디렉토리의 jar는 클래스패스가 자동으로 설정된다.web.xml
- 배치 지시자(deployment descriptor)로서 일종의 환경 설정 파일이다.
- 웹 애플리케이션에 대한 여러가지 설정을 할 때 사용된다.bin
- 애플리케이션에서 사용되는 각종 실행 파일이 저장된 곳이다.conf
- 프레임워크에서 사용하는 각종 설정 파일이 저장된 곳이다.src
- 자바 소스 파일이 저장된 곳이다.3. 컨테이너에서 웹 애플리케이션 실행하기
- 웹 애플리케이션은 단독 실행이 불가하다. 웹 컨테이너에서 실행된다. 우리는 톰캣을 사용한다.
- 웹 애플리케이션을 톰캣 컨테이너에 등록하는 방법은 1. CATALINA_HOME%webApps 디렉터리에 애플리케이션을 저장하거나 2. server.xml에 웹 애플리케이션을 등록한다.
- 실제로 개발할 때는 개발자가 정한 위치에 웹 애플리케이션 생성 후 그 위치를 server.xml 에 등록하고 톰캣을 실행하는 식으로 한다. 그러면 톰캣이 server.xml에 입력된 정보에 따라 해당 위치로 이동 후 애플리케이션 확인하고 실행한다.
- 톰캣은 모든 설정 정보를 xml로 저장 후 실행시 정보를 읽어와 설정대로 실행한다.
- 그래서 우리가 만든 웹 애플리케이션도 미리 <context>를 사용해서 server.xml에 등록해야 한다.
3-1. 컨텍스트란?


<Context docBase="실제 애플리케이션의 WEB-INF 디렉터리 위치"
path="/컨텍스트 이름"
reloadable="true 혹은 false"
source="org.eclipse.jst.jee.server:servlettest"/>path
- 웹 애플리케이션의 컨텍스트 이름이다.
- 웹 애플리케이션 이름과 다를 수 있다.
- 웹 브라우저에서 실제 웹 애플리케이션을 요청하는 이름이다.docBase
- 컨텍스트에 대한 실제 웹 애플리케이션이 위치한 경로이다.
- WEB-INF 상위 폴더까지의 경로를 나타낸다.reloadable
- 실행 중 코드가 수정될 경우 바로 갱신할지를 설정한다.
- false로 설정한다면 톰캣을 다시 실행해야 추가한 소스코드의 기능이 반영된다.- https://docs.jboss.org/jbossas/javadoc/7.1.2.Final/javax/servlet/ServletContext.html?is-external=trueContext
- 사전적 의미 : 문맥, 환경, 정황
- 개발할 땐? 웹 실행시 생성되는 문맥 정보서블릿을 관리하는 것이 서블릿 컨테이너이다. (톰캣처럼!)\
- 하나의 web application 안에 하나의 context가 존재한다.
- 이름이 중복되면 안 된다.
- 대소문자 구분한다.
- server.xml에 등록한다.
- web application 내의 모든 서블릿을 관리하며 정보를 공유할 수 있도록 돕는 것이 ServletContext이다.
- 서블릿 컨텍스트(ServletContext)란 하나의 서블릿이 서블릿 컨테이너와 통신하기 위해서 사용되어지는 메서드들을 가지고 있는 클래스이다.
- 서블릿이 해당 서블릿 컨테이너와 통신하는 데 사용하는 일련의 메서드를 정의합니다.배포 설명자에 "distributed"으로 표시된 웹 응용 프로그램의 경우 각 가상 머신에 대해 하나의 컨텍스트 인스턴스가 있습니다. 이 상황에서 컨텍스트는 전역 정보를 공유하는 위치로 사용할 수 없습니다(정보가 진정으로 전역적이지 않기 때문입니다). 대신 데이터베이스와 같은 외부 리소스를 사용하십시오.
- 객체는 서블릿이 초기화될 때 웹 서버가 서블릿을 제공하는 객체 내에 ServletContext포함됩니다.
- Q. 웹어플리케이션 안에 context가 존재하는 건가? (포함관계인가?)
- A. web application은 통용적으로 사용된다.
context는 jsp/servlet에서 사용한다.
dynamic web project는 이클립스에서 사용한다. - / 포트번호까지
- / 없으면 현재 경로와 같은 것
3-2. 톰캣 컨테이너에서의 웹 애플리케이션 동작 과정
- 웹 브라우저에서 context 이름으로 요청한다.
- 요청 받은 톰캣 컨테이너는 요청한 context 이름이 server.xml에 있는지 확인한다. (path!!!)
- 해당 context 이름이 있다면 context의 실제 웹 애플리케이션이 있는 경로(docBase!!)로 가서 요청한 것을 웹 브라우저로 전송한다.
- 웹 브라우저는 전송된 페이지를 브라우저에 나타낸다.
4. 이클립스에서 웹 애플리케이션 실습하기
- 이클립스에서는 한 개의 프로젝트가 한 개의 웹 애플리케이션이다!
- 그래서 context명도 프로젝트 이름으로 자동생성된건가?
- 새로운 프로젝트 생성하면 server에서 톰캣 컨테이너 추가해야 한다.
- Add and Remove도 해줘야 한다.
- 아래의 프로젝트가 톰캣과 연동되어 생성된 프로젝트였다 ! 몰랐네 ! 이름도 적혀 있는데 !!!

5. 웹 애플리케이션 서비스하기
- 배치란?
- 웹 애플리케이션을 실제로 서버에서 서비스하는 톰캣으로 이동하여 실행하는 것을 배치(deplpy)한다 <= 라고 한다. 사용자에게 서비스하기 위해서는 이클립스 톰캣에서 서비스하는 것은 의미 없기 때문이다.
[ 5장. 서블릿 이해하기 ]
1. 서블릿이란?
- 동적 웹 페이지를 처음으로 구현한 것은 서블릿(자바로 만든 CGI프로그램)이다.
- 서블릿이란 서버 쪽에서 실행되며 클라이언트의 요청에 따라 동적으로 서비스를 제공하는 자바 클래스이다.
- 자바로 작성되어 있어 자바의 특징을 모두 가진다.
- 독자 실행 불가하며, JSP/Servlet 컨테이너에서 실행된다.
- 스레드 방식으로 실행된다.
- 플랫폼 독립적이다. 컨테이너 종류에 상관없이 실행된다.
- 보안 기능을 적용하기 쉽다.
- 웹 브라우저에서 요청시 기능을 수행한다.
1-2. 서블릿의 동작 과정
- 클라이언트가 웹 서버에 요청
- 웹서버가 요청을 웹 어플리케이션 서버에 위임한다.
- WAS가 각 요청에 해당하는 서블릿을 실행한다.
- 서블릿이 요청에 대한 기능을 수행한 후 결과를 반환해 클라이언트에 전송한다.
2. 서블릿 API 계층 구조와 기능

서블릿 구성 요소 기능 Servlet 인터페이스
- javax.servlet 패키지에 선언되어 있다.
- Servlet 관련 추상 메소드를 선언한다.
- init() : 서블릿 콘테이너에서 호출되어 서블릿이 서비스에 투입되었음을 나타낸다. 서블릿 컨테이너는 서블릿을 인스턴스화한 후 init 메서드를 정확히 한 번 호출한다. 서블릿이 요청을 수신하려면 init 메서드가 성공적으로 완료되어야 한다.
- service() : 서블릿 컨테이너에서 호출되어 서블릿이 요청에 응답할 수 있도록 한다. 이 메서드는 서블릿의 init() 메서드가 성공적으로 완료된 후에만 호출된다. 응답의 상태 코드는 항상 오류를 발생시키거나 전송하는 서블릿에 대해 설정된다. 서블릿은 일반적으로 여러 요청을 동시에 처리할 수 있는 멀티 스레드 서블릿 컨테이너 내에서 실행된다. 개발자는 파일, 네트워크 연결 및 서블릿의 클래스 및 인스턴스 변수와 같은 공유 리소스에 대한 액세스를 동기화해야 한다.
req - 클라이언트의 요청을 포함하는 ServletRequest 개체
res - 서블릿의 응답을 포함하는 서블릿 응답 개체
- 그니까 doGet 이게 service인 거임!!
- distroy() : 서블릿 컨테이너에서 호출되어 서블릿이 서비스를 중단하고 있음을 서블릿에 알린다. service method의 모든 스레드가 종료되거나 시간이 초과되었을 경우에만 호출된다. 서블릿 컨테이너가 이 메서드를 호출한 후 이 서블릿에서 서비스 메서드를 다시 호출하지 않는다. 서블릿이 메모리, 파일 핸들, 스레드 등의 보유 리소스를 정리하고 영구적인 상태가 메모리에 있는 서블릿의 현재 상태와 동기화되도록 할 수 있다.
- getServletInfo() : 작성자, 버전 및 저작권과 같은 서블릿에 대한 정보를 반환한다. String을 반환한다.
- getServletConfig() : 서블릿에 대한 초기화 및 시작 매개 변수가 포함된 서블릿 구성 개체를 반환한다. ServletConfig 개체는 init 메서드로 전달된 개체를 반환한다. 이 인터페이스를 구현하는 것은 ServletConfig 객체를 저장할 수 있게 해서 이 메소드가 반환도 할 수 있게 한다.ServletConfig 인터페이스
- javax.servlet 패키지에 선언되어 있다.
- Servlet 관련 추상 메소드를 선언한다.
- servlet 컨테이너가 servlet을 초기화 할 때 정보를 건네주기 위해 사용한다.
- getInitParameter() : 명명된 초기화 파라미터값을 포함하는 String 값을 반환하거나, 존재하지 않을 경우 null을 반환한다.
- getInitParameterNames() : 서블릿의 초기화 매개 변수 이름을 Enumeration of String 개체로 반환하거나, 서블릿에 초기화 매개 변수가 없는 경우 빈 Enumeration으로 반환한다.
- getServletContext() : 호출한 곳에서 실행 중인 서블릿 컨텍스트에 대한 참조를 반환합니다.
- getServletName() : 이 서블릿 인스턴스의 이름을 반환합니다.GenericServlet 클래스
- javax.servlet 패키지에 선언되어 있다.
- 상위 두 인터페이스를 구현하여 일반적인 서블릿 기능을 구현한 클래스이다.
- 사용되는 프로토콜에 따라 service()를 오버라이딩해서 구현한다.HttpServlet 클래스
- javax.servlet 패키지에 선언되어 있다.
- GenericServlet을 상속받아 http 프로토콜을 사용하는 웹 브라우저에서 서블릿 기능을 수행한다.
- 웹 브라우저 기반 서비스를 제공하는 서블릿을 만들 때 상속받아 사용한다.
- 요청시 service()가 호출되며 요청 방식에 따라 doGet()이나 doPost()가 호출된다.(Http?) Servlet의 특이점!!!
- public service() => protected service() => doXxx()를 호출하는 과정이다!
- public service() : 클라이언트의 request를 protected service() 에게 전달한다.
- protected service() : request를 public service()에서 전달받아 doXXX 메서드를 호출한다.
- doXxx() : 서블릿이 Xxx request를 수행하기 위해 service()를 통해 호출한다.
3. 서블릿의 생명주기 메서드
- 서블릿도 자바 클래스이기에 초기화 과정 => 메모리에 인스턴스 생성하고 서비스 수행 => 소멸 과정을 거친다.
- 단계를 거칠 때마다 서블릿 클래스의 메소드가 호출되어 초기화, 데이터베이스 연동, 마무리 작업을 수행한다.
- 이 때 기능을 수행하는 메소드를 서블릿 생명주기 메소드라고 한다!
- !!! 그럼 객체랑 똑같은 거 아닌가? 다만 객체가 생성될 때 나 destroy 당한다!!! 하고 사라지지 않을 뿐
생명주기 단계 호출 메서드 특징 초기화 init()
- 서블릿 요청시 맨 처음 한 번만 호출된다.
- 서블릿 생성시 초기화 작업을 주로 수행한다. (??? 주로면 다른 것도 한다는 거임???)
- 실행 초기에 서블릿 기능 수행과 관련된 기능을 설정하는 용도로 많이 사용한다.작업 수행 doGet()
doPost()
- 서블릿 요청시 매번 실행된다.
- 실제로 클라이언트가 요청하는 작업을 수행한다.
- doXXX() 메서드들은 서블릿의 핵심 기능을 처리하므로 반드시 구현해야 한다.종료 destroy()
- 서블릿이 기능을 수행하고 메모리에서 소멸될 때 호출된다.
- 서블릿의 마무리 작업을 주로 수행한다.
4. FirstServlet을 이용한 실습
이클립스에서 서블릿을 만들고 실행하는 과정
- 사용자 정의 서블릿 클래스 만들기
- 서블릿 생명주기 메서드 구현
- 서블릿 매핑 작업
- 웹 브라우저에서 서블릿 매핑 이름으로 요청하기
5. 서블릿 동작 과정
1-2 서블릿의 동작 과정을 더 자세하게!
- 클라이언트가 웹 서버에 요청한다.
- 웹서버가 요청을 웹 어플리케이션 서버에 위임한다.
- 찾는 servlet이 메모리에 존재하는지 확인한다.
- servlet이 없다면 서블릿 객체 메모리를 로드 후, init()을 사용해 호출한다.
- servlet이 있다면 doGet() 혹은 doPost()를 호출한다.
- WAS가 각 요청에 해당하는 서블릿을 실행한다.
- 서블릿이 요청에 대한 기능을 수행한 후 결과를 반환해 클라이언트에 전송한다.
- 만약 서블릿이 없다면 생성한다. 다른 브라우저에서 같은 서블릿을 찾는다면 다시 생성할 필요 없이 미리 메모리에 로드된 서블릿을 사용한다. doXxx() 메소드만 호출하는 것이다.
- 즉, 서블릿은 동일한 작업에 대해 메모리에 존재하는 서블릿을 재활용하여 훨씬 빠르고 효율적으로 동작할 수 있다.
6. annotation을 이용한 서블릿 매칭
- @WebServlet("/servlet mapping 이름")
[ 6장. 서블릿 기초 ]
1. 서블릿의 세가지 기능
- 톰캣과 같은 WAS가 처음 나왔을 때 웹 브라우저 요청을 멀티 스레드 방식으로 처리하는 기술이 서블릿이엇다.
- 서블릿의 세 가지 기능
- 1. 클라이언트로부터 요청을 받는다.
- 2. 비즈니스 로직을 처리한다.
- 3. 결과를 다시 클라이언트에 돌려준다.
- 클라이언트가 로그인 하기 위해 ID와 비밀번호를 FORM에 입력한다. 로그인 버튼을 누르면 사용자가 입력한 ID와 비밀번호가 서버 쪽의 서블릿에 전달된다. 서블릿은 사용자가 입력한 ID와 비밀번호를 받아오고, 데이터베이스에서 사용자가 이미 등록되었는지/ID나 비밀번호가 틀렸는지 등을 조회한 후, 오류가 있을 경우 오류 메세지를 클라이언트에게 전송한다.
1-1. 서블릿 응답과 요청 수행 API 기능
- 요청과 관련된 API : javax.servlet.http.HttpServletRequest
- 응답과 관련된 API : javax.servlet.http.HttpServletResponse
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { }
- 위의 API가 doGet()이나 doPost() 메서드의 매개변수로 사용된 예이다.
2. <form> 태그 이용해 서블릿에 요청하기
- 웹 브라우저에서 form 태그 등의 전송을 클릭하면 입력 데이터가 서블릿으로 전송된다.
- name과 value의 값으로 전달된다. id 아님!!!
- name : form 태그의 이름을 지정한다.
- method : 기본값은 GET, POST 지정 가능
- action : form 태그에서 데이터를 전송할 서블릿이나 JSP 지정, 서블릿으로 전송할 때는 mapping된 이름을 사용한다.
- encType : form 태그에서 전송할 데이터의 encoding 타입을 지정한다. 파일을 업로드할 때는 multipart/form-data뢰 지정한다.
3. 서블릿에서 클라이언트의 요청을 얻는 방법
메서드 기능 String getParameter(String name) name의 이름을 알고 있으며 name에 전송된 값을 받아올 때 사용한다. String[] getParameterValues(String name) 같은 name에 대한 여러 값을 얻을 때 사용한다. Enumeration getParameterNames() name값을 모를 때 사용한다. 3-1. HttpRequestServlet으로 요청 처리 실습 (한 개의 값)
- form으로 값이 넘어간다

- <input>의 name 속성값으로 전송된 value를 받는다.

3-2. 여러 개의 값을 전송할 때의 요청 처리
- 체크박스의 name 속성 값을 받을 때를 생각해보자.
- name 속성은 배열로 전송될 것이다.
- 여러개의 name 값이 넘어갈 수 있는 checkbox input


- 아래와 같이 받는다!
3-3. Enumeration getParameterNames() 을 사용한 요청 처리
- 전송되는 데이터가 많아 name이 헷갈릴때는 getParameterNames()를 사용하자.
4. 서블릿의 응답처리 방법
1. doGet()이나 doPost() 메서드 안에서 처리한다.
2. javax.servlet.http.HeepServletResponse 객체를 사용한다.
3. serContentType()를 사용해 클라이언트에게 전송할 데이터 종류(MIME-TYPE)를 지정한다.
4. 클라이언트와 서블릿의 통신은 자바 I/O의 스트림을 이용한다.
4-1. MIME 타입
- 클라이언트에게 전송되는 컨텐츠의 타입을 지정할 때 사용되는 규약이다.
- 서버(서블릿)에서 웹 브라우저로 데이터 를 전송할 때는 톰캣 컨테이너에서 제공하는 전송 데이터 중 하나를 지정한다. 톰캣 컨테이너에서 미리 설정한 데이터 종류를 뜻한다.
- type/subtype : 타입과 서브타입으로 구성된다.
- 굉장히 종류 많음!
- text/html text/plain application/xml
- application/json : JSON 형식으로 작성된 데이터 교환용 텍스트 데이터
- multipart/form-data : 브라우저에서 서버로 폼의 내용을 전송할 때 사용
- application/x-www-form-urlencoded : 브라우저에서 서버로 폼의 내용을 전송할 때 사용
4-2. HttpServletResponse를 이용한 서블릿 응답 실습
서블릿이 클라이언트에 응답하는 과정은 다음과 같다.
- setContentType()을 이용해 MIME-TYPE을 지정한다.
- 데이터를 출력할 PrintWriter 객체를 생성한다.
- 출력데이터를 HTML 형식으로 만든다.
- PrintWrite의 print()나 println()를 사용해 데이터를 출력한다.
5. 웹브라우저에서 서블릿으로 데이터 전송하기
5-1. GET/POST 전송 방식
GET 방식 POST 방식
- 서블릿에 데이터를 전송할 때는 데이터가 URL 뒤에 name=value 형태로 전송된다.
- 여러개의 데이터를 전송할 때는 &로 구분해서 전송된다.
- 보안이 취약하다.
- 전송할 수 있는 데이터는 최대 255자이다.
- 기본 전송 방식이고 사용이 쉽다.
- 웹 브라우저에 직접 입력해서 전송할 수 있다.
- 서블릿에서는 doGet() 이용해 데이터를 처리한다.- 서블릿에 데이터를 전송할 때는 TCP/IP 프로토콜 데이터의 body 영역에 숨겨진 채 전송된다.
- 보안에 유리하다.
- 전송 데이터 용량이 무제한이다.
- 전송시 서블릿에서는 또다시 작업을 해야 하므로 처리 속도가 GET 방식보다 느리다.
- 서블릿에서는 doPost()를 이용해 데이터를 처리한다.5-2. GET 방식으로 서블릿에 요청
5-2. POST 방식으로 서블릿에 요청
- GET 방식은 DOGET()으로!!! POST방식은 DOPOST()로 받자 !!!
6. GET 방식과 POST 방식 요청 동시에 처리하기
- doHandle() 사용함
- 204페이지

7. 자바스크립트로 서블릿에 요청하기

8. 서블릿을 이용한 여러가지 실습 예제
- 유효성 검사!

[ 7장. 서블릿 비즈니스 로직 처리 ]
1. 서블릿의 비즈니스 로직 처리 방법
- 서블릿 비즈니스 처리 작업이란, 서블릿이 클라이언트로부터 요청을 받으면 그 요청에 대해 작업을 수행하는 것이다.
- 서블릿의 핵심 기능이다.
- 데이터베이스와 연동하거나, 다른 서버와 연동해서 데이터를 얻는다.
- 클라이언트에게 요청 받음 - 비즈니스 로직 처리 - 처리 결과 클라이언트에게 반환
2. 서블릿의 데이터베이스 연동하기
- 클라이언트 요청 => 서블릿이 sql문 사용해서 데이터베이스에서 작업 => 이 과정에서 dao, vo 사용된다.
- PreparedStatement, Statement, Connection 사용한 DBMS 서블릿 연동 작업
- Statement가 전달하는 SQL문은 단순한 문자열이다. DBMS는 이 문자열을 컴파일하고 실행한다.
- PreparedStatement는 컴파일된 SQL문을 DBMS에 전달하여 성능을 향상시킨다.
- PreparedStatement가 Statement를 상속함!! 대박!!!
3. DataSource 이용해 데이터베이스 연동하기
- 커넥션풀이란 미리 데이터베이스와 연결시킨 상태를 유지하는 것이다.
- 웹 애플리케이션이 실행됨과 동시에 연동할 DB와의 연결을 미리 설정하고, 필요할 때마다 미리 연결한 상태를 이용해 빠르게 DB와 연동한다.
- 톰캣은 자체적으로 커넥션풀 기능 제공한다!
3-1. 커넥션풀(Connection Pool) 동작 과정
- 톰캣 컨테이너 실행 후 응용 프로그램 실행한다.
- 톰캣 컨테이너가 실행되며 Connection Pool 객체를 생성한다.
- 생성된 Connection 객체를 DBMS와 연결한다.
- 만약 DB와의 연동 작업이 필요한 경우, 응용 프로그램은 ConnectionPool에서 제공하는 메소드를 호출하여 연동한다.

3-2. JNDI
- 실제 웹애플리케이션에서 ConnectionPool 객체를 구현할 때는 javax.sql.DataSource를 이용한다.
- 웹 애플리케이션 실행시 톰캣이 만든 ConnectionPool 객체에 접근할 때는 JNDI를 이용한다.
- 톰캣 객체가 ConnectionPool 객체 생성하면 이 객체에 대한 JNDI이름(key)를 미리 설정한다. 웹 애플리케이션에서 DB와 연동작업 할 때 이 JNDI 이름으로 접근하여 작업한다.
- JNDI : Java Naming Directory Interface
- JNDI 사용예
- - 웹브라우저에서 name/value 쌍으로 전송 후 서블릿에서 getParameter(name)으로 값 가져올 때
- - 해시맵/해시테이블에 키/값으로 저장 후 키 이용해 값가져올 때
- - 도메인 네임에 대한 ip 주소 가져올때

name : DataSource에 대한 JUDI 이름 auth : 인증 주체 type : 데이터베이스 종류별 DataSource driverClassName : 연결할 DB 종류에 따른 드라이버 클래스 이름 url : 접속할 DB 주소와 포트 번호 및 SID username : DB 접속 ID password : DB 접속 비밀번호 maxActive : 동시에 최대로 DB에 연결 가능한 Connection 수 maxIdle : 동시에 idle 상태로 대기할 수 있는 최대 수 maxWait : 새로운 연결이 생길 때까지 기다릴 수 있는 최대 시간 
4. DataSource 이용해 회원 정보 등록하기
5. 회원 정보 삭제하기
[ 8장. 서블릿 확장 API 사용하기 ]
1. 서블릿 포워드 기능 사용하기
- 포워드 : 하나의 서블릿에서 다른 서블릿이나 JSP와 연동하는 방법이다.
- 포워드 기능 : 서블릿에서 다른 서블릿이나 JSP로 요청을 전달하는 방법
- 포워드의 용도
- 1. 요청에 대한 추가작업을 다른 서블릿에게 수행하게 한다.
- 2. 요청에 포함된 정보를 다른 서블릿이나 JSP와 공유할 수 있다.
- 3. 요청에 정보를 포함시켜(?? 같은 말 아닌가) 다른 서블릿에 전달할 수 있다.
- 4. Model2 개발시 서블릿에서 JSP로 데이터를 전달하는데 사용된다.
2. 서블릿의 여러가지 포워드 방법
포워드 방법 네 가지
redirect
- 서블릿이 웹 브라우저를 거쳐 다른 서블릿이나 JSP에게 요청하는 방법이다.
- HttpServletResponse 객체의 sendRedirect() 메소드 사용
- sendRedirect(" ");Refresh
- 서블릿이 웹 브라우저를 거쳐 다른 서블릿이나 JSP에게 요청하는 방법이다.
- HttpServletResponse 객체의 addHeader() 메서드 사용
- response.addHeader("Refreash", "");location
- 서블릿이 웹 브라우저를 거쳐 다른 서블릿이나 JSP에게 요청하는 방법이다.
- location.href= ' ' ;dispatch
- 서블릿이 클라이언트를 거치지 않고 바로 다른 서블릿에게 요청하는 방법이다.
- 일반적으로 포워딩 기능을 지칭한다.
- RequestDispatcher 클래스의 forward() 메소드를 사용한다.
- RequestDispatcher rd = request.getRequestDispatcher(jspName);
- rd.forward(request, response);redirect, Refresh, location의 수행 과정 (아마도)
=> 클라이언트의 웹브라우저에서 첫번째 서블릿에 요청
=> servlet1이 sendRedirect() 메서드를 이용해 servlet2를 웹브라우저를 통해 요청
=> 웹브라우저는 sendRedirect() 메서드가 지정한 servlet2를 다시 요청한다.

3. dispatch를 사용한 포워드 방법
- 클라이언트의 웹브라우저를 거치지 않고 바로 서버에서 포워딩이 진행된다.
- URL가 바뀌지 않으며, 클라이언트 측에서는 포워드가 진행되는지 알 수 없다.
4. 바인딩
- 앞에서 배운 것은 GET으로 전달하는 방법.
- 하지만 다량의 정보를 전달할 때는?
- 바인딩을 사용하자.
- 주로 HttpRequestServlet, HttpSession, ServletContext 객체에서 사용되며, 저장된 자원(데이터)는 프로그램 실행 시 서블릿이나 JSP에서 공유하여 사용한다.
- model2, spring framework로 구현하는 웹 프로그램은 바인딩을 사용해 서블릿이나 JSP간 데이터를 전달하고 공유한다.
- 바인딩 관련 메소드 : getAttribute(), setAttribute(), removeAttribute()
- 반환값이 Object라서 형변환 해야 함
5. ServletContext와 ServletConfig 사용법
6. load-on-startup 사용하기
[ 9장. 쿠키와 세션 알아보기 ]
1. 웹페이지 연결 기능
- 보통 웹에서 사용되는 정보는 서블릿의 비즈니스 처리 로직을 사용해 DB에서 가져온다.
- 하지만 어떤 정보들은 클라이언트의 PC나 메모리에 저장하고 사용하는 것이 효율적이다.
1-1. 세션트래킹
- 내가 어떤 사이트에서 로그인했다고 했을 때, HTTP 프로토콜 방식으로 통신하는 웹 페이지들은 서로 어떤 정보도 공유하지 않는다. 이전 웹페이지에서 수행한 작업을 다른 웹페이지에서 알 수 없다.
- HTTP는 서버-클라이언트 통신시 stateless 방식으로 통신하기 때문이다. 각 웹페이지의 상태나 정보가 다른 페이지와 공유되지 않는다.
- 웹페이지 사이의 상태를 공유하기 위해서는 프로그래머가 세션 트래킹이라는 웹페이지 연결 기능을 구현해야 한다.
연동 방법
- 1. <hidden> 태그
- 2. URL Rewriting
- 3. 쿠키 : 클라이언트 PC의 Cookie 파일에 정보 저장 후 웹페이지들이 공유한다.
- 4. 세션 : 서버 메모리에 정보 저장 후 웹페이지들이 공유한다.
2. <hidden> 태그와 URL Rewriting 이용해 웹페이지 연동하기
2-1. <hidden> 태그를 이용한 세션 트래킹
- < input type="hidden" name="user_email" value="d@gmail.com" >
- String user_email = request.getParameter("user_email");
2-2. URL Rewriting을 이용한 세션 트래킹
- user_address=URLEncoder.encode(user_address, "UTF-8");
- out.println("<a href='/member?id="+user_id+"&user_pw=" + ... '></>");
3. 쿠키를 이용한 웹 페이지 연동 기능
쿠키란?
- 웹페이지들 사이의 공유 정보를 클라이언트 PC에 저장 후 필요할 때 여러 웹페이지가 공유해서 사용할 수 있도록 하는 것이다.
쿠키의 특징
- 정보가 클라이언트PC에 저장된다.
- 저장 정보 용량에 제한이 있다. (파일 용량은 4kb)
- 보안이 취약하다.
- 클라이언트 브라우저에서 사용 유무를 설정할 수 있다.
- 도메인당 쿠키가 만들어진다. (웹사이트당 하나의 쿠키)
- 보안에 취약하기에 보톤 쿠키는 보안 무관 경우에 사용한다. [ 오늘은 더 이상 보지 않기 ㅁ ] 등
쿠키의 종류
속성 Persistence 쿠키 Session 쿠키 생성 위치 파일로 생성 브라우저 메모리에 생성 종료 시기 쿠키를 삭제하거나 쿠키 설정 값이 종료된 경우 브라우저를 종료한 경우 최초 접속 시 전송 여부 최초 접속시 서버로 전송 최초 접속시 서버로 전송되지 않음 용도 로그인 유무 또는 팝업창을 제한할 때 사이트 접속시 Session 인증 정보를 유지할 때 쿠키 기능 실행 과정
- 브라우저로 사이트에 최초 접속한다.
- 서버는 정보를 저장한 쿠키를 생성한다.
- 생성된 쿠키를 브라우저로 전송한다.
- 브라우저는 서버로부터 받은 쿠키 정보를 쿠키 파일에 저장한다.
- 브라우저에 재접속시, 서버가 브라우저에게 쿠키 전송을 요청하면 브라우저는 쿠키 정보를 서버에 넘겨준다.
- 서버는 쿠키 정보를 이용해 작업을 한다.
쿠키 API
- 쿠키는 Cookie 클래스 객체를 생성하여 정보를 저장한 후 => 서버에서 클라이언트로 전송해 파일로 저장된다.
- javax.servlet.http.Cookie를 이용한다.
- HttpServletResponse의 addCookie() 메서드를 이용해 클라이언트 브라우저에 쿠키를 전송한 후 저장한다.
- 쿠키 생성시 setMaxAge() 메서드의 인자값으로 지속쿠키 혹은 세션쿠키를 만들 수 있다. 인자를 음수로 주거나 메소드를 사용하지 않으면 세션쿠키, 인자값으로 양수를 지정하면 지속쿠키이다.
서블릿에서 쿠키 사용하기
만들고 전송하기
Cookie c = new Cookie("cookieTest", URLEncoder.encode("JSP프로그래밍입니다.", "UTF-8"); c.serMaxAge(24*60*60); response.addCookie(c); <=== 생성된 쿠키 브라우저로 전송전송된 쿠키 받기
Cookie[] allValues = request.getCookies(); if(allValues[i].getName().equals("cookieTest")) { 값 가져오기 }- 이런 식으로 만들고 저장해서, 만약 쿠키 이름이 notPopup이 있다면 팝업 안 띄우고 이런 식으로 동작한다.
4. 세션을 이용한 웹페이지 연동 기능
- 쿠키와의 공통점 : 웹페이지 사이의 공유 정보를 서버에 저장하고 페이지간 매개해 준다는 점.
- 쿠키와의 차이점
- 쿠키는 웹페이지의 정보가 클라이언트 PC에 저장되어 정보가 노출될 수 있다는 단점이 있다.
- 세션은 서버의 메모리에 생성되기에 보안이 요구되는 정보를 담기에 적합하다.
세션의 특징
- 정보가 서버의 메모리에 저장된다.
- 브라우저의 세션 연동은 세션 쿠키를 이용한다. ==> ?????
- 쿠키보다 보안에 유리하다.
- 서버에 부하를 줄 수 있다.
- 브라우저(사용자)당 한 개의 세션(세션id)가 생성된다.
- 그래서 브라우저에 대한 세션을 구분하고 작업을 수행할 수 있다.
- 세션은 유효 시간을 가진다. 기본은 30분이다.
- 로그인 상태 유지 기능이나 쇼핑몰의 장바구니 담기 기능 등에 주로 이용된다.
세션 기능 실행 과정
- 클라이언트의 브라우저가 서버에 최초 접속한다.
- 서버의 서블릿은 세션 객체를 생성 후 세션 객체에 대한 세션 id를 브라우저에 전송한다.
- 브라우저는 세션id를 브라우저가 사용하는 세션 쿠키에 저장한다.
- 즉, 서버로부터 전송된 세션id도 쿠키이며, 이름은 jsessionId이다.
- 만약 재접속했다면, 세션 쿠키에 저장된 세션id를 다시 서버로 전송한다.
- 서버에서는 전송된 세션id를 이용해 브라우저의 세션 객체에 접근하여 작업을 수행한다.
세션API의 특징과 기능
- 서블릿에서 세션을 이용하려면 HttpSession 클래스 객체를 생성해서 사용해야 한다.
- HttpSession 객체는 HttpServletRequest의 getSession() 메소드를 호출해서 생성한다.
HttpSession session = request.getSession();HttpSession session = request.getSession();
session.setAttribute("sessionid", id);
- 세션 get하고 sessionid라는 이름으로 id 저장하기!
- 여기서 id는 파라미터로 받은 값으로, session이 만료되기 전까지 모든 서블릿에서 공유된다!HttpSession session = request.getSession();
세션 얻기!session.removeAttribute("변수 이름");
세션 속성 삭제!
(session.invalidate();도 세션 삭제함. 이건 아예 삭제하는 듯?)session.setMaxInactiveInterval(60*5);
세션 최대 유효시간 변경!5. encodeURL() 사용법
- 만약 브라우저에서 쿠키 기능을 사용할 수 없게 설정했다면?
- 쿠키도 세션도 사용 불가하다.
- 이런 경우는 encodeURL() 메소드를 사용해 직접 서버에서 브라우저로 응답을 보낸 후, URL Rewriting 방법을 사용해 jsessionId를 서버로 전송하여 세션기능을 사용해야 한다.
String url = response.encodeURL("login"); out.println("<a href="+url+">로그인 상태 확인 </a>");6. 세션을 이용한 로그인 예제
[ 10장. 서블릿의 필터와 리스너 기능 ]
1. 서블릿 속성과 스코프
- 서블릿 속성이란 아래의 세가지 서블릿 API 클래스에 저장되는 객체(정보)이다.
- ServletContext, HttpSession, HttpServletRequest
- 서블릿의 스코프란 서블릿 API에 바인딩된 속성에 대한 접근 범위이다.
- ServletContext : application scope (타브라우저 접근 가능)
- HttpSession : session scope (동브라우저 접근 가능)
- HttpServletRequest : request scope (요청객체 받는 서블릿만 접근 가능)
2. 서블릿의 여러가지 URL 패턴
- URL 패턴이란 실제 서블릿의 매핑 이름을 말한다.
- 서블릿 매핑시 사용되는 가상의 이름으로, 클라이언트가 브라우저에서 요청할 때 사용되며 반드시 ' / ' 로 시작해야 한다.
@WebServlet("/member/list ") 정확히 이름까지 일치하는 URL 패턴 @WebServlet("/member/* ") 디렉터리 이름만 일치하는 URL 패턴 @WebServlet("*/do ") 확장자만 일치하는 URL 패턴 @WebServlet("/* ") 모든 요청 URL패턴 3. Filter API
- 한글 인코딩처럼 반복되는 작업을 필터에서 처리하자!
- 클라이언트 => 필터 => 서블릿
Filter 메소드 요약 void distroy() 웹 컨테이너가 서비스를 중단하고 있음을 나타내기 위해 웹 컨테이너에서 호출된다. void doFilter() 요청과 응답 쌍이 체인을 통과할 때마다 컨테이너에서 호출된다.
다음 체인을 실행하고, 다음 체인이 없다면 서블릿을 실행한다.void init(FilterConfig filterConfig) 웹 컨테이너가 서비스를 시작하고 있음을 필터에 나타내기 위해(초기화할 때) 웹 컨테이너에서 호출된다.
https://harutocoding.tistory.com/228필터 만들기

필터 기능 구현

4. 여러가지 서블릿 관련 Listener API
- 이벤트리스너처럼 서블릿 관련 이벤트에 대해 적절한 처리를 해주는 Listener이다.
- HttpSessionBindingListener / HttpSessionListener로 로그인 접속자수 표시 실습
[ 11강. JSP 정의와 구성요소 ]
1. JSP 등장 배경
- JSP는 HTML, CSS, JS를 기반으로 JSP 요소를 사용해 화면을 구성한다.
- 서블릿의 비즈니스 로직과 결과를 보여주는 화면 기능을 분리한다.
- 개발자는 비즈니스 로직에, 디자이너는 화면에 집중한다.
- 재사용성과 유지관리가 수월해진다.
- Model2 방식에서 View를 담당한다.
2. JSP의 3단계 작업 과정
- 서블릿에서는 println()과 같은 코드 안에 html 태그를 넣어서 브라우저로 전송했다. 브라우저가 받아서 실히간으로 구현했다.
- jsp는 html, js, css, jsp의 구성 요소들이 섞여있어서 톰캣 컨테이너에 의해 브라우저로 전송되기 전에 실행단계를 거쳐야 한다.
2-1. 톰캣 컨테이너에서 JSP 변환 과정
- 변환 단계
- 컴파일 단계
- 실행 단계
변환 단계
(Translation
Step)
- 컨테이너가 JSP 파일을 자바 파일로 변환한다.
- sba / eclipse / workspace 밑에 보면 변환된 java 파일이 있다.
- 서블릿에서는 하나하나 out.println("<h1>HELLO</h1>");와 같은 형태로 적어야 했다.
- 하지만 JSP는 요청시 컨테이너에서 자동으로 out.write() 등을 사용해 html 태그 등을 브라우저로 전송해 준다.컴파일 단계
(Compile
step)
- 컨테이너는 변환된 java 파일을 class 파일로 컴파일한다.실행 단계
(Interpret
Step)
- 컨테이너는 class파일을 실행하여 그 결과 (html, css, js)를 브라우저로 전송해 출력한다.
- 즉, 브라우저로 출력되는 것은 class파일로 컴파일된 jsp(java)파일이라는 것을 알 수 있다.3. JSP 페이지 구성 요소
- 디렉티브 태그
- 스트립트 요소
- 표현 언어
- 내장 객체
- 액션 태그
- 커스텀 태그
4. 디렉티브 태그

- 이 부분을 페이지 지시자 태그, directive tag라고 한다.
- isErrorPage, errorPage, pageEncoding, session, import, info, language 등의 JSP 속성이 있다.

- 이 부분을 Taglib 디렉티브 태그라고 한다.
- 개발자나 프레임워크에서 제공하는 태그를 사용할 때 사용한다.
<%@ include file="aaa_image.jsp" %>
- 인클루드 디렉티브 태그이다.
[ 12장. JSP 스크립트 요소 기능 ]
1. JSP 스크립트 요소
JSP 스크립트 요소란 JSP 페이지에서 동적인 처리를 제공하는 기능이다.
선언문 : JSP에서 변수나 메서드를 선언할 때 사용한다.
스크립틀릿 : JSP에서 자바 코드를 작성할 때 사용한다.
표현식 : JSP에서 변수의 값을 출력할 때 사용한다.
스크립트요소는 브라우저로 전송되기 전에 컨테이너에서 자바 코드로 변환된다.
브라우저는 html, css, js만 전달받는다.
2. 선언문 사용하기
<%! 멤버변수 혹은 메서드 %>
서블릿 클래스의 멤버로 변환된다.
3. 스크립트릿 사용하기
<% 자바 코드 %>
브라우저로 전송되기 전에 컨테이너에서 자바 코드로 변환된다.서블릿의 _jspService() 메서드 안의 자바 코드로 변환 된다.
out.write() 형태로 출력된다.
4. 표현식 사용하기
<%= 값 / 자바변수 / 자바식 %>
표현식 안의 값은 out.print() 형태로 출력된다.
5. JSP 주석문 사용하기
<%-- JSP 주석 --%>
6. 스크립트 요소 사용해 실습하기
로그인, 계산기, 구구단, 이미지 리스트 출력
7. 내장 객체(내장 변수) 기능
8. JSP 페이지 예외 처리하기
9. JSP welcome 파일 작성하기
10. 스크립트 요소 이용해 회원 정보 조회하기
[ 13장. 자바 코드를 없애는 액션 코드 ]
1. 인클루드 액션 태그 사용하기
2. 포워드 액션 태그 사용하기
3. useBean, setProperty, getProperty 액션 태그 사용하기
[ 14장. 표현 언어와 JSTL ]
1. 표현언어란?
2. 표현 언어 내장 객체(내장 변수)
3. 표현 언어로 바인딩 속서 ㅇ출력하기
4. 커스텀 태그
5. JSP 표준 라이브러리 (JSTL)
6. Core 태그 라이브러리 사용하기
7. Core 태그 라이브러리 실습 예제
8. 다국어 태국 라이브러리 사용하기
9. 한글을 아스키 코드로 변환하기
10. 포매팅 태그 라이브러리 사용하기
11. 문자열 처리 함수 사용하기
12. 표현 언어와 JSTL을 이용한 회원 관리 실습
[ 15장. JSP 페이지를 풍부하게 하는 오픈 소스 기능 ]
1. JSP에서 파일 업로드
2. JSP에서 파일 다운로드
[ 16장. HTML5와 제이쿼리 ]
(1-4 생략)
5. 제이쿼리 Ajax 기능
6. 제이쿼리에서 JSON 사용하기

'REVIEW > BOOK' 카테고리의 다른 글
독서 후기 1. 미라클모닝 밀리어네어 (0) 2022.05.14