Java2013.09.25 17:29

요즘은 보안문제 이슈로 인해 파일을 주고 받을 때 스트림 방식이 아닌 Base64로 인코딩하여 스트링 형식으로 변환하여 주고 받는 방식을 많이 사용하고 있다. 그러면 자바에서는 어떻게 구현하면 되는것일까? 


대체적으로 파일을 다운로드 받을 때는 OutputStream에 파일을 쓰는데, String형으로 변환을 하기 위해서는 byteOutputStream에 파일을 쓰고 바이트배열형식으로 형을 변환하여 Base64로 인코딩하면 쉽게 String형으로 파일을 변환할 수 있다. 


이는 파일 사이즈가 작고 모바일 통신에서 주로 사용하는 방식으로 String형으로 변환된 파일을 XML에 포함으로 주고 받기도 한다. 


아래 소스는 파일을 다운로드 받을 때 파일을 Base64로 인코딩하여 String 형으로 변환하는 메소드 예제이다.

//상단에 Base64 처리를 하기 위해 import 한다.

import org.apache.commons.codec.binary.Base64


//파일을 Base64로 인코딩하여 String형으로 변환하는 메소드

public String fileToString(File file) {

    String fileString = new String();

    FileInputStream inputStream =  null;

    ByteArrayOutputStream byteOutStream = null;


    try {

        inputStream = new FileInputStream(file);

byteOutStream = new ByteArrayOutputStream();

    

int len = 0;

byte[] buf = new byte[1024];

        while ((len = inputStream.read(buf)) != -1) {

             byteOutStream.write(buf, 0, len);

        }


        byte[] fileArray = byteOutStream.toByteArray();

        fileString = new String(Base64.encodeBase64(fileArray));

        

    } catch (IOException e) {

        e.printStackTrace();

    } finally {

nputStream.close();

        byteOutStream.close();

    }

    return fileString;

}



Posted by 나리 짱!!! naleejang
Java2013.09.02 17:48

오늘은 파일 업로드 다운로드에 대한 자바 소스에 대한 글을 남겨볼까 합니다. 

늘어렵게만 느꼈던 파일 업로드 그리고 다운로드~!! 막상 해 보니 그리 어렵지 않더군요~!! 


업로드는 Apache 프로젝트인 fileupload를 이용하여 업로드를 하였습니다. jar 파일을 받아서 import 하면 되니까 엄청 편하더라구요~!! 아래 소스도 예제도 친절하게 다 나와 있고, 정말 좋은 것 같습니다. ^^  

아래 URL 확인하시면 됩니다.

http://commons.apache.org/proper/commons-fileupload/using.html



아래 소스는 파일 업로드 샘플 예제이구요~!! 

public void upload(HttpServletRequest request) throws Exception {

 

// Check that we have a file upload request
boolean isMultipart = ServletFileUpload.isMultipartContent(request);

HashMap dataMap = new HashMap();

File tempFile = null;

 
If(!isMultipart) {
       throw new Exception(“Form type is not multipart”);
}
 
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
// Set factory constraints
factory
.setRepository(TempDirectory);
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Parse the request
List<FileItem> items = upload.parseRequest(request);

 

// Process the uploaded items
for(FileItem item:items) {

String fieldName = item.getFieldName();

 

if (item.isFormField()) { // processFormField

            dataMap.put(fieldName, item.getString());

} else {

            if( item.getSize() > 0) tempFile = item;

}

}

 

// Create file object for upload

File uploadFile = new File(savePath + "/" + saveFileName);

              

// Save file object

if(tempFile.getSize() > 0) {

tempFile.write(uploadFile);

tempFile.delete();

}

}



이건 덤으로 다운로드 샘플 예제입니다. 다운로드는 그냥 InputStream을 OutputStream으로 써주는 가장 일반적인 구현방법입니다. 대부분의 다운로드 구현이 아래 방식을 사용하더군요~!! 

