실전 JSP 인프런 강의 정리

min·2021년 11월 8일
0

Servlet 같은 부분은 아무래도 처음 배웠을 때 보단 대충 더 알 것 같지만 복잡한 JSP..

웹 프로그램 개요

  • 웹 프로그램이란?
    • 네트워크 (컴퓨터가 서로 연결되어 있는 것)을 통해서 데이터를 주고 받는 것을 인터넷 서비스를 이용하는 것이라고 이야기 함
    • 인터넷 서비스를 이용해서 서로 다른 구성요소들이 통신할 수 있는 프로그램
  • 프로토콜과 IP
    • 프로토콜
      • 인터넷 객체 (request) → 웹 서버 → 인터넷 객체 (response) : 통신 규약
      • HTTP, FTP, SMTP, POP 등
    • IP
      • IP 주소: 해당 IP를 통해서 웹 서버를 접근 할 수 있음
      • DNS 서버: 네이버에 들어가기 위해서 ip 주소를 입력하는 것이 아니라 www.naver.com 을 입력 할 수 있게 매핑을 도와주는 서버
  • 웹 프로그램의 동작 원리
    • 정적 데이터인 경우 HTML으로 응답
    • 동적 데이터인 경우 웹 컨테이너에 데이터를 담아서 응답함
  • 웹 컨테이너 구조
    • xxx.jsp → xxx_jsp.java → xxx_jsp.class → xxx_jsp.obj → html
    • WAS = Web Application Server가 담고 있는 웹 컨테이너가 개발자가 만든 jsp 파일을 가지고 java 파일을 만들어서 클래스 파일을 만들고 object 파일까지 만들어줌.
    • 개발자는 jsp 파일을 작성하는 것 까지만 실행함
    • WebContent : 웹 컨테이너 역할을 하는 부분, JSP 파일이 웹 컨테이너 안에서 동작해야 하기 때문에 해당 폴더 하위에 생성해줘야 함
    • 사용자가 응답 받는 HTML 파일에서 확인을 하면 JSP 문법은 보이지 않고 정적인 HTML 코드만 확인 할 수 있음.

Sevlet 맵핑

  • Servlet 맵핑이란?
  • web.xml 파일을 이용한 맵핑
    • 고전적인 방식
    • web.xml 파일에 해당 코드를 넣어준다.
    <servlet>
    	<servlet-name>servletEx</servlet-name>
    	<servlet-class>com.servlet.ServletEx</servlet-class>
    </servlet>
    <servlet-mapping>
    	<servlet-name>servletEx</servlet-name>
    	<url-pattern>/SE</url-pattern>
    </servlet-mapping>
  • Java Annotation을 이용한 맵핑

Servlet request, response

  • HttpServletRequest : 요청에 대한 정보를 가지고 있는 객체, 클라이언트가 서버 쪽으로 데이터를 요청 할 때 기능과 속성들을 가지고 있는 객체
  • HttpServletResponse:: 응답에 대한 정보를 가지고 있는 객체, 서버가 브라우저 쪽으로 데이터를 보내줄 때 기능과 속성들을 가지고 있는 객체

Servlet Life-Cycle

  • 사용자의 요청에 의해서 생성된 servlet의 생명 주기(생성, 실행, 종료)
  • Servlet의 생명 주기
    • @PostContruct Servlet을 준비해주는 단계
    • init() 생성 단계
    • service servlet이 일하는 단계, 구현하는 단계
    • destory() 일을 다 하고 소멸되는 단계
    • @PreDestory Servlet을 종료시켜주는 단계
  • 웹 컨테이너 톰캣에서 알아서 해당 메소드들을 단계에 맞춰서 실행 시켜줌

form 데이터 처리

  • 사용자의 form 데이터를 Servlet에서 처리 할 수 있음

Servlet vs JSP

  • Servelet
    • 순수 자바 파일
    • xxx.java → xxx.class
    • httpServlet 클래스를 상속 받아서 만들어짐
  • JSP
    • xxx.jsp → xxx_jsp.java → xxx_jsp.class : jsp 파일을 개발자가 만들면 컨테이너가 알아서 java 파일을 만들고 컴파일러를 통해서 class 파일로 컴파일됨
    • jsp 파일을 서버에 올려보면 html 주석은 남아있고 jsp 주석은 사라지는 것을 확인 할 수 있음
    • 지시어: 서버에서 jsp 페이지를 처리하는 방법에 대한ㄴ 정의
      1. page: 페이지 기본 설정

        <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

      2. include: include file 설정 : include 하고 싶은 위치에 해당 지시어 추가 해주면 마치 하나의 페이지 처럼 화면에 보이게 함

      3. taglib: 외부라이브러리 태그 설정

      4. import 하는 경우

