java web_1013
오늘부터 퇴근 후 매일 아래 과정으로 실습하며 다시 웹 공부를 시작하려고 한다.
과정이 끝나면 계획했던 사이드 프로젝트를 시작 할 예정이다. (11/18 ~)
구글링을 잘하고 남의 코드를 복붙해서 디버깅하고 리팩토링 하고 그걸 내 코드로 만들어가며 공부하는게 실무적으로는 빠를지도 모른다. 서적을 보고 제대로 된 지식을 바탕으로 연습량을 늘리고 기본기를 다져가며 하는 정공법이 처음에는 조금 느릴지 몰라도 시간이 갈수록 속도가 더 빨라질거라고 생각한다. 다소 융통성 없는 나한테는 아무래도 이 방법이 가장 빠를듯 하다. 5주 플랜 뿌시자!!
**5주 플랜 (10/13 ~ 11/17)
자바 웹을 다루는 기술(매일 5강씩)
코드로 배우는 스프링 웹 프로젝트 개정판(매일 part1씩)
모던 자바스크립트(매일 7강씩)
페도라/리눅스
============================================================================================
클라이언트 pc 기반 프로그램
Float.parseFloat() :: 문자열 파싱하여 float 객체 생성 / String을 float으로 변환할 수 있음
String str = "123.456f"; // or "123.456"
float num = Float.parseFloat(str);
System.out.println(num); // 123.456
아래와 같은 클라이언트 기반 프로그램은 내용 추가 시 일일이 다시 pc에 업데이트 해야 하기 때문에 이에 대한 문제점을 보완하여 나온 것이 클라이언트-서버 기반 프로그램
float won = Float.parseFloat(operand1.getText());
String result = null;
String operator = opSelection.getSelectedItem().toString();
if(operator.equals("달러")) {
result = String.format("%.6f", won / USD_RATE);
}
else if(operator.equals("엔화")) {
result = String.format("%.6f", won / JPY_RATE);
}
else if(operator.equals("위안")) {
result = String.format("%.6f", won / CNY_RATE);
}
txtResult.setText(result);
}
String.format() - 문자열 형식 지정
String.format() :: 문자열 형식 지정
String.format() 메소드를 사용하면 printf()처럼 형식 문자열을 만들 수 있음
클라이언트-서버 기반 프로그램은 기존에 클라이언트가 수행하는 모든 기능을 서버에서 수행하여 클라이언트의 기능은 대폭 축소됨. 클라이언트는 처리 할 데이터가 있으면 서버에 전달하고 서버가 데이터를 처리한 후에 다시 이를 화면에 출력하는 역할만 하는 것.
new BufferedReader() > Scanner 와 유사 / Bufferedwriter > System.out.println()과 유사
:: 둘은 모두 기존에 쓰던 scanner와 System.out.println()보다 속도 측면에서 훨씬 빠르기 때문에 많은 양의 데이터를 처리할 때 유리 (입력된 데이터가 바로 전달되지 않고 버퍼를 거쳐 전달되므로 데이터 처리 효율성을 높임)
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); //선언
String s = bf.readLine(); //String
int i = Integer.parseInt(bf.readLine()); //Int
주의사항 :: readLine()시 리턴값은 String으로 고정되기 때문에 String이 아닌 다른 타입으로 입력 받으려면 꼭 형변환을 해주어야 함 / 예외처리를 꼭 해주어야 함. readLine을 할때마다 try & catch를 활용하여 예외처리를 해주어도 되지만 보통throws IOException을 통하여 작업함.
참고 https://st-lab.tistory.com/41
JAVA [자바] - 입력 뜯어보기 [Scanner, InputStream, BufferedReader]
이 글을 지금 이 시점에 써야 할까 고민을 많이 했다. 사실 자바를 그냥 다룰 줄만 아는 것에 목표를 둔다면 이 글이 무의미할 수도 있다. 그러나 자바에 대해 조금이라도 관심이 있고 더 배우고
st-lab.tistory.com