public HttpServletResponse download(HttpServletResponse response, String filePath) throws Exception {

File downfile = new File(filePath);

 

if(!downfile.exists()) {

        throw new FileNotFoundException();

}

       

ServletOutputStream outStream = null;

FileInputStream inputStream = null;

       

try {

        outStream = response.getOutputStream();

        inputStream = new FileInputStream(downfile);               

 

        //Setting Resqponse Header

        response.setContentType("application/octet-stream");

        response.setHeader("Content-Disposition",                     

                           "attachment;filename=\""+downfile.getName()+"\"");

              

        //Writing InputStream to OutputStream

        byte[] outByte = new byte[4096];

        while(inputStream.read(outByte, 0, 4096) != -1)

        {

          outStream.write(outByte, 0, 4096);

        }

} catch (Exception e) {

        throw new IOException();

} finally {

        inputStream.close();

        outStream.flush();

        outStream.close();

}

              

return response;

}


Posted by 나리 짱!!! naleejang
Java2013.08.23 17:50

얼마 전에 프로젝트를 시작을 했습니다. 늘 할 때 마다 어렵다고 느끼는 건 환경설정일 것입니다.

이번 프로젝트에서는 하나의 Apache2 포트에 여러 개의 Tomcat 을 연동하는 환경설정을 해야만 했습니다

그래서 제 윈도우 PC에 먼저 환경 설정을 해 보았습니다. 물론 인터넷의 도움을 받아 여기저기 뒤져보면서 했습니다. 정리하는 차원에서 한번 써 보았습니다. 잘 보아 주세요~~~


 



우선 Windowsapachetomcat, tomcat connectors를 다운로드 받는다.

 

1.     아파치2는 아래 사이트에서 Windows용인 httpd-2.0.65-win32-x86-no_ssl.msi 를 다운로드 받는다.

http://httpd.apache.org/download.cgi


2.     톰캣은 아래 사이트에서 설치하고자 하는 톰캣 버전의 zip 파일을 다운로드 받는다.

http://tomcat.apache.org/download-60.cgi

 

3.     톰캣 컨넥터는 windows용으로 잘 받아야 한다. 아래 Url을 이용하면 쉽게 받을 수 있다. 이때 일반 톰캣 컨넥터를 다운로드 받으면 Apache에서 해당 모듈을 로딩하지 못하게 되는 문제가 발생을 한다. 따라서, 반드시 윈도우용으로 받아야만 한다.

http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/windows/tomcat-connectors-1.2.32-windows-i386-httpd-2.0.x.zip

 

4.     다운로드 받은 아파치는 설치하고, 톰캣은 적절한 디렉토리에 압축을 풀어놓는다.

아파치 정상적으로 설치되면 아래와 같은 시스템 아이콘이 나타난다.

 

5.     좀 전에 다운받은 톰캣 컨넥터를 압축을 푼다.

 

6.     압축을 풀은 mod_jk.so 파일을 아파치가 설치되어 있는 디렉터리의 modules 디렉터리로 이동시킨다. PC 같은 경우에는 아래 그림과 같이 추가시켰다.

 

7.     이제 아파치가 설치되어 있는 디렉토리로 가서 workers.properties를 생성해 보자. 그리고 아래와 같이 편집한다.

** 이때 여러대의 tomcat 을 추가하고 싶다면 아래와 같이 worker 리스트를 추가해 주면 된다.


8.     이제 아파치의 httpd.conf 파일의 환경설정을 해보자. 아파치가 설치되어 있는 디렉터리의 conf 디렉터리로 가면 해당 파일을 볼 수 있다. 아래 보이는 그림처럼, conf 파일에 내용을 추가해 보자.

 

** 여러대의 톰캣을 띄울때는 아래와 같이 경로를 설정하고 해당 포트의 tomcat를 설정해 주면 된다.



톰캣을 여러개 띄우고 싶을때는 각각의 톰캣의 포트 전부 다른것으로 변경해 주어야 한다. 

톰캣 포트 설정은 톰캣 디렉터리의 conf 디렉토리를 들어가면 server.xml이 보이는데 이 파일에서 아래 내용을 전부 다 찾아서 포트정보를 변경해 주면 된다. 

<Server port="8006" shutdown="SHUTDOWN">

 

<Connector port="8084" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8445" />

 

<!-- Define an AJP 1.3 Connector on port 8009 -->

<Connector port="8008" protocol="AJP/1.3" redirectPort="8445" />

 

http://ant103.egloos.com/198206

http://www.imcore.net/linux-apache-apache-tomcat-%EC%97%B0%EB%8F%99/

http://blog.daum.net/gujjy/188

Posted by 나리 짱!!! naleejang
Java2013.07.30 13:59

