본문 바로가기
JAVA/spring

MVC Architecture

by 개폰지밥 2020. 2. 24.
반응형

자바 웹 개발 워크북 책 보면서 공부

 

5MVC 아키텍처

서블릿의 단점을 보완하기 위해 등장한 JSP(JavaServer Page)라는 기술.

실무 웹 애플리케이션 개발에 있어 최선의 관행으로 알려진 ‘MVC 아키텍처에 대해 배우기

5.1 MVC 이해하기

5.1.1 올인원 ALL-in-one 방식과 문제점

서블릿

-       요청 데이터 처리

-       비즈니스 로직 및 데이터 처리

-       결과 화면 생성

이와 비슷하게 올인원 PC를 예로 들 수 있다. 단점은 특정 부품이 고장이 났을 때 전체를 교환해야 하며 일부 부품만 교체하거나 특정 기능만 업그레이드 할 수 없다. 하지만 컴퓨터의 사용 목적이 명확하고 용도가 자주 바뀌지 않는다면 오히려 올인원 PC가 좋습니다. 그래서 요즘 가정용 PC로도 올인원 PC가 각광을 받고 있습니다.

하지만 요즘과 같은 글로벌 비즈니스 환경에서는 더더욱 올인원 방식은 적합하지 않습니다.

5.1.2 글로벌 환경과 MVC 아키텍처

MVC의 각 컴포넌트 역할

컨트롤러 컴포넌트 역할

컨트롤러 컴포넌트 역할은 클라이언트 요청에 대해 모델과 뷰를 결정하여 전달하는 일을 합니다.

모델 컴포넌트의 역할은 데이터 저장소와 연동하여 사용자가 입력한 데이터나 사용자에게 출력할 데이터를 다루는 일을 합니다.

컴포넌트의 역할은 모델이 처리한 데이터나 그 작업 결과를 가지고 사용자에게 출력할 화면을 만드는 일을 합니다. 이렇게 생성된 화면은 웹 브라우저가 출력합니다.

5.1.4 MVC 구동 원리

1) 웹 브라우저가 웹 애플리케이션 실행을 요청하면, 웹 서버가 그 요청을 받아서 서블릿 컨테이너(EX:톰캣)에 넘겨 줍니다. 서블릿 컨테이너는 URL을 확인하여 그 요청을 처리할 서블릿을 찾아서 실행합니다.

2) 서블릿은 실제 업무를 처리하는 모델 자바 객체의 메서드를 호출합니다. 만약 웹 브라우저가 보낸 데이터를 저장하거나 변경해야 한다면 그 데이터를 가공하여 값 객체(VO:Value Object)를 생성하고, 모델 객체의 메서드를 호출할 때 인자값으로 넘깁니다. 모델 객체는 엔터프라이즈 자바빈일 수도 있고, 일반 자바 객체 일 수도 있습니다.

3) 모델 객체는 JDBC를 사용하여 매개변수로 넘어온 값 객체를 데이터베이스에 저장하거나, 데이터베이스로부터 질의 결과를 가져와서 값 객체로 만들어 반환합니다. 이렇게 값 객체는 객체와 객체 사이에 데이터를 전달하는 용도로 사용하기 때문에 데이터 전송 객체:DTO;Data Transfer Object)’라고 부릅니다.

4) 서블릿은 모델 객체로부터 반환받은 값을 jsp에 전달합니다.

5) jsp는 서블릿으로부터 전달받은 값 객체를 참조하여 웹 브라우저가 출력할 결과 화면을 만듭니다. 그리고 웹 브라우저에게 출력함으로써 요청 처리를 완료합니다.

6) 웹 브라우저는 서버로부터 받은 응답 내용을 화면에 출력합니다.

Mvc 구조로 만들게 되면 추가적으로 더 많은 클래스를 작성해야 하고 처리되는 절차도 복잡해집니다. 오히려 서블릿 하나로 처리하던 때보다 더 복잡해 보일 것입니다. 세상 일이란게 가는게 있으면 오는게 있고, 오는게 있으면 가는게 있습니다. 기술 문서를 보다 보면 이런 경우를 트레이드오프라고 자주 표현합니다.

 

5.2 뷰 컴포넌트와 JSP

MVC 아키텍처에서 뷰 컴포넌트를 만들 때 보통 JSP를 사용합니다. 뷰 컴포넌트의 역할은 웹 브라우저가 출력할 화면을 만드는 일입니다.