웹 기반 프로그램 동작 방식
사용자 pc의 웹 브라우저를 통해 화면에 해당하는 HTML문서(정적 웹 페이지)를 서버에 요청 > 서버는 요청받은 HTML 문서를 브라우저에 전송하여 해당 기능을 담당하는 화면을 보여줌
먼저 처리할 데이터를 브라우저에서 입력 받아 서버에 처리를 요청 > 서버는 화면에서 입력한 데이터를 전송 받아 처리함 > 그 다음 데이터 처리 결과를 웹 브라우저로 전송하여 화면에 결과를 보여줌
즉, 웹 기반 프로그램의 경우 사용자가 사용하는 프로그램의 기능이나 화면이 바뀌면 서버에서 모두 처리함
웹 브라우저에서 HTTP 서버 주소로 요청하면 HTML 태그로 이루어진 화면을 웹 브라우저에 전송하여 화면에 나타냄 > 이후 사용자가 화면에 데이터를 입력한 후 결과를 요청하면 다시 데이터를 받아서 비즈니스 로직을 처리하고 그 결과를 다시 웹 브라우저에 전송하여 띄움 / 1장 끝
> 정적 웹 프로그래밍 :: 웹 서버에 미리 보여줄 HTML CSS 이미지 JS 파일을 저장해두고 브라우저에서 요청시 그대로 전달하는 방식
* HTTP :: www 서비스를 제공하는 통신규약으로 웹 서버와 클라이언트는 이 프로토콜을 이용해 데이터를 주고 받음
* js :: HTML 웹 페이지의 여러가지 동적인 기능을 제공하는 스크립트 언어
* 스크립트 언어 :: 이미 존재하는 소프트웨어(응용 소프트웨어 / 애플리케이션)를 제어하기 위한 용도로 쓰이는 언어/ 다른 응용 프로그램에 삽입되어 동작하는 프로그래밍 언어로 소스 코드를 컴파일 하지 않고도 실행할 수 있음 / 웹 서버에 의해 처리되며 웹 페이지 내에 포함된 JS는 웹 브라우저 즉 클라이언트 측에서 수행 됨
- 자바스크립트(JavaScript) : 표준 HTML 문서 내에 삽입되어 사용되며, 인터랙티브한 웹 페이지를 만들 수 있게 함
- 제이쿼리(jQuery) : HTML 문서에 삽입하여 사용할 수 있는 자바스크립트 라이브러리
- JSP : 자바 서버 페이지(JavaServer Pages)의 약자로, HTML 페이지 안에 자바(Java) 코드를 직접 삽입하여 웹 서버에서 동적으로 웹 페이지를 생성하여 웹브라우저가 표현할 수 있도록 전달해 주는 스크립트 프로그래밍 언어
> 동적 웹 프로그래밍 :: 기존에 관리자가 하던 역할을 서버가 수행함. 클라이언트로 부터 데이터 요청이 올때마다 서버는 데이터베이스에 접근하여 실시간 데이터를 제공할 수 있음. 기존의 프로세스 방식으로 동작하는 동적 웹 프로그래밍의 단점을 개선하여 나온 대표 방식 > JSP
** 에플리케이션 하나가 하나의 프로세스 라면 그 안에서의 분기 처리가 스레드임
JSP는 기본적으로 스레드 방식으로 실행하기 때문에 기존의 프로세스 방식보다는 효율적으로 기능을 수행 할 수 있음
*각각의 요청에 대한 기능을 메모리에 따로 로드 하지 않아도 됨 / 클라이언트의 요구를 처리하는 기능은 최초 한번만 메모리에 로드 되고 클라이언트가 동일한 기능을 요구하면 기존에 사용한 기능을 재사용함 / 2장 끝
** 3장의 개발 환경 설정은 아래의 간단한 설명으로 대신하고 스킵한다
JDK > JAVA 로 개발하기 위해 JDK를 설치하고 로컬의 어디에서나 호출하여 사용이 용이하도록 JDK환경 변수를 설정한다
* 이클립스는 실행 시 자동으로 JDK 설치 위치를 인식하여 실행하지만 메이븐같은 자바 관련 개발 도구들은 JDK의 위치를 환경 변수로 인식하기 때문에 JSP 개발 시 필히 환경 변수(JAVA_HOME)를 설정해야 함
웹 서버 : APACH 톰캣 / IDE : 이클립스 / DB : MYSQL & DBEAVER / JS 와 JSP 작성을 보다 쉽게 하기 위해 VSC 편집툴 사용 예정
*톰캣 : DB와 같은 다른 기능과 연동할 수 있게 동작하는 웹 서버(=웹 컨테이너) / JSP 를 실행하여 웹 페이지에 가격 정보를 동적으로 표시해줌 (JVM의 path 지정 시 JRE 설치 폴더를 위치로 잡아줌) / 3장 끝
============================================================================================
웹 애플리케이션의 기본 directory 구조
컨테이너에서 실행되는 모든 웹 애플리케이션은 아래의 루트 디렉토리와 하위 디렉토리 구조를 기본으로 가짐
웹 애플리케이션 이름(루트 디렉토리) > WEB-INF > classes / lib / web.xml
**브라우저에서 웹 애플리케이션 요청 시
http:// IP주소 :포트번호 / 컨텍스트 이름(프로젝트명)/요청 파일 이름
> http:// localhost:8080/javaproject/newjsp
** 컨텍스트 :: 톰캣이 인식하는 하나의 웹 애플리케이션(=하나의 프로젝트) / 웹 애플리케이션당 하나의 컨텍스트가 server.xml에 등록됨
**배치(deploy) :: 톰캣의 루트 디렉토리에 있는 webapps 폴더에 위치하는 웹 애플리케이션은 직접 server.xml에 등록하지 않아도 톰캣 실행시 자동으로 등록됨. 따라서 개발이 완료된 프로젝트의 war를 미리 webapps폴더에 위치시킨 후 톰캣을 실행하면 톰캣이 알아서 압축을 해제한 후 생성된 우베 애플리케이션을 자동으로 등록해줌 / 4장 끝
정적웹 페이지의 문제점을 보완하여 나온 동적 웹 페이지는 초기에 서블릿을 이용함. 실제 웹 애플리케이션 개발 시에도 jsp(view 역할)와 서블릿(controller 역할)이 각자의 역할을 나누어 화면 / 서버단의 기능을 구현하였음. 서블릿에 대한 이해를 바탕으로 이후 jsp에 대해 다시 정리할 예정.
서블릿 :: 서버 쪽에서 실행되며 클라이언트의 요청에 따라 동적으로 서비스를 제공하는 자바 클래스 / 일반 자바 프로그램과 다르게 독자적으로 실행되지 못하고 톰캣과 같은 웹 컨테이너에서 실행된다는 특징이 있음 (멀티 스레드 방식) / 컨테이너 종류에 상관없이 실행되어 플랫폼에 독립적임(was나 운영체제 신경 안씀)
** controller :: 웹 프로젝트에서의 요청(클라이언트 요청에 대한 응답) 처리자 / 파라미터 검수 및 실제 기능을 처리하는 서비스 메서드 호출하여 비즈니스 로직 수행 >> 웹 프로젝트의 흐름 제어자
단순히 고정된 정보를 브라우저에 뿌리는 목적이라면 웹 서버로도 충분하지만 클라이언트 단에서 실시간으로 데이터를 뿌리기 위해서는 디비에서 데이터를 가져오는 기능이 필요. 이러한 기능을 서버단에서 서블릿이 처리해주면 웹 페이지에서 실시간으로 데이터가 변하는 동적 웹 프로그램을 구현 할 수 있음.
서블릿 API 계층 구조와 기능 >> 서블릿은 자바로 만들어져 있어 클래스들 간의 상속 계층 구조를 가짐
> 서블릿 API는 Servlet 과 ServletConfig 인터페이스를 구현해 제공하고 HttpServlet이 이를 상속받음
** HttpServlet 클래스 :: (일반적인 여러 통신 프로토콜에 대한 서블릿 기능을 구현 하는 GenericServlet 클래스를 상속받음) HTTP 프로토콜을 사용하는 웹 브라우저에서 서블릿 기능을 수행함 / 웹 브라우저 기반 서비스를 제공하는 서블릿 생성 시 본 클래스를 상속받아 사용함 / 요청 시 service()를 통해 요청 방식에 따라 doGet() doPost()가 호출됨
** 사용자 정의 서블릿 실습으로 서블릿 동작과정 이해 > 이클립스에서 HttpServlet 를 extends 하려고 할때 javax.servlet import가 안될 때가 있는데 이는 이클립스 내 프로젝트에 Server 라이브러리가 설정이 안되어 있기 때문이므로 server Runtime 라이브러리 설정을 추가해주면 됨 (서블릿 API들은 톰캣 라이브러리로 제공되기 때문에 이클립스 프로젝트에서 반드시 클래스 패스를 설정해주어야 함)
** class path :: 클래스를 찾기 위한 경로로 JVM이 프로그램을 실행하기 위해 .class 파일을 찾는데 기준이 되는 파일 경로를 말함. classpath를 지정할 수 있는 방법 (1)환경 변수 CLASSPATH (2) java runtime CLASSPATH
** was :: web application server