REST 란?

REpresentational State Transfer 의 약자로, 통신 규약이나 표준 또는 스펙이 아니라 분산 하이퍼미디어 시스템을 위한 www 같은 소프트웨어 아키텍처의 한 형식이며 네트워크 상에서 클라이언트와 서버 사이의 통신 방식이다. REST 라는 용어는 2000년 로이필딩(Roy Fielding) 박사의 논문에서 처음 소개되었다.



REST 구성요소


Resource

REST에서 가장 중요한 개념은 바로 유일한 ID를 가지는 Resource가 서버에 존재하고, 클라이언트는 각 Resource의 상태를 조작하기 위해 요청을 보낸다는 것이다. 일반적으로 Resource는 user, friends, group 등과 같은 명사형의 단어이고, HTTP에서 이러한 Resource 를 구별하기 위한 ID는 '/groups/{groupId}/member/101'와 같은 URI이다.


Method

GET, DELETE 등과 같이 Resource를 조작할 수 있는 동사형의 단어를 Method라고 한다. 클라이언트는 URI를 이용해서 Resource를 지정하고 해당 Resource를 조작하기 위해서 Method를 사용한다. HTTP에서는 GET, POST, PUT, DELETE 등의 Method를 제공한다. 


Representation of Resource

클라이언트가 서버로 요청을 보냈을 때, 서버가 응답으로 보내주는 Resource의 상태를 Representation이라고 한다. REST에서 하나의 Resource는 여러 형태의 Representation으로 나타내어 질 수 있다. 예를 들어 xml, json, text, rss 등으로 전달할 수 있다.


URI 구성

- URI는 ‘/groups’, ‘/users’ 등과 같이 직관적으로 어떤 정보를 제공하는지 알 수 있는 단어들로 구성

- URI는 ‘/groups/{groupId}/member/101’와 같이 URI path가 계층적인 구조를 가지도록 구성

- URI의 상위 path는 하위 path의 집합을 의미하는 단어로 구성. 예를 들어 ‘/groups/101/member/12532’의 경우 ‘groups’는 ‘101’ 등의 그룹의 집합이므로 ‘/groups’ 만으로도 그룹 목록이라는 정보를 제공할 수 있는 유효한 URI가 된다.

- CREATE / DESTORY/UPDATE/DELETE 등의 기본 CRUD 처리는 URI에 명시적으로 표현하도록 하여 URI를 보더라도 직관적으로 어떤 기능을 제공하는지 알 수 있도록 명명하도록 한다.



Posted by 나리 짱!!! naleejang
Java2012.03.06 15:05
Java에서 Rest API로 가장 많이 사용하는 것은 Apache CXF이다. CXF는 Server모듈을 만들수 있고, 쉽게 client 프로그래밍을 할 수 있다. 그런데 Java가 아닌 다른 언어로 제공되는 Rest를 사용할 경우, 다른 서버의 url을 바로 호출할 경우 사용 할수 있는 것이 바로  HttpClient이다.

HttpClient 객체에는 HttpGet, HttpHead, HttpPost, HttpPut, HttpDelete가 있는데, 이 메소드들은 Android에서도 많이 사용되고 있는 통신 방법이다. 어떻게 보면 CXF Restful과도 같아 보인다.

- HttpGet : 데이터를 조회할 때 주로 사용한다.
- HttpHead : 조회하고자 하는 데이터의 메타데이터나 인증정보, 혹은 세션값을 확인 할 때 사용한다.
- HttpPost : 데이터의 메타데이터 등을 수정할 때 사용한다.
- HttpPut : 새로운 데이터를 생성할 때 사용한다.
- HttpDelete : 데이터 삭제시 사용하는 메소드이다.
 
그럼 이제 OpenStack Swift Client Java API 예제와 함께 자주 사용하는 HttpClient 메소드들을 알아보도록 하자.

** 아래 예제 샘플은  http://wiki.openstack.org/SwiftAPI 에 가면 다운로드 받을 수 있다.




HttpGet 

/**
 로그인된 Account의 Container 리스트를 조회하는 메소드로 HttpGet을 사용하였다.
*/

public List<FilesContainer> listContainers(int limit, String marker) throws IOException, HttpException, FilesException