5.2.1 JSP를 사용하는 이유

과거에는 HTML을 출력하려고 out.println()을 호출하고 있습니다. 출력하는 문자열에 태그 속성이 포함되어 있는데 인용부호(‘’)로 인해 코드가 더 복잡해 보입니다. Htmlout.println()을 사용하여 출력한다면 거의 재앙이라 할 수 있습니다. 이런 부분을 해소하고자 나온 기술이 jsp 입니다.

5.2.2 JSP 구동 원리

1) 개발자는 서버에 jsp 파일을 작성해 둡니다. 클라이언트가 jsp를 실행해 달라고 요청하면, 서블릿 컨테이너는 jsp 파일에 대응하는 자바 서블릿을 찾아서 실행합니다.

2) 만약 jsp에 대응하는 서블릿이 없거나 jsp 파일이 변경되었다면, jsp 엔진을 통해 jsp 파일을 해석하여 서블릿 자바 소스를 생성합니다.

Hello.jsp -> hello.java -> hello.class

5.2.3 JSP의 구동 과정 확인

JSP 파일로부터 자동 생성된 자바 소스 파일 확인

이클립스는 톰캣 서버의 인스턴스마다 tmpx와 같은 임시 폴더를 만들어 웹 애플리케이션 배치를 관리합니다.

Tmpxwork 폴더에는 jsp 파일로부터 자동 생성된 서블릿 소스 파일과 컴파일된 클래스 파일이 들어 있습니다. Hello.jsp에 대응하는 서블릿 파일이 만날 수 있습니다.

Php나 파이썬은 인터프리터 방식으로 소스를 바로 읽어서 실행하지만, jsp 파일은 그 자체로 실행되지 않고 자바 서블릿 클래스로 만들어진 다음에 실행됩니다. 당연히 실행 속도 면에서는 php나 파이썬과 같은 스크립트 기반 서버 애플리케이션보다 jsp가 더 빠릅니다.

Jsp가 직접 실행되는 것이 아니라 jsp로부터 만들어진 서블릿이 실행된다는 것을 명심해야 한다

5.2.4 HttpJspPage 인터페이스

Jsp 엔진은 jsp 파일로부터 서블릿 클래스를 생성할 때 httpjsppage 인터페이스를 구현한 클래스를 만듭니다.

 

Html을 출력하고 싶으면 jsp에서는 그냥 출력할 내용을 작성하면 됩니다. Jsp를 사용하지 않는다면 out.write(“<title>Hello</title>\n”); 앞의 코드처럼 개발자가 출력 코드를 일일이 작성해야 합니다. 바로 이런 점 때문에 jsp를 사용하는 것입니다.

5.2.7 JSP 프리컴파일

실무에선느 웹 애플리케이션을 서버에 배치할 때 모든 JSP 파일에 대해 자바 서블릿 클래스를 미리 생성하기도 합니다. 그 이유는 JSP 실행 요청이 들어 왔을 때, 곧바로 서블릿을 호출할 수 있기 때문입니다.

이 방식의 문제점은 JSP를 편집하면 서버를 다시 시작해야 합니다. 그래야만 변경된 JSP에 대해 서블릿 코드가 다시 생성됩니다. 즉 어느 정도 안정화된 이후에 JSP 프리컴파일(Precompile)을 고려해야 한다.

 

5.3 JSP의 주요 구성 요소

5.3.3 jsp 전용 태그 지시자

<%@ 지시자 … %>jsp 전용 태그로 지시자속성에 따라 특별한 자바 코드를 생성합니다. Jsp 지시자에는 page, taglib, include가 있습니다.

<% 지시자 속성=”속성=”” … %>

 

Page 지시자

Page 지시자는 jsp 페이지와 관련된 속성을 정의할 때 사용하는 태그입니다.

<%@ page

           language=”java”

           contentType=”text/html; charset=UTF-8”

           pageEncoding=UTF-8”%>

1)     language 속성jsp 페이지에 삽입되는 코드의 스크립팅 언어를 지정합니다. 현재 jsp 2.2 사양에서는 ‘java’만 허용해서 지금은 의미없는 속성이지만, 나중에 다른 스크립트 언어의 사용을 허용하다면 필요할 것입니다. Language 속성을 생략하면 기본으로 ‘java’ 입니다.

