2022년 6월 14일 화요일

JSP 3강 - 내장 객체의 영역

1. 내장 객체의 영역이란?
각  객체가 저장되는 메모리의 유효 기간
  • page 영역 : 동일한 페이지에서만 공유됨, 페이지를 벗어나면 소멸
  • request 영역 : 하나의 요청에 의해 호출된 페이지와 포워드된 페이지까지 공유됨, 새로운 페이지로 요청(페이지 이동)하면 소멸.
  • session 영역 :  클라이언트가 처음 접속한 후 포워드나 페이지 이동 시에도 영역은 공유, 웹 브라우저를 닫으면 소멸. 
  • application 영역 : 한 번 저장되면 웹 애플리케이션이 종료될 때까지 공유, 서버를 셧다운 하면 소멸
범위의 크기 : application > session > request > page 

2. 내장 객체 사용법

 void setAttribute(String name, Object value)

  • 각 영역의 속성을 저장
  • 첫 번째 인수는 속성명, 두 번째 인수는 저장할 값
  • 값의 타입은 object이기에 모든 타입의 객체를 저장 가능
 Object getAttribute(String name)

  • 영역에 저장된 속성 값을 얻어온다.
  • object 로 자동 형 변환되어 저장되기에 원래 타입으로 형 변환 후 사용해야 한다.
void removeAttribute(String name)
  • 영역에 저장된 속성을 삭제
  • 삭제할 속성 명이 존재하지 않더라도 에러는 발생하지 않음.
3. 데이터 전송 객체(DTO) 란?
데이터를 저장하거나 전송하는데 쓰이는 객체.
자바빈즈 규약
  1. 자바빈즈는 기본 패키지 이외의 패키지에 속해야 한다
  2. 멤버 변수(속성)의 접근 지정자는 private로 선언해야 한다.
  3. 기본 생성자가 있어야 한다
  4. 멤버 변수에 접근할 수 있는 getter / setter 메서드가 있어야 한다.
  5. getter / setter 메서드의 접근 지정자는 public로 선언해야 한다.

2022년 5월 26일 목요일

JSP 02 내장 객체

 내장 객체 특징

  • 컨테이너가 미리 선언해 놓은 참조 변수를 이용해 사용
  • 별도의 객체 생성 없이 각 내장 객체의 메서드 사용
  • JSP 문서 안의 <% 스크립틀릿 %> 과 <%= 표현식 %> 에서만 사용 가능
  • <%! 선언부 %> 에서는 즉시 사용은 불가능, 매개변수로 전달 받아 사용 가능


request 객체 : 클라이언트가 전송한 요청 정보를 담고 있는 객체

  • 클라이언트와 서버에 대한 정보 읽기
  • 클라이언트가 전송한 요청 매개변수에 대한 정보 읽기
  • 요청 헤더 및 쿠키 정보 읽기


//GET 방식으로 요청
 <a href="./RequestWebInfo.jsp?eng=Hello&han=안녕"> 

//POST 방식으로 요청
<form action="RequestWebInfo.jsp" method="post">  
        영어 : <input type="text" name="eng" value="Bye" /><br />
        한글 : <input type="text" name="han" value="잘 가" /><br />
        <input type="submit" value="POST 방식 전송" />
</form>

//클라이언트와 서버의 환경 정보 읽기
<body>
    <ul>
        <li>데이터 전송 방식 : <%= request.getMethod() %></li>
        <li>URL : <%= request.getRequestURL() %></li>
        <li>URI : <%= request.getRequestURI() %></li>
        <li>프로토콜 : <%= request.getProtocol() %></li>
        <li>서버명 : <%= request.getServerName() %></li>
        <li>서버 포트 : <%= request.getServerPort() %></li>
        <li>클라이언트 IP 주소 : <%= request.getRemoteAddr() %></li>
        <li>쿼리스트링 : <%= request.getQueryString() %></li>
        <li>전송된 값 1 : <%= request.getParameter("eng") %></li>
        <li>전송된 값 2 : <%= request.getParameter("han") %></li>
    </ul>
</body>

내장 객체 - request
<body>
<%
<!--한글인 경우 깨지기에 다국어 지원하는 UTF-8로 설정 -->
request.setCharacterEncoding("UTF-8");  

<!--전송되는 값이 1개라면 getParameter -->
String id = request.getParameter("id");    
String sex = request.getParameter("sex");

<!-- 전송되는 값이 2개 이상이면 getParameterValues -->
String[] favo = request.getParameterValues("favo");  
String favoStr = "";