{
        //로그인이 되었는지를 체크한다. 

if (!this.isLoggedin()) {

    throw new FilesAuthorizationException("You must be logged in", null, null);

}

HttpGet method = null;

try {

LinkedList<NameValuePair> parameters = new LinkedList<NameValuePair>();

    if(limit > 0) {
                        //파라메터로 받은 limit를 추가한다. 

parameters.add(new BasicNameValuePair("limit", String.valueOf(limit)));

}

    if(marker != null) {
                        //파라메터로 받은 marker를 추가한다.  

parameters.add(new BasicNameValuePair("marker", marker));

}

    //위에서 생성한 parameters는 URI를 생성할때 사용이 된다.

    String uri = parameters.size() > 0 ? makeURI(storageURL, parameters) : storageURL;
                //위에서 선언한 HttpGet 객체를 생성한다.

method = new HttpGet(uri);

method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut);
                //헤더에 인증 Token를 추가한다.  

method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken);
                
                //여기서 사용되는 FilesResponse는  HttpClient로 실행한 결과값을 담아놓는 HttpResponse로 보                    면 된다.

FilesResponse response = new FilesResponse(client.execute(method));

    if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {

//상태코드가 401로 인증되지 않았을 경우 

}

if (response.getStatusCode() == HttpStatus.SC_OK)

{

//상태코드가 200으로 성공했을 경우

}

else if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT)

{

//상태코드 204 로 새로운 정보가 없을 경우

}

else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND)

{

//상태코드가 404 Not Found가 나왔을 경우

}

else {

//응답코드가 없을 경우

}

}

catch (Exception ex) {

ex.printStackTrace();

throw new FilesException("Unexpected error, probably parsing Server XML", ex);

}

finally {

if (method != null) method.abort();

}

} 


HttpHead

 /**
 로그인된 Account의 MetaData 정보를 조회할 때 HttpHead를 사용하였다.
*/ 
public FilesAccountInfo getAccountInfo() throws IOException, HttpException, FilesAuthorizationException, FilesException

{
        //로그인이 되었을 경우에만 아래 프로세스를 수행한다. 

if (this.isLoggedin()) {

HttpHead method = null;


try {

method = new HttpHead(storageURL);

method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut);

method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken);
                        //해당 storageURL의 MetaData를 조회한다.

FilesResponse response = new FilesResponse(client.execute(method));
 

if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {
                                //401 인증이 되지 않았을경우 Header를 삭제하고 다시 로그인을 한다.

method.removeHeaders(FilesConstants.X_AUTH_TOKEN);

if(login()) {

method.abort();

method = new HttpHead(storageURL);

method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut);

method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken);
                                        //다시 해당 storageURL의 MetaData를 조회한다. 

response = new FilesResponse(client.execute(method));

}

else {
                                        //인증이 되지 않으면 오류처리한다. 

throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine());

}

}

                        // 기존 정보와 변동이 없으면 기존 정보를 조회하여 리턴한다. 

if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT)

{

int nContainers = response.getAccountContainerCount();

long totalSize  = response.getAccountBytesUsed();

return new FilesAccountInfo(totalSize,nContainers);

}

else {

throw new FilesException("Unexpected return from server", response.getResponseHeaders(), response.getStatusLine());

}

}

finally {

if (method != null) method.abort();

}

}

else {

    throw new FilesAuthorizationException("You must be logged in", null, null);

}

}


HttpPost

 /**
 Object Metadata 정보를 수정할 때 HttpPost를 사용한다.
*/  
public boolean updateObjectMetadataAndManifest(String container, String object, 

Map<String,String> metadata, String manifest) throws FilesAuthorizationException, 

HttpException, IOException, FilesInvalidNameException {

        FilesResponse response;

        //로그인이 되어 있는지 체크한다.

if (!isLoggedin) {

    throw new FilesAuthorizationException("You must be logged in", 

    null, null);

}
        //수정될 Container가 있는지 체크한다. 

if (!isValidContainerName(container))

throw new FilesInvalidNameException(container);     
 
       //수정될 Object가 있는지 체크한다.

if (!isValidObjectName(object))

           throw new FilesInvalidNameException(object);


//Post 될 Url를 생성한다.

String postUrl = storageURL + "/"+FilesClient.sanitizeForURI(container) +

"/"+FilesClient.sanitizeForURI(object);

HttpPost method = null;

try {

          method = new HttpPost(postUrl);

        if (manifest != null){

        method.setHeader(FilesConstants.MANIFEST_HEADER, manifest);

        }

  method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut);

  method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken);
                //HttpPost에 파라메터, 헤더, metadata값을 추가한다. 

  if (!(metadata == null || metadata.isEmpty())) {

  for(String key:metadata.keySet())

  method.setHeader(FilesConstants.X_OBJECT_META+key, 

  FilesClient.sanitizeForURI(metadata.get(key)));

  }
                //HttpPost를 HttpClient로 실행한다. 