2)     contentType 속성은 출력할 데이터의 mime 타입과 문자 집합을 지정합니다. 예제 코드에서 값 ‘text/html’은 출력할 데이터가 html 텍스트임을 가리킵니다. 예쩨 코드에서 값 charset=UYF-8은 출력할 데이터를 UTF-8로 변환할 것을 지시합니다.

3)     pageEncoding 속성은 출력할 데이터의 문자 집합을 지정합니다. 만약 이 속성을 생략하면 contentType에 설정된 값을 사용합니다. contentType 속성에도 없다면 기본값 ‘ISO-8859-1’을 사용합니다.

4)      

5.3.4 JSP 전용 태그 스크립트릿

JSP 페이지 안에 자바 코드를 넣을 때는 스크립트릿 태그 <% %>안에 작성해야 합니다. 스크립트릿 태그 안에 작성한 내용은 서블릿 파일을 만들 때 그대로 복사됩니다.

<% 자바 코드 %>

 

5.3.5 jsp 내장 객체

Jsp 페이지에서 스크립트릿 <% %<이나 표현식 <%= %>을 작성할 때 별도의 선언 없이 사용하는 자바 객체가 있습니다. 이런 객체를 jsp 내장 객체라 합니다. Ex) request

 

5.3.6 jsp 전용 태그 선언문

<@! @>은 서블릿 클래스의 멤버(변수나 메서드)를 선언할 때 사용하는 태그.

5.3.7 jsp 전용 태그 표현식

표현식(expressions) 태그는 문자열을 출력할 때 사용합니다. 따라서 표현식 <%= %> 안에는 결과를 반환하는 자바 코드가 와야 합니다.

<%= 결과를 반환하는 자바 표현식 %>

 

 

5.4 서블릿에서 뷰 분리하기

[정리]

1)     값 객체 역할을 수행할 Member 클래스 생성(보통 데이터베이스 테이블에 대응하여 값 객체를 정의)

web05/src/spms/vo/Member.java

2)     서블릿에서 뷰 관련 코드 제거

A.     HTML 출력 코드 제거

B.      JSP에 전달할 회원 목록 데이터 준비

ArrayList<Member> members = new ArrayList<Member>();