<!-- favo  값이 있으면 반복해서 하나의 문자열로 합침 -->
if (favo != null) {  
    for (int i = 0; i < favo.length; i++) {
        favoStr += favo[i] + " ";
    }
}
String intro = request.getParameter("intro").replace("\r\n", "<br/>");  
%>
<ul>
    <li>아이디 : <%= id %></li>
    <li>성별 : <%= sex %></li>
    <li>관심사항 : <%= favoStr %></li>
    <li>자기소개 : <%= intro %></li>
</ul>
</body>

요청 헤더 정보 출력하기
<body>
    <%
    Enumeration headers = request.getHeaderNames();  
    while (headers.hasMoreElements()) {  
        String headerName = (String)headers.nextElement();  
        String headerValue = request.getHeader(headerName); 
        out.print("헤더명 : " + headerName + ", 헤더값 : " + headerValue + "<br/>");
    }
    %>
    <p>이 파일을 직접 실행하면 referer 정보는 출력되지 않습니다.</p>
</body>

response 객체 : 요청에 대한 응답을 웹 브라우저로 보내는 역할
  • 페이지 이동을 위한 redirect
  • HTTP 헤더에 응답 헤더 추가

<body>
<%
<!--request 내장 객체로 전송된 매개 변수를 얻어옴-->
String id = request.getParameter("user_id");
String pwd = request.getParameter("user_pwd"); 

<!--회원 인증(테스용으로 하드 코딩)-->
if (id.equalsIgnoreCase("must") && pwd.equalsIgnoreCase("1234")) {
    <!--로그인 환영 페이지로 이동-->
    response.sendRedirect("ResponseWelcome.jsp");
}
else {
    <!--첫 화면으로 이동 + 로그인 실패 에러 출력-->
    request.getRequestDispatcher("ResponseMain.jsp?loginErr=1")
       .forward(request, response); 
}
%>
</body>

HTTP 헤더에 응답 헤더 추가, 수정하기  
<%
// 응답 헤더에 추가할 값 준비 
SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm");
long add_date = s.parse(request.getParameter("add_date")).getTime(); 

java.sql.Date date2 = new java.sql.Date(add_date); 
System.out.println(date2);

int add_int = Integer.parseInt(request.getParameter("add_int"));
String add_str = request.getParameter("add_str");

// 응답 헤더에 값 추가(add), 수정(set)
response.addDateHeader("myBirthday", add_date);
response.addIntHeader("myNumber", add_int);
response.addIntHeader("myNumber", 1004); // 추가
response.addHeader("myName", add_str);
response.setHeader("myName", "안중근");  // 수정
%>
<html>
<head><title>내장 객체 - response</title></head>
<body>
    <h2>응답 헤더 정보 출력하기</h2>
    <%
    Collection<String> headerNames = response.getHeaderNames();
    for (String hName : headerNames) {
        String hValue = response.getHeader(hName);
    %>
        <li><%= hName %> : <%= hValue %></li>
    <%
    }   
    %>
    
    <h2>myNumber만 출력하기</h2>
    <%
Collection<String> myNumber = response.getHeaders("myNumber");
for (String myNum : myNumber) {
%>
<li>myNumber : <%= myNum %></li>
<%
}
%>
</body>
</html>

out 객체 : 스크립틀릿 내에서 변수를 브라우저에 출력해야 한다면 out 내장 객체 사용
<body>
    <%
    // 버퍼 내용 삭제하기
    out.print("출력되지 않는 텍스트");  // 버퍼에 저장  
    out.clearBuffer();  // 버퍼를 비움(윗 줄의 출력 결과 사라짐) 

    out.print("<h2>out 내장 객체</h2>");

    // 버퍼 크기 정보 확인
    out.print("출력 버퍼의 크기 : " + out.getBufferSize() + "<br>");
    out.print("남은 버퍼의 크기 : " + out.getRemaining() + "<br>"); 

    out.flush();  // 버퍼 내용 출력 
    out.print("flush 후 버퍼의 크기 : " + out.getRemaining() + "<br>");

    // 다양한 타입의 값 출력
    out.print(1);
    out.print(false);
    out.print('가');
    %>
</body>

application 객체 :  웹 애플리케이션당 1개만 생성되며 모든 JSP 페이지에서 접근 가능. 전반에서 사용하는 정보를 저장하거나, 서버의 정보 등을 얻어오는데 사용
<body>
    <h2>web.xml에 설정한 내용 읽어오기</h2>
    초기화 매개변수 : <%= application.getInitParameter("INIT_PARAM") %>

    <h2>서버의 물리적 경로 얻어오기</h2>
    application 내장 객체 : <%= application.getRealPath("/02ImplicitObject") %>

    <h2>선언부에서 application 내장 객체 사용하기</h2>
    <%!
    public String useImplicitObject() {
        return this.getServletContext().getRealPath("/02ImplicitObject");
    }
    public String useImplicitObject(ServletContext app) {
        return app.getRealPath("/02ImplicitObject");
    }
    %>
    <ul>
        <li>this 사용 : <%= useImplicitObject() %></li>
        <li>내장 객체를 인수로 전달 : <%= useImplicitObject(application) %></li>
    </ul>