HttpResponse resp = client.execute(method);

response = new FilesResponse(resp);

if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {
                        //인증이 되지 않았으면 처음부터 다시 실행한다. 

method.abort(); 

if(login()) {

method = new HttpPost(postUrl);

  method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut);

  method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken);

  if (!(metadata == null || metadata.isEmpty())) {

  for(String key:metadata.keySet())

  method.setHeader(FilesConstants.X_OBJECT_META+key, 

  FilesClient.sanitizeForURI(metadata.get(key)));

  }

    client.execute(method);

}

}

return true;

} finally {

if (method != null) 

method.abort();

}

}


HttpPut

 /**
 Container를 생성할 때 HttpPut 메소드를 사용한다.
*/   
public void createContainer(String name) throws IOException, HttpException, FilesAuthorizationException, FilesException

{
        //우선 로그인이 되었는지 먼저 체크한다. 

if (this.isLoggedin())

{
                //생성가능한 container명인지 체크한다. 

if (isValidContainerName(name))

{
                        //해당 storageUrl로 container 생성을 요청할 준비를 한다.

HttpPut method = new HttpPut(storageURL+"/"+sanitizeForURI(name));

method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut);

method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken);

try {
                                // 준비된 요청을 실행한다.

FilesResponse response = new FilesResponse(client.execute(method));    

              if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {

              // 402 인증이 안되었을 경우

            }


          if (response.getStatusCode() == HttpStatus.SC_CREATED)

         {
                                        //  201 Container 생성 성공

          return;

         }

         else if (response.getStatusCode() == HttpStatus.SC_ACCEPTED)

         {

         // 202 이미 Container가 있을 경우

         }

         else {

        // 기타는 에러로 간주

         }

}

finally {

method.abort();

}

}

else

{

throw new FilesInvalidNameException(name);

}

}

else {

    throw new FilesAuthorizationException("You must be logged in", null, null);

}

}



HttpDelete

  /**
 Container를 삭제할 때 HttpDelete 메소드를 사용한다.
*/  
public boolean deleteContainer(String name) throws IOException, HttpException, FilesAuthorizationException, FilesInvalidNameException, FilesNotFoundException, FilesContainerNotEmptyException

{
        //로그인이 되었는지 체크한다. 

if (this.isLoggedin())

{
                //삭제 가능한 Container명인지 체크한다. 

if (isValidContainerName(name))

{
                        // 해당 storageURL로 container를 삭제할 준비를 한다. 

HttpDelete method = new HttpDelete(storageURL+"/"+sanitizeForURI(name));

try {

method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut);

  method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken);
                                // 준비된 요청을 실행한다.

        FilesResponse response = new FilesResponse(client.execute(method));


          if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {

        // 402 인증이 안되었을 경우 

        }


          if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT)

       {

       // container가 삭제되었다.

         return true;

       }

       else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND)

       {
                           //삭제 할 container가 없을 경우 

       logger.debug ("Container does not exist !");

       

       }

       else if (response.getStatusCode() == HttpStatus.SC_CONFLICT)

       {
                           //삭제 할 container가 empty가 아닐 경우 에러를 발생한다.

       logger.debug ("Container is not empty, can not delete a none empty container !");

       }

}

finally {

method.abort();

}

}

else

{

        throw new FilesInvalidNameException(name);

}

}

else

{

    throw new FilesAuthorizationException("You must be logged in", null, null);

}

return false;

}


 
Posted by 나리 짱!!! naleejang
Java2012.02.08 12:57
요즘은 Restful이 유행이다. 통신을 하기 위해서 가장  부하가 적은 웹서비스이기 때문이다. Java에서 요즘 가장 많이 사용하는 것이 Spring Framework 와 함께 Apache CXF를 가장 많이 사용한다. 그다음에 사용하는 WebService로는 Apache AXIS 이다. 둘다 Apache에서 나온 프로젝트이기 때문에 오픈소스라고 볼 수 있다. 라이센스는 걱정하지 않고 사용하기만 하면 되는 것이다. 

