JSP
Web
•
인터넷: 컴퓨터 네트워크망
•
웹: 인터넷 서비스 중 하나
◦
인터넷 상의 정보를 하이퍼텍스트 방식과 멀티미디어 환경에서 검색할 수 있게 해주는 정보 검색 시스템
◦
HTTP 프로토콜을 사용하며, HTML로 작성된 문서를 연결하여 다양한 콘텐츠를 제공
◦
하이퍼텍스트:
참조(하이퍼링크)를 통해 독자가 한 문서에서 다른 문서로 즉시 접근할 수 있는 텍스트
•
동작 구조
◦
HTML로 만들어진 콘텐츠는 웹 서버(Web Server)라고 하는 별도의 서버 소프트웨어를 통해 서비스로 제공된다.
◦
웹 서버 소프트웨어로는 아파치(Apache)가 대표적이다.
◦
또한 웹 서비스를 요청한 클라이언트에서 서비스를 이용하기 위해서는 웹 브라우저(Web Browser)가 필요하다.
네트워크
•
네트워크(Network)는 여러 컴퓨터들을 통신 회선으로 연결한 것을 말한다.
•
LAN(Local Area Network)은 가정, 회사, 건물, 특정 영역에 존재하는 컴퓨터를 연결한 것이다.
•
WAN(Wide Area Network)는 LAN을 연결한 것으로, 우리가 흔히 말하는 인터넷은 WAN이다.
•
웹은 인터넷 기반 서비스 중 하나이고, 인터넷은 전 세계를 연결한 컴퓨터 네트워크이다.
•
네트워크(Network)는 컴퓨터와 컴퓨터를 연결해주는 망(Net)으로, 네트워크를 구축하기 위해서는 컴퓨터 간의 연결 규격, 규약이 필요하다.
•
컴퓨터 간의 연결 규격, 규약을 프로토콜(Protocol)이라 한다.
프로토콜
•
컴퓨터 간의 통신을 할 수 있도록 만든 프로토콜에는 TCP 통신과 UDP 통신이 있다.
•
TCP (이메일, 파일 전송, DB 연동)
◦
TCP(Transmission Control Protocol)은 연결형 프로토콜로, 상대방이 연결된 상태에서 데이터를 주고 받는다. 즉, 클라이언트의 연결 요청과 서버의 연결 수락으로 통신 회선이 고정되어, 데이터가 손실없이 순서대로 전달된다.
◦
TCP는 IP와 함께 사용하기 때문에 TCP/IP 라고 한다.
웹 브라우저가 웹 서버에 연결할 때, 이메일 전송, 파일 전송, DB 연동 등에 쓰인다.
•
UDP (무전기)
◦
UDP(User Datagram Protocol)은 발신자가 일방적으로 수신자에게 데이터를 보내는 방식으로,
TCP/IP 처럼 연결 요청 및 수락 과정이 없기 때문에 TCP보다 데이터 전송 속도가 상대적으로 빠르다.
(중간 검증 절차가 없기 때문에 TCP보다 데이터 전송 속도가 빠름)
◦
하지만 고정 회선이 아니라 여러 회선을 통해 데이터가 전송되기 때문에 특정 회선의 속도에 따라 데이터가 순서대로 전달되지 않거나, 잘못된 회선으로 인해 데이터 손실이 발생할 수 있다.
TCP/IP
•
하드웨어, 운영체제, 접속 매체와 관계없이 동작할 수 있다.
•
TCP/IP는 OSI(Open Systems Interconnection) 7계층에서 유래한 것으로 4계층 구조로 구성되어 있
◦
응용 계층 - WWW, FTP, Telnet, SMTP와 같은 네트워크 프로그램
◦
전송 계층 - 각 시스템을 연결하고 TCP 프로토콜을 이용해 데이터를 전송
◦
인터넷 계층 - IP 프로토콜을 이용해 데이터를 정의하고 경로를 배정
◦
물리 계층 - 실제 네트워크에 접근할 수 있도록 하는 물리적인 부분
•
OSI 7계층은 네트워킹을 위한 물리적 장비에서 실 서비스를 제공하기 위한 애플리케이션에 이르는 단계까지 계층화 한 것이다.
(물-데-네-전-세-표-응)
◦
TCP/IP는 이러한 OSI 7계층을 좀 더 단순화하여 4계층으로 정의한 것이다.
TCP 네트워킹
•
•
ServerSocket은 클라이언트의 연결을 수락하는 서버 쪽 클래스이고, Socket은 클라이언트에서 연결을 요청할 때 또는 클라이언트와 서버 양쪽에서 데이터를 주고받을 때 사용되는 클래스이다.
IP 주소
•
각각의 집마다 고유한 주소가 있기 때문에 우편물이나 택배물이 정확하게 집을 찾아 도착할 수 있게 된다.
•
마찬가지로 컴퓨터에도 고유한 주소가 있다. 이를 IP 주소(Internet Protocol Address)라고 한다.
•
IP 주소(IP Address)는 TCP/IP로 연결된 네트워크에서 각각의 컴퓨터를 구분하기 위해 사용하는 주소이다.
•
IP 주소는 4개로 구분된 10진수 숫자로 구성되어 있고, 사용할 수 있는 IP 주소 범위는 아래와 같다.
•
IP 주소는 네트워크 어댑터(LAN 카드)마다 할당된다.
•
만약 컴퓨터에 두 개의 네트워크 어댑터가 장착되어 있다면, 두 개의 IP 주소를 할당 받을 수 있다.
•
네트워크 어댑터에 어떤 IP 주소가 부여되어 있는지 확인하려면 터미널에 명령어를 입력하면 된다.
◦
윈도우는 ipconfig, 맥OS는 ifconfig 명령어를 입력
•
이론적으로는 컴퓨터가 IP 주소를 가지고 있어야 하나, 수많은 컴퓨터에 각기 다른 고유한 IP주소를 할당하기에는 한계가 있다.
•
사설 IP는 일반적으로 10.0.0.0, 192.0.0.0 등의 몇 가지 IP 블록을 사용하지만, 실제로는 모든 인터넷 IP를 사용할 수 있다.
•
네트워크 구성 상 직접 연결하지는 않지만, 라우터 장비에서 제공하는 NAT(Network Access Tranlator) 기능을 이용한다. NAT를 이용해 공인 IP로 대응하면 인터넷에 접속할 수 있게 되는 것이다.
•
전화번호를 모르면 전화를 걸 수 없듯, 연결하고 싶은 컴퓨터의 IP 주소를 모르면 프로그램은 서로 통신할 수 없게 된다.
•
114에 전화번호를 문의하듯, 프로그램에서는 DNS(Domain Network System)를 이용해 컴퓨터의 IP 주소를 검색한다.
•
여기에서 DNS는 도메인 이름으로, IP를 등록하는 저장소이다.
•
대중에게 서비스를 제공하는 대부분의 컴퓨터는 도메인 이름으로 IP를 DNS에 미리 등록해놓는다.
•
웹 브라우저는 웹 서버와 통신하는 클라이언트로, 사용자가 입력한 도메인 이름으로 DNS에서 IP 주소를 검색해 찾아 웹 서버와 연결하고 웹 페이지를 받아온다.
인터넷 기반 서비스
•
인터넷 기반의 대표적인 서비스는 웹 이외에도 이메일, FTP, Telnet, DNS 등이 있다.
•
인터넷 기반 서비스는 각각에 해당하는 프로토콜과 포트가 정해져 있다.
Port
•
포트(Port)는 네트워크 서비스를 제공하기 위한 일종의 출입문이다.
•
즉, 하나의 컴퓨터에서 여러 개의 네트워크 서비스를 제공하는 경우,
이들을 구분하기 위한 목적으로 사용한다.
•
한 대의 컴퓨터에는 하나 이상의 다양한 서버 프로그램들이 실행될 수 있다.
•
웹 서버, 데이터베이스 관리 시스템, FTP 서버 등이 하나의 IP 주소를 갖는 컴퓨터에서
동시에 실행될 수 있다.
•
IP는 컴퓨터의 네트워크 어댑터까지 갈 수 있는 정보이고, 컴퓨터 내부에서는 실행하는 서버를 선택하기 위해 추가적인 Port 번호가 필요하다.
•
즉, Port는 운영체제가 관리하는 서버 프로그램의 연결 번호이다.
•
서버는 시작할 때 특정 Port 번호에 바인딩된다.
(예를 들어, 웹 서버는 80번으로, DBMS는 3306번으로 바인딩할 수 있다.)
•
프로그램에서 사용할 수 있는 전체 Port 번호의 범위는 0 ~ 65335로,
사용 목적에 따라 세 가지 범위를 가진다.
•
•
InetAddress를 이용하면 로컬 컴퓨터의 IP 주소를 얻을 수 있고,
도메인 이름으로 DNS에서 검색한 후 IP 주소를 가져올 수도 있다.
•
로컬 컴퓨터의 InetAddress를 얻고 싶다면 InetAddress.getLocalHost( ) 메소드를 다음과 같이 호출하면 된다.
public class IpExample {
public static void main(String[] args) throws UnknownHostException {
InetAddress local = InetAddress.getLocalHost();
System.out.println("내 아이피: " + local.getHostAddress());
InetAddress[] remoteArr = InetAddress.getAllByName("www.naver.com");
for (InetAddress remote : remoteArr) {
System.out.println("naver 아이피:" + remote.getHostAddress());
}
}
}
Java
복사
서버와 클라이언트
•
네트워크 안에 유무선으로 컴퓨터가 연결되어 있다면, 실제로 데이터를 주고받는 행위는 프로그램들이 한다.
•
서비스를 제공하는 프로그램을 일반적으로 서버(Server)라고 부르고, 서비스를 요청하는 프로그램을 클라이언트(Client)라고 부른다.
JSON 데이터 형식
•
네트워크로 전달하는 데이터가 복잡할수록 구조화된 형식이 필요하다.
•
네트워크 통신에서 최근 가장 많이 사용되는 형식은 JSON(JavaScript Object Notation)이다.
•
Java에서 JSON을 문자열로 직접 작성할 수 있지만, 대부분은 라이브러리를 이용해서 생성한다.
•
JSON을 다루는 라이브러리의 종류는 다양하고, 이에 따라 프로젝트마다 사용되는 라이브러리가 제각각이다.
Web Application
•
웹 애플리케이션은 웹에서 실행되는 응용프로그램을 뜻하며, 인터넷을 통한 여러가지의 서비스를 일컫는다.
•
사용자는 필요한 데이터를 Request(요청)하고, 서버에서는 사용자의 Request를 수행하며, 요청한 데이터를 Response(응답)하게 되는 형식이다.
•
웹 애플리케이션의 구성 요소
1.
웹 브라우저 : 클라이언트에서 요청을 하고, 전달받은 페이지를 볼 수 있는 환경
2.
웹 서버 : 서버에 저장된 리소스를 클라이언트에 전달하는 역할 (주로 정적 콘텐츠)
3.
웹 애플리케이션 서버 :
WAS라 부르며, 서버에서 필요한 기능을 수행하고, 그 결과를 웹 서버에 전달하는 역할
4.
데이터베이스 : 서비스에 필요한 데이터를 보관, 갱신 등 관리를 수행하는 역할
•
실습
// ClientExample.java
package com.client;
import java.io.IOException;
import java.net.Socket;
public class ClientExample {
public static void main(String[] args) {
try {
Socket s = new Socket("172.30.1.30", 8080);
System.out.println("[클라이언트] 연결 성공");
s.close();
System.out.println("[클라이언트] 연결 종료");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
// ServerExample.java
package com.server;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
import java.util.Scanner;
public class ServerExample {
private static ServerSocket ss = null;
public static void main(String[] args) {
System.out.println("서버를 종료하려면 q를 입력하세요.");
startServer();
Scanner sc = new Scanner(System.in);
while (true) {
if (sc.nextLine().toLowerCase().equals("q")) {
break;
}
}
sc.close();
stopServer();
}
private static void startServer() {
Thread thread = new Thread() {
@Override
public void run() {
try {
ss = new ServerSocket(8080);
System.out.println("[서버] 서버 시작");
while (true) { // Listening
System.out.println("[서버] 요청 기다리는 중...");
Socket s = ss.accept();
InetSocketAddress isa = (InetSocketAddress) s.getRemoteSocketAddress();
String clientIP = isa.getHostString();
System.out.println("[서버] " + clientIP + "의 연결 요청 수락");
s.close();
System.out.println("[서버] " + clientIP + "와의 연결 종료");
}
} catch (IOException e) {
e.printStackTrace();
}
}
};
thread.start();
}
private static void stopServer() {
try {
ss.close();
System.out.println("[서버] 종료");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Java
복사
프로그램 구성도
요청과 응답
•
서버는 클라이언트가 있기에 동작한다.
•
클라이언트에서 서버로 요청(request)을 보내고, 서버에서는 요청의 내용을 읽고 처리한 뒤 클라이언트에
응답(response)을 보낸다.
•
즉, 서버에는 요청을 받는 부분과 응답을 보내는 부분이 있어야 한다.
•
모든 요청과 응답은 헤더(Header)와 본문(Body)을 가지고 있다.
◦
헤더는 요청 또는 응답에 대한 정보를 가지고 있는 곳이고
◦
본문은 서버와 클라이언트 간에 주고받을 실제 데이터를 담아두는 공간이다.
HTTP
•
HTTP는 HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는 프로토콜이다.
•
HTTP는 웹에서 이루어지는 모든 데이터 교환의 기초이며, 클라이언트-서버 프로토콜이기도 하다.
•
클라이언트와 서버들은 (데이터 스트림과 대조적으로) 개별적인 메시지 교환에 의해 통신한다.
•
클라이언트에 의해 전송되는 메시지를 요청(requests)이라고 부르며,
그에 대해 서버에서 응답으로 전송되는 메시지를 응답(responses)이라고 부른다.
HTTP 헤더
•
HTTP 헤더는 클라이언트와 서버가 요청 또는 응답으로 부가적인 정보를 전송할 수 있도록 해준다.
•
HTTP 헤더는 콜론(:)을 기준으로 키와 값으로 이루어져 있다.
•
일반 헤더(General header) :
요청과 응답 모두에 적용되지만 Body에서 전송되는 데이터와는 관련이 없는 헤더.
•
요청 헤더(Request header):
Fetch될 리소스나 클라이언트 자체에 대한 자세한 정보를 포함하는 헤더.
•
응답 헤더(Response header):
응답에 대한 부가적인 정보(위치 또는 서버 자체에 대한 정보 등)를 갖는 헤더.
•
엔티티 헤더(Entity header):
콘텐츠 길이나 MIME 타입과 같이 Entity Body에 대한 자세한 정보를 포함하는 헤더.
Tip:
HTTP 헤더의 키는 대소문자 구분을 하지 않으며,
값은 줄바꿈을 인식하지 않고,
맨 앞의 빈 문자열은 무시된다는 특징이 있다
Java
복사
HTTP 상태 코드
•
웹 브라우저는 서버에서 보내주는 상태 코드를 보고 요청이 성공했는지 실패했는지를 판단한다.
•
200번대 코드 : 성공을 알리는 상태코드. [ 200(성공), 201(작성됨) ]
•
300번대 코드 : 리다이렉션(다른 페이지로 이동)을 알리는 상태 코드.
다른 주소의 페이지로 넘어갈 때 이 코드가 사용된다.
•
400번대 코드 : 요청 자체에 오류가 있을 때 표시되는 상태 코드.
[ 401(권한없음), 403(금지됨), 404(찾을 수 없음) ]
•
500번대 코드 : 요청은 제대로 왔지만 서버에 오류가 생겼을 때 발생하는 상태 코드.
HTTP 요청 메소드
•
GET:
서버 자원을 가져오고자 할 때 사용하며, 요청의 본문에 데이터를 넣지 않는다.
데이터를 서버로 보내야 한다면 쿼리스트링을 사용한다. ( ?name=자유로&age=20 )
•
POST:
서버에 자원을 새로 등록하고자 할 때 사용하며, 요청의 본문에 새로 등록할 데이터를 넣어 보낸다.
•
PUT:
서버의 자원을 요청에 들어 있는 자원으로 치환하고자 할 때 사용하며, 요청의 본문에 치환할 데이터를 넣어 보냅니다.
•
PATCH:
서버 자원의 일부만 수정하고자 할 때 사용하며, 요청의 본문에 일부 수정할 데이터를 넣어 보냅니다.
•
DELETE:
서버의 자원을 삭제하고자 할 때 사용하며. 요청의 본문에 데이터를 넣지 않는다.
•
OPTIONS:
요청을 하기 전에 통신 옵션을 설명하기 위해 사용한다.
서블릿 컨테이너 (Servlet Container)
•
WAS(Web Application Server)는 웹 애플리케이션을 구동하는 서버를 의미한다.
◦
서버 컴퓨터가 WAS로 동작하기 위해서는 Java EE 또는 아파치 톰캣(Tomcat)과 같은 서블릿 컨테이너가 필요하다.
◦
WAS는 단순히 Java EE 또는 서블릿 컨테이너의 구동을 위해 존재하는 것은 아니고,
운영 및 관리, 장애 대응 등 여러 가지 역할을 하는 시스템이다.
•
문법
<%-- jsp 의 주석문 --%>
<%-- JSP 개요 (java server pages)
==> 웹페이지를 생성하는 언어 -> 클라이언트를 생성하는 서버코드
-java 코드와 server 형태를 띄는 페이지
servlet 이 자동으로 만들어진다.
Servlet - Java(html)
Jsp - Html(java) -코딩하기가 수월하다
--%>
<% %> - 자바를 품은 HTML
Java
복사
<%--
scriptlet => script + applet -> java Code Area (자바 코드에 자바 코드를 넣을 수 있는 것) -- 어디에 해도 상관없음
--%>
Java
복사
서블릿이란?
•
서블릿이란 Java 기반의 Web 프로그램 개발을 위해 만들어진 기술이다.
•
서블릿을 실행하기 위해서는 톰캣과 같은 서블릿 컨테이너가 필요하며, 이를 일반적으로 WAS라 부른다.
•
데스크톱이나 스마트폰에서 실행되는 일반적인 애플리케이션과 달리 웹 프로그램은 서버에서 접속해야 화면을 볼 수 있다.
•
이 때 HTML은 정적 파일이므로 실시간으로 변하는 뉴스 기사, 날씨 정보, 쇼핑몰의 상품 정보 등을 가지고 있을 수 없다.
•
이러한 정보는 DB에 저장되어 있기 때문에 사용자의 웹 요청을 받으면
별도의 프로그래밍을 통해 DB에서 가져와 HTML로 재구성하여 클라이언트에 다시 전달해야 한다.
•
웹 요청과 응답 과정은 다음과 같다.
◦
클라이언트(웹 브라우저)가 서버에 페이지(index.html)를 요청한다.
◦
서버는 클라이언트에 요청받은 파일(html)을 응답한다.
◦
클라이언트는 수신받은 파일(html) 내용을 해석(CSS, JavaScript)하여, 화면에 표시한다.
•
이 때, HTML을 정적 파일이므로, 실시간으로 변하는 정보 등을 가지고 있을 수 없다.
•
변경된 정보를 표시하고 싶다면, 다시 요청을 보내 DB에서 가지고 온 정보로 재구성된 HTML로 클라이언트에 재전달해야 한다.
•
Java를 기반으로 하는 서블릿의 장점은 아래와 같다.
◦
Java API를 모두 사용할 수 있다.
◦
운영체제나 하드웨어의 영향을 받지 않으므로, 한 번 개발된 애플리케이션은 다양한 서버 환경에서도 실행 가능하다.
◦
다양한 오픈소스 라이브러리와 개발 도구를 활용할 수 있다.
•
반면 서블릿의 단점은 아래와 같다.
◦
HTML 응답을 위해서는 출력문으로 문자열 결합을 사용해야 한다.
◦
서블릿에 HTML이 포함된 경우, 화면 수정이 어렵다.
◦
HTML 폼 데이터 처리가 불편하다.
◦
기본적으로 단일 요청과 응답을 처리하는 구조이기 때문에 다양한 경로의 URL 접근을 하나의 클래스에서 처리하기 어렵다.
•
위와 같은 단점을 보완하기 위해 JSP가 생겨났으며,
HTML 문서 내에 Java 코드를 삽입하는 방식이기 때문에 HTML 파일을 직접 수정하는 것이 가능해졌다.
•
HttpServletRequest는 HTTP 프로토콜의 요청 정보를 서블릿에 전달하기 위한 목적으로 사용된다.
•
HttpServletResponse는 요청을 보낸 클라이언트로 응답하기 위한 목적으로 사용된다.
•
서블릿 객체의 생성과 종료에 이르는 과정을 서블릿 생명주기라고 한다.
•
서블릿 클래스는 기본적으로 doGet(), doPost()와 같은 HTTP 요청 메소드에 따라 필요한 메소드를 오버라이딩해 구현하며, 컨테이너에 의해 객체의 생성과 소멸 등이 관리되므로 필요에 따라 특정 생명 주기 이벤트에 동작하는 메소드를 구현해야 한다.