20
Design Pattern Apply For Servlet/JSP servlet으로 배우는 디자인 패턴 #1 builder Pattern

Servlet design pattern

Embed Size (px)

DESCRIPTION

builder pattern

Citation preview

Page 1: Servlet design pattern

Design Pattern Apply For Servlet/JSP servlet으로 배우는 디자인 패턴

#1 builder Pattern

Page 2: Servlet design pattern

Target Audience

디자인패턴 공부할 때는 콘솔에 HelloWorld만 찍어봤는데

웹은 어떻게 하나요??

세미나를 들어도 스터디를 해도 적용이 안되요.

저녁에는 디자인패턴 책보고 회사에선 c+v 하고 있어요.

Page 3: Servlet design pattern

Pre require expreience

experience with using on java based application

knowledge of web

Page 4: Servlet design pattern

Servlet의 기본 메소드들

Page 5: Servlet design pattern

doGet, doPost

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

System.out.println("doPost 메소드 호출");

response.setCharacterEncoding("UTF-8");

request.setCharacterEncoding("UTF-8");

PrintWriter writer = response.getWriter();

//contenTtype을 정의한다.

response.setContentType("text/html");

String name = request.getParameter("nameTxt");

String email = request.getParameter("emailTxt");

writer.println("<html>");

writer.println("<head><title>hello servlet3 </title> </head>");

writer.println("<body>");

writer.println( "전달받은 이름은 " + name + "이고" + "<br/>" + "email주소는" + email +"입니다." );

writer.println("</body>" );

writer.println( "<html>" );

}

xml을 달라고하면? excel을 달라고하면? 이게 라이브러리 문제인가? 왜 이 서블릿은 post요청이 왔을 때 늘 html로 보여줘야 하나? printWriter를 반복해서 양식(HTML)을 만들고 있다. 와이파이 되요? rest webservice 되요? 시대에..

Page 6: Servlet design pattern

Builder Pattern이란?

생성관점

앞서 보았던 html생성하던 코드는 내용(전달받은 내용:입니다.)

을 찍기에는 꽤나 복잡하다. 그리고 printWriter가 순차적으로

실행되어야 한다.

이렇게 객체 생성 시에 복잡하고 얽혀있는 관계들을 단순하게

분리해 낸 것을 builder pattern이라고 한다.

Page 7: Servlet design pattern

Builder Pattern Diagram

+BuildPart()

+GetProduct()

ConcreteBuilder

+BuildPart()

+GetProduct()

AbstractBuilder

+Build()

Director

Client

Product

Requests build

Uses

Creates

Uses

1

1

1

*

1

1

1

1

Page 8: Servlet design pattern

각 클래스의 역할

Builder는 실제로 문서의 요소들을 만드는 역할을 한다.

Director는 builder를 선택해서 최종적인 문서를 완성한다.

Page 9: Servlet design pattern

기존 코드 분석

html 생성

Header 생성

body 생성

body안에 내용삽입

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

System.out.println("doPost 메소드 호출");

response.setCharacterEncoding("UTF-8");

request.setCharacterEncoding("UTF-8");

PrintWriter writer = response.getWriter();

//contenTtype을 정의한다.

response.setContentType("text/html");

String name = request.getParameter("nameTxt");

String email = request.getParameter("emailTxt");

writer.println("<html>");

writer.println("<head><title>hello servlet3 </title> </head>");

writer.println("<body>");

writer.println( "전달받은 이름은 " + name + "이고" + "<br/>" + "email주소는" + email +"입니다." );

writer.println("</body>" );

writer.println( "<html>" );

}

Page 10: Servlet design pattern

Builder 클래스 작성

html 생성

Header 생성

body 생성

body안에 내용삽입

Page 11: Servlet design pattern

Html builder 클래스 작성

Page 12: Servlet design pattern

XmlBuilder 클래스 작성

Page 13: Servlet design pattern

Director 클래스 작성

Director 클래스는 builder 클래스에서

정의한 메소드들을 이용해서 실제 문서를 만드는 역할을 한다.

builder들은 공통된 메소드들을 가지고 있어서 실제로 builder가 어떤 타입의 문서를 만드는지는 director가 알 필요가 없다.

servlet에서 사용하기 때문에 여기서는 편의상 close메소드를 이용해서 문자열을 반환하기로 했다.

Page 14: Servlet design pattern

Director 클래스 리펙토링1

문서를 생성하는 construct안에 요소를 생성하는 메소드의 파라메터 하드코딩 제거

public String construct(String type, String header, String data){ builder = factory.createBuilder(type); builder.makeRoot( type ); builder.makeHeader( header ); builder.makeBody( data ); return builder.close(); } }

Page 15: Servlet design pattern

Director 클래스 리펙토링2

builder는 추상클래스라 직접적인 인스턴스 생성이 안됨

안되는데 왜 생성자에서 전달받고 있나. factory한테 넘기자

private Builder builder;

BuilderFactory factory;

public Director() {

factory = new BuilderFactory();

} 이제 director는 builder타입 인자 안 받고 그냥 딱 생성하는

걸로

Page 16: Servlet design pattern

factory클래스 추가

나의 type별 builder 생성을 서블릿에게 알리지 말라.

public Builder createBuilder(String type){

Builder builder = null;

if( type.equals("html") )

{

builder = new HTMLBuilder();

}

else if( type.equals("xml") )

{

builder = new XMLBuilder();

}

return builder;

}

Page 17: Servlet design pattern

기존 서블릿

파라메터에서 타입을 받아서 처리하자.

Page 18: Servlet design pattern

기존 서블릿 if문과의 이별

쫌 이제 우리 그만 좀 헤어지자.

PrintWriter out = resp.getWriter();

String type = req.getParameter("docType") == null ? "html" : req.getParameter("docType");

Director director = new Director();

out.println(director.construct(type, "builder pattern servlet", “content 1234"));

Page 19: Servlet design pattern

실행결과

html

xml

Page 20: Servlet design pattern

https://www.facebook.com/thecodinglive