While(rs.next()){member.add(new Member() .setNo(rs.getInt(“MNO”))

C.      RequestDispatcher를 이용한 forward, include

회원 목록 데이터가 준비되었으면, 화면 생성을 위해 jsp로 작업을 위임해야 합니다.

RequestDispatcher rd = request.getRequestDispatcher(“/member/MemberList.jsp”);

D.     ServletRequest(HttpServletRequest)를 통한 데이터 전달

3)     뷰 컴포넌트 만들기

MeberListServlet으로부터 받은 회원 목록 데이터를 가지고 화면을 생성하는 jsp를 만들기

Mvc 아키텍처를 위한 첫 작업으로 기존의 서블릿으로부터 뷰(view) 역할을 분리하겠습니다.

5.4.1 값 객체(VO) = 데이터 수송 객체(DTO)

데이터베이스에서 가져온 정보를 jsp 페이지에 전달하려면 그 정보를 담을 객체가 필요합니다. 이렇게 값을 담는 용도로 사용하는 객체를 값 객체(value object)’라고 부릅니다. ‘데이터 수송 객체(data transfer object)’라고도 부릅니다. 또한, 값 객체는 업무영역(business domain)의 데이터를 표현하기 때문에 객체지향 분석 및 설계 분야에서는 도메인 객체(domain object)’라고도 합니다.

5.4.2 뷰 분리하기 실습

5.4.3 값 객체 생성

Member 클래스는 회원 목록 출력에 필요한 데이터 뿐만 아니라 등록이나 변경할 때 사용하는 데이터도 포함하고 있습니다. 보통 데이터베이스 테이블에 대응하여 값 객체를 정의합니다.

셋터(setter) 메서드의 리턴값이 void가 아니라 member입니다. 이렇게 한 이유는 셋터 메서드를 연속으로 호출하여 값을 할당할 수 있게 하기 위함입니다.

5.4.4 서블릿에서 뷰 관련 코드 제거

뷰 역할 분리하기 위해 출력 코드 제거

Html 출력 코드 제거

Jsp에 전달할 회원 목록 데이터 준비

데이터를 준비하기 위한 첫 번째 작업이 회원 목록을 담을 ArrayList 객체를 준비하는 것입니다.

ArrayList<Member> members = new ArrayList<Member>();

그리고 ResultSet 객체를 통해 데이터베이스로부터 받은 레코드를 값 객체 Member에 담습니다. 이 값 객체는 ArrayList에 보관됩니다. 테이블에 있는 레코드를 모두 담을 때까지 이 과정을 반복합니다.

 

객체를 생성하고 값을 넣는 전형적인 코드

Member member = new Member();

Member.setNo(rs.getInt(“MNO”));

….

RequestDispatcher를 이용한 forward, include

회원 목록 데이터가 준비되었으면, 화면 생성을 위해 jsp로 작업을 위임해야 합니다. 이렇게 다른 서블릿이나 jsp로 작업을 위임할 때 사용하는 객체가 RequestDispatcher입니다. 이 객체는 HttpServletRequest를 통해 얻습니다.

RequestDispatcher rd = request,getRequestDispatcher(“/member/MemberList.jsp”);

 

이제 RequestDispatcher 객체를 얻었으면 포워드하거나 인클루드 하면 됩니다. 포워드로 위임하면 해당 서블릿으로 제어권이 넘어간 후 다시 돌아오지 않습니다, 인클루드로 위임을 하면 해당 서블릿으로 제어권을 넘긴 후 그 서블릿이 작업을 끝내면 다시 제어권이 넘어옵니다.

rd.include(request, response);

ServletRequest(HttpServletRequest)를 통한 데이터 전달

MemberListServletMemberList.jsprequestresponse를 공유합니다. 바로 이 부분을 이용하여 데이터를 전달할 수 있습니다.

ServletRequest는 클라이언트의 요청을 다루는 기능 외에 어떤 값을 보관하는 보관소 기능도 있습니다. setAttribute()를 호출하여 값을 보관할 수 있고, getAttribute()를 호출하여 보관된 값을 꺼낼 수 있습니다. 아래는 회원 목록을 MemberList.jsp에 전달하고 있습니다.

request.setAttribute(“members”, members);

MemberListServlet request 객체는 MemberList.jsp와 공유하기 때문에, request에 값을 담아두면 MemberList.jsp에 꺼내 쓸 수 있습니다.

 

5.4.5 뷰 컴포넌트 만들기

WebContent 아래에 member 폴더를 만들고, MemberList.jsp를 생성하기

하나의 객체에게 많은 역할을 맡기기 보다는 그 역할을 쪼개어 여러 객체에게 위임하는 것이 객체지향 프로그래밍을 잘 짜는 방법입니다.

=> lib에 혹시 mysql-connect-java-5.1.34-bin.jar 있는지 확인

 

5.5 포워딩과 인클루딩

서블릿끼리 작업을 위임하는 방법에는 포워딩(Forwarding)과 인클루딩(Including) 이렇게 두가지 방법이 있습니다.

포워딩 방식은 작업을 한 번 위임하면 다시 이전 서블릿으로 제어권이 돌아오지 않습니다.

 

5.6 데이터 보관소

서블릿들이 서로 협력하여 작업을 수행할 때, 데이터를 공유하는 방법. 서블릿 기술은 데이터를 공유하기 위한 방안으로 네 가지 종류의 데이터 보관소를 제공합니다.

1)     ServletContext 보관소: 웹 애플리케이션이 시작될 때 생성되어 웹 애플리케이션이 종료될 때까지 유지됩니다. 이 보관소에 데이터를 보관하면 웹 애플리케이션이 실행되는 동안에는 모든 서블릿이 사용할 수 있습니다.

2)     HttpSession 보관소: 보통 로그인할 때 이 보관소 초기화하고, 로그아웃하면 이 보관소에 저장된 값들을 비웁니다.

3)     ServletRequest 보관소:  JSP에서는 request 변수를 통해 이 보관소를 참조할 수 있습니다.

4)     JspContext 보관소: JSP 페이지를 실행하는 동안만 유지됩니다. JSP에서는 PAGEcONTEXT 변수를 통해 이 보관소를 참조할 수 있습니다.

 

보관소에 값을 넣고 빼내는 방법은 모두 같습니다. 다음의 메서드를 호출하여 값을 저장하고 조회할 수 있습니다.

보관소 객체.setAttribute(, ); //값 저장

보관소 객체.getAttribute(); //값 조회

보관소 객체의 사용법이 Map 객체의 put()get() 메서드와 유사합니다

 