JSP Request, Response

  • Request
    • Servlet에서 사용한 코드와 동일함
  • Response
    • response.XXX()

JSP 내장객체

  • config 객체
    • web.xml (웹 환경설정)의 데이터를 getinitParameter()라는 메소드를 이용해서 jsp에서 해당 구성 값을 가지고 올 수 있게 하는 객체
    • getServletConfg().getInitParameter(param-name); 을 하면 param-value 값을 가지고 올 수 있음
    <!-- 해당 파일(userWebxml.js)에 해당하는 곳에서만 사용 할 수있는 param -->
    <servlet>
    	  <servlet-name>servletEx</servlet-name>
    	  <jsp-file>/useWebxml.jsp</jsp-file>
    	  <init-param>
    	  	<param-name>adminId</param-name>
    	  	<param-value>admin</param-value>
    	  </init-param>
    	  <init-param>
    	  	<param-name>adminPw</param-name>
    	  	<param-value>1234</param-value>
    	  </init-param>
      </servlet>
      <servlet-mapping>
      	<servlet-name>servletEx</servlet-name>
      	<url-pattern>/useWebxml.jsp</url-pattern>
      </servlet-mapping>
  • application 객체
    • config 객체와는 다르게 모든 jsp 파일에서 전체적으로 사용 할 수 있는 param을 가지고 올 수 있게 함
    • global한 변수의 경우에 사용
    <context-param>
      	<param-name>imgDir</param-name>
      	<param-value>/upload/img</param-value>
      </context-param>
      <context-param>
      	<param-name>testServerIp</param-name>
      	<param-value>127.0.0.1</param-value>
      </context-param>
      <context-param>
      	<param-name>realServerIp</param-name>
      	<param-value>172.0.0.1</param-value>
      </context-param>
  • out 객체
  • exception 객체
    • <%@ page isErrorPage="true" %>
    • exception.getMessage() 메소드를 이용해서 exception message를 알아본다.
  • 클라이언트와 서버의 연결을 유지시켜주는 방법으로 Cookie에 대해서 학습한다.
  • http의 특징으로 한번 클라이언트가 request를 하고 서버가 response를 하고 나면 해당 연결을 해제 시켜 버림 > 왜냐면 하나의 서버에 수 천개의 많은 클라이언트가 붙는 경우 서버의 부하가 예상되기 때문에 효율적으로 운영하기 위해서 리소스를 낭비하지 않기 위해 연결을 해제시킴.
    • 어떤 데이터가 유지 되기를 원하게 되면서 사용 (ex: 사이트의 로그인 정보의 경우 페이지를 움직여도 로그인 정보를 유지하고 싶음)
    • 브라우저의 연결 정보 (요청과 응답 정보)를 서버에 저장하기에는 서버에 부하가 걱정이 되기 때문에 클라이언트 쪽에 기존 연결정보를 저장함.
  • Cookie란?
    • 서버와 클라이언트 연결을 시도한 흔적
  • Cookie 구현
    1. cookie가 null인지 판단한다

      1-1. true인 경우 재활용

      1-2. false인 경우 cookie 생성

  • Cookie는 사용자의 정보가 브라우저에 저장이 되면 보안에 취약 할 수 있음. Cookie에 저장하는 데이터는 간단한 데이터만 저장하는 것이 좋음.

Session

  • 클라이어트와 서버의 연결을 유지시켜주는 방법으로 Session에 대해서 학습한다.
  • Cookie에서 언급한 http의 특성으로 인해서 연결을 유지시키는 방법으로 쿠키와 다르게 클라이언트(브라우저)에 저장하는 것이 아닌 서버에 기존 연결정보를 저장하여 연결을 유지시켜준다.
  • 웹 컨테이너에서 생성이 되고 서버에서 저장이 되는 데이터를 의미한다.

Filter

  • 브라우저와 웹 서버가 통신을 할 때 filter 라는 것을 둬서 중간 다리 역할을 수행함.
  • 서블릿의 개수가 많아지는 경우에 한글 처리 코드를 모두 추가하는 것은 비효율적이기 때문에 Filter에 한글 처리 코드 부분을 추가해주면 모든 Request와 Response에 대한 한글 처리가 이루어 질 수 있음.
  • 강의에서는 web.xml을 통해서 Filter를 적용하는 부분을 진행했지만 어노테이션을 통해서도 Filter를 적용 할 수 있다.
@WebFilter(urlPatterns = { "/*" }, initParams = {
	@WebInitParam(name = "encoding", value = "utf-8", description = "encoding"),
	@WebInitParam(name = "forceEncoding", value = "true", description = "forceEncoding") })
