Jersey의 JSON Support

Posted at 2009/06/08 13:57// Posted in 나만의 작업
Jersey에서 JSON을 지원하는 방법은 두가지가 있다.

* JAXB Based JSON support
* Low-Level JSON support


일단, JAXB 기반의 JSON 지원하는 방법을 알아보면,

JSON하고 XML data format을 쉽게 produce/consume하면 시간절약을 할 수 있다.
왜냐면 Java model, JAXB를 이용한 annotated된 POJO를 쓰기때문에 쉽게 핸들링할 수 있다.

자바 모델에 @XmlRootElement 어노테이션을 붙여주고 간단한 몇가지 작업을 해주면~ 큰 노력하지 않고
JSON을 지원할 수 있다. 

단점은 매우 특별한 JSON format을 처리할 때 좀 어렵다는거.옵션을 줘야한다.

위의 글에서 자세한 내용을 참고~


두번째 방법인 Low-Level JSON support
JSONObject나 JSONArray를 이용. Jettison project 를 이용
가장 큰 이점은 JSON format의 produced나 consumed을 full로 컨트롤할 수 있다. 직접 사용자가 원하는데로 쓰기때문에.. 반면에 data model object를 다룰때 JAXB기반보다는 좀더 복잡하다
간단한 JSON의 경우 JAXB를 쓸 경우엔 한줄로 끝나지만 JSONObject를 생성해서 쓰면 꽤 여러줄을 코딩해야 한다. 

JAXB bean creation

MyJaxbBean myBean = new MyJaxbBean("Agamemnon", 32);


Constructing a JSONObject

JSONObject myObject = new JSONObject();
myObject.JSONObject myObject = new JSONObject();
try {
   myObject.put("name", "Agamemnon");
   myObject.put("age", 32);
   } catch (JSONException ex) {
   LOGGER.log(Level.SEVERE, "Error ...", ex);
  }

간단한 경우엔 JAXB를..조금 섬세한 작업이 필요하다면 JSONObject를 쓰는것이 좋을 것 같다.
JAXB에서 configuration 설정은 지금보다 더 섬세한 작업을 할 수 있게 지원해준다면 좋을텐데...

참고!! 및 주의!!

그리고 현재 많이 보이는 글들중 JAXB를 조금 더 세세하게 옵션을 줘서 표현하는 방법에 ContextResolver<JAXBContext> 인터페이스를 구현하여 자신만의 JSONJAXBContext에 옵션을 주는 방법에
  @Provider
   public class MyJAXBContextResolver implements ContextResolver<JAXBContext> {

       private JAXBContext context;
       private Class[] types = {StatusInfoBean.class, JobInfoBean.class};

       public MyJAXBContextResolver() throws Exception {
           Map props = new HashMap<String, Object>();
           props.put(JSONJAXBContext.JSON_NOTATION, JSONJAXBContext.JSONNotation.MAPPED);
           props.put(JSONJAXBContext.JSON_ROOT_UNWRAPPING, Boolean.TRUE);
           props.put(JSONJAXBContext.JSON_ARRAYS, new HashSet<String>(1){{add("jobs");}});
           props.put(JSONJAXBContext.JSON_NON_STRINGS, new HashSet<String>(1){{add("pages"); add("tonerRemaining");}});
           this.context = new JSONJAXBContext(types, props);
       }

       public JAXBContext getContext(Class<?> objectType) {
           return (types[0].equals(objectType)) ? context : null;
       }
   }


이런식으로  JSONJAXBContext.JSON_NOTATION 등의 상수들이 모두 deprecated 되었다.
Jersey 1.0.2 부터는 아래처럼 변경되었다.

   @Provider
   public class MyJAXBContextResolver implements ContextResolver<JAXBContext> {

       private JAXBContext context;
       private Class[] types = {StatusInfoBean.class, JobInfoBean.class};

       public MyJAXBContextResolver() throws Exception {
           this.context = new JSONJAXBContext(
                   JSONConfiguration.mapped()
                                      .rootUnwrapping(true)
                                      .arrays("jobs")
                                      .nonStrings("pages", "tonerRemaining")
                                      .build(),
                   types);
       }

       public JAXBContext getContext(Class<?> objectType) {
           return (types[0].equals(objectType)) ? context : null;
       }
   }






  1. [NC]...YellOw
    2009/06/10 21:10 [Edit/Del] [Reply]
    날이 점점 더워지고 있네요. 더위 조심하세요~~

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

