1. 내장 객체에 대하여 설명하시오.
JSP 페이지에서 사용할 수 있도록 JSP 컨테이너에 미리 정의된 객체
JSP 페이지가 서블릿 프로그램으로 번역될 때 JSP 컨테이너가 자동으로 내장 객체를 멤버 변수, 메소드 매개변수 등의 각종 참조 변수(객체)로 포함한다. -> 별도의 import문 없이 자유롭게 사용 가능. 스크립트릿 태그나 표현문 태그에 선언을 하거나 객체를 생성하지 않고도 직접 호출하여 사용할 수 있다.
- 스크립트릿 안에서만 사용 가능
- 스크립트릿에 내장 객체와 같은 이름의 변수를 선언할 수 없음
- 선언문에서는 사용 가능하나 가급적 사용하지 않는 것이 좋음
- 서블릿 컨테이너가 해당 JSP 페이지 실행 시 자동으로 생성
- jsp가 변환된 fileName_jsp.java 파일을 열어보면 _jspService() 메소드 내부에 선언되어 있음

setAttribute() & getAttribute
request, session, application, pageContext 내장 객체는 속성(attribute)값을 저장하고 읽을 수 있는 메소드를 제공한다.
속성값을 저장하고 읽을 수 있는 기능은 JSP 페이지 및 서블릿 간 정보를 주고받을 수 있도록 한다.

내장 객체 영역
웹 애플리케이션은 page, request, session, application 4개의 영역(scope)을 가짐
내장 객체의 영역은 객체 유효기간이라고도 불리며 객체를 누구와 공유할 것인가를 나타냄
🥨 page 영역
- 한 번의 웹 브라우저(클라이언트)의 요청에 대해 하나의 JSP 페이지가 호출됨
- page 영역은 객체를 하나의 페이지 내에서만 공유
- pageContext 내장 객체 사용
🥨 request 영역
- 한 번의 웹 브라우저의 요청에 대해 같은 요청을 공유하는 페이지가 대응됨
- 같은 request 영역인 경우 두 개의 페이지가 같은 요청을 공유할 수 있음
- 객체를 하나 또는 두 개의 페이지 내에서 공유 가능
- include, forward 액션 태그 사용시 request 내장 객체를 공유하게 되며 그에 따라 같은 request 영역이 됨
- 주로 페이지 모듈화에 사용
- request 내장 객체 사용
🥨 session 영역
- 하나의 웹 브라우저당 1개의 session 객체 생성
- 같은 웹 브라우저 내에서 요청되는 페이지들은 같은 객체 공유
- 주로 회원 관리(인증)에 사용되며 session 내장 객체 사용
🥨 application 영역
- 하나의 웹 애플리케이션(프로젝트)당 1개의 application 객체 생성
- 같은 웹 애플리케이션에 요청되는 페이지들은 같은 객체 공유
- /Project_Name 웹 애플리케이션에서는 같은 application 객체 공유
- 애플리케이션 전체에서 공유하는 객체이므로 메모리에 부담이 갈 수 있어서 자주 사용되지는 않음
- application 내장 객체 사용
2. forward, redirect의 차이는?

- 서블릿이나 jsp가 요청을 받은 후 그 요청을 처리하다가 추가적인 처리를 같은 was 안에 있는 다른 서블릿이나 jsp에 위임하여 처리하는 경우
- 주로 서블릿으로 request 요청을 보내고 응답처리는 jsp로 가공한다.
- 요청과 응답이 한번만 이루어짐 → 요청 URL이 동작된 후에도 같다.