Apache CXF : http://cxf.apache.org

위의 Apache CXF 홈페이지를 방문하면 다운로드 뿐만 아니라 좀 더 자세한 정보를 알아 낼 수 있다. 

Apache AXIS :  http://axis.apache.org/axis2/java/core/ 

AXIS 역시 홈페이지를 방문하면 Install 가이드 및 자세한 정보를 확인 할 수 있다.
 
Apache CXF 설치

Eclipse에서 Maven Project를 생성 후 Pom.xml에 Apache CXF 를 추가한다.



환경설정

Web.xml에 다음과 같이 Servlet을 추가합니다.

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>SimpleJaxs</display-name> <context-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/beans.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener>

<servlet> <servlet-name>CXFServlet</servlet-name> <servlet-class> org.apache.cxf.transport.servlet.CXFServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
</web-app> 



web.xml 환경설정이 끝나면 beans.xml를 생성한다.

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xmlns:jaxrs="http://cxf.apache.org/jaxrs"

  xmlns:cxf="http://cxf.apache.org/core"

  xsi:schemaLocation="

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://cxf.apache.org/jaxrs

http://cxf.apache.org/schemas/jaxrs.xsd

http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd">


  <import resource="classpath:META-INF/cxf/cxf.xml" />

  <import resource="classpath:META-INF/cxf/cxf-extension-jaxrs-binding.xml" />

  <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />


 <jaxrs:server id="CxfService" address="/Service">

    <jaxrs:serviceBeans>

    <ref bean="DemoBean" />

    </jaxrs:serviceBeans>

  </jaxrs:server>

  

  

  <bean id="DemoBean" class="demo.jaxrs.server. DemoCxf " />


Server 프로그램 샘플
 
그럼 이번에는 Server Program 를 생성해 보도록 하겠다.

package demo.jaxrs.server;
import javax.ws.rs.Consumes;

import javax.ws.rs.DELETE;

import javax.ws.rs.GET;

import javax.ws.rs.POST;

import javax.ws.rs.PUT;

import javax.ws.rs.Path;

import javax.ws.rs.PathParam;

import javax.ws.rs.Produces;

import javax.ws.rs.core.Response;
 

@Path("/DemoCxf/")

public class  DemoCxf {

        @GET

@Path("/getMsg/{gubun}")

public String getMsg(@PathParam("gubun") String _gubun)
        {

return "hi"+ _gubun;

}

        @POST
        @Path("/AddData/{gubun}/{data}")
        public String addData(@PathParam("gubun") String _gubun, @PathParam("data") String _data)

        {
                String data = _data;
                return "true";
        }



Client 프로그램 샘플

Server 프로그램을 생성했으면 Client 프로그램을 생성해야 한다.

import org.apache.cxf.jaxrs.client.WebClient;

 public class DemoCxfClient {
       public String getMsgClient( String serverUrl) 

{

WebClient client = WebClient.create(serverUrl);

                String gubun = "1"; 

String result = client.path("/CxfService/DemoCxf/getMsg").accept("application/xml").get(gubun);

return result;

}

        public String addDataClient( String serverUrl, String data) 

{

WebClient client = WebClient.create(serverUrl);
                String gubun = "1"; 
                String data = "test_data";   

String result = client.path("/CxfService/DemoCxf/addDataClient").accept("application/xml").post(gubun, data);

return result;

}

 
 
샘플 코드에서 나는 Rest의 두가지를  샘플로 코딩하였다. 바로 @GET 과 @POST이다. 이번에는 Rest 방식에 대하여 설명하도록 하겠다.

@GET 
   특정 구분자에 의한 값을 조회할때 
@POST
   새로운 데이터를 저장하거나 생성할 때
@PUT
   저장되어 있는 데이터를 변경할 때
@DELETE
   저장되어 있는 데이터를 삭제할 때
@HEAD
   조회하고자 하는 데이터의 메타데이터를 확인 할 때
@OPTION 
   지원 메소드를 체크할 때 
Posted by 나리 짱!!! naleejang