Jersey의 Exception Handling

Posted at 2009/06/05 14:02// Posted in 나만의 작업

Jersey에서는 WebApplicationException 클래스를 이용하여 Exception Handling한다.

WebApplicationException을 잡아야 하고, 예외를 Response로 매핑한다.
예외를 위한 response가 null이 아니면 응답을 생성, null이면 서버 오류 응답을 생성
런타임 예외나 미리감지되는 예외(checked exception) 기호에 따라 사용
미리 감지되지 않는 예외나 오류는 컨테이너 안쪽까지 전파가 되도록 예외를 다시 던져야(re-thrown) 한다.
미리 감지되는 예외나 throwable 은 직접 예외를 던지지 말고, 서블릿인 경우은  ServletException으로, JAX-WS Provider 기반인 경우는 WebServiceException으로 예외를 감싸서 던져야 한다.


 public SparklinesResource(
          @QueryParam("d") IntegerList data,
          @DefaultValue("0,100") @QueryParam("limits") Interval limits) {
      if (data == null)
          throw new WebApplicationException(400);
  
      this.data = data;  
      this.limits = limits;
  
      if (!limits.contains(data))
          throw new WebApplicationException(400);


* 참고 : 이 예제는 Joe Gregorio의  Sparklines service and python implementation을 보고 영감을 받고 Paul Sandoz 아저씨가 만든 Sparklines 예제중의 일부이다.



'나만의 작업' 카테고리의 다른 글

[Jersey] WebApplicationException and Mapping Exception to Responses  (0) 2009/07/30
[Jersey] Building Responses  (4) 2009/07/21
[Jersey] Representation and Java Types  (0) 2009/07/16
Jersey의 JSON Support  (2) 2009/06/08
Jersey의 Exception Handling  (0) 2009/06/05
Jersey의 Return Type  (0) 2009/06/04
Jersey의 MessageBodyReader/Writer  (0) 2009/06/03
JAX-RS @Produces와 @Consumes  (2) 2009/06/02
JAX-RS의 구성  (0) 2009/06/01

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

Jersey의 Return Type

Posted at 2009/06/04 10:36// Posted in 나만의 작업
Jersey에서 사용할 수 있는 Return Type에는

void
Response
GenericEntity 
Java Type
네가지 타입이 있다.

void : 204 status code (성공. message body가 empty)
Response : null 리턴 값은 204 status code.
GenericEntity / Other : 리턴값이 null이 아니면 200 status code를 사용하고 null이면 204 status code를 사용한다.
Response의 instance에 어떤 metadata를 추가적으로 제공하고 싶으면 ResponseBuilder를 쓰면 된다.
(ResponseBuilder는 빌더 패턴을 사용해 Response 인스턴스를 생성 한다.)



'나만의 작업' 카테고리의 다른 글

[Jersey] Building Responses  (4) 2009/07/21
[Jersey] Representation and Java Types  (0) 2009/07/16
Jersey의 JSON Support  (2) 2009/06/08
Jersey의 Exception Handling  (0) 2009/06/05
Jersey의 Return Type  (0) 2009/06/04
Jersey의 MessageBodyReader/Writer  (0) 2009/06/03
JAX-RS @Produces와 @Consumes  (2) 2009/06/02
JAX-RS의 구성  (0) 2009/06/01
What is Jersey?  (0) 2009/06/01

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

Jersey의 MessageBodyReader/Writer

Posted at 2009/06/03 10:19// Posted in 나만의 작업
JAX-RS는 MessageBodyReader와 MessageBodyWriter를 통해 HTTP 메세지 바디와 자바 타입간의 마샬링과 언마샬링을 해준다.

MessageBodyReader의 생긴 모습을 보면, (이 인터페이스를 구현하여 원하는 모습의 자바타입 객체로 변신시킬 수 있다.)

public interface MessageBodyReader<T> {
boolean isReadable(Class<?> type, Type genericType, 
            Annotation annotations[], MediaType mediaType);

T readFrom(Class<T> type, Type genericType,  
            Annotation annotations[], MediaType mediaType,
            MultivaluedMap<String, String> httpHeaders, 
            InputStream entityStream)
throws IOException, WebApplicationException;
    
}


<Message Body Reader>
representation을 자바 타입으로 매핑한다. 
MessageBodyReader 인터페이스 구현 필요, @Provider 어노테이션이 꼭 필요하다.

JSON representaion 예제
{"Customer ":{"id":"123","name":"john"}}
의 JSON타입이 들어오면 MessageBodyReader를 통해 
Customer라는 객체의 필드 id = 123, name = john의 자바타입으로 매핑을 시킬 수 있다.

단계
1. 엔티티 바디에 맞는 자바 타입 선택
2. 요청 미디어 타입에 맞는 MessageBodyReader 클래스 선택
3. isReadable 메소드를 이용해 선택한 MessageBodyReader 클래스를 돌아가며 원하는 자바 타입의 MessageBodyReader 프로바이더 선택
4. 3번이 성공하면, MessageBodyReader의 readFrom으로 바디를 자바 타입으로 매핑
3번이 실패하면, HTTP 415 상태코드(지원하지 않는 미디어 타입)로 응답 보냄.


 MessageBodyWriter를 살펴보면, (이 인터페이스를 구현하여 원하는 모습의 representation 타입 객체로 변신시킬 수 있다.)

public interface MessageBodyWriter<T> {
boolean isWriteable(Class<?> type, Type genericType,
            Annotation annotations[], MediaType mediaType);

long getSize(T t, Class<?> type, Type genericType,
Annotation annotations[], 
            MediaType mediaType);

void writeTo(T t, Class<?> type, Type genericType, 
Annotation annotations[], 
            MediaType mediaType, 
            MultivaluedMap<String, Object> httpHeaders,
            OutputStream entityStream) throws IOException,
WebApplicationException;    
}


<Message Body Writer>
자바 타입을 representation으로 매핑한다.
 MessageBodyWriter 인터페이스 구현 필요, @Provider 어노테이션이 꼭 필요하다.

단계
1. 응답 엔티티 바디로 매핑할 객체를 얻기
2. @Produces 값 얻기
3. MessageBodyWriter 프로바이더 집합 선택
4. 선택한 MessageBodyWriter 프로바이더 정렬
5. isWriteable 메소드를 이용해 선택한 MessageBodyWriter 프로바이더를 돌아가며 적합한 MessageBodyWriter 프로바이더 선택
6. 5번이 성공하면, writeTo 메소드로 객체를 엔티티 바디로 매핑
5번이 실패하면, HTTP 406 상태코드(요청한 페이지가 요청한 콘텐츠 특성으로 응답할 수 없습니다)로 응답 보냄


꼭 필요한 annotation
MessageBodyReader -> @Consumes
MessageBodyWriter -> @Produces
각 클래스는 맞는 annotation을 사용해야 한다.



MessageBodyReader를 구현한 테스트 클래스

package com.flyburi.jersey.resources;


import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;

import javax.ws.rs.Consumes;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyReader;
import javax.ws.rs.ext.Provider;

import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;

import com.flyburi.jersey.model.User;
import com.sun.jersey.api.spring.Autowire;

@Consumes(MediaType.APPLICATION_JSON)
@Provider
@Autowire
public class UserReader implements MessageBodyReader<User>{

private final Log logger = LogFactory.getLog(getClass());
@Override
public boolean isReadable(Class<?> klass, Type genericType,
Annotation[] annotations, MediaType mediaType) {
return User.class.isAssignableFrom(klass);
}

@Override
public User readFrom(Class<User> type, Type genericType,
Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, String> httpHeaders, InputStream in)
throws IOException, WebApplicationException {
String body = IOUtils.toString(in);
User user = null;
try {
JSONObject json = new JSONObject(body);
String id = json.getString("id");
String name = json.getString("name");
String password = json.getString("password");

user = User.create(id, name, password);
} catch (JSONException jse) {
if (logger.isErrorEnabled()) {
logger.error(jse);
}
}
return user;
}

}



MessageBodyWriter를 구현한 테스트 클래스

package com.flyburi.jersey.resources;

import java.io.IOException;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;

import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.Provider;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.codehaus.jettison.json.JSONObject;

import com.flyburi.jersey.model.User;
@Provider
@Produces(MediaType.APPLICATION_JSON)
public class UserWriter implements MessageBodyWriter<User>{

private static final String JSON_EMPTY_CONTAINER = "{}";
private final Log logger = LogFactory.getLog(getClass());
@Override
public long getSize(User t, Class<?> type, Type genericType,
Annotation[] annotations, MediaType mediaType) {
return -1;
}

@Override
public boolean isWriteable(Class<?> type, Type genericType,
Annotation[] annotations, MediaType mediaType) {
return User.class.isAssignableFrom(type);
}

@Override
public void writeTo(User user, Class<?> type, Type genericType,
Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, Object> httpHeaders,
OutputStream output) throws IOException,
WebApplicationException {
JSONObject json;
try {
json = new JSONObject(JSON_EMPTY_CONTAINER);
json.accumulate("id", user.getId());
json.accumulate("name", user.getName());
json.accumulate("password", user.getPassword());
output.write(json.toString().getBytes());
} catch (Exception ex) {
logger.error(ex);
}
}

}



'나만의 작업' 카테고리의 다른 글

[Jersey] Representation and Java Types  (0) 2009/07/16
Jersey의 JSON Support  (2) 2009/06/08
Jersey의 Exception Handling  (0) 2009/06/05
Jersey의 Return Type  (0) 2009/06/04
Jersey의 MessageBodyReader/Writer  (0) 2009/06/03
JAX-RS @Produces와 @Consumes  (2) 2009/06/02
JAX-RS의 구성  (0) 2009/06/01
What is Jersey?  (0) 2009/06/01
What is JAX-RS?  (0) 2009/05/29

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

JAX-RS의 구성

Posted at 2009/06/01 13:34// Posted in 나만의 작업
1. Root Resource Classes

* 웹 리소스을 구현하기 위해 JAX-RS 어노테이션을 사용하는 자바 클래스
 적어도 하나의 메소드에 @Path을 사용한 POJO

Root resource class들은 JAX-RS runtime에 인스턴스화된다.
 @Path 어노테이션이 달린 Resource 클래스

@Path("/hi")
public class HiResource {
    @GET 
    @Produces("text/plain")
    public String getAsText() {
        return "Hi! buri. Show Text.";
    }


2. Resource Methods

@GET
@POST
@PUT
@DELETE
@HEAD

*  URI Templates

@Path annotation의 값은 상대 경로 URI.

@Path("user list/{id}")
@Path("user%20list/{id})

두개의  path는 동등하다. 어노테이션의 값은 자동으로 인코딩된다

정규 표현식도 가능하다.

* sub resources
리소스 클래스에서 @Path 어노테이션이 달린 메소드는 하위 리소스 메소드나 하위 리소스 로케이터가 된다.

3. Extracting Request Parameters

@FormParam : Form값이 전송된 경우 Form안의 값들을 꺼내온다.
@QueryParam : URI 쿼리 파라미터의 값을 꺼내온다.
@PathParam : URI template에 명시되어 있는 값을 꺼내온다.  
@CookieParam : 쿠키에 있는 값을 꺼내온다.
@HeaderParam : 헤더에 있는 값을 꺼내온다.
@Context : Request header나  URI 정도등등의 inject 정보를 사용할 수 있다.

@POST
@Consumes("application/x-www-form-urlencoded")
public void post(@FormParam("name") String name){ .... }


@GET
@Path("/user/{id}")
public void get(@PathParam("id") String id) { .... }


@GET
public String get(@Context UriInfo ui){
    MultivaluedMap<String, String> queryParams = ui.getQueryParameters();
    MultivaluedMap<String, String> pathParams = ui.getPathParameters();
}


@GET
public String get(@Context HttpHeaders hh){
    MultivaluedMap<String, String> headerParams = ui.getRequestHeaders();
    Map<String, Cookie> pathParams = ui.getCookies();
}


* Annotation Inheritance

public interface ReadOnlyAtomFeed {  
   @GET @Produces("application/atom+xml")  
   Feed getFeed();  
 }  
  
 @Path("feed")  
 public class ActivityLog implements ReadOnlyAtomFeed {  
    public Feed getFeed() {...}  
 } 

* 기타 Annotation

@DefaultValue : @Context만 빼고 위의 다른 어노테이션에서 기본값 설정을 할때에 사용

@Encoded : @FormParam, @MatrixParam, @QueryParam, @PathParam 에서 파라미터 값을 자동으로 URI 디코딩하지 않도록 한다.



'나만의 작업' 카테고리의 다른 글

Jersey의 Exception Handling  (0) 2009/06/05
Jersey의 Return Type  (0) 2009/06/04
Jersey의 MessageBodyReader/Writer  (0) 2009/06/03
JAX-RS @Produces와 @Consumes  (2) 2009/06/02
JAX-RS의 구성  (0) 2009/06/01
What is Jersey?  (0) 2009/06/01
What is JAX-RS?  (0) 2009/05/29
What is REST?  (2) 2009/05/27
Thinkfree Office Live 한국어 서비스 시작  (2) 2009/04/01

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

What is Jersey?

Posted at 2009/06/01 10:57// Posted in 나만의 작업
구글에서 "Jersey"를 치면 제일 처음으로 Map에서 저지섬이 나오고 두번째 링크로는 역시 위키피디아의 저지섬이 나온다.
세번째 링크가 되어서야 내가 원하는 jersey 공식 홈페이지가 나온다. 

Jersey는 SUN에서 개발하는 REST 방식의 웹 어플리케이션을 지원하는 JAX-RS의 구현체의 이름이다.

Jersey is the open source (under dual CDDL+GPL license), production quality, JAX-RS (JSR 311) Reference Implementation for building RESTful Web services. But, it is also more than the Reference Implementation. Jersey provides an API so that developers may extend Jersey to suite their needs. The governance policy is the same as the GlassFish project. (출처 : https://jersey.dev.java.net/)


Jersey 1.0.3 버젼은 JAX-RS 1.0.을 구현하였고, 2009년 5월 현재는 JAX-RS 1.1을 구현한 Jersey 1.1.0-ea(ealry access)버젼 개발중이다.




'나만의 작업' 카테고리의 다른 글

Jersey의 Return Type  (0) 2009/06/04
Jersey의 MessageBodyReader/Writer  (0) 2009/06/03
JAX-RS @Produces와 @Consumes  (2) 2009/06/02
JAX-RS의 구성  (0) 2009/06/01
What is Jersey?  (0) 2009/06/01
What is JAX-RS?  (0) 2009/05/29
What is REST?  (2) 2009/05/27
Thinkfree Office Live 한국어 서비스 시작  (2) 2009/04/01
자바스크립트 로깅 라이브러리 Blackbird  (2) 2008/11/03

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

What is JAX-RS?

Posted at 2009/05/29 11:03// Posted in 나만의 작업

JAX-RS(Java™ API for RESTful Web Services)는 자바 플랫폼에서 경량화된 REST 방식의 웹 애플리케이션 구현을 지원하는 자바 API이다.

SOAP기반의 SOA 연동은 자바 애플리케이션을 무겁게 한다는 비판과 함께, 최근 웹 애플리케이션의 경향인 AJAX기반으로 JSON이나 RSS와 같이 간결한 프로토콜을 사용한 연동이 보편화되면서 쉽게 구현할 수 있도록 Java EE에 JAX-RS 라는 사양이 포함되고 있다. (출처 : http://ko.wikipedia.org/wiki/JAX-RS)


2008년 10월에 JSR 311 1.0 released 되었고 2009년 5월 현재는 JSR 311 1.1 draft 상태이다.


Open source 구현체로는

CXF 

이정도가 있다. 


JAX-RS 1.0 Features


The JAX-RS API may be found online here.   

The JAX-RS specification may be found online here.



javax.ws.rs High-level interfaces and annotations used to create RESTful service resources.
javax.ws.rs.core Low-level interfaces and annotations used to create RESTful service resources.
javax.ws.rs.ext APIs that provide extensions to the types supported by the JAX-RS API.



'나만의 작업' 카테고리의 다른 글

Jersey의 MessageBodyReader/Writer  (0) 2009/06/03
JAX-RS @Produces와 @Consumes  (2) 2009/06/02
JAX-RS의 구성  (0) 2009/06/01
What is Jersey?  (0) 2009/06/01
What is JAX-RS?  (0) 2009/05/29
What is REST?  (2) 2009/05/27
Thinkfree Office Live 한국어 서비스 시작  (2) 2009/04/01
자바스크립트 로깅 라이브러리 Blackbird  (2) 2008/11/03
윈도우용 launcy  (0) 2008/08/31

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

What is REST?

Posted at 2009/05/27 16:43// Posted in 나만의 작업
REST는 2000년도에 Roy Fielding의 박사학위 논문에서 네트워크 시스템의 구조적 형식(architecture style)을 설명하기 위해 만들어진 용어이다. 최근도 아니고 이미 뜰만큼 뜬 REST에 대해 정리해보자.

정의
REST stands for "REpresentational State Transfer"
REST is an architecture style not a standard : REST는 비표준 아키텍쳐 스타일
Data and Service are represented by unique URI : unique한 URI를 통해 Data와 Service를 표현한다.


특징
Addressable Resources
Every "thing" should have a URI
Statelessness 
scalability and decoupling
Representation Orientted
Different applications need different formats
Uniform interface
Use the standard methods of the protocol

Addressable Resources
모든 것은 URI을 가지고 있다. 예를 들면 "User", "article" 책의 "ISBN", 운전면허증의 "라이센스 번호"등은
모두 Resource 라고 한다. 이 리소스에 클라이언트가 바로 액세스할 수 있게 주소를 가르키는 URI를 가지고 있어야 한다. URI를 가지고 접근 가능하도록 하는것.

http://www.flyburi.com/article/1

Statelessness(상태비보존성) 
웹 어플리케이션이 클라이언트의 상태에 대한 정보를 보관하지 않는다.  모든 HTTP 요청이 완전히 독립적으로 발생한다 .어떤 요청을 했을때 다른 페이지에 의존적이지 않고, searchForm을 입력해서 "buri" 를 찾는게 아닌 /user/buri를 URL로 입력하여 접근 가능하도록 한다. 이렇게 되면 사용자는 URI만 보고 예측하여 계층적인 접근을 가능하므로 직관적이다.

서버는 클라이언트 time out에 대해 신경쓸 필요도 없고 클라이언트가 애플리케이션의 "어디"에 있었는지 기억한 정보를 잃어버릴 일도 없다.클라이언트는 매 요청마다 필요한 모든 정보를 준다. REST에서는 상태가 서버가 아니라 클라이언트에 유지되며 매 요청마다 필요한 정보를 서버에 보낸다.
이렇게 하면 쉽게 북마크 할 수 있다.

Uniform interface
모든 Resource는 일반적인 인터페이스(HTTP GET, POST, PUT, DELETE)로 접근되어야 한다.


RESTful 웹서비스는 REST 아키텍쳐 스타일을 사용하는 웹서비스.

'나만의 작업' 카테고리의 다른 글

JAX-RS @Produces와 @Consumes  (2) 2009/06/02
JAX-RS의 구성  (0) 2009/06/01
What is Jersey?  (0) 2009/06/01
What is JAX-RS?  (0) 2009/05/29
What is REST?  (2) 2009/05/27
Thinkfree Office Live 한국어 서비스 시작  (2) 2009/04/01
자바스크립트 로깅 라이브러리 Blackbird  (2) 2008/11/03
윈도우용 launcy  (0) 2008/08/31
hello! blogger 대한민국 블로거 컨퍼런스 참가신청  (6) 2008/03/05
  1. [NC]...YellOw
    2009/05/28 19:53 [Edit/Del] [Reply]
    아~~~~~~~~ 어렵네용~*

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

SOA와 Web Service

Posted at 2007/03/25 21:41// Posted in 나만의 작업

아직은 아키텍쳐에 관심이 많이는 없었지만 특별한 기회에 접하게 되었다.
SOA란 말, SOAP, REST, WEB SERVICE에 대해 세미나에서 듣기만 해보았고,
정확히 어떤 말인지 잘은 몰랐지만, 한번 정리해보려고 한다.

1) SOA의 기본 개념
표준화, 공용화, 재사용성 강화(One Build, Many Use)
Business Agility
SOA => Design Paradiam

SOA의 기대효과
Loosely Coupled, Re-Usable, Interoperable, composited.

2) Service란?
기업의 업무를 표현한 SW Component.

규약을 받은 후에 service consumer와 service provider사이에서 메세지 교환

서비스의 종류
- Business Service
- Intermediary Service
- Process Centric Service
- Application Service
- Public Enterprise Service

3) SOA 단계적 발전 모델
- Fundamental SOA
SOA 처음 적용시 사용을 많이 함.
Business Service + Application Service
서비스에 대한 조합. 전체를 시스템화
문제점 : service 크기가 증가함에 따라 연결이 매우 복잡해짐

- Networked SOA

- Process Oriented SOA

4) WEB SERVICE
Distributed Architecture, Message Oriented Architecture, HTTP(SMTP, FTP)

SOAP Web Services
XML기반, 상호 통신을 위한 표준 Message 형식

WSDL(Web Services Description Language)
XML기반, 서비스에 접근하는 방법을 제공
SOAP만을 위해 디자인되지는 않았음.

5) WS-*확장
구현이 어렵고 복잡하다.
Data양이 비대해짐
서비스 이용자에게도 접근성이 낮다.