- 여러 페이지가 있을 때, 조건에 따라 해당 페이지를 분기시킬 때 사용함
- 서버가 클라이언트에게 어떤 URL로 이동하라는 요청을 보내는 것 (클라이언트에게 다시 접근하게 만든다.)
- 클라이언트는 리다이렉션 응답을 받게 되면 헤더에 포함된 URL로 재요청을 보낸다.
- 서블릿이나 JSP는 리다이렉트하기 위해 HttpServeltResponse클래스의 sendRedirect() 메서드를 사용
- HTTP 프로토콜로 정해진 규칙
- 요청과 응답이 각각 이루어짐 → 처음 요청한 URL과 리다이렉트가 일어난 후의 URL이 다르게 변경된다.
1) URL의 변화여부
- redirect: 변화 O
- forward: 변화 X
2) 객체의 재사용여부
- redirect: 재사용 X
- forward: 재사용 O
3. 액션 태그의 정의와 종류는?
서버나 클라이언트에게 어떤 행동을 하도록 명령하는 태그
- JSP와 JSP 사이를 제어하거나 다른 페이지의 실행 결과를 현재 페이지에 포함시킬 수 있다.
- XML 형식 : <jsp: .../> 혹은 < jsp: > </jsp: >
주요 액션 태그
① forward : 다른 페이지의 이동과 같은 페이지의 흐름을 제어한다. // 컨트롤을 누가 갖고 있나?
② include : 외부 페이지의 내용을 포함하거나 페이지를 모듈화 한다. // 디렉티브 include와 차이점
③ param : 파라미터를 얻음
④ useBean : 자바 빈즈를 사용하기 위해 실제 자바 클래스를 선언하고 초기화한다.
⑤ setProperty : 자바 빈즈의 property를 설정
⑥ getProperty : 자바 빈즈의 property를 얻음
① forward 액션 태그
: jsp 컨테이너가 forward 액션 태그를 만나면, 그 전까지 출력 버퍼에 저장되어있던 내용을 모두 삭제하고, forward 액션 태그에 설정된 페이지로 프로그램의 제어가 이동한다.
<jsp:forward page="이동할 외부 파일명" />
- 액션 태그는 스크립트 태그를 이용하여 jsp 페이지에 직접 자바 코드를 작성하지 않기 위해 사용된다.
- 유지 보수 효율성
- flush된 후에, 컨트롤러가 외부 jsp 파일로 이동한다.
- 컨트롤러는 외부 jsp로 이동하지만, 웹 브라우저의 주소(url)는 처음에 요청한 jsp 파일이다.
② include 액션 태그
: 현재 jsp 페이지의 특정 영역에 외부 파일의 내용을 포함한다.
<jsp:include page="외부 파일명" flush="false" />
- flush 속성 값은 html, jsp, 서블릿 페이지 등 사용 가능하다.
- 기본 값은 false, true로 설정하면 외부 파일로 제어권이 이동할 때, 현재 jsp 페이지가 지금까지 출력 버퍼에 저장된 내용을 웹 브라우저에 출력하고 출력 버퍼를 비운다.
// 그럼 원래는 출력 버퍼에 저장한 결과를 처리하고 나서 include되는 것이다.
- 일반적으로 flush 값은 false로 해두는 것이 좋다. true로 할 경우에는 헤더 값이 다시 같이 전송되는데, 이때 수정된 헤더 정보를 추가해도 이미 헤더 정보는 전송된 후에 지워진 상태라 수정된 헤더를 추가해도 반영이 되지 않는다.
cf.
include 액션 태그와 include 디렉티브 태그의 차이점
include 액션 태그
1) 동적
2) 처리된 내용을 포함
3) 요청 시 자원 포함
4) 별도의 파일로 요청 처리 흐름을 이동
5) request 기본 내장 객체나 param 액션 태그를 이용하여 파라미터 전달
6) 화면 레이아웃의 일부분을 모듈화할 때 주로 사용
include 디렉티브 태그
1) 정적
2) 텍스트로 포함
3) 번역 시 자원 포함
4) 현재 페이지에 삽입
5) 페이지 내의 변수를 선언후에 변수에 값을 저장
6) 공통으로 사용되는 코드나 저작권을 포함하는 경우에 사용한다.
③ param 액션 태그
: 현재 jsp 페이지에서 다른 페이지에 정보를 전달하는 태그
<jsp:include page="외부파일명" name="식별자" value="값" />
- 단독으로 사용 못하고, <jsp:forward>나 <jsp:include> 태그의 내부에서 사용된다.
- 다른 페이지에 여러 개의 정보를 전송해야할 때는 다중의 파라미터 액션 태그를 사용한다.
- param 액션 태그로 받아오는 파라미터는 getParameter("식별자"); 를 통해 받을 수 있고, request를 사용하여 현재 페이지에 요청을 보낸다.
④ javaBean 액션 태그
: 동적 콘텐츠 개발을 위해 자바 코드를 사용하여 자바 클래스로 로직을 작성하는 방법
(과정) 웹브라우저가 jsp에 request -> jsp는 자바 빈즈를 이용해서 데이터 베이스를 사용함.
- 계산식이나 자료의 처리를 담당하는 자바 코드를 따로 분리하여 작성하는 것.
- '화면 출력'과 '데이터 처리' 부분을 분리하여 데이터처리를 자바 빈즈를 통해 다룰 수 있도록 작성하는 것.
- 자바 빈즈는 property와 method로 구성한다.
1) 자바 클래스는 java.io.Serializable 인터페이스를 구현해야한다. // 생략 가능, 저장된 프로퍼티를 포함하여 파일 시스템에 저장 혹은 네트워크로 전송될 수 있도록 "객체 직렬화"를 제공한다.
2) 인수가 없는 기본 생성자가 있어야 한다.
3) 모든 멤버 변수인 프로퍼티는 private 접근 지정자로 설정해야 한다.
4) 모든 멤버 변수인 프로퍼티는 getter/setter() 메서드가 존재해야 한다.
- getter() 메서드 : 멤버 변수에 저장된 값을 가져올 수 있는 메서드
- setter() 메서드 : 멤버 변수에 값을 저장할 수 있는 메서드
package com.dao;
import java.io.Serializable;
public class MemberBean implements java.io.Serializable{
private int id;
private String name;
public MemberBean(){
}
public int getID(){ return id;}
public void setID(){ this.id=id;}
public String getName(){ return name;}
public void setName(){ this.name=name;}
}
⑤ useBean 액션 태그
: 자바 빈즈를 사용하기 위해 실제 자바 클래스를 선언하고 초기화하는 태그
<jsp:useBean id="식별자" class="자바빈즈 이름" scope="범위" />
- scope 속성 : 자바 빈즈 범위
- page : 해당 jsp 페이지에서만 운영할 것인지.
- request : 사용자의 요청을 처리할 동안에만 할 것인지.
- session : 접속을 종료할 때까지 할 것인지.
public class Calculator{
public int process(int n){
return n*n*n;
}
}
<jsp:useBean id="bean" class="java.util.Date" />
⑥ setProperty 액션 태그
: 자바 빈즈의 setter() 메서드에 접근하여 자바 빈즈의 멤버 변수인 프로퍼티의 값을 저장하는 태그
<jsp:property name="식별자" property="프로퍼티 이름" value="값" >
- useBean 액션 태그와 함께 사용된다.
- 전달되는 요청 파라미터의 값을 직접 저장하거나 자바 빈즈의 프로퍼티로 변경하여 값을 저장할 수 있다.
- 혹은 모든 자바빈즈 프로퍼티 이름과 동일하게 요청 파라미터를 설정할 수 있다.
- param 속성과 value 속성을 둘 다 사용할 수 없으므로 하나만 선택해서 사용한다.
(ex)
1) 요청 파라미터 이름과 자바빈즈의 프로퍼티 이름이 일치하는 경우
2) 요청 파라미터 이름과 자바빈즈의 프로퍼티 이름이 일치하지 않는 경우
3) 요청 파라미터 이름과 자바빈즈의 프로퍼티 이름이 모두 일치하는 경우
=> property="*"를 사용하면 모든 요청 파라미터가 자바빈즈의 프로퍼티로 전달된다.
** name에 저장된 값을 가져오기 위해서 사용하는 것이 getProperty() 메서드이다.