5.6.1 ServletContext 활용 – DB 커넥션

 

공유 자원을 준비하는 서블릿 작성

먼저 웹 애플리케이션이 시작될 때 데이터베이스 커넥션 객체를 준비하는 서블릿 작성

conn = (Connection) sc.getAttribute(“conn”);

지금까지 서블릿을 만들 때, service()를 직접 오버라이딩 하거나 또는 doGet(), doPost()를 오버라이딩 했습니다. 하지만 이번 서블릿은 클라이언트에서 호출할 서블릿이 아니므로 이런 메서드들을 오버라이딩 하지 않습니다.

 

그러나 AppInitServlet 처럼 다른 서블릿이 생성되기 전에 미리 준비 작업을 해야 하는 서블릿이 라면, 클라이언트 요청이 없더라도 생성되어야 합니다. <load-on-startup> 태그는 바로 그런 용도의 서블릿을 배치할 때 사용합니다.

 

URL 매핑이 없는 서블릿

Webl.xml 보면 AppInitServlet에 대해 <servlet-mapping> 태그가 없습니다. AppInitServlet에 대해 url을 지정하지 않았습니다. 이렇게 url 매핑 정보가 없는 서블릿은 클라이언트에서 실행을 요청할 수 없습니다. AppInitServlet 처럼 다른 서블릿을 위해 준비 작업을 수행하는 서블릿인 경우 url을 지정하지 않습니다.

 

5.6.2 HttpSession의 활용 로그인

HttpSession 객체는 클라이언트 당 한 개가 생성됩니다. 웹 브라우저로부터 요청이 들어오면, 그 웹 브라우저를 위한 HttpSession 객체가 있는지 검사하고, 없다면 새로 HttpSession 객체를 만듭니다. 이렇게 생성된 HttpSession 객체는 그 웹 브라우저로부터 일정 시간 동안 Timeout 요청이 없으면, 삭제됩니다. 따라서 로그인되어 있는 동안 지속적으로 사용할 데이터를 HttpSession 객체에 저장합니다.

 

1)     웹 브라우저에서 ‘/auth/login’ 서블릿을 요청합니다.

2)     LogInServletLoginForm.jsp로 화면 출력 작업을 위임합니다.

3)     LoginForm.jsp는 로그인 입력폼을 만들어 출력합니다.

4)     사용자가 입력한 정보를 가지고 다시 ‘/auth/login’ 서블릿을 요청합니다. 단 이번에는 POST 요청입니다.

5)     LoginServlet은 이메일과 암호가 일치하는 회원 정보를 DB에서 찾아서 값 객체’Member’에 담습니다. 또한 다른 서블릿들도 참조할 수 있도록 HttpSession 객체에 보관합니다. 만약 이메일과 암호가 일치하는 회원을 찾지 못한다면, LogInFail.jsp로 작업을 위임합니다.

6)     로그인 성공일 때, 회원 목록 페이지로 리다이렉트 합니다. 로그인 실패일 때, 로그인 실패 메시지를 출력한 후 다시 로그인 입력폼으로 리프래시 합니다.

 

로그인 컨트롤러 만들기

웹 브라우저로부터 GET 요청이 들어오면 doGet()이 호출되어 LogInForm.jsp로 포워딩 합니다.

rd.forward(request, response);

jsp에서 다시 서블릿으로 돌아올 필요가 없어서 인클루딩 대신 포워딩으로 처리하였습니다.

 

사용자가 이메일과 암호를 입력한 후 POST 요청을 하면 doPost()가 호출됩니다. doPost()에서는 데이터베이스로부터 회원 정보를 조회합니다. 만약 이메일과 암호가 일치하는 회원을 찾는다면 값 객체 Member에 회원 정보를 담습니다.(?????)

Member member = new Member()

.setEmail(rs.getString(“EMAIL”)).setName(rs.getString(“MNAME”));

그리고 Member 객체를 HttpSession에 보관합니다.

HttpSession session = request.getSession();

session.setAttribute(“member”,member);

 

로그인 성공이면, /member/list로 리다이렉트 합니다.

Rc.forward(reqest, response);

로그인에 실패한다면, /auth/LoginFail.jsp로 포웓이 합니다.

RequestDispatcher rd = request.getRequestDispatcher(“/auth/LogInFail.jsp”); rd.forward(Request, response);

 

로그인 입력폼 만들기

