1. Web Architecture
- Web Browser: ML(HTML, XML(데이터 전달용 문서, 데이터 전송)), CSS, JS에서 웹 서버로 data를 가지고 request 하는데, 이 데이터를 parameter이다.
- Web Server(=HTTP Server): 클라이언트는 웹서버로 http라는 프로토콜을 가지고 접속하는데, 이때 접속을 도와주는 역할을 하는 것이 WebServer이다. 클라이언트가 요청하면 응답을 해준다.
- Application Server: WebServer는 요청과 응답만 하지, 실질적으로 프로그래밍을 돌릴 능력이 없다. 그래서 필요한 것이 applicationserver. PL(prorgram language)를 돌릴 수 있다. 여기서 자바를 돌려서 로직 처리하게 된다. 클라이언트한테 요청받은 걸 로직 처리하는 역할
1. 데이터를 가져오고(data get)
2. 로직 처리(덧셈 뺄셈과 같은 business logic(=Service=handler) + db를 검사하는 db logic(=DAO)
3. 응답처리(성공 vs 실패 vs에러): HTML
- WAS(Web Application Server): 이전에는 웹서버와 애플리케이션 서버가 분업되어있었으나 요즘 나오는 서버는 같이 일을 함. 웹서버와 애플리케이션 서버의 역할을 모두 하는 게 WAS(jeus, weblogic, tomcat..)
- web과 java가 합쳐진 것이 servlet과 jsp(jsp는 servlet이 가진 쌍 따옴표를 줄이기 위해 씀)
- JDBC: 자바를 이용하여 데이터베이스에 접근하는 것
- 서블릿-> DTO->서비스-> DAO
2. survlet생성법
class로 충분히 만들 수 있다. 하지만, 서블릿이 가지고 있는 인터페이스가 갖고 있는 메서드 5가지를 오버라이드 해줘야 함. 5개 중에 4개만 필요한 경우도 있는데, 인터페이스의 특성상 5개 모두 오버라이드 해야 하기 때문에 귀찮다.
그래서 서블릿으로 만들게되면 필요한 것만 오버라이드 할 수 있다.
[알쓸신잡: page이동방법]
1. 링크 이동 2. 주소 입력 3. Form태그 이용-get/post
결론: post라고 표현하지 않았으면 다 get이다~
알쓸신잡
java+web을 같이할 수 있는걸 servlet이라고 했는데 javaSE에는 포함이 안되어있고 javaEE버전에 포함되어 있다.
JRE의 rt.jar파일에 보면, 여태까지 썼던 java라이브러리가 다 있다. 하지만 서블릿은 javax.servlet을 쓰는데 여기에 없다.
jdbc를 해보면 알겠지만, JAVA에서 DB를 쓰기 위해서는 DB사마다 다르게 연결해줬어야 했다. 즉, VenderAPI가 필요했다. 결국 우리는 javaEE를 하기 위한 라이브러리가 필요하다. 어떤 WAS를 쓰든 javaEE에서 만든 표준이라 상관은 없지만, 쓸 WAS가 라이브러리를 가지고 온다. 우리는 톰캣을 쓸건데 톰캣이 라이브러리를 가지고 왔다. 자바만 쓸 경우 JRE만 가지고 오는데, Dynamic Web Project는 톰캣도 같이 데려온다. 톰캣 안에 보면 servlet-api.jar안에 javax.servlet이 들어있다.
3. Servlet이란?
자바 서블릿(Java Servlet)은 자바를 사용하여 웹페이지를 동적으로 생성하는 서버 측 프로그램 혹은 그 사양을 말하며, 흔히 "서블릿"이라 불린다. 자바 서블릿은 웹 서버의 성능을 향상하기 위해 사용되는 자바 클래스의 일종이다. 서블릿 은 JSP와 비슷한 점이 있지만, JSP가 HTML 문서 안에 Java 코드를 포함하고 있는 반면, 서블릿은 자바 코드 안에 HTML을 포함하고 있다는 차이점이 있다.
servlet=html in java
jsp = java in html
- servlet API
원래 <<Interface>>Servlet이 갖고 있는 메서드는 5개이다. 인터페이스다 보니 5개 메서드를 오버라이드 하는 건 귀찮은 일이다. 그래서 서블릿에서 필요한 것만 상속받게 GenericServlet 추상 클래스를 만든다. 필요한 것만 상속받게 한다.
우리는 https라는 환경에서 사용하다 보니 httpsServlet을 상속받게 된다. httpsServlet 안에는 2개의 메서드가 있다. get과 post. 그래서 서블릿을 만들 땐 doGet이나 doPost를 상속받으면 된다. 그걸 sevlet으로 생성하면 정말 간편하게 할 수 있다!
원하는 메서드가 없다면? 상위 클래스의 메서드를 확인해라. 메서드가 끝나는 부분에 상위 클래스가 있음
PirntWriter클래스의 getWriter() 메서드를 쓴다.
그 안에 html을 쓰는 거다. F11을 눌러서 보자.
내가 보낼 때는 text로 보내지만, 클라이언트에게는 html로 인식해~ "content type"
이걸 꼭 설정해줘야 한다.
주의) 무조건 맨 앞줄에 쓰기★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
한글로 바꾼 다음에 응답을 해줘야 하기 때문
근데.. 엄청난 html 길이를 다 서블릿으로 바꾸려면..? 장난 아니다.
언제 out.println을 쓰고 있냐고요. 그래서 나온 것이 jsp!
간단한 html은 서블릿으로 가능했지만, 몇천 줄 되는 html은 무리다.
참! 내용을 변경하고 save를 하고 새로고침을 누르면 콘솔 창에 ' ~콘텍스트를 다시 로드하는 것을 완료했습니다."라는 게 떠야 브라우저가 새로고침 된다. 그래서 유명한 콘서트 예매할 때 서버 전송 때문에 오래 걸리나보다. 서버를 비싼 걸 쓰는 이유..
- URL을 바꾸는 방법
방법은 2가지
방법 1: 서버에서 지웠다가 다시 실행(비추)
방법 2: properties에서 바꾸고 + servers폴더에서 server.xml을 수정하는 방법
[알쓸신잡: 주소창에 꼭 html을 붙여야 할까?]
index.html을 웰컴 페이지라고 하는데 주소창에 안 쳐도 자동으로 들어가진다.
[알쓸신잡]
404 에러: 무조건 맞춤법 에러
- Servlet Life-Cycle
Servlet class는 javaSE에서의 class와는 다르게 main method가 없다. 즉 객체의 생성부터 사용(method call)의 주체 가 사용자가 아닌 Servlet Container(Servlet Engine=WAS=톰캣)에게 있다. Client가 요청(request)을 하게 되면 Servlet Container는 Servlet객체를 생성(한 번만)하고, 초기화(한 번만) 하며 요청에 대한 처리(요청 시마다 반복)를 하게 된다(스레드). 또한 Servlet객체가 필요 없게 되면 제거하는 일까지 Container가 담당하게 된다.
다른 사용자가 동시에 사이트를 접속해도 서블릿은 한 번만 초기화되고(=서블릿 객체는 한 개만 만들어지고) init메서드도 한 번만 초기화가 된다. 클라이언트 수만큼 스레드가 호출되면서 doGet, doPost, sercive만 사용자 수만큼 호출!
클래스를 수정하면 detroy가 호출되고, 새로고침 하면 맨 처음 들어오는 클라이언트만 init()이 호출되고 나머지 클라이언트부터는 doGet()이 호출된다.
- Servlet method
- Servlet Life-Cycle의 '주요' method
method | description |
init() | 서블릿이 메모리에 로드 될 때 한번 호출 코드 수정으로 인해 다시 로드 되면 다시 호출 |
doGet() | GET방식으로 data전송 시 호출 |
doPost() | POST방식으로 data전송 시 호출 |
service() | 모든 요청은 service()를 통해서 doXXX()메소드로 이동 |
destroy() | 서블릿이 메모리에서 해제되면 한번 호출 코드가 수정되면 호출 |
- Servlet Parameter 처리[Parameter 전송 방식]
GET | POST | |
특징 | - 전송되는 데이터가 URL뒤에 Query String으로 전달 - 입력 값이 적은 경우나 데이터가 노출이 되도 문제가 없을 경우 사용 |
- URL과 별도로 전송 - HTTP header 뒤 body에 입력 스트림 데이터로 전달 |
장점 | - 간단한 데이터를 빠르게 전송. form tag뿐만 아니라 직접 URL에 입력하여 전송 가능 | - 데이터의 제한이 없다 - 최소한의 보안 유지 효과를 볼 수 있다 |
단점 | - 데이터 양에 제한이 있다 - (location bar(URL + parameters)를 통해 전송할 수 있는 데이터의 사이즈는 2kb(2048byte)로 제한된다 |
- 전달 데이터의 양이 같을 경우 GET 방식보다 느리다. - (전송 패킷을 body에 데이터를 구성해야 하므로) |
- URL? QueryString? Parameter?
[ URI ]
URI는 특정 리소스를 식별하는 통합 자원 식별자(Uniform Resource Identifier)를 의미한다. 웹 기술에서 사용하는 논리적 또는 물리적 리소스를 식별하는 고유한 문자열 시퀀스다.
[ URL ]
URL은 흔히 웹 주소라고도 하며, 컴퓨터 네트워크 상에서 리소스가 어디 있는지 알려주기 위한 규약이다. URI의 서브셋이다.
- servlet에서 jdbc작업순서
① JDBC Driver Loading - init()
② DBMS와 연결 (Connection 생성)
③ SQL 실행 준비 (Statement, PreparedStatement 생성) + SQL 문장도 이때 만들면 됨
④ SQL 실행 DML executeUpdate(): insert/update/delete문 + executeQuery(): select문
⑤ DBMS 연결 끊기 : throws SQLException으로 예외처리가 되어있기에 마지막에 꼭 끊어줘야 함(연결 역순으로)
https://feastforall.tistory.com/207 참고하세요~!
① Driver Loading : init()
@Override
public void init() throws ServletException {
try {
// 1. Driver Loading
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
② DBMS와 연결 (Connection 생성)
}
'back-end > sevlet+ jsp+MVC' 카테고리의 다른 글
JSTL (JSP Standard Tag Library) (0) | 2022.04.10 |
---|---|
EL(Expression Language) (0) | 2022.04.10 |
HttpSession/Cookie (0) | 2022.04.09 |
JSP(Java Server Page) (1) | 2022.04.04 |