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>
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의 객체 참조에 해당하는 특수 문자를 처리한다. 예를 들어, '&'는 '&'로 변환한다.
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} : 널은 널이라 표시
21. § 결론 : RESTful 웹 서비스를 만들 수 있다
§ RESTful을 이해했다
§ 뷰의 종류인 JSP, JSTL, EL등을 이해 했다
§ 요즘 대중적인 API 뷰 JSON(GSON)을 이해 했다
§ 스프링과 여러가지 추가적인 라이브러리가 필요
§ 웹 서비스를 보기 편하게 디자인 할 수 있다
§ 과제 : 웹 서비스 디자인에 대한 생각을 정리
22. § MVC 심층학습
§ 모델
§ 데이터
§ POJO (Plain Old Java Object)
§ 과제 : MVC 모델에 대한 추가 학습