'2017/03/12'에 해당되는 글 3건

  1. 2017.03.12 Retrofit2. 2.사용방법 (Retrofit 2로 HTTP 호출하기)
  2. 2017.03.12 Retrofit2. 1.기본 개념
  3. 2017.03.12 Java. Annotation

[ Retrofit2. 2.사용방법  (Retrofit 2로 HTTP 호출하기) ]

 

1. 정의

    - Retrofit은 안드로이드와 Java 애플리케이션을 위한 라이브러리로, 안전한 타입(type-safe) 방식의 HTTP 클라이언트 이다. 이번 글에서는 Retrofit 2 HTTP 클라이언트의 사용 복잡성과 앱 적용 시의 유용성을 살펴볼 예정이다.

 

 

1. 네트워크 사용을 위해서 AndroidManifest.xml 에서 Internet Permission 을 허용해야 됨

 

 <manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>

 

 

2. Retrofit을 사용하기 위해서 build.gradle 파일에 라이브러리 추가

   - Retrofit2만 적용시

 

 dependencies {
    compile 'com.squareup.retrofit2:retrofit:2.1.0'

}

 

  - Retrofit2 + gson 적용시

 

 dependencies {
    compile 'com.google.code.gson:gson:2.7'
    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0' 
}

 

 

 

3. 모델 클래스 만들기(데이터 그릇)

 

 public class Contributor {
 
  String login;
  String html_url;
 
  int contributions;
 
  @Override
  public String toString() {
    return login + "(" + contributions + ")";
  }
}

 

4. HTTP 통신을 하기 위한 서비스 인터페이스를 생성

 

 public interface GitHubService {
 
  @GET("repos/{owner}/{repo}/contributors")
  Call<List<Contributor>> repoContributors(
      @Path("owner") String owner
      , @Path("repo") String repo);
}

 

5. Retrofit 객체를 GitHubService 에 생성

   기본적인 Retrofit 객체 생성 형태는 아래와 같지만,

 

 public static final Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://api.github.com/")
            .build();

.addConverterFactory(GsonConverterFactory.create());

는 받아오는 Json 형식의 데이터를 Java 객체 형태로 변환 또는 반대 형식으로 변환시켜주는 Gson 라이브러리를 사용해야하기 때문에 수정해야 됨.

 

 

 public interface GitHubService {
 
  @GET("repos/{owner}/{repo}/contributors")
  Call<List<Contributor>> repoContributors(
      @Path("owner") String owner
      , @Path("repo") String repo);
 
  public static final Retrofit retrofit = new Retrofit.Builder()
      .baseUrl("https://api.github.com/")
      .addConverterFactory(GsonConverterFactory.create())
      .build(); 
}

 

6. HTTP 호출

   동기적으로 HTTP 를 호출하기 위해서 인터페이스를 구현하고

   Call 호출하기 위한 형태는 아래와 같다.

 

 GitHubService gitHubService = GitHubService.retrofit.create(GitHubService.class);
 Call<List<Contributor>> call = gitHubService.repoContributors(“square”, “retrofit”);
 List<Contributor> result = call.execute().body();

 

 그러나 Android 에서는 MainThread(UI Thread) 에서 네트워크 통신을 할 수 없도록 되어 있다.
위의 형태로 돌릴 경우 아래와 같은 에러 메세지가 떨어지게 된다.

 

 02-04 19:32:55.190 1678-1678/com.example.jihoonryu.retrofit2_test E/AndroidRuntime:
 FATAL EXCEPTION: main
 Process: com.example.jihoonryu.retrofit2_test, PID: 1678
 android.os.NetworkOnMainThreadException

 

그렇기 때문에 AsyncTask 를 통해서 백그라운드 스레드에서 작동을 시켜야 한다.

 

- 동기(Synchronous)

 