>>>>>>>>>>>>>>>>> 시간 오래 걸려도 싹다 짚고 넘어가야 스프링 가서 이해가 쉬움 / init()이랑 destroy()는 생략함
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FirstServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
*** 서블릿 매핑을 위해 web.xml 에서 서블릿 이름에 대한 매핑 정보를 작성해야 함
(브라우저에서 서블릿 이름으로 요청하기 때문)
아래와 같이 서블릿 클래스를 web.xml에서 별도의 이름으로 등록하고, 서블릿 매핑 태그 안에서 해당 이름의 서블릿을 호출할 url pattern을 지정해주면 매핑된 url pattern으로 클라이언트에서 요청할 수 있음/ 매핑에 해당하는 서블릿은 요청을 받고 비즈니스 로직 수행 결과를 화면에 응답함
<servlet>
<servlet-name>aaa</servlet-name>
<servlet-class>kill.FirstServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>aa2</servlet-name>
<servlet-class>kill.SecondServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>aaa</servlet-name>
<url-pattern>/first</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>aa2</servlet-name>
<url-pattern>/second</url-pattern>
</servlet-mapping>
*** 두개 이상의 서블릿 매핑시 sevlet 태그와 servlet-mapping 태그를 각각 분리하여 작성해야함
*** 톰캣에서 실행 시 http://IP주소:8080(포트번호)/프로젝트명/서블릿 매핑 이름
>>> http://localhost:8080/projectName/first
*** 실습 결과를 보면 해당 서블릿을 톰캣으로 최초 구동시 한번만 메모리에 로드 + init()호출되고 get/post의 서비스를 수행
*** 톰캣을 재구동 하고 브라우저의 새 탭을 열어 호출시 이미 로드+init된 서블릿을 재사용해 훨씬 빠르고 효율적으로 동작
> web.xml에서 서블릿을 매핑하지 않고도 @webServlet 어노테이션을 이용해 서블릿을 매핑할 수 있음
* 어노테이션@ :: 시스템 주석 (=기능이 들어간 동작 주석 / 소스코드에 직접 기능을 설정하는 방법) / 5장 끝