2015년 11월 16일 월요일

안드로이드 http통신 retrofit 2.0

retrofit은 http통신모듈로서 android에서 많이 사용한다고 합니다.

  • 파싱 & value object로의 변환이 편하고
  • template 방식으로의 사용
  • 동기 & 비동기 지원

의 장점을 뽑을 수 있을 것 같습니다.
spring framework를 공부하면서 동시에 개발하고 있는데 사용방식이 많이 유사함이 느껴집니다.

2.0을 기준 입니다.

저의 환경으로는  json으로 서버와 값을 주고 받게 됩니다.

기본적인 튜토리얼은 http://square.github.io/retrofit/ 를 참고했습니다.

먼저 라이브러리 추가. (GRADLE)


compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
//json파싱을 위한 주입
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
//xml파싱을 위한 주입
compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta1'

value object 작성

public class test {
    private String ret;

    public String getRet() {
        return ret;
    }

    public void setRet(String ret) {
        this.ret = ret;
    }
}

Service작성


public interface TestService {
    @FormUrlEncoded
    @POST("/test")
    public Call<test> retroTest(@Field("param") String aa);
}


어노테이션을 몇개 정리.
@POST("상세주소")를 이용하여 상세 주소를 설정합니다.
@GET/PUT/DELETE등도 사용가능합니다.
@HEARs를 이용해서 헤더 설정도 가능하고

@FormUrlEncoded을 사용하여 x-www-form-urlencoded를 설정하고
@Multipart를 이용한 파일전송 등도 설정 가능합니다.

동기/비동기 방식이 1.9버전에서는 선언하는 방식이 서로 달랐는데 2.0버전에서는 두가지의 차이가 없습니다. 사용에 따라서 동기/비동기가 나눠지는데 아래 설명하겠습니다.


Service생성 및 반환

public class repo {
    public TestService getService(){
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://192.168.25.24:8080")
                .addConverterFactory(GsonConverterFactory.create())
//              .addConverterFactory(SimpleXmlConverterFactory.create())
                .build();
        TestService service =  retrofit.create(TestService.class);
        return service;
    }
}

baseUrl을 설정하고, 저는 json만을 사용하기 때문에 GsonConverterFactory만 설정하였고 xml을 사용하시려면 SimpleXmlConverterFactory까지 설정 하시면 됩니다.

getService()를 이용하여 TestService에 대한 설정,생성,반환을 받습니다.

동기방식 사용

String result = null;
TestService service = new repo().getService();
Call<test> c = service.retroTest("aa");
try {
    result = c.execute().body().getRet();
} catch (IOException e) {
    e.printStackTrace();
}
위 방식은 동기방식 입니다. Call<test>를 받은 이후 실행(execute) -> 결과(body)를 하게 되면 위의 결과는 test객체에 담겨져 오게 됩니다.

비동기방식 사용

final String[] result = {null};
TestService service = new repo().getService();
Call<test> c = service.retroTest("aa");
c.enqueue(new Callback() {

    @Override
    public void onResponse(Response response, Retrofit retrofit) {
        result[0] = response.body().getRet();
    }

    @Override
    public void onFailure(Throwable t) {
        result[0] = "false";
    }
});
위 방식은 비동기방식 입니다. Call<test>를 받은 이후 enqueue를 통해 구현합니다.
onResponse를 통하여 결과값을 받을 때 처리, 즉 callback방식으로의 처리를 하게 됩니다.

위의 방법으로 안드로이드(또는 다른 java플렛폼)에서 사용을 간단하게 http통신을 하게 됩니다.

2015년 11월 9일 월요일

[spring] - mongo 에러처리

mongodb의 특성상 처리에 대한 결과를 신경 쓰지 않는다.

즉, 삽입에서의 성공, 실패에 대한 처리가 불가능가능하지 않다.

 결과를 리턴받는 것은 필요한 기능이고 당연 기능을 제공한다. 하지만 spring에서든 node에서든 이러한 성격에 따라 결과를 신경쓰지 않는 것을 따기 때문에 default 설정으로 그냥 넘기게 된다.

xml 설정의 mongoTemplate의 설정 부분을 바꾸면 된다.
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
    <constructor-arg ref="mongo" />
    <constructor-arg value="oman" />
    <property name="writeResultChecking" value="EXCEPTION"/>
</bean>


value로 설정 할 수 있는 값은 3가지다.
none, exception, log



  • none
    • default 설정 값으로 아무런 행동도 하지 않는다. error를 던지지도 않고 로그로도 남기지 않는다.
  • log
    • 문제가 생길 경우 로그로 남긴다.
    • ....failed: E11000 duplicate key error index:........
  • exception
    • 예외처리가 되어 핸들링 할 수 있게 된다.
    • org.springframework.dao.DataIntegrityViolationException:.......