new AsyncTask<Void, Void, String>() {
 
    @Override
    protected String doInBackground(Void... params) {
      GitHubService gitHubService = GitHubService.retrofit.create(GitHubService.class);
      Call<List<Contributor>> call = gitHubService.repoContributors("square", "retrofit");
     
    try {
        return call.execute().body().toString();
      } catch (IOException e) {
        e.printStackTrace();
      }
 
      return null;
    }
 
    @Override
    protected void onPostExecute(String s) {
      super.onPostExecute(s);
      TextView textView = (TextView) findViewById(R.id.textView);
      textView.setText(s);
    }
}.execute();

 

 Retrofit2 의 장점은 동기적이던 비동기적이던 구현하기 쉬움에 있다.
비동기적(Asynchronously) 으로 구현할 경우는 자체적으로 백그라운드 스레드를 타기 때문에 그냥 구현해주면 된다.

 

 -비동기(Asynchronous)

 

 

 GitHubService gitHubService = GitHubService.retrofit.create(GitHubService.class);
    Call<List<Contributor>> call = gitHubService.repoContributors("square", "retrofit");
    call.enqueue(new Callback<List<Contributor>>() {
      @Override
      public void onResponse(Call<List<Contributor>> call,
          Response<List<Contributor>> response) {
 
        TextView textView = (TextView) findViewById(R.id.textView);
        textView.setText(response.body().toString());
      }
 
      @Override
      public void onFailure(Call<List<Contributor>> call, Throwable t) {
 
      }
});

 

 

 

 

참고] http://devuryu.tistory.com/44


1. Realm / Retorift2로 HTTP 호출하기
2. Retrofit 한글 소개
3. Getting started with Retrofit 2
4. Retrofit 2.0: The biggest update yet on the best HTTP Client Library for Android

'[Android] - 개념 > Retrofit2' 카테고리의 다른 글

Retrofit2. 3. 참고 URL  (0) 2017.03.13
hanjul에 추가할 주석문장  (0) 2017.03.13
Retrofit2. 1.기본 개념  (0) 2017.03.12
Posted by 농부지기
,

[ Retrofit2. 1.기본 개념 ]

 

1. 사용이유

    - 안드로이드에서 HTTP 통신을 쉽게 할 수 있도록 해주는 라이브러리이다.

 

2. 이전 HTTP 통신 라이브러리

    - 이전 프로젝트에서는 Android Volley를 적용하여 개발하였음.

    - Volley 처음 적용시 설정과 구현을 통해 서버와의 통신을 하는데까지 복잡하고 손이 많이 간다는 느낌과  생각보다 조금 무겁다는 느낌  그리고 필요로 하는 기능보다 사용하지 않는 기능이 더 많다.

    - 그렇다고 Volley 가 안좋다는 것은 아니며 RequestQueue, NetworkImageView, DiskBasedCache를 이용하여 안정적이고 유용하게 쓸 수 있다.

 

 

Posted by 농부지기
,

[ Java. Annotation ]

 

 

 


어노테이션

설명

@SuppressWarnings

컴파일러가 일반적으로 경고하는 내용   내용은 제외시킬  사용

@Entity

퍼시스턴스화  클래스를 선언

@Table

DB 있는 테이블과 맵핑 시킨다.

@Data

 필드의 setter, getter 자동 생성

@EqualsAndHashCode

Equals  hashCode 함수를 만들어 

@JsonIgnoreProperties

클래스 내에 없는 필드가 json 존재할  에러 방지 설정 

@GeneratedValue

primary 컬럼에 고유값을 자동으로 생성 부여

@Id

 클래스의 어느 속성이 유일한 식별자 인지를 가리킴

@Enumerated

Java Enum class를 표현

@Column

컬럼 길이 제약과 같은 세부사항을 지정할  있게 

@Repository

해당 클래스에서 발생하는 DB 관련 예외를 spring DAOException으로 전환

@Service

비즈니스 로직이 들어가는 Service 등록이 

@Autowired

Spring 의존관계(DI) 자동으로 설정타입(by type)으로 연결

@Qualifier

동일한 타입의  객체들 중에서 특정 빈을 사용하도록 설정

@PostConstruct

의존하는 객체를 설정한 이후에 초기화 작업을 수행할 메서드에 수행

@PreDestory

컨테이너에서 객체를 제거하기 전에 호출  메서드에 적용

@Target

어디에 어노테이션을 넣을  있는지를 서술

@Retention

지속성을 설정어떻게 저장할 것인지

@Documented

어노테이션이 기본으로 javadoc  유사한 툴에 의해 문서화 되는 것을 나타냄

@AllArgsConstructor

모든 인자의 생성자를 자동으로 생성

@NoArgsConstructor

인자 없는 생성자를 생성

@MappedSuperclass

해당 어노테이션이 정의된 class 상속받은 entity에는 해당 컬럼이 자동으로 생성/매핑

@JsonSerialize

Annotation use for configuring serialization aspects, by attaching to "getter" methods or fields, or to value classes

@Value

프로퍼티값을 파라미터에 적용

@Configuration

스프링 IoC 컨테이너가 해당 클래스를  정의의 소스로 사용

@EnableAsync

스프링 XML 설정의 <task:annotation-driven> 대신해서 자바에 설정

@EnableScheduling

스프링 스케줄 task 실행을   있게 

@EnableTransactionManagement

스프링 XML 설정의 <tx:annotation-driven/> 대신해서 자바에 설정

@PropertySource

Property 파일을 Environment로 로딩

@EnableJpaRepositories

JPA repositories   있게 

@EnableAspectJAutoProxy

스프링 XML 설정의 <aop:aspectj-autoproxy/> 대신해서 자바에 설정

@ComponentScan

스프링 XML 설정의 <context:component-scan> 대신해서 자바에 설정

@Resource

어플리케이션에서 필요로 하는 자원을 자동 연결할  사용이름(by name)으로 연결

@Bean

스프링 XML 설정의 <bean /> 동일한 기능을 제공

@EnableTransactionManagement

스프링의 annotaion-driven 트랜잭션 관리기능을   있게 

@MapperScan

Mybatis mapper 등록을 자바에 설정

@ControllerAdvice

예외 발생시 작업을 처리할  있게 스프링 프레임워크 3.2에서 추가

@Controller

Spring MVC Controller 클래스 선언을 단순화 시켜줌

@RequestMapping

Url class 또는 method 맵핑 시켜주는 역할

@ResponseBody

HTTP body 부분만 전달 XML, JSON으로 출력   사용

@Api

Api 어떤 역할을 하는  표시

@ApiOperation

Api 기능을 표시

@ApiParam

Api에서 사용할 파라미터를 표시

@Aspect Spring은 자동적으로 @Aspect 어노테이션을 포함한 클래스를 검색하여 Spring AOP 설정에 반영
@Pointcut pointcut은 결합점(Join points)을 지정하여 충고(Advice)가 언제 실행될지를 지정하는데 사용 @Pointcut 어노테이션을 사용
@Before 메소드가 수행 전에 수행 된다.Before advice는 @Before 어노테이션을 사용
@After 메소드 수행 후 무조건 수행된다. After (finally) advice는 @After 어노테이션을 사용
@AfterThrowing 메소드가 수행 중 예외사항을 반환하고 종료하는 경우 수행된다. After throwing advice는 @AfterThrowing 어노테이션을 사용
@RestController @Controller + @ResponseBody *http://spring.io/guides/gs/rest-service/
@JsonInclude @JsonInclude(JsonInclude.Include.NON_EMPTY) 필드가 empty이거나 null 일 때 json으로 변환되지 않도록 함 *http://fasterxml.github.io/jackson-annotations/javadoc/2.0.5/com/fasterxml/jackson/annotation/JsonInclude.Include.html
@Transactional DB 트랜잭션관리를 위해 사용

 

@Transactional 을 붙였는 데 사용하지 못하는 경우,

1. innoDB 가 아닌 경우,

2. interface 가 없는 경우,

3. method 에 사용하였는 데, 해당 method를 같은 class 내부에서 호출하는 경우,

2, 3번 -> @Transactional을 사용하면 해당 class를 spring에서 다시 proxy 형태로 실행/관리 하기 때문.

 



출처: http://toma0912.tistory.com/9 [토마's 개발노트]

'자바(java) > 기본문법' 카테고리의 다른 글

C#-기술집 URL  (0) 2018.02.02
Servlet - Session관리  (0) 2017.02.02
Posted by 농부지기
,