6) REST
보안 Spec이 없다. 간단한 표준
SOAP은 같이 보안이나 안전한 메시지, 혹은 비즈니스 프로세스 자동화와 같은 문제들을 해결할 수 있다.

7) 결론
소비자에게 제공하기 위한 API를 쓸땐 REST,
기업간의 정보 제공은 SOAP을 쓸수 있도록 한가지에 치우칠수도 있지만 상호호환하며
사용할 수도 있을 것이다.

관련 URL
http://en.wikipedia.org/wiki/Service-oriented_architecture#Other_SOA_Concepts
http://webservices.xml.com/pub/a/ws/2003/09/30/soa.html
http://www.ibm.com/developerworks/kr/webservices/newto/

  1. 2007/03/26 23:53 [Edit/Del] [Reply]
    웹서비스 공부하시나보네요 ^^
    웹 서비스를 접할 기회가 없어서 내용이 엄청 생소하네요. 어려워 보이기도 하구요.
  2. 염장똥꾸
    2007/03/28 18:15 [Edit/Del] [Reply]
    이런공부도 하네..

    대단해.. 지금 간 회사는 좋은가 보구나...

    열공해라...
  3. 2007/03/30 17:49 [Edit/Del] [Reply]
    나도 최근에 SOA 정리했는데...나도 글 올릴께 ~ 유미씨 평소에 정리하는 습관이 있었구나..정리 잘하네...
    • 2007/04/01 03:35 [Edit/Del]
      전 머리가 나빠서 정리를 안하면 다 까먹어서
      생존필수로 정리를 할수 밖에 없는데
      위에 글은 좀 빼먹은것도 많고,,^^;;; ㅎㅎ

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret