SlideShare a Scribd company logo
1 of 25
Download to read offline
자바 웹 개발 시작하기
(3주차 : 스프링 웹 개발)
2011. 11. 11

DEVELOPMENT #2

이덕곤
§  모델 1 과 모델 2 방식의 차이점 이해
§  모델 2 기반의 웹 개발
§  스프링 웹 MVC전략 이해
§  핵심은 DispatcherServlet

§  ORM(Object-relational mapping)의 이해
§  하이버네이트(하나의 구현체) 사용

§  배포서술자의 이해 (web.xml)
§  못다한 이야기 계속하기(2주차 PT 활용)
§  스프링 웹 개발
§  RESTful (REpresentational State Transfer)
§  컨트롤러 (UrlRewrite)
§  뷰, 표현방법 : JSP, EL, JSTL
§  JSON : Gson
§  REST : 대규모 네트워크 시스템을 위한 웹 서비스 아키텍처
§  로이 필딩(Roy Fielding)의 2000년 박사학위 논문에서 소개
§  REpresentational State Transfer의 약자
§  월드 와이드 웹과 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어
아키텍처의 한 형식 (표준은 없음)
§  SOA(Service Oriented Architecture) 기반 웹 서비스 보다 간단
§  SOAP(전송프로토콜), WSDL(정의), UDDI(등록) 등의 복잡성, XML의존성 에서 해방

§  ROA(Resource Oriented Architecture) 따르는 웹 서비스 디자인
§  Naver, 구글등의 Open API가 REST 방식으로 구현되어 공개

§  최근 추가된 뜻
§  XML과 HTTP를 사용하는 단순한 웹 기반 인터페이스를 지칭
(즉, REST의 원칙을 따르는 Web Services)
§  구글이 오랫동안 제공해온 SOAP 검색 API 서비스가 2006년 12월 중단
§  대신 구글은 REST 기반의 Ajax Search API를 대안으로 제시

§  2003년도 아마존이 제공한 두 가지 인터페이스의 점유율 (표준이지만..)
REST (XML over HTTP) 85%

SOAP 15%

§  REST방식의 호출 : "서버 주소 + 서비스 이름 + 자원“

O
X

http://millky.com/user/byuri (GET 방식으로 호출)
http://millky.com/user/getUser?id=byuri

§  URL을 통해 필요한 자원을 계속해서 추적하여 얻어(HTTP GET) 가거나
삽입(HTTP PUT), 삭제(HTTP DELETE)할 수 있게 분류 설계한다.
§  결코 한번에 모든 정보를 제공해서는 안 된다.
§ 

http://bol.com/employee 전체 직원 명단을 얻어 온다.

§ 

http://bol.com/employee/603045 특정 직원의 자세한 정보를 얻어 온다.(HTTP GET)

§ 

http://bol.com/employee/603045 특정 직원의 해당 정보를 갱신 한다.(HTTP PUT)
§  http://www.restlet.org/
§  자바를 위한 경량화 REST framework
§  서블릿의 프로그래밍 모델을 기반 오픈소스 프로젝트
§  JSR 311 Java API for RESTful Web Services (이하 JSR 311)

§  http://jersey.java.net/
§  Jersey(저지)는 JAX-RS 자바 API(JSR-311)의 오픈 소스 구현체
§  JAX-RS는 자바 어노테이션 API
§  REST 아키텍처 스타일을 따르는 자바 기반 RESTful 웹 서비스용

§  http://restfulie.caelum.com.br/
§  등등 많은 구현체가 있음
§  RESTful : (표현으로 상태를 전송)~스럽게
§  웹상의 모든 것들은 URL로 표현 (Representation)
§  많은 웹2.0 회사들이 Open API의 구현 방법으로 많이 사용

§  RESTful(스타일) 웹 서비스 특징
§  작고 어디에서나 적용되는 인터페이스를 가진다
§  기본적으로 상태를 저장하지 않는다 (하지만 필요할 수도 있음)
§  GET, POST, PUT, DELETE 사용
§  하지만 실상 PUT과 Delete 메소드는 HTTP스팩에는 존재하지만
지원하는 브라우저는 많지 않다. (이름으로 해결)
§  모든 자원은 URL를 이용하여 유일하게 지칭될 수 있다
§  자원들의 표현(Representation)들이 URL을 통해 서로 연결되어 있다
§  웹 서비스? -> 웹 XML 서비스
§  우리가 만드는 것이 웹 (XML) 서비스인가?
§  우리가 만드는 것은 웹

프로그램

§  단지 예쁜 주소를 표시하고 싶어서… 는 아님
§  사람들이 주소를 보고 정보를 쉽게 파악할 수 있다
§  자원은 같은 자리에 존재한다 (퍼머링크)
§  스프링 프레임워크 + 여러가지
§  프로젝트 디자인까지 알아보기 편하게 만들어 봅시다.
§  MVC 기반의 디자인
§  모델과 컨트롤러 뷰의 확실한 분리
§  환경 설정 파일
§  각종 XML, properties

§  RESOURCE
§  HTML, JS, CSS