요청 URL은 입력폼 요청할 때의 URL과 같습니다. 이렇게 로그인 입력폼의 URL과 로그인 처리를 하는 URL이 같더라도, 서버에서는 GET 요청과 POST 요청을 구분하여 처리하기 때문에 상관없습니다.

“<form action=”login” method=”post”>

 

로그인 실패 시 출력작업을 수행할 jsp 만들기

<meta http-equiv="Refresh" content="1;url=login">

근데 loginFail까지는 뜨는데 다시 loginForm으로 돌아가지는 않는다. 왜그런지 모르겠음…?????

 

화면 상단에 로그인 한 회원의 이름을 출력하기

 

5.6.3 HttpSession의 활용 로그인 정보 사용

LogInServlet에서 HttpSession 보관서에 저장한 Member 객체를 Header.jsp에서 꺼내보기

 

페이지 헤더에 로그인 사용자 이름 출력

Jsp 내장 객체 session을 사용하여 “member”라는 키로 저장된 값을 꺼냅니다.

Member member = (Member) session.getAttribute("member");

HttpSession 보관소에서 꺼낸 Member 객체로부터 이름을 알아내어 사용자 로그인 정보를 출력합니다.

 

서블릿에 자동 로딩이 설정되어 잇다면 최대 5초 정도 기다리면 변경된 서블릿이 다시 로딩, 하지만 정확한 테스트를 위해 서블릿을 변경할 경우에는 톰캣 서버를 재시작하고 나서 테스트 jsp는 저장한 후 바로 테스트.

 

5.6.4 HttpSession의 활용 로그아웃

HttpSession 객체에 보관된 모든 값들을 없애고 싶다면, 세션을 무효화시키면 됩니다. 로그아웃 수행 시나리오는 다음과 같습니다.

 

로그아웃 서블릿 생성

HttpSession 객체를 무효화 하기 위해 invalidate()를 호출합니다. 세션 객체가 무효화 된다는 것은 HttpSession 객체가 제거 된다는 것을 의미합니다.

session.invalidate();

HttpSession 객체를 무효화시킨 후, 새로운 요청이 들어오면 HttpSession 객체가 새로 만들어집니다.

 

5.6.5 ServletRequest의 활용

LogInServletLogInForm.jsp 사이에서 ServletReuqet를 공유하는 것을 보여준다.

5.6.6 JspContext의 활용

JspContext 보관소는 jsp 페이지를 실행할 때 생성되고, 실행이 완료되면 이 객체는 제거됩니다. 따라서 JSP 페이지 내부에서만 사용될 데이터를 공유할 떄 사용합니다.

Jsp 페이지를 작성하다 보면 <jsp:include>와 같은 특별한 태그를 사용하게 됩니다. 이런 태그들은 jsp 엔진이 서블릿 클래스를 생성할 때 특정 자바 코드로 변환됩니다. 이때 이 태그의 값을 다루는 객체를 태그 핸들러라고 부릅니다. 바로 이 태그 핸들러에게 데이터를 전달하고자 할 때 JspContext 보관소를 사용하는 것입니다. Jsp 페이지에 선언된 로컬 변수는 태그 핸들러에서 접근할 수 없습니다. 따라서 태그 핸들러에게 전달할 데이터가 아니라면 JspContext에 값을 보관할 필요는 없습니다.

 

5.7 JSP 액션 태그의 사용

JSP 페이지를 작성할 때, 가능한 자바 코드의 삽입을 최소화하는 것이 유지 보수에 좋습니다. 이를 위해 JSP에서는 다양한 JSP 전용 태그를 제공하고 있습니다. JSP에서 기본으로 제공하는 태그들의 집합을 ‘JSP 액션(ACTION)’이라 합니다. JSP 액션을 사용하면 자바로 직접 코딩하는 것보다 빠르고 쉽게 원하는 기능을 작성할 수 있습니다.

 

5.7.1 JSP 액션 태그 - <jsp:useBean>

<jsp:useBean> 액션 테그는 application, session, request, page 보관소에 저장된 자바 객체를 꺼낼 수 있습니다. 만약 보관소에 저장된 객체가 없다면, 새로 생성하여 해당 보관소에 저장합니다.

Jsp:useBean 문법

<jsp:useBean id=”이름” scope=”page|request|session|aaplication” class=”클래스명” type=”타입명”/>

….

 

Id 속성