</body>

exception 객체 :  오류명과 오류 메시지를 출력하는 객체
  • 404 에러 - 클라이언트가 요정한 경로에서 문서를 찾을 수 없음
  • 405 에러 - 허용되지 않은 메서드 처리할 컨트롤러가  없음
  • 500 에러 - 서버 내부 오류
<body>
<%
int status = response.getStatus();  // response 내장 객체로부터 에러 코드 확인

// 에러 코드에 따라 적절한 메시지 출력
if (status == 404) {
    out.print("404 에러가 발생하였습니다.");
    out.print("<br/>파일 경로를 확인해주세요.");
}
else if (status == 405) {
    out.print("405 에러가 발생하였습니다.");
    out.print("<br/>요청 방식(method)을 확인해주세요.");
}
else if (status == 500) {
    out.print("500 에러가 발생하였습니다.");
    out.print("<br/>소스 코드에 오류가 없는지 확인해주세요.");
}
%>
</body>

2강 전체 요약 
  • request 객체 -  클라이언트의 요청을 받거나 웹 브라우저에 대한 정보, 요청 헤더에 대한 정보를 읽을 때 사용
  • response 객체 - 요청에 대한 응답을 웹 브라우저로 보낼 때 사용. 페이지 이동이나 응답 헤더를 추가할 때도 사용
  • out  객체 - 변수 등의 값을 웹 브라우저에 출력할 때 사용
  • application 객체 - 웹 애플리케이션을  구성하는 모든 JSP 에서 접근 가능한 객체로, 웹 애플리케이션에 대한 설정값을  저장할 때 주로 사용
  • exception 객체 - 예외 처리를 위해 사용

JSP 01 기본

 게으름에.. -_-; 이제야 1강 요약 정리 해본다.

-JSP 특징- 

HTML 코드 안에서 필요한 부분만 자바 코드를 스크립트 형태로 추가

자주 쓰이는 기능을 내장 객체로 사용

처리된 결과를 보여주는 view를 만들 때 사용


-서블릿 특징-

자바 코드 안에서 전제 HTML 페이지 생성

변수 선언, 초기화에 반드시 선행

컨트롤러를 만들 때 사용


-JSP 파일 기본 구조-

지시어 : JSP 페이지를 자바 코드로 변환하는데 필요한 정보를 JSP 엔진에 알려줌 

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

    pageEncoding="UTF-8"

    errorPage="IsErrorPage.jsp" %>

language :  스트립핑 언어(java)

contentType : 문서의 타입 (text/html; charset=UTF-8)

pageEncoding : 인코딩 방식 (UTF-8)

errorPage : 에러시 이동할 페이지 지정 (IsErrorPage.jsp)


<%@ include file = "IncludeFile.jsp" %>  

include :  외부 클래스 가져오기 (IncludeFile.jsp)


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

    pageEncoding="UTF-8" isErrorPage="true"%>

isErrorPage : 현재 페이지가 에러 페이지임을 표시 (isErrorPage="true")


<%!  // 선언부(메서드 선언)

public int add(int num1 , int num2) {

    return num1 + num2;

}

%>

<html>

<head><title>스크립트 요소</title></head>

<body>

<%  // 스크립틀릿(자바 코드)

int result = add(10, 20);

%>

덧셈 결과 1 : <%= result %> <br />

덧셈 결과 2 : <%= add(30, 40) %>

</body>

</html>


2022년 5월 21일 토요일

JSP 공부 시작~~ 0강

예전에 다뤄봤던 JSP를 복습해보기로 한다.

스프링 부트 + AWS를 공부하고 나니 의외로 예전 버전인 스프링의 개념이 필요했다.

분명 썼던 거라도 오랫동안 사용하지  않으면 기억 손실로 복습이 필요하다.  ㅠㅠ

그래서 우선 JSP를 공부 할 때마다 이 곳에 각 강의 요약 정리를 올리고자 한다.

목표는 1일 2강이 목표이긴 하나... 변수가 생기면 늦을 수도 있다...

0강은 기본 셋팅 후에 남기는 글이다.


이번에 공부할 책은 "성낙현의 JSP 자바 웹 프로그래밍" 이다.

선택한 이유는 나름 최근에 나온 책이면서, 실무에서 가장 많이 쓴다는 버전으로 공부하기 때문이다.

셋팅 버전은 다음과 같다.

OS : 윈도우10

JDK : openjdk -11.0.2 

톰켓 :  9