§  다양한 컨트롤러
§  다양한 뷰의 지원
§  URL 다시쓰기
§  들어오는
요청들을
룰에 맞추어
돌려준다
§  http://tuckey.org
/urlrewrite/

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.2//EN"
"http://www.tuckey.org/res/dtds/urlrewrite3.2.dtd">
<urlrewrite decode-using="null">
<!-- 리소스를 짧은 주소로 축약합니다. -->
<rule enabled="true" match-type="wildcard">
<from>/res/**</from>
<to>/RESOURCE/$1</to>
</rule>
<!-- 파비콘을 짥은 주소로 축약합니다. -->
<rule enabled="true">
<from>/favicon.ico</from>
<to type="forward">/RESOURCE/image/faviconStar.ico</to>
</rule>
<!-- 루트로 들어오는 요청을 웹으로 전환합니다. -->
<rule enabled="true">
<from>^/([^.]*)$</from> <!-- 확장자가 없는 것 -->
<to type="forward">/_WEB/$1</to>
</rule>
</urlrewrite>
<!-- 1. request 입력을 UTF-8 방식으로 encoding 합니다. -->
<filter>
<filter-name>Character Encoding Filter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Character Encoding Filter</filter-name>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 2. RESTFul을 위한 URL처리기 입니다. -->
<filter>
<filter-name>URL Rewrite Filter</filter-name>
<filter-class>
org.tuckey.web.filters.urlrewrite.UrlRewriteFilter
</filter-class>
<init-param>
<param-name>confPath</param-name>
<param-value>/WEB-INF/config/base/urlrewrite.xml
</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>URL Rewrite Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- 3. 리퀘스트 요청을 처립합니다. -->
<servlet>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/config/spring/example-servlet.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<url-pattern>/_WEB/*</url-pattern>
</servlet-mapping>
<!-- 4. 환경설정파일을 로드합니다.. -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/spring/*Context.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/web/" />
<property name="suffix" value=".jsp" />
</bean>
InternalResource ViewResolver

JSP

Velocity ViewResolver

Velocity

FreeMarker ViewResolver

Freemarker

ResourceBundleViewResolver

ResourceBundle

Model

JSTLView

HTML 문서

ExcelView

Excel 문서

PDFView

PDF 문서

CSVView

CSV 문서

Model
package com.starpl.study.controller.web;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.starpl.study.model.dao.TestDao;
import com.starpl.study.model.dao.entity.Test;
@Controller
@RequestMapping(value = { "/test" })
public class TestController
{
@Autowired
private TestDao testDao;
final String redirectBase = "redirect:/test";
@RequestMapping(value = { "", "/" })
public String root(HttpServletRequest request, Model model)
{
return this.redirectBase + "/list";
}

@RequestMapping(value = { "/write" }, method = RequestMethod.GET)
public String showWriteForm(Model model)
{
return "/write";
}
@RequestMapping(value = { "/write" }, method = RequestMethod.POST)
public String writePost(HttpServletRequest request, Model model)
{
Test test = new Test();
test.setSubject(request.getParameter("subject"));
testDao.insertTest(test);
return this.redirectBase + "/list";
}
@RequestMapping(value={ "/update/{idx}" }, method=RequestMethod.GET)
public String showUpdateForm(HttpServletRequest request, Model model,
@PathVariable int idx)
{
model.addAttribute("idx", idx);
return "/update";
}

@RequestMapping(value={ "/update/{idx}" },method=RequestMethod.POST)
public String updatePost(HttpServletRequest request, Model model,Test test,
@PathVariable int idx)
{
test.setIdx(idx);
@RequestMapping(value = { "/list" }, method = RequestMethod.GET)
testDao.updateTest(test);
public String showList(Model model)
{
return this.redirectBase + "/list";
List<Test> testList = testDao.getTestList();
}
model.addAttribute("testList", testList);
return "/list";
}
}
list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>글목록</title></head>
<body><div>
update.jsp
<a href="/test/write">write</a> <br>
<%@ page language="java" contentType="text/html; charset=UTF-8"
<c:forEach var="item" items="${testList}">
pageEncoding="UTF-8"%>
${item.idx} ${item.subject}
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
<fmt:formatDate value="${item.regDate}“
"http://www.w3.org/TR/html4/loose.dtd">
pattern="yyyy.MM.dd (E) HH:mm" />
<html>
<a href="/test/update/${item.idx}">수정</a>
<head>
<a href="/test/delete/${item.idx}">삭제</a>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<br></c:forEach>
<title>수정</title>
</div></body></html>
</head>
<body>
<form action="/test/update/${idx}" method="post">
write.jsp
<!-<%@ page language="java"
<input type="hidden" name="idx" value="${idx}">
contentType="text/html; charset=UTF-8"
-->
pageEncoding="UTF-8"%>
<input type="text" name="subject">
<!DOCTYPE html PUBLIC
<input type="submit">
"-//W3C//DTD HTML 4.01 Transitional//EN"
</form></body></html>
"http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<meta http-equiv="Content-Type“ content="text/html; charset=UTF-8">
<title>글 작성</title>
</head><body>
<form action="/test/write" method="post">
<input type="text" name="subject"> <input type="submit">
</form></body></html>
§  EL(Expression Language)
§  jsp에서 사용된 자바코드 중에서 수식판단과 출력을 위한 것.

§  JSTL(Java Standard Tag Library)
§  JCP(Java Commutity Process) 에서 정한 표준 태그 라이브러리로 인터
페이스는 sun에서 정의하고, 구현은 Apache 에서 구현하고, 제공한다
라이브러리
코어
XML
국제화
데이터베이스
함수

하위기능
변수지원
흐름제어
URL처리
XML코어
흐름제어
XML변환
지역
메시지형식
숫자,날짜 형식
SQL
콜렉션 처리
String 처리

접두어

관련Url

c

http://java.sun.com/jsp/jstl/core

x

http://java.sun.com/jsp/jstl/xml

fmt

http://java.sun.com/jsp/jstl/fmt

Sql

http://java.sun.com/jsp/jstl/sql

fn

http://java.sun.com/jsp/jstl/functions
기능 분류

태그

변수 지원

set - JSP에서 사용될 변수를 설정한다.
remove - 설정한 변수를 제거 한다.

흐름 제어

if - 조건에 따라 내부 코드를 수행한다.
choose - 다중 조건을 처리할 때 사용한다.
forEach - 컬렉션이나 Map의 각 항목을 처리할 때 사용한다.
forTokens - 구분자로 분리된 각각의 토큰을 처리할 때 사용된다.

URL 처리

import - URL을 사용하여 다른 자원의 결과를 삽입한다.
redirect - 지정한 경로로 리다이렉트한다.(방향을 돌리다.)
url - URL을 재작성한다.

기타 태그

catch - 예외 처리에 사용된다.
out - JspWriter에 내용을 알맞게 처리한 후 출력한다.
§ 

length(ob) : obj가 List와 같은 Collection인 경우 저장된 항목의 개수를 리턴하고, obj가 문자열일 경우
문자열의 길이를 리턴한다.

§ 

toUpperCase(str) : str을 대문자로 변환한다.

§ 

toLowerCase(str) : str을 소문자료 변환한다.

§ 

substring(str,idx1,idx2) : str.substring(dix1, idx2)의 결과를 리턴한다. idx2가 -1일 경우 str.substring(idx1)과
동일하다.

§ 

substringAfter(str1,str2) : str1에서 str1에 포함되어 있는 str2 이후의 문자열을 구한다.

§ 

substringBefore(str1,str2) : str1에서 str1에 포함되어 있는 str2 이전의 문자열을 구한다.

§ 

trim(str) : str 좌우의 공백문자를 제거한다.

§ 

replace(str,src,dest) : str에 있는 src를 dest로 변환한다.

§ 

indexOf(str1, str2) : str1에서 str2가 위치한 인덱스를 구한다.

§ 

startsWith(str1, str2) : str1이 str2로 시작할 경우 true를, 그렇지 않을 경우 false를 리턴한다.

§ 

endsWith(str1, str2) : str1이 str2로 끝나는 경우 true를, 그렇지 않을 경우 flase를 리턴한다.

§ 

contains(str1, str2) : str1이 str2를 포함하고 있을 경우 true를 리턴한다.

§ 

containsIgnoreCase(str1, str2) : 대소문자 구분 없이 str1이 str2를 포함하고 있을 경우 true를 리턴한다.

§ 

split(str1,str2) : str2로 명시한 글자를 기준으로 str1을 분리해서 배열로 리턴한다.

§ 

join(array, str2) : array에 저장된 문자열을 합친다. 이때 각문자열 사이에는 str2이 뭍는다.

§ 

escapeXml(str) : XML의 객체 참조에 해당하는 특수 문자를 처리한다. 예를 들어, '&'는 '&amp;'로 변환한다.
§  http://code.google.com/p/google-gson/
간단한 예시

CLASS

Serialization
BagOfPrimitives obj = new BagOfPrimitives();
Gson gson = new Gson();
String json = gson.toJson(obj);
==> json is {"value1":1,"value2":"abc"}

class BagOfPrimitives {
private int value1 = 1;
private String value2 = "abc";
private transient int value3 = 3;
BagOfPrimitives() {
// no-args constructor
}
}

Deserialization
BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);
==> obj2 is just like obj
§ 

@Since(1.0) -> new GsonBuilder().setVersion(1.0).create() : 버전관리

§ 

@Expose -> new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create() : 노출관리

§ 

@SerializedName("custom_naming") private final String someField; : 필드명을 바꿔준다

§ 

new GsonBuilder().serializeNulls().create(); -> {"s":null,"i":5} : 널은 널이라 표시
§  JSON 뷰

<bean class=
"org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
import java.util.List;
<bean class=
import org.springframework.beans.factory.annotation.Autowired;
"org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
<list>
<value>text/plain;charset=UTF-8</value>
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
</list>
</property>
</bean>
import com.google.gson.GsonBuilder;
import com.starpl.study.model.dao.TestDao;
</list>
</property>
import com.starpl.study.model.dao.entity.Test;
</bean>
@Controller
@RequestMapping(value = { "/api" })
public class TestApiController
{
@Autowired
private TestDao testDao;
package com.starpl.study.controller.api;

@ResponseBody
@RequestMapping(value = { "/list" }, method = RequestMethod.GET)
public String showList()
{
List<Test> testList = testDao.getTestList();
return new GsonBuilder().setPrettyPrinting().setDateFormat("yyyy-MM-dd HH:mm:ss").create().toJson(testList);
}
}
§  결론 : RESTful 웹 서비스를 만들 수 있다
§  RESTful을 이해했다
§  뷰의 종류인 JSP, JSTL, EL등을 이해 했다
§  요즘 대중적인 API 뷰 JSON(GSON)을 이해 했다
§  스프링과 여러가지 추가적인 라이브러리가 필요
§  웹 서비스를 보기 편하게 디자인 할 수 있다
§  과제 : 웹 서비스 디자인에 대한 생각을 정리
§  MVC 심층학습
§  모델
§  데이터
§  POJO (Plain Old Java Object)
§  과제 : MVC 모델에 대한 추가 학습
§  http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm
§  http://blog.openmaru.com/97
§  http://www.ibm.com/developerworks/kr/library/tutorial/x-restatompp/i
ndex.html
§  http://www.ibm.com/developerworks/kr/wa-apachewink1/index.html
§  http://www.mimul.com/pebble/default/2010/05/01/1272710220000.ht
ml
§  http://www.iamcorean.net/22
§  http://sunnysideupegg.tistory.com/entry/REST-Representational-Stat
e-Transfer
§  http://www.ibm.com/developerworks/kr/library/j-jstl0211.html
§  http://www.ibm.com/developerworks/kr/library/j-jstl0318/
§  http://bunnyon.blog.me/150081013290
§  http://onceavocisunl.files.wordpress.com/2007/12/jstl_ebook.pdf
§  http://blog.naver.com/choiye84/130090207606
§  http://code.google.com/p/google-gson/
§  http://sites.google.com/site/gson/gson-user-guide
§  http://blog.springsource.com/2010/01/25/ajax-simplifications-in-sprin
g-3-0/
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)

More Related Content

What's hot

overview of spring4
overview of spring4overview of spring4
overview of spring4Arawn Park
 
자바 웹 개발 시작하기 (8주차 : 명세서, 단위테스트, 통합)
자바 웹 개발 시작하기 (8주차 : 명세서, 단위테스트, 통합)자바 웹 개발 시작하기 (8주차 : 명세서, 단위테스트, 통합)
자바 웹 개발 시작하기 (8주차 : 명세서, 단위테스트, 통합)DK Lee
 
Spring-Boot (springcamp2014)
Spring-Boot (springcamp2014)Spring-Boot (springcamp2014)
Spring-Boot (springcamp2014)sung yong jung
 
spring.io를 통해 배우는 spring 개발사례
spring.io를 통해 배우는 spring 개발사례spring.io를 통해 배우는 spring 개발사례
spring.io를 통해 배우는 spring 개발사례Daehwan Lee
 
Resource Handling in Spring MVC
Resource Handling in Spring MVCResource Handling in Spring MVC
Resource Handling in Spring MVCArawn Park
 
자바 웹 개발 시작하기 : 계획
자바 웹 개발 시작하기 : 계획자바 웹 개발 시작하기 : 계획
자바 웹 개발 시작하기 : 계획DK Lee
 
자바 웹 개발 시작하기 (10주차 : ㅌㅗㅇ ㅎㅏ ㄹㅏ)

자바 웹 개발 시작하기 (10주차 : ㅌㅗㅇ ㅎㅏ ㄹㅏ)
자바 웹 개발 시작하기 (10주차 : ㅌㅗㅇ ㅎㅏ ㄹㅏ)

자바 웹 개발 시작하기 (10주차 : ㅌㅗㅇ ㅎㅏ ㄹㅏ)
DK Lee
 
진짜기초 Node.js
진짜기초 Node.js진짜기초 Node.js
진짜기초 Node.jsWoo Jin Kim
 
SpringMVC 전체 흐름 알아보기
SpringMVC 전체 흐름 알아보기SpringMVC 전체 흐름 알아보기
SpringMVC 전체 흐름 알아보기Myung Woon Oh
 
Spring mvc
Spring mvcSpring mvc
Spring mvcksain
 
Spring boot-summary(part2-part3)
Spring boot-summary(part2-part3)Spring boot-summary(part2-part3)
Spring boot-summary(part2-part3)Jaesup Kwak
 
실전! 스프링과 함께하는 환경변수 관리 변천사 발표자료
실전! 스프링과 함께하는 환경변수 관리 변천사 발표자료실전! 스프링과 함께하는 환경변수 관리 변천사 발표자료
실전! 스프링과 함께하는 환경변수 관리 변천사 발표자료수홍 이
 
Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Choonghyun Yang
 
Facebook은 React를 왜 만들었을까?
Facebook은 React를 왜 만들었을까? Facebook은 React를 왜 만들었을까?
Facebook은 React를 왜 만들었을까? Kim Hunmin
 
Spring MVC
Spring MVCSpring MVC
Spring MVCymtech
 
세미나 Spring mybatis
세미나 Spring mybatis세미나 Spring mybatis
세미나 Spring mybatisSomang Jeong
 
XECon2015 :: [2-2] 박상현 - React로 개발하는 SPA 실무 이야기
XECon2015 :: [2-2] 박상현 - React로 개발하는 SPA 실무 이야기XECon2015 :: [2-2] 박상현 - React로 개발하는 SPA 실무 이야기
XECon2015 :: [2-2] 박상현 - React로 개발하는 SPA 실무 이야기XpressEngine
 
Meteor 0.3.6 Preview
Meteor 0.3.6 PreviewMeteor 0.3.6 Preview
Meteor 0.3.6 PreviewJuntai Park
 
04.[참고]개발환경 실습교재
04.[참고]개발환경 실습교재04.[참고]개발환경 실습교재
04.[참고]개발환경 실습교재Hankyo
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs기동 이
 

What's hot (20)

overview of spring4
overview of spring4overview of spring4
overview of spring4
 
자바 웹 개발 시작하기 (8주차 : 명세서, 단위테스트, 통합)
자바 웹 개발 시작하기 (8주차 : 명세서, 단위테스트, 통합)자바 웹 개발 시작하기 (8주차 : 명세서, 단위테스트, 통합)
자바 웹 개발 시작하기 (8주차 : 명세서, 단위테스트, 통합)
 
Spring-Boot (springcamp2014)
Spring-Boot (springcamp2014)Spring-Boot (springcamp2014)
Spring-Boot (springcamp2014)
 
spring.io를 통해 배우는 spring 개발사례
spring.io를 통해 배우는 spring 개발사례spring.io를 통해 배우는 spring 개발사례
spring.io를 통해 배우는 spring 개발사례
 
Resource Handling in Spring MVC
Resource Handling in Spring MVCResource Handling in Spring MVC
Resource Handling in Spring MVC
 
자바 웹 개발 시작하기 : 계획
자바 웹 개발 시작하기 : 계획자바 웹 개발 시작하기 : 계획
자바 웹 개발 시작하기 : 계획
 
자바 웹 개발 시작하기 (10주차 : ㅌㅗㅇ ㅎㅏ ㄹㅏ)

자바 웹 개발 시작하기 (10주차 : ㅌㅗㅇ ㅎㅏ ㄹㅏ)
자바 웹 개발 시작하기 (10주차 : ㅌㅗㅇ ㅎㅏ ㄹㅏ)

자바 웹 개발 시작하기 (10주차 : ㅌㅗㅇ ㅎㅏ ㄹㅏ)

 
진짜기초 Node.js
진짜기초 Node.js진짜기초 Node.js
진짜기초 Node.js
 
SpringMVC 전체 흐름 알아보기
SpringMVC 전체 흐름 알아보기SpringMVC 전체 흐름 알아보기
SpringMVC 전체 흐름 알아보기
 
Spring mvc
Spring mvcSpring mvc
Spring mvc
 
Spring boot-summary(part2-part3)
Spring boot-summary(part2-part3)Spring boot-summary(part2-part3)
Spring boot-summary(part2-part3)
 
실전! 스프링과 함께하는 환경변수 관리 변천사 발표자료
실전! 스프링과 함께하는 환경변수 관리 변천사 발표자료실전! 스프링과 함께하는 환경변수 관리 변천사 발표자료
실전! 스프링과 함께하는 환경변수 관리 변천사 발표자료
 
Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)
 
Facebook은 React를 왜 만들었을까?
Facebook은 React를 왜 만들었을까? Facebook은 React를 왜 만들었을까?
Facebook은 React를 왜 만들었을까?
 
Spring MVC
Spring MVCSpring MVC
Spring MVC
 
세미나 Spring mybatis
세미나 Spring mybatis세미나 Spring mybatis
세미나 Spring mybatis
 
XECon2015 :: [2-2] 박상현 - React로 개발하는 SPA 실무 이야기
XECon2015 :: [2-2] 박상현 - React로 개발하는 SPA 실무 이야기XECon2015 :: [2-2] 박상현 - React로 개발하는 SPA 실무 이야기
XECon2015 :: [2-2] 박상현 - React로 개발하는 SPA 실무 이야기
 
Meteor 0.3.6 Preview
Meteor 0.3.6 PreviewMeteor 0.3.6 Preview
Meteor 0.3.6 Preview
 
04.[참고]개발환경 실습교재
04.[참고]개발환경 실습교재04.[참고]개발환경 실습교재
04.[참고]개발환경 실습교재
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs
 

Similar to 자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)

vine webdev
vine webdevvine webdev
vine webdevdcfc1997
 
#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Restful web service
Restful web serviceRestful web service
Restful web servicesunguen lee
 
REST Ovewview
REST OvewviewREST Ovewview
REST OvewviewTerry Cho
 
Ksug 세미나 (윤성준) (20121208)
Ksug 세미나 (윤성준) (20121208)Ksug 세미나 (윤성준) (20121208)
Ksug 세미나 (윤성준) (20121208)Sungjoon Yoon
 
Network path reference
Network path referenceNetwork path reference
Network path referenceSol Kim
 
대용량 분산 아키텍쳐 설계 #5. rest
대용량 분산 아키텍쳐 설계 #5. rest대용량 분산 아키텍쳐 설계 #5. rest
대용량 분산 아키텍쳐 설계 #5. restTerry Cho
 
REST with Spring
REST with SpringREST with Spring
REST with Spring강우 김
 
REST API 설계
REST API 설계REST API 설계
REST API 설계Terry Cho
 
Jstl_GETCHA_HANJUNG
Jstl_GETCHA_HANJUNGJstl_GETCHA_HANJUNG
Jstl_GETCHA_HANJUNGJung Han
 
vert.x 를 활용한 분산서버 개발하기
vert.x 를 활용한 분산서버 개발하기vert.x 를 활용한 분산서버 개발하기
vert.x 를 활용한 분산서버 개발하기John Kim
 
200.마이크로서비스에 적합한 오픈소스 WAS는 무엇?
200.마이크로서비스에 적합한 오픈소스 WAS는 무엇?200.마이크로서비스에 적합한 오픈소스 WAS는 무엇?
200.마이크로서비스에 적합한 오픈소스 WAS는 무엇?Opennaru, inc.
 
RESTful API 설계
RESTful API 설계RESTful API 설계
RESTful API 설계Jinho Yoo
 
Front-end Development Process - 어디까지 개선할 수 있나
Front-end Development Process - 어디까지 개선할 수 있나Front-end Development Process - 어디까지 개선할 수 있나
Front-end Development Process - 어디까지 개선할 수 있나JeongHun Byeon
 

Similar to 자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발) (20)

4-3. jquery
4-3. jquery4-3. jquery
4-3. jquery
 
vine webdev
vine webdevvine webdev
vine webdev
 
#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
 
Restful web service
Restful web serviceRestful web service
Restful web service
 
REST Ovewview
REST OvewviewREST Ovewview
REST Ovewview
 
Ksug 세미나 (윤성준) (20121208)
Ksug 세미나 (윤성준) (20121208)Ksug 세미나 (윤성준) (20121208)
Ksug 세미나 (윤성준) (20121208)
 
Html5 performance
Html5 performanceHtml5 performance
Html5 performance
 
Network path reference
Network path referenceNetwork path reference
Network path reference
 
대용량 분산 아키텍쳐 설계 #5. rest
대용량 분산 아키텍쳐 설계 #5. rest대용량 분산 아키텍쳐 설계 #5. rest
대용량 분산 아키텍쳐 설계 #5. rest
 
REST with Spring
REST with SpringREST with Spring
REST with Spring
 
Servlet3
Servlet3Servlet3
Servlet3
 
REST API 설계
REST API 설계REST API 설계
REST API 설계
 
Jstl_GETCHA_HANJUNG
Jstl_GETCHA_HANJUNGJstl_GETCHA_HANJUNG
Jstl_GETCHA_HANJUNG
 
Srping data rest
Srping data restSrping data rest
Srping data rest
 
vert.x 를 활용한 분산서버 개발하기
vert.x 를 활용한 분산서버 개발하기vert.x 를 활용한 분산서버 개발하기
vert.x 를 활용한 분산서버 개발하기
 
웹표준 교육
웹표준 교육웹표준 교육
웹표준 교육
 
200.마이크로서비스에 적합한 오픈소스 WAS는 무엇?
200.마이크로서비스에 적합한 오픈소스 WAS는 무엇?200.마이크로서비스에 적합한 오픈소스 WAS는 무엇?
200.마이크로서비스에 적합한 오픈소스 WAS는 무엇?
 
ch04
ch04ch04
ch04
 
RESTful API 설계
RESTful API 설계RESTful API 설계
RESTful API 설계
 
Front-end Development Process - 어디까지 개선할 수 있나
Front-end Development Process - 어디까지 개선할 수 있나Front-end Development Process - 어디까지 개선할 수 있나
Front-end Development Process - 어디까지 개선할 수 있나
 

자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)

  • 1. 자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발) 2011. 11. 11 DEVELOPMENT #2 이덕곤
  • 2. §  모델 1 과 모델 2 방식의 차이점 이해 §  모델 2 기반의 웹 개발 §  스프링 웹 MVC전략 이해 §  핵심은 DispatcherServlet §  ORM(Object-relational mapping)의 이해 §  하이버네이트(하나의 구현체) 사용 §  배포서술자의 이해 (web.xml)
  • 3. §  못다한 이야기 계속하기(2주차 PT 활용) §  스프링 웹 개발 §  RESTful (REpresentational State Transfer) §  컨트롤러 (UrlRewrite) §  뷰, 표현방법 : JSP, EL, JSTL §  JSON : Gson
  • 4. §  REST : 대규모 네트워크 시스템을 위한 웹 서비스 아키텍처 §  로이 필딩(Roy Fielding)의 2000년 박사학위 논문에서 소개 §  REpresentational State Transfer의 약자 §  월드 와이드 웹과 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍처의 한 형식 (표준은 없음) §  SOA(Service Oriented Architecture) 기반 웹 서비스 보다 간단 §  SOAP(전송프로토콜), WSDL(정의), UDDI(등록) 등의 복잡성, XML의존성 에서 해방 §  ROA(Resource Oriented Architecture) 따르는 웹 서비스 디자인 §  Naver, 구글등의 Open API가 REST 방식으로 구현되어 공개 §  최근 추가된 뜻 §  XML과 HTTP를 사용하는 단순한 웹 기반 인터페이스를 지칭 (즉, REST의 원칙을 따르는 Web Services)
  • 5.
  • 6. §  구글이 오랫동안 제공해온 SOAP 검색 API 서비스가 2006년 12월 중단 §  대신 구글은 REST 기반의 Ajax Search API를 대안으로 제시 §  2003년도 아마존이 제공한 두 가지 인터페이스의 점유율 (표준이지만..) REST (XML over HTTP) 85% SOAP 15% §  REST방식의 호출 : "서버 주소 + 서비스 이름 + 자원“ O X http://millky.com/user/byuri (GET 방식으로 호출) http://millky.com/user/getUser?id=byuri §  URL을 통해 필요한 자원을 계속해서 추적하여 얻어(HTTP GET) 가거나 삽입(HTTP PUT), 삭제(HTTP DELETE)할 수 있게 분류 설계한다. §  결코 한번에 모든 정보를 제공해서는 안 된다. §  http://bol.com/employee 전체 직원 명단을 얻어 온다. §  http://bol.com/employee/603045 특정 직원의 자세한 정보를 얻어 온다.(HTTP GET) §  http://bol.com/employee/603045 특정 직원의 해당 정보를 갱신 한다.(HTTP PUT)
  • 7. §  http://www.restlet.org/ §  자바를 위한 경량화 REST framework §  서블릿의 프로그래밍 모델을 기반 오픈소스 프로젝트 §  JSR 311 Java API for RESTful Web Services (이하 JSR 311) §  http://jersey.java.net/ §  Jersey(저지)는 JAX-RS 자바 API(JSR-311)의 오픈 소스 구현체 §  JAX-RS는 자바 어노테이션 API §  REST 아키텍처 스타일을 따르는 자바 기반 RESTful 웹 서비스용 §  http://restfulie.caelum.com.br/ §  등등 많은 구현체가 있음
  • 8. §  RESTful : (표현으로 상태를 전송)~스럽게 §  웹상의 모든 것들은 URL로 표현 (Representation) §  많은 웹2.0 회사들이 Open API의 구현 방법으로 많이 사용 §  RESTful(스타일) 웹 서비스 특징 §  작고 어디에서나 적용되는 인터페이스를 가진다 §  기본적으로 상태를 저장하지 않는다 (하지만 필요할 수도 있음) §  GET, POST, PUT, DELETE 사용 §  하지만 실상 PUT과 Delete 메소드는 HTTP스팩에는 존재하지만 지원하는 브라우저는 많지 않다. (이름으로 해결) §  모든 자원은 URL를 이용하여 유일하게 지칭될 수 있다 §  자원들의 표현(Representation)들이 URL을 통해 서로 연결되어 있다
  • 9. §  웹 서비스? -> 웹 XML 서비스 §  우리가 만드는 것이 웹 (XML) 서비스인가? §  우리가 만드는 것은 웹 프로그램 §  단지 예쁜 주소를 표시하고 싶어서… 는 아님 §  사람들이 주소를 보고 정보를 쉽게 파악할 수 있다 §  자원은 같은 자리에 존재한다 (퍼머링크) §  스프링 프레임워크 + 여러가지 §  프로젝트 디자인까지 알아보기 편하게 만들어 봅시다.
  • 10. §  MVC 기반의 디자인 §  모델과 컨트롤러 뷰의 확실한 분리 §  환경 설정 파일 §  각종 XML, properties §  RESOURCE §  HTML, JS, CSS §  다양한 컨트롤러 §  다양한 뷰의 지원
  • 11. §  URL 다시쓰기 §  들어오는 요청들을 룰에 맞추어 돌려준다 §  http://tuckey.org /urlrewrite/ <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.2//EN" "http://www.tuckey.org/res/dtds/urlrewrite3.2.dtd"> <urlrewrite decode-using="null"> <!-- 리소스를 짧은 주소로 축약합니다. --> <rule enabled="true" match-type="wildcard"> <from>/res/**</from> <to>/RESOURCE/$1</to> </rule> <!-- 파비콘을 짥은 주소로 축약합니다. --> <rule enabled="true"> <from>/favicon.ico</from> <to type="forward">/RESOURCE/image/faviconStar.ico</to> </rule> <!-- 루트로 들어오는 요청을 웹으로 전환합니다. --> <rule enabled="true"> <from>^/([^.]*)$</from> <!-- 확장자가 없는 것 --> <to type="forward">/_WEB/$1</to> </rule> </urlrewrite>
  • 12. <!-- 1. request 입력을 UTF-8 방식으로 encoding 합니다. --> <filter> <filter-name>Character Encoding Filter</filter-name> <filter-class> org.springframework.web.filter.CharacterEncodingFilter </filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>Character Encoding Filter</filter-name> <servlet-name>Spring MVC Dispatcher Servlet</servlet-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 2. RESTFul을 위한 URL처리기 입니다. --> <filter> <filter-name>URL Rewrite Filter</filter-name> <filter-class> org.tuckey.web.filters.urlrewrite.UrlRewriteFilter </filter-class> <init-param> <param-name>confPath</param-name> <param-value>/WEB-INF/config/base/urlrewrite.xml </param-value> </init-param> </filter> <filter-mapping> <filter-name>URL Rewrite Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 3. 리퀘스트 요청을 처립합니다. --> <servlet> <servlet-name>Spring MVC Dispatcher Servlet</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/config/spring/example-servlet.xml </param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Spring MVC Dispatcher Servlet</servlet-name> <url-pattern>/_WEB/*</url-pattern> </servlet-mapping> <!-- 4. 환경설정파일을 로드합니다.. --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/config/spring/*Context.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener>
  • 13. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/view/web/" /> <property name="suffix" value=".jsp" /> </bean> InternalResource ViewResolver JSP Velocity ViewResolver Velocity FreeMarker ViewResolver Freemarker ResourceBundleViewResolver ResourceBundle Model JSTLView HTML 문서 ExcelView Excel 문서 PDFView PDF 문서 CSVView CSV 문서 Model
  • 14. package com.starpl.study.controller.web; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import com.starpl.study.model.dao.TestDao; import com.starpl.study.model.dao.entity.Test; @Controller @RequestMapping(value = { "/test" }) public class TestController { @Autowired private TestDao testDao; final String redirectBase = "redirect:/test"; @RequestMapping(value = { "", "/" }) public String root(HttpServletRequest request, Model model) { return this.redirectBase + "/list"; } @RequestMapping(value = { "/write" }, method = RequestMethod.GET) public String showWriteForm(Model model) { return "/write"; } @RequestMapping(value = { "/write" }, method = RequestMethod.POST) public String writePost(HttpServletRequest request, Model model) { Test test = new Test(); test.setSubject(request.getParameter("subject")); testDao.insertTest(test); return this.redirectBase + "/list"; } @RequestMapping(value={ "/update/{idx}" }, method=RequestMethod.GET) public String showUpdateForm(HttpServletRequest request, Model model, @PathVariable int idx) { model.addAttribute("idx", idx); return "/update"; } @RequestMapping(value={ "/update/{idx}" },method=RequestMethod.POST) public String updatePost(HttpServletRequest request, Model model,Test test, @PathVariable int idx) { test.setIdx(idx); @RequestMapping(value = { "/list" }, method = RequestMethod.GET) testDao.updateTest(test); public String showList(Model model) { return this.redirectBase + "/list"; List<Test> testList = testDao.getTestList(); } model.addAttribute("testList", testList); return "/list"; } }
  • 15. list.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>글목록</title></head> <body><div> update.jsp <a href="/test/write">write</a> <br> <%@ page language="java" contentType="text/html; charset=UTF-8" <c:forEach var="item" items="${testList}"> pageEncoding="UTF-8"%> ${item.idx} ${item.subject} <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" <fmt:formatDate value="${item.regDate}“ "http://www.w3.org/TR/html4/loose.dtd"> pattern="yyyy.MM.dd (E) HH:mm" /> <html> <a href="/test/update/${item.idx}">수정</a> <head> <a href="/test/delete/${item.idx}">삭제</a> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <br></c:forEach> <title>수정</title> </div></body></html> </head> <body> <form action="/test/update/${idx}" method="post"> write.jsp <!-<%@ page language="java" <input type="hidden" name="idx" value="${idx}"> contentType="text/html; charset=UTF-8" --> pageEncoding="UTF-8"%> <input type="text" name="subject"> <!DOCTYPE html PUBLIC <input type="submit"> "-//W3C//DTD HTML 4.01 Transitional//EN" </form></body></html> "http://www.w3.org/TR/html4/loose.dtd"> <html><head> <meta http-equiv="Content-Type“ content="text/html; charset=UTF-8"> <title>글 작성</title> </head><body> <form action="/test/write" method="post"> <input type="text" name="subject"> <input type="submit"> </form></body></html>
  • 16. §  EL(Expression Language) §  jsp에서 사용된 자바코드 중에서 수식판단과 출력을 위한 것. §  JSTL(Java Standard Tag Library) §  JCP(Java Commutity Process) 에서 정한 표준 태그 라이브러리로 인터 페이스는 sun에서 정의하고, 구현은 Apache 에서 구현하고, 제공한다 라이브러리 코어 XML 국제화 데이터베이스 함수 하위기능 변수지원 흐름제어 URL처리 XML코어 흐름제어 XML변환 지역 메시지형식 숫자,날짜 형식 SQL 콜렉션 처리 String 처리 접두어 관련Url c http://java.sun.com/jsp/jstl/core x http://java.sun.com/jsp/jstl/xml fmt http://java.sun.com/jsp/jstl/fmt Sql http://java.sun.com/jsp/jstl/sql fn http://java.sun.com/jsp/jstl/functions
  • 17. 기능 분류 태그 변수 지원 set - JSP에서 사용될 변수를 설정한다. remove - 설정한 변수를 제거 한다. 흐름 제어 if - 조건에 따라 내부 코드를 수행한다. choose - 다중 조건을 처리할 때 사용한다. forEach - 컬렉션이나 Map의 각 항목을 처리할 때 사용한다. forTokens - 구분자로 분리된 각각의 토큰을 처리할 때 사용된다. URL 처리 import - URL을 사용하여 다른 자원의 결과를 삽입한다. redirect - 지정한 경로로 리다이렉트한다.(방향을 돌리다.) url - URL을 재작성한다. 기타 태그 catch - 예외 처리에 사용된다. out - JspWriter에 내용을 알맞게 처리한 후 출력한다.
  • 18. §  length(ob) : obj가 List와 같은 Collection인 경우 저장된 항목의 개수를 리턴하고, obj가 문자열일 경우 문자열의 길이를 리턴한다. §  toUpperCase(str) : str을 대문자로 변환한다. §  toLowerCase(str) : str을 소문자료 변환한다. §  substring(str,idx1,idx2) : str.substring(dix1, idx2)의 결과를 리턴한다. idx2가 -1일 경우 str.substring(idx1)과 동일하다. §  substringAfter(str1,str2) : str1에서 str1에 포함되어 있는 str2 이후의 문자열을 구한다. §  substringBefore(str1,str2) : str1에서 str1에 포함되어 있는 str2 이전의 문자열을 구한다. §  trim(str) : str 좌우의 공백문자를 제거한다. §  replace(str,src,dest) : str에 있는 src를 dest로 변환한다. §  indexOf(str1, str2) : str1에서 str2가 위치한 인덱스를 구한다. §  startsWith(str1, str2) : str1이 str2로 시작할 경우 true를, 그렇지 않을 경우 false를 리턴한다. §  endsWith(str1, str2) : str1이 str2로 끝나는 경우 true를, 그렇지 않을 경우 flase를 리턴한다. §  contains(str1, str2) : str1이 str2를 포함하고 있을 경우 true를 리턴한다. §  containsIgnoreCase(str1, str2) : 대소문자 구분 없이 str1이 str2를 포함하고 있을 경우 true를 리턴한다. §  split(str1,str2) : str2로 명시한 글자를 기준으로 str1을 분리해서 배열로 리턴한다. §  join(array, str2) : array에 저장된 문자열을 합친다. 이때 각문자열 사이에는 str2이 뭍는다. §  escapeXml(str) : XML의 객체 참조에 해당하는 특수 문자를 처리한다. 예를 들어, '&'는 '&amp;'로 변환한다.
  • 19. §  http://code.google.com/p/google-gson/ 간단한 예시 CLASS Serialization BagOfPrimitives obj = new BagOfPrimitives(); Gson gson = new Gson(); String json = gson.toJson(obj); ==> json is {"value1":1,"value2":"abc"} class BagOfPrimitives { private int value1 = 1; private String value2 = "abc"; private transient int value3 = 3; BagOfPrimitives() { // no-args constructor } } Deserialization BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class); ==> obj2 is just like obj §  @Since(1.0) -> new GsonBuilder().setVersion(1.0).create() : 버전관리 §  @Expose -> new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create() : 노출관리 §  @SerializedName("custom_naming") private final String someField; : 필드명을 바꿔준다 §  new GsonBuilder().serializeNulls().create(); -> {"s":null,"i":5} : 널은 널이라 표시
  • 20. §  JSON 뷰 <bean class= "org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> import java.util.List; <bean class= import org.springframework.beans.factory.annotation.Autowired; "org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; <list> <value>text/plain;charset=UTF-8</value> import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; </list> </property> </bean> import com.google.gson.GsonBuilder; import com.starpl.study.model.dao.TestDao; </list> </property> import com.starpl.study.model.dao.entity.Test; </bean> @Controller @RequestMapping(value = { "/api" }) public class TestApiController { @Autowired private TestDao testDao; package com.starpl.study.controller.api; @ResponseBody @RequestMapping(value = { "/list" }, method = RequestMethod.GET) public String showList() { List<Test> testList = testDao.getTestList(); return new GsonBuilder().setPrettyPrinting().setDateFormat("yyyy-MM-dd HH:mm:ss").create().toJson(testList); } }
  • 21. §  결론 : RESTful 웹 서비스를 만들 수 있다 §  RESTful을 이해했다 §  뷰의 종류인 JSP, JSTL, EL등을 이해 했다 §  요즘 대중적인 API 뷰 JSON(GSON)을 이해 했다 §  스프링과 여러가지 추가적인 라이브러리가 필요 §  웹 서비스를 보기 편하게 디자인 할 수 있다 §  과제 : 웹 서비스 디자인에 대한 생각을 정리
  • 22. §  MVC 심층학습 §  모델 §  데이터 §  POJO (Plain Old Java Object) §  과제 : MVC 모델에 대한 추가 학습
  • 23. §  http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm §  http://blog.openmaru.com/97 §  http://www.ibm.com/developerworks/kr/library/tutorial/x-restatompp/i ndex.html §  http://www.ibm.com/developerworks/kr/wa-apachewink1/index.html §  http://www.mimul.com/pebble/default/2010/05/01/1272710220000.ht ml §  http://www.iamcorean.net/22 §  http://sunnysideupegg.tistory.com/entry/REST-Representational-Stat e-Transfer
  • 24. §  http://www.ibm.com/developerworks/kr/library/j-jstl0211.html §  http://www.ibm.com/developerworks/kr/library/j-jstl0318/ §  http://bunnyon.blog.me/150081013290 §  http://onceavocisunl.files.wordpress.com/2007/12/jstl_ebook.pdf §  http://blog.naver.com/choiye84/130090207606 §  http://code.google.com/p/google-gson/ §  http://sites.google.com/site/gson/gson-user-guide §  http://blog.springsource.com/2010/01/25/ajax-simplifications-in-sprin g-3-0/