Your SlideShare is downloading. ×
0
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

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

3,009

Published on

Java web development 03 …

Java web development 03

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

벌써 2년도 넘은 자료지만
그래도 필요하신분이 있을지 몰라서...
(지금보니 2년사이 많은것을 배운것 같네요 ㅎㅎ)

Published in: Technology
0 Comments
17 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,009
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
100
Comments
0
Likes
17
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 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. §  구글이 오랫동안 제공해온 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)
  • 6. §  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/ §  등등 많은 구현체가 있음
  • 7. §  RESTful : (표현으로 상태를 전송)~스럽게 §  웹상의 모든 것들은 URL로 표현 (Representation) §  많은 웹2.0 회사들이 Open API의 구현 방법으로 많이 사용 §  RESTful(스타일) 웹 서비스 특징 §  작고 어디에서나 적용되는 인터페이스를 가진다 §  기본적으로 상태를 저장하지 않는다 (하지만 필요할 수도 있음) §  GET, POST, PUT, DELETE 사용 §  하지만 실상 PUT과 Delete 메소드는 HTTP스팩에는 존재하지만 지원하는 브라우저는 많지 않다. (이름으로 해결) §  모든 자원은 URL를 이용하여 유일하게 지칭될 수 있다 §  자원들의 표현(Representation)들이 URL을 통해 서로 연결되어 있다
  • 8. §  웹 서비스? -> 웹 XML 서비스 §  우리가 만드는 것이 웹 (XML) 서비스인가? §  우리가 만드는 것은 웹 프로그램 §  단지 예쁜 주소를 표시하고 싶어서… 는 아님 §  사람들이 주소를 보고 정보를 쉽게 파악할 수 있다 §  자원은 같은 자리에 존재한다 (퍼머링크) §  스프링 프레임워크 + 여러가지 §  프로젝트 디자인까지 알아보기 편하게 만들어 봅시다.
  • 9. §  MVC 기반의 디자인 §  모델과 컨트롤러 뷰의 확실한 분리 §  환경 설정 파일 §  각종 XML, properties §  RESOURCE §  HTML, JS, CSS §  다양한 컨트롤러 §  다양한 뷰의 지원
  • 10. §  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>
  • 11. <!-- 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>
  • 12. <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
  • 13. 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"; } }
  • 14. 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>
  • 15. §  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
  • 16. 기능 분류 태그 변수 지원 set - JSP에서 사용될 변수를 설정한다. remove - 설정한 변수를 제거 한다. 흐름 제어 if - 조건에 따라 내부 코드를 수행한다. choose - 다중 조건을 처리할 때 사용한다. forEach - 컬렉션이나 Map의 각 항목을 처리할 때 사용한다. forTokens - 구분자로 분리된 각각의 토큰을 처리할 때 사용된다. URL 처리 import - URL을 사용하여 다른 자원의 결과를 삽입한다. redirect - 지정한 경로로 리다이렉트한다.(방향을 돌리다.) url - URL을 재작성한다. 기타 태그 catch - 예외 처리에 사용된다. out - JspWriter에 내용을 알맞게 처리한 후 출력한다.
  • 17. §  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;'로 변환한다.
  • 18. §  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} : 널은 널이라 표시
  • 19. §  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); } }
  • 20. §  결론 : RESTful 웹 서비스를 만들 수 있다 §  RESTful을 이해했다 §  뷰의 종류인 JSP, JSTL, EL등을 이해 했다 §  요즘 대중적인 API 뷰 JSON(GSON)을 이해 했다 §  스프링과 여러가지 추가적인 라이브러리가 필요 §  웹 서비스를 보기 편하게 디자인 할 수 있다 §  과제 : 웹 서비스 디자인에 대한 생각을 정리
  • 21. §  MVC 심층학습 §  모델 §  데이터 §  POJO (Plain Old Java Object) §  과제 : MVC 모델에 대한 추가 학습
  • 22. §  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
  • 23. §  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/

×