Servlet & JSP

MoonDD·2023년 8월 8일
0

JSP

  • Part1. 서블릿 프로그래밍

    Part1. 서블릿 프로그래밍

    1. 자바와 웹


    서블릿

    클라이언트에서 웹 브라우저를 통해 요청이 들어오면 서버에서 해당 요청을 수행하고 결과값을 클라이언트에게 전송한다.

    HTTP 프로토콜로 통신하는 웹을 잘 활용할 수 있는 API를 제공한다.

    자바언어로 구현해야한다.

    JSP

    서블릿과 동일한 기능을 가지고 있지만, 서블릿과 다른 점이 있다.

    1. HTML 페이지 안에서 스크립트 형태로 구현된다. 코드가 좀 더 간결하다

    2. 웹 애플리케이션의 역할에서
      1. JSP는 뷰 페이지를 만들 때 사용 → 뷰 : 요청을 받거나 보여주는 페이지
      2. 서블릿을 컨트롤러 페이지를 만들 때 사용 → 컨트롤러 : 뷰에서 온 요청을 처리하는 페이지

      웹 애플리케이션

      웹에서 수행되는 애플리케이션

      수행되는 위치에 따라

      • Client Side : 클라이언트의 자원을 이용하고 클라이언트에 의해 수행될 때

      • Server Side : 서버에서 수행되고 서버의 자원을 사용하며, 그 결과를 클라이언트에 전송할 때

        구현하는 방식에 따라

      • 컴파일 방식 : 웹 애플리케이션이 미리 컴파일되고 실행 파일이 만들어진 후 사용되면

      • 비컴파일 방식 : 요청이 있을 때마다 해석되거나 컴파일이 필요없을 때

      RESTful 기반 웹 서비스

      Resourcce Oreiented Architecture : 리소스 중심의 표현, 전달, 접근 방식의 기술

      서버 ↔ 클라이언트

      자원의 접근을 위해서 URI와 HTTP 요청방식을 사용하고 다양한 형식으로 클라이언트에게 응답을 보낼 수 있다.

      웹서버와 웹 어플리케이션 서버

      웹 서버

      웹에서 서버 기능을 수행하는 프로그램

      HTTP 프로토콜을 기반으로 클라이언트에게 요청을 받으면 해당 요청을 서비스하는 기능을 담당한다.

      제공하는 기능들

      • 요청한 웹 문서 찾기
      • 요청 처리 도중 발생한 문제를 코드 값으로 응답하기
      • 사용자 인증
      • 서버 프로그램에 대한 요청을 웹 어플리세이션 서버에게 수행시키고 그 결과를 응답받는다.

      웹 어플리케이션 서버

      웹 서버 → 다양한 문서와 웹 애플리케이션 처리 / 웹 , Client, Server 환경의 요청 처리 → 많은 요청이 왔을 때 웹 서버 혼자서 감당 X

      ⇒ 웹 서버의 기능을 분리해서 처리하기 위해 웹 애플리케이션 서버를 사용

      ex) Tomcat

      WAS의 구성

      • 웹 서버 기능 : Presentation Logic만 담당
        • 클라이언트로부터 요청받은 일과 화면에 표현하는 로직만 담당
      • 컨테이너 기능 : Business Logic을 담당
        • 다양한 기능을 수행하는 로직
      • 엔터프라이즈 환경에 필요한 기능
        • 트랜잭션, 보안, 트래픽 관리, DB 커넥션 풀, 사용자 관리

      톰캣

      JSP/서블릿 컨테이너와 웹서버만 제공

      일반적으로 독립적인 웹서버를 설치 + 톰캣 연동

      WAS 시장의 점유율이 높다.

      컨테이너

      • 서블릿/JSP 웸 서버 애플리케이션

        • 동적 컨텐츠를 생성하는 웹 컴포넌트
      • 컨테이너

        • 개발자대신 웹 컴포넌트 저장, 메모리 로딩, 객체 생성 및 초기화 같이 웹 컴포넌트를 관리해주는 역할

        • 서블릿 컨테이너

          서블릿 생명주기 관리 및 수행하는 프로그램
          클라이언트 요청에 따라 서블릿을 수행하는 프로그램
          서블릿 표준 API를 기반으로 클래스를 제공
          → 기본적인 동작과 API 호환성을 지원

      • JSP 컨테이너

        JSP를 서블릿으로 변환하는 프로그램

      HTTP 프로토콜

      Application Layer에 해당하는 프로토콜

      Transport Layer에서 TCP를 이용해 웹 브라우저와 웹 서버 간에 통신하는 프로토콜이다.

      특징

      • 무연결
      • 무상태
      • 요청, 응답

      HTTP 요청정보

      • 요청 줄
        • 요청방식
          • GET
          • POST
          • PUT
          • DELETE
        • URI
          • 프로토콜
          • 서버 주소
          • 포트 번호
          • URI
        • HTTP 버전
      • 헤더
        • 웹 클라이언트와 웹 서버가 공유해야할 정보들
      • 몸체
        • 웹 클라이언트가 웹 서버에 보내는 데이터들

      HTTP 응답정보

      • 상태 줄
        • HTTP 버전
        • 상태 코드
        • 상태 코드 설명
      • 헤더
        • 클라이언트의 요청에 대한 실행 결과를 웹 클라이언트가 잘 처리할 수 있게 하기 위한 정보들
      • 메세지 몸체

      2. 서블릿 구현 및 실행


      서블릿

      웹 브라우저에서 클라이언트에게 요청을 받아 서버가 실행할 수 있는 유일한 자바 프로그램

      서블릿 표준 API를 기반으로 클래스를 제공

      → 기본적인 동작과 API 호환성을 지원

      서블릿 API를 상속하고 있기에 웹에서 동작하는 기본 동작을 갖추고 있다.

      서블릿이 상속 받고 있는 클래스

      • Servlet Interface
        • 기본 동작에 해당되는 init(), service(), destroy(), getServletConfig(), getServletInfo() 메소드 선언
          • 서블릿 생명주기에 연관된 메소드들
      • GenericServlet abstract class
        • service() 메소드를 제외한 모든 메소드를 재정의
      • HttpServlet abstract class
        • service() 메소드를 재정의
          • 요청방식에 따라 정해진 사양의 메소드가 호출된다.

      서블릿 객체의 생명주기

      • init()

        • 웹 서버가 실행되고 서블릿을 최초로 요청할 때만 호출된다.
      • service()

        • 클라이언트 요청이 있을 때마다 실행된다.
      • destroy()
        - 웹 애플리케이션 서비스가 중지되는 시점에 한번만 실행된다.

        ⇒ 즉 서빌릿은 최초 요청 시 객체가 생성되고 그 이후 요청들에 대해서는 재사용되다가 서버가 종료될때 서블릿 객체는 삭제된다.

      3. 요청정보와 응답정보


      HttpServletRequest, HttpServletResponse

      • HTTP 통신 기반의 요청 응답 관련 메소드 제공
      • ServletRequest, ServeltResponse 인터페이스를 상속하고 있다.

      응답, 요청 객체가 생성되고 사라지는 과정

      1. 클라이언트 요청
      2. 웹 서버
      3. 서블릿 컨테이너
      4. 최초 요청 파악
        (1) 서블릿 객체 생성
      5. HttpServletRequest, HttpServletResponse 객체 생성
      6. service() 메소드 호출
      7. service() 메소드 완료 → 클라이언트에게 응답
      8. HttpServletRequest, HttpServletResponse 객체 소멸

      ServletRepoonse 인터페이스

      HttpServletResponse가 상속하고 있는 인터페이스

      일반적인 네트워크 통신에서의 응답 관련 메소드 제공

      • 주요메소드
        • void setCharacterEncoding
        • void setContentLength
        • void setContentType
          • 보내는 데이터의 문서타입과 문자셋

      HttpServletResponese

      HTTP 통신 기반의 응답 관련 메소드 제공

      ex) 쿠키 설정, HTTP 응답 헤더 설정

      • 주요메소드
        • void addCookie
        • void setHeader
        • void setStatus

      ServletRequet 인터페이스

      HttpServletRequest가 상속하고 있는 인터페이스

      일반적인 네트워크 통신에서의 요청관련 메소드 제공

    • 주요메소드
      - getContentLength
      - getPrameter
      - getServerPort

      HttpServletRequest

      HTTP 통신 기반의 요청 관련 메소드 제공

      • 주요메소드
        • getHeader
        • getCookies
        • getQueryString
        • getMethod

      URI , URL

      호출 메소드

      HttpServletRequest 인터페이스를 통해 호출 가능 → getRequestURI() / getRequestURL()

      URI : 클라이언트가 요청한 문서정보를 반환

      URL : 클라이언트가 서비스를 요청한 문서의 전체 정보 (프로토콜 + 서버주소 + 포트번호 + URI)

      헤더정보

      • Enumeration getHeaderNames()
        • 요청정보의 헤더에 있는 이름들
        • Enumeration 특성 상 커서를 이용해서 다음 요소에 접근할 수 있다.
          • boolean hasMoreElements()
          • String nextElement()

      쿼리정보

      쿼리 : URL과 함께 넘어온 정보들

      GET 요청은 requestybody가 없으므로 URL에 붙어 쿼리형태로 데이터를 넘겨줄 수 있다.

      • key=value?key1=value1
      • HttpServletRequest 인터페이스 → getQueryString()

      4. 질의 문자열


      클라이언트가 웹서버에 정보를 요청할 떄 질의 문자열을 사용해서 필요한 데이터를 전달한다.

      질의문자열 규칙

      • name=value 형식
      • 영문자,숫자, 일부 특수기호는 그대로, 나머지 문자는 16진수로 변환해서 전달
      • 공백기호는 +로 변경되어 전달

      GET 요청 방식

      • 데이터를 조회하는 요청에 사용
      • request body가 없고 질의 문자열이 URI에 포함되어 전달된다.
        • 외부 노출 위험
        • 문자열 길이가 제한적
        • 인코딩/디코딩 X
      • GET으로 요청하는 방법
        • a 태그의 기본 요청방식
        • 브라우저 주소줄에 직접 입력
        • form 태그의 기본 요청방식

      POST 요청 방식

      • 데이터 값을 수정하거나 상태변화를 일으키는 요청에 사용
      • 질의 문자열이 request body에 포함된다.
      • POST로 요청하는 방법
        • form 태그의 method 속성 → POST로 지정

      서블릿 연결

      1. action 속성 → URI 주소 지정 (상대주소)
        1. method 속성
      2. 서블릿 클래스에 @WebServlet(”/ + URI주소”) 지정

      질의 문자열 추출

      • getParameter()
      • getParameterValues()
      • getQueryString()
        • GET에서 사용
      • getInputStream()
        • POST에서 사용
        • readLine()을 이용해 줄 단위로 데이터 읽어옴

      5. 서블릿 설정과 변수


      💡서블릿 설정을 위한 태그

      • <servlet>
        • <servlet-name>
        • <servlet-class>
      • <init-param>
        • <param-name>
        • <param-value>
        • ServletConfig.getInitParameter()를 이용해서 접근할 수 있다.
      • <load-on-startup>
        • 서블릿 생성 우선순위

      서블릿 동시 요청

      CGI

      클라이언트 요청이 들어올때마다 독립적인 프로세스가 만들어진다.

      → 프로세스마다 메모리에 데이터가 로딩된다.

      서블릿

      서블릿 최초 요청 → init() 호출 ⇒ 하나의 프로세스 생성

      최초 이후 서블릿 요청 → service() 호출 = 만들어진 프로세스내에 스레드 생성

      스레드는 독립적인 stack을 가지고 있지만 code, heap 영역은 다른 스레드와 공유한다.

      ⇒ 메모리 측면에서 효율적

      ⇒ 변수의 범위를 주의해서 사용해야한다.

      자바의 변수

      멤버 변수

      • class 변수
        • 선언 방법 : static 선언
        • 사용 메모리 : code 영역
        • 생성 시점 : 프로그램 시작
        • 제거 시점 : 프로그램 종료
      • instance 변수
        • 선언 방법 : 메소드 바깥쪽에 선언
        • 사용 메모리 : heap 영역
        • 생성 시점 : 객체 생성 시
        • 제거 시점 : 참조가 끊긴 후 GC에 의해

      지역 변수

      • 선언 방법 : 메소드 안쪽에 선언
      • 사용 메모리 : stack 영역
      • 생성 시점 : 메소드 실행 시
      • 제거 시점 : 메소드 종료 시

      6. 상태정보 유지 기술


      Stateless

      HTTP 통신의 특징 중 하나

      클라이언트가 요청을 보내고 서버가 응답을 보내면 연결이 끊기기때문에 이전에 요청을 보냈던 클라이언트에 대한 정보가 없는 것을 의미한다.

      상태정보

      계속된 요청에 사용할 수 있도록 이전 서비스 결과를 저장한 정보들을 상태정보라고 한다.

      클라이언트 혹은 서버에 저장하는 방식이 있다.

      • 클라이언트 측 → 브라우저에 저장 ex )쿠키
      • 서버 측→ 메모리 힙 영역에 저장

      유지 기간 분류

      • 웹 애플리케이션 단위 유지
        • 웹 애플리케이션 생명주기 = ServletContext 생명주기
        • ServletContext는 웹 애플리케이션이 시작될때 생성되고 종료될 때 소멸한다.
      • 클라이언트 단위 유지
        • 쿠키, 세션
        • 상태정보다 다른 클라이언트는 사용할 수 없어야할때
        • ex) 로그인 정보
      • 요청 단위 유지
        • 하나의 요청(클라이언트 요청 + 서버의 응답)에서만 유지

      ServletContext

      웹 애플리케이션 단위로 유지하며 서버측에 저장되는 객체이다.

      ServletContext는 해당 웹 애플리케이션에 포함된 모든 서블릿이 공유하고 있다.

      → 속성을 이용해 서블릿 간 정보 공유가 가능하다.

      ServletContext 추출하는 방법

      ServletContext는 해당 웹 애플리케이션에 포함된 모든 서블릿이 공유하고 있다.

      • ServletContext 객체
        • ServletConfig.getServletContext() 이용해서 추출
        • ServletContext 객체에서 서버의 정보를 얻을 수 있다.
        • 객체에 속성을 set/get/remove → 서블릿 간 정보 공유를 가능하게 한다.
      • ServletContext의 주소
        • init() 메소드 재정의
        • HttpServlet 객체 이용
          • 서블릿을 만들기 위해서는 반드시 HttpServlet을 상속받아야한다.
          • ServletConfig 상속 —> GenericServlet → HttpServlet

      ServletContext 변수 설정

      web.xml 파일에서 이용

      ServletContext 변수 추출

      ServletContext.getInitParameter() 이용

      쿠키

      활용 예시

      • 유저 로그인 인증 상태 유지
      • 방문 횟수
      • 사용자 정보 저장

      특징

      • 클라이언트 단위로 저장
      • 클라이언트 쪽에 저장
      • 클라이언트가 직접 점검해볼 수 있기에 보안상 유의해서 사용
      • name=value 형식으로 저장
      • expire=날짜 → 쿠키 유지 기간

      쿠키생성

      javax.servlet.http.Cookie 객체를 이용해 생성한다.

      → 해당 객체의 함수들을 이용해 쿠키의 속성을 설정할 수 있다.

      세션

      일정기간동안 클라이언트 상태 정보 저장을 목적으로 한다.

      저장 위치

      • 세션 객체는 서버 측에 저장.
      • 세션 ID는 클라이언트 측에 쿠키로 저장.

      활용 예시

      • 장바구니
      • 로그인, 로그아웃 사용자 인증 처리

      💡세션 트래킹

      1. 클라이언트의 세션이 이미 존재하면 해당 세션을 추출 / 없다면 생성
        1. 세션 ID를 클라이언트에게 쿠키로 보낸다.
      2. 정보를 저장한 객체를 세션에 등록
      3. 클라이언트가 요청이 올때마다 세션에 저장된 정보를 활용해서 기능에 사용
      4. 세션이 더이상 필요없어진 시점에 세션 삭제

      HttpSession 객체 생성

      HttpServletRequest.getSession(boolean create)

      • ruquest의 클라이언트 세션 ID와 동일한 세션 객체를 찾아준다.
      • create = true → 없으면 객체 생성
      • create = falase → 없으면 null 반환

      Request 단위 정보 공유

      요청 재지정

      아래 객체들을 이용해 요청온 페이지에서 다른 페이지로 요청을 옮겨줄 수 있다.

      • HttpServletResponse 객체
        • sendRedirect()
        • encodeRedirectURL()
      • RequestDistpatcher 객체
        • forward()
        • include()

      Reqeust 단위 정보 공유

      1. HttpServletRequest, HttpServletResponse 객체에 속성으로 정보를 저장한다.
      2. ReaureDispatcher의 foward, include 메소드에 request, response 객체를 담아 다른 페이지에 정보를 공유한다.

      7. 고급 기능


      필터

      • 서블릿 실행 전후로 필터가 실행된다.
        • 서블릿의 처리와 유지 보수를 좀 더 효과적으로 처리할 수 있다.
      • 필터는 여러개의 서블릿에 적용
        • 여러 페이지에 동일한 기능을 적용해야할 때 활용하면 좋다.
      • Filter 인터페이스를 통해 구현

      필터 구현

      Filter 인터페이스

      • init()
        • 웹 애플리케이션이 시작될 때 한번만 작동
      • destroy()
        • 웹 애플리케이션이 종료될 때 한번만 작동
      • doFilter()
        • 해당 필터에 매핑된 서블릿이 실행될때마다 호출
        • FilterChain
          • 3번째 인자
          • web.xml에 작성된 모든 필터 정보를 가지고 있다.
          • chain.doFilter() 메소드 생략할 경우 실행 흐름이 멈춰 서블릿까지 전달되지 못하고 해당 메소드에서 끝난다.

      필터 등록 및 매핑

      방법 1 : 태그 이용

      1. Filter 인터페이스 상속 후 객체 구현
      2. <filter> 태그 이용해 필터 객체 등록
      3. <filter-mapping> 태그로 필터와 서블릿 매핑

      필터 등록

      • <filter> 태그
        • <filter-name>
        • <filter-class>
        • <init-param>
          • <param-name>
          • <param-value>

      필터 매핑

      • <filter-mapping> 태그
        • <filter-name>
        • <url-pattern>
        • <servlet-name>

      FilterConfig

      필터 객체에 필터에 대한 정보값들을 전달한다.

      방법 2 : @WebFilter 이용

      1. filter 인터페이스 상속 후 객체 구현
      2. 필터 객체에 @WebFilter 어노테이션 선언
      3. 속성으로 filterName, urlPatterns 속성을 추가한다.

      리스너

      = 이벤트 핸들러

      각 이벤트가 발생한 시점에서 수행될 처리 내용을 구현할 수 있다

      웹의 이벤트 소스

      • ServletContext
      • HttpSession
      • HttpServletRequest

      리스너 구현 및 등록

      방법 1 : 태그 이용

      1. Listener, AttributeListener 인터페이스 상속 후 구현
        • Listner는 객체 생명주기와 관련된 이벤트
        • AttributeListner는 객체의 속성에 대한 이벤트
      2. <listner> 태그 이용해서 web.xml에 등록

      방법 2 : @WebListener 이용

      1. Listener, AttributeListener 인터페이스 상속 후 구현
      2. 리스너 클래스 선언부 위에 @WebListener를 선언한다.

      오류처리

      자바에서는 프로그램 실행 중 발생하는 오류도 객체로 표현한다.

      방법 1: try catch 처리

      방법 2: Throw 처리

      throw로 처리한 오류가 발생시 해당 함수를 호출한 부분에서 오류 해결

      • finally → 오류 해결 X, 오류 발생시에도 무조건 실행해야하는 역할

      방법 3 : web.xml 오류 처리

      • <error-page>

        <error-code>, <exception-type>에 지정된 오류 유형을 가진 오류가 발생 시

        <location> 태그에 지정된 오류 페이지가 실행

  • Part2. JSP 프로그래밍

    Part2. JSP 프로그래밍

    8. JSP 프로그래밍


    템플릿 데이터에 동적인 데이터를 끼워 넣을 수 있는 방법을 제공한다.

    추상화를 위한 JSP 기능

    • 자바빈즈 컴포넌트 아키텍처

      • 태그 라이브러리

      JSP 장점

      • 플랫폼 독립성
      • 역할 분리
      • 컴포넌트와 태그 라이브러리의 재사용
      • 정적 콘텐츠와 동적 컨텐츠의 분리
      • 액션, 표현식, 스크립트 제공
      • N-tier 엔터프라이즈 애플리케이션을 위한 웹 접근 레이어

      JSP 실행 단계

      컨테이너는 JSP와 서블릿 클래스를 웹 컴포넌트로 인식

      1. 변환 단계 : JSP Container
        1. JSP (.jsp) → 서블릿 소스 (.java) — 컴파일 —> 서블릿 클래스 (.class)
      2. 실행 : ServletContainer
        • 실행은 요청이 있을때마다
        • 구현된 서블릿 클래스를 초기화하고, 실행해서 요청을 처리하고 응답을 보낸다.

      💡스크립트 기반 태그

      스크립트 태그의 종류에 따라 자바 소스로 변환된다.

      • 지시자

        • <%@ … %>

        • 페이지에 대한 정보 설정

        • page 지시자

          <%@ page 속성 = 값 %>

          • contentType
          • import
          • errorPage, isErrorPage
        • include 지시자

          <%@ include file = “파일명” %>

      • 선언문

        • <%! 변수 선언 %> 혹은 <%! 메소드 선언 %>
        • 멤버변수 또는 메소드 선언
      • 스크립트릿

        • <% … %>
        • _jspService()내에 그대로 옮겨짐
      • 표현식

        • <%= … %>
        • _jspServe()의 out.println()으로 그대로 옮겨짐
      • 주석

        • <%-- … -->

      9. 내장 객체


      JSP 파일이 자바 소스로 변환될 때 _jspService() 메소드 안에 자동으로 생성된 코드로 인해 미리 선언과 초기화가 된 객체들

      _jspSerive() 메소드내에서만 내장 객체는 사용할 수 있기때문에, 스크립트릿과 표현식에서만 사용할 수 있다.

      • request
        • 질의 문자열, forward() 함수를 활용할 수 있다.
      • response
      • session
        • 로그인, 로그아웃에 세션을 통해 인증을 유지할 수 있다.
      • application
        • ServletContext 객체 메소드들을 사용할 수 있다.
      • config
      • out
        • 웹 브라우저에 출력하는 기
      • pageContext
        • jsp 페이지 하나당 만들어진다.
        • 내장객체를 반환하여 사용할 수 있다.

      10. 표준 액션 태그와 JSP 자바빈즈


      XML 기반 태그

      • 표준 액션 태그
      • 커스텀 태그

      표준 액션 태그

      많이 쓰는 기능을 JSP 스펙으로 이미 정의해서 컨테이너마다 동일하게 구현해놓은 표준 액션 태그이다.

      태그 사용

      <태그 라이브러리 이름 : 태그 이름>

      표준 액션 태그 종류

      • <jsp : forward page = “경로”>
        • = 서블릿 RequestDisaptcher.forward() 실행
      • <jsp : include file = “파일경로”>
        • include 지시자 : java로 변환될때 파일 포함
        • : 실행될때 파일 포함

      JSP 자바빈즈

      JSP 자바빈즈의 장점

      • 폼 데이터 처리 용이
        • 클라이언트로부터 전달받은 데이터를 쉽게 추출하고 다른 페이지에서 참조할 수 있다.
      • 자바빈즈 활용 범위 확장 용이
        • 여러 페이지에서 사용해야하는 데이터는 자바빈즈를 이용해 쉽게 유지하여 여러 범위에서 사용할 수 있다.
      • 컴포넌트 기반 구현 기능
        • 비지니스 로직을 컴포넌트로 만들어 활용하면 JSP 페이지 크기는 작아지고 컴포넌트 재활용을 통해 구현되므로 효과적으로 구현할 수 있다.

      JSP 자바빈즈 개발 규약

    1. 패키지화

      1. 기본 패키지에 있으면 인식 X
    2. 기본 생성자 존재

    3. 멤버 변수 ⇒ private

    4. getter/setter 메소드 ⇒ public

    5. 직렬화 구현 (선택사항)

      자바빈즈 생성 및 사용

    6. 생성

      1. 패키지화
      2. 자바빈즈로 사용할 클래스 구현
    7. 사용

      1. <jsp:useBean class = “클래스명” id=”식별자명”>
      2. <jsp:getProperty property=”변수명” name=”id명”>
      3. <jsp:setProperty property=”변수명” name=”id명” value=”저장할값”>
        1. value를 설정하지 않으면 질의 문자열에서 찾아서 설정된다.
        2. property=”*” ⇒ 클라이언트의 질의 문자열에서 추출해서 바인딩한다.
  • Part3. JSP 프로그래밍2

    Part3. JSP 프로그래밍 2

    11. 데이터베이스


    JDBC

    자바 프로그램에서 DB 관련 작업을 수행한다.

    자바언어로 다양한 관계형 데이터베이스에 접속하고 SQL 문을 수행하기 위해 사용되는 표준 SQL 인터페이스 API 이다.

    💡 JDBC 프로그램 ↔ JDBC 인터페이스 ↔ JDBC 드라이버 ↔ DB

    • 접속하려는 DBMS마다 JDBC 드라이버가 필요하다.

    💡JDBC 프로그래밍

    1. JDBC 드라이버 로딩

      • Class.forName(JDBC 드라이버 패키지)
    2. DBMS 서버 접속

      • DriverManager.getConnection()
        • 연결에 성공 시 Connection 객체 반환
    3. Statement, PreparedStatement 객체

      • DB에 SQL문을 전달할 때 사용되는 객체
      • Statement 객체
        • Connection 객체에서 createStatement()를 통해 Statement 객체 생성
      • PreparedStatement 객체
        • Statement와 같은 기능이지만 ?를 사용해서 동적으로 값을 할당할 수 있다.
    4. Statement 실행

      • ResultSet ExecuteQurey()
        • select 결과값을 가지는 객체
      • int ExecuteUpdate()
    5. 자원 해제
      - 최근에 사용한 객체부터 거꾸로 올라가며 해제

      DataSource

      Connection을 효율적으로 관리하고 사용하기 위해 Connection Pool을 사용

      Connection Pool은 미리 Connection 객체를 가지고 있어 사용자가 요청이 들어올때 바로 사용할 수 있는 특징이 있다.

      이때 Connection Pool을 관리하는 목적으로 DataSource 객체를 사용한다.

      💡사용방법

      1. JNDI 서버 객체 생성
        • 서용하고자하는 자원의 이름값만으로 자원을 연결하여 이용할 수 있다.
      2. look up()
        • 매개변수로 들어온 이름에 해당하는 DataSource를 찾아서 객체로 반환해준다.
      3. getConnection()
      4. Statement 객체 생성
      5. Statement 실행
      6. 자원 해제

      12. Expression Language


      • ${ } 내에 표현식으로 표현한다.
      • 문자, 연산자, 변수를 사용해서 표현식을 작성한다.
        • 문자 : 논리, 숫자, 문자열
        • 연산자 : 산술, 논리, 비교 연산자 , empty 연산자

      내장객체

      JSP의 내장객체처럼 내장 객체 참조변수 이름으로 곧바로 사용할 수 있다.

      내장객체의 대부분은 map 형태로 되어 있다.

      param

      질의 문자열을 쉽게 가져올 수 있다.

      ${param.keyName} 혹은 ${param[keyName]}

      활용 예시) <jsp:forward page=”${param.p}” />

      header

      요청정보의 헤더정보를 가져온다.

      💡정보추출

      request, session, application 단위로 정보를 추출하는 간단한 방법

      1. 자바빈즈 객체 구현
      2. 자바빈즈 등록
        • 원하는 단위의 객체에 setAttribute(”id명”, beans 객체 )
      3. EL구문을 통해 사용
        • request, session, application 순서로 getAttribute(”속성명”) 메소드를 실행

      13. 커스텀 태그


      장점

      • 재사용성
      • 역할분담
      • 유지 보수성
      • 기독성

      클래스 기반 커스텀 태그

      1. Tag Handler Class

        태그 기능을 자바 클래스 파일에 구현

      2. Tag Libray Descriptor

        JSP 태그와 연결

      3. TLD 파일 등록

        JSP 컨테이너가 TLD 파일을 인지하도록 web.xml에 등록 혹은 WEB-INF 폴더에 넣기

      4. 커스텀 태그 사용

        taglib 지시자를 이용해 JSP 페이지에서 선언

      태그 기반 커스텀 태그

      JSP 파일에 직접 구현한다.

      1. Tag 파일 (*.tag)

        JSP 페이지처럼 작성하지만 tag 지시자를 사용

        일반 JSP 페이지에서 사용할 수 없는 지시자 사용

        내부적으로 태그 파일이 태그 핸들러 파일로 변환되어 사용된다.

      2. 커스텀 태그 사용

        taglib 지시자를 사용해 JSP 페이지에서 선언

      tag 지시자

      커스텀 태그에 대한 기본적인 정보를 설정

      • body-content
        • empty : 몸체 없음
        • tagdependent : 몸체 내용을 그대로 사용
        • scriptless (default) : 액션 처리 후 결괏값 사용
      • dynamic-attribute
        • 속성을 동적으로 사용할때 속성을 저장할 변수 이름 지정

      attribute 지시자

      커스텀 태그에 사용할 속성 정의

      • name
      • required

      variable 지시자

      EL에서 사용하는 변수를 선언할 때 사용

      • name-given

        EL에서 사용할 변수의 이름을 지정

      • scope

        • AT_BEGIN : 시작 태그부터 사용
        • NESTED : 시작 태그와 끝 태그 사이에서 사용
        • AT_END : 끝 태그 이후부터 사용

      <jsp:doBody>

      커스텀 태그 몸체의 내용을 출력해주는 태그

      14. JSTL


      태그 라이브러리를 공통으로 사용하기 위한 표준

      Core, Formatting, SQL, XML, Functions 5개의 태그 라이브러리를 제공하고 있다.

      Core

      • 기본 액션

        ex) <c:set>, <c:out>, <c:remove>, <c:catch>

      • 조건 액션

        ex) <c:if>, <c:choose>, <c:when>, <c:otherwise>

      • 반복 액션

        ex) <c:forEach>, <c:forTokens>

      • URL 액션

        ex) <c:import>. <c:url>, <c:param>, <c:redirect>

      Formatting

      서비스 지역이나 문화에 맞줘 작업이 수행될 수 있게 도와주는 역할을 한다.

      ex) <fmt:message>, <fmt:param>, <fmt:requestEncoding>, <fmt:timeZone>

      SQL

      데이터베이스에 관련된 기능을 수행한다.

      ex) <sql:setDataSource>, <sql:query>, <sql:update>

  • Part4. MVC 기반 웹 프로젝트

    15. 웹 애플리케이션 디자인 패턴


    MVC

    개발 디자인 패턴

    • Model

      • Service 객체 / Business 객체 → 서비스 처리를 하기 위한 객체
      • Dao 객체 → DB 처리에 관한 기능을 하는 객체
    • View

      → 클라이언트로부터 요청이 일어나거나 처리된 결과를 보여주는 페이지

    • Controller

      → 뷰에서 클라이언트가 서비스를 요청했을 때 실행되는 곳

      3계층 아키텍쳐

      구조적인 측면에서 3계층 아키텍쳐 사용

      • Presentation tier

        클라이언트 ↔ 애플리케이션

        프론트엔드

      • Business tier

        서비스 처리를 위한 비즈니스 로직을 구현

        벡엔드, 미들웨어

      • Persistent tier

        데이터베이스 서버나 파일 시스템에 접근해서 데이터를 생성, 관리하는 계층

        벡엔드

  • 질문
    • 폴더 구조를 어떻게 해야할지,,
    • Servlet 클래스들이 왜 serialVersionUID를 가지고 있는지
      • HttpServlet 클래스는 GenericSerlvet 클래스를 상속 받고 있다. GenericServlet은 Servlet뿐만 아니라 Serialize 인터페이스도 상속받고 있는데, 이는 서블릿 객체 직렬화를 위해 상속받고 있다고 한다. 서블릿이 네트워크를 통해 응답 스트림을 보내기 위해서 직렬화가 필요하다고 한다.

피드백

jdbc 드라이버 로딩 과정

sql Injection

참조도서

  • 처음 해보는 Servlet & JSP 웹 프로그래밍

0개의 댓글