public void init(FilterConfig fConfig) throws ServletException {
		encoding = fConfig.getInitParameter("encoding") == null ? "" : fConfig.getInitParameter("encoding");
		forceEncoding = fConfig.getInitParameter("forceEncoding") == null ? "false"
				: fConfig.getInitParameter("forceEncoding");
	}

JDBC

  • Java와 DB가 통신할수 있게 해주는 API
  • Eclipse에서도 Oracle의 API를 이용하기 위해서 Oracle Lib을 Eclipse에 복사한다.
    • window - preference - classpath variables에서 실제로 우리가 사용하고 있는 jar 라이브러리의 위치를 확인 할 수 있다.
    • 이 부분이 jdk 16버전 사용하면서 해당 강의대로 하면 안되고 ojdbc6.jar 파일을 WEB-INF - lib 파일 하위에 붙여 넣어 줘야 했다.
    • 강의 따라 하면 jre-lib 이 deprecated 되었다고 뜬다. 검색해보면 해당 방법 쓰는 건 거의 jre 1.8 버전 대의 것들인 듯..
  • Client (브라우저) → 웹 컨테이너 속 jsp, servlet → (jdbc를 통해) → 데이터베이스
  • JDBC 실행 순서
    1. OracleDriver 로딩 : Class.forName(driver);
      • Driver가 Java 것이 아니기 때문에 드라이버를 메모리에 로딩해야 한다.
    2. Java와 Oracle 연결 : con = DriverManager.getConnection(url, id, pw);
    3. Query 전송 객체 : stat = con.createStatement();
      • 통신을 위한 객체
    4. Query 작성 : String sql = "SELECT * FROM book;"
    5. Query 전송 : res = stmt.executeQuery(sql)
      • 실제적인 통신
  • 오류란 오류는 다 만나고 있다.
    1. driver를 찾지 못했음 - 위에 작성한 방법으로 해결

    2. url이 올바르지 않다는 에러 메세지 - 오타 확인

    3. ORA-12505, TNS:listener does not currently know of SID given in connect descriptor

      1) SID를 잘못 입력했나 해서 접속 테스트 화면에서 확인해 봤지만 xe가 맞았다.

      2) CMD 창에서 lsnrctl status 을 입력 해보라해서 (이유도 모르고..) 입력을 해봤지만 status가 ready로 정상이었다.

      • 오라클 리스너는 네트워크를 이용해서 클라이언트에서 오라클 서버로 연결하기 위한 오라클 네트워크 관리자로 lsnrctl 명령어로 리스너를 확인 할 수 있음.

      3) https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=hyoun1202&logNo=220107048463 해당 블로그 글을 확인해보고 혹시나 싶어서 :xe 부분을 /xe로 변경해보았다. 결과는 성공.

      • 어이가 없는 것은.. sid가... 진짜.. xe라는 것이다.. 일단.. 여기서 좀 더 소모하고 싶지 않기 때문에 넘어간다..
    4. 문법 관련 오류 - 에러를 잘 보면 알아서 확인 할 수 있다. 대부분 휴먼 에러..

DAO와 DTO

  • DAO (Data Access Object)
  • DTO (Data Transfer Object) - 서로 데이터를 관리하는 경우, 데이터 베이스에 있는 데이터를 자바의 형태로 바꿔주는 객체 (VO)
  • Mybatis의 감사함을 다시 느끼며 코딩 중 ㅋㅋ

Connection Pool

  • 데이터베이스와 통신하는 자원을 효율적으로 관리하기 위해서 사용함
  • 데이터베이스와 통신 할 때 (입출력) 계속해서 Connection을 맺고 끊고 수십 만 번 반복하면 과부하가 걸릴 수 있음.
  • 미리 Connection Pool에 이미 Connection이 만들어져 있는 상태에서 웹 서버는 Connection 객체를 가지고 와서 사용하고 그냥 반환하면 됨.
  • Tomcat 컨테이너에서 미리 만들어서 필요 할 때마다 가져옴.
  • Server 하위 context.xml 파일에 해당 부분을 추가해준다.
<Resource
	auth="Container"
	driverClassname="oracle.jdbc.driver.OracleDriver"
	url="jdbc:oracle:thin:@localhost:1521/xe"
	username="scott"
	password="tiger"
	name="jdbc/orace11g"
	type="javax.sql.DataSource"
	maxActive="4"
	maxWait="10000" />
  • Connection Pool은 해당 xml의 name 값을 가지고 접근한다.
  • 음~ 바로 오류나 버렸다.

추가적으로 확인 할 부분

profile
발등에 불이 따뜻하다..

0개의 댓글