객체의 이름을 설정합니다. 이 이름을 사용하여 보관소로부터 값을 꺼낼 겁니다.

Scope 속성

기존의 객체를 조회하거나 새로 만든 객체를 저장할 보관소를 지정합니다. pageJspContext, request ServletRequest, sessionHttpSession applicationServletContext 보관소를 의미합니다.

Class 속성

클래스 이름은 반드시 패키지 이름을 포함(fully qualified name)해야 하고, 인터페이스 이름은 x

Type 속성

참조 변수를 선언할 떄 사용할 타입의 이름입니다.

 

5.7.2 <jsp:useBean>의 활용 (안됨)

 

5.7.3 JSP 액션 태그의 존재 의의

<jsp:userBea> 액션을 사용하면 자바 객체를 생성하거나 request 객체에서 값을 꺼내는 작업을 쉽게 처리할 수 있습니다. 이렇게 JSP 액션 태그를 사용하면 자바 언어를 모르는 웹 디자이너나 웹 퍼블리셔들도 손쉽게 웹 페이지를 만들 수 있습니다. 즉 비즈니스 로직을 처리하는 부분과 화면을 처리하는 부분을 나눠서 개발할 수 있습니다. 이럴 목적으로 만든 기술이 JSP 입니다. 하지만 가능한 서버 측 기술에 독립적인 HTML, CSS, JavaScript와 같은 표준 웹 기술을 배우는데 더 많은 노력을 기울어야 합니다.

 

실력 향상 과제

회원 목록을 출력하는 MemberListServlet처럼 회원 등록, 변경, 삭제 서블릿도 jsp를 도입하여 뷰 컴포넌트를 분리하세요.

1.     회원 등록 - MemeberAddServlet에서 입력화면을 생성하는 코드를 제거하고, 대신 MemberForm.jsp를 만들어 화면 출력을 위임하세요. 또한, MemberAddServlet에서 회원 정보를 등록하다가 오류가 발생했을 때 /Error.jsp로 위임하도록 코드를 변경하세요.

<MemberAddServlet>

l  틀린 것

 jsp에 위임해주는 아래 문장은 꼭 doGet에만 써야하는가? doPost에 작성했더니 error. … url이 적혀있어서 그런가?

RequestDispatcher rd = request.getRequestDispatcher("/member/MemberForm.jsp");

           rd.forward(request, response);

 

l  틀린 것

Error 부분은 아래와 같이 추가

catch (Exception e) {

                      RequestDispatcher rd = request.getRequestDispatcher("../error/Error.jsp");

                      rd.forward(request, response);

           }

 

<MemberForm.jsp> => 이거는 html이니까 딱히 신경쓸 것 없는 것 같구..

<%@page import="spms.vo.Member"%>

<%@page import="java.util.ArrayList"%>

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

pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta charset="utf-8" />

<title>회원등록</title>

 

</head>

<body>

<h1>회원등록</h1>

<form action="add" method="post">

           이메일:<input type ="text" name="email"><br>

           암호: <input type="text" name="password"><br>

           이름: <input type="text" name="name"><br>

           <input type="submit" value='추가'>

           <input type="reset" value='취소'>

</form>

</body>

</html>

 

 

<Error.jsp>

<%@ page language="java" contentType="text/html; charset=EUC-KR"

           pageEncoding="EUC-KR"%>

<%@ page trimDirectiveWhitespaces="true"%>

<!doctype html>

<html>

<head>

<meta charset="utf-8" />

<meta http-equiv="Refresh" content="1;url=list">

<title>error 페이지</title>

</head>

<body>

           <div class="container">

                     <h1>error 페이지</h1>

           </div>

</body>

</html>

 

2.     회원 삭제 - MemberDeleteServlet에서 삭제를 수행하다가 오류가 발생하면 /Error.jsp로 위임하도록 코드를 변경하세요.

 

3.     회원 상세 정보 조회 및 변경 - MemberUpdateServlet에서 상세 정보 출력을 MemberUpdateForm,jsp에게 포워딩합니다. 예외 처리는 /Error.jsp에게 위임하세요.

반응형

'JAVA > spring' 카테고리의 다른 글

MyBatis Setting  (0) 2020.06.16
Mybatis Log Setting  (0) 2020.06.16
Servlet JDBC  (1) 2020.01.20
Servlet Programming  (0) 2020.01.09
Web programming  (0) 2020.01.03

댓글