이클립스 : 2020-09 윈도우 64비트


선 공부한 스프링부트 + AWS에서 책과 다르게 최신 버전으로 공부 했다가 오류 고치느라 고생한 경험으로 이번에는 책에 버전을 맞춰서 공부 하고자 한다..

JSP 요약 정리가 끝나면 스프링부트도 요약 정리해서 올릴 예정이다.


2022년 4월 20일 수요일

오라클 기본 8 - 함수

 1. 함수란?

일반적인 프로그래밍 언어에서 사용되는 함수와 같이 복잡한 프로그래밍이 가능하도록 지원 해준다. 함수는 RETURN문에 의해서 특정 값을 돌려주는 기능도 한다.


2. 함수 생성법

CREATE FUNCTION 함수이름 (파라미터)

    RETURN 데이터형식

AS 

    변수 선언 부분

BEGIN

    이 부분에 PL/SQL 프로그램 코딩

    RETURN 변수;

END 함수이름;


3. 함수의 정의와 프로시저 정의의 차이점

- 프로시저의 파라미터와 달리 IN, OUT, IN OUT 을 사용할 수 없다.

- 함수는 RETURN 문으로 반환할 값의 데이터 형식을 지정하고, 본문 안에서는 RETURN 문으로 하나의 값을 반환해야 한다.

- 프로시저는 별도의 반환하는 구문이 없으며, 필요하다면 여러개의  OUT 파라미터를 사용해야 한다.

- 프로시저는 EXECUTE 로 호출하지만, 함수는 EXECUTE 뿐 아니라, SELECT 문장 안에서도 호출 한다.

오라클 기본 7 - 스토어드 프로시저

 1. 스토어드 프로시저란?

오라클에서 제공되는 프로그래밍 기능.

쿼리문의 집합으로 어떠한 동작을 일괄 처리 하기 위한 용도로 사용.

자주 사용되는 일반적인 쿼리를 사용하는 것보다 모듈화 시켜서 필요할 때마다 호출.


2. 스토어드 프로시저의 정의 형식

CREATE OR REPLACE PROCEDURE 프로시저_이름 AS 변수_선언_부분

BEGIN

    PL/SQL 프로그래밍 코딩 부분

END 프로시저_이름


3. 스토어드 프로시저의 실행

EXECUTE 프로시저_이름();


4. 스토어드 프로시저의 수정과 삭제

수정 : CREATE OR REPLACE PROCEDURE 문을 다시 사용

삭제 : DROP PROCEDURE 


5. 파라미터의 사용

입력 - 입력_파라미터_이름 IN 데이터_형식 := 디폴트 값

실행 - EXECUTE 스토어드_프로시저_이름(전달 값);

출력 - 출력_파라미터_이름 OUT 데이터 형식

입출력 - 입력_파라미터_이름 IN OUT 데이터_형식 := 디폴트 값


6. 스토어드 프로시저의 특징

- 오라클의 성능을 향상 시킬 수 있다.

- 유지 관리가 간편하다

- 예외 처리 및 모듈식 프로그램이 가능하다.

- 네트워크 전송량의 감소

오라클 기본 6 - 인덱스

 1. 개념 

검색을 빠르게 하기 위해 책의 찾아보기 부분과 같이 미리 정리를 해놓는 기술


2. 장점 

-검색의 속도를 높일 수 있다.

-쿼리의 부하가 줄어들어 시스템 전체 성능이 향상된다.


3. 단점

-인덱스가 DB 공간을 차지하여 추가적인 공간이 필요

-처음 인덱스를 생성하는데 시간이 필요

-변경 작업(insert, update, delete)이 자주 일어날 경우 오히려 성능이 나빠질 수 있음


4. 정의법

CREATE TEBLE 테이블명

(

    userID CHAR(8) NOT NULL PRIMARY KEY --기본키를 지정하면 인덱스 자동 생성

)

테이블 생성 시 제약 조건에 Primary Key 또는 Unique를 사용하면 자동으로 인덱스 생성


5. 인덱스 제거법

DROP INDEX 인덱스이름;


6. 결론

-인덱스는 열 단위에서 생성된다.

-WHERE 절에서 사용되는 열에 인덱스를 생성해야 한다

-WHERE 절에 사용되더라도 자주 사용해야 가치가 있다

-데이터의 중복도가 높은 열은 인덱스를 만들어도 별 효과가 없다.

-JOIN 에 자주 사용되는 열에는 인덱스를 생성해주는 것이 좋다.

-인덱스는 읽기에만 성능 향상 시키기에 데이터 변경이 자주 일어나는 DB에는 좋지 않다.

- 사용하지 않는 인덱스는 제거하여 용량과 부하를 줄일 수 있다.