티스토리 뷰

개발자 배배/Android

[Beacon] 5. Login 구현 :: retrofit

사연있는 배배 2017. 2. 13. 03:49

 

beacon 시행착오를 본격적으로 시작하기 전에 기본 뼈대도 맞출겸, 

잠시 코딩하며 쉬어갈겸해서 로그인을 구현해봤는데 생각만큼 쉽진 않았다. 

수많은, 크고 작은 error들과 마주했고, 구글링 생각 구글링 생각 끝에 결국 해냈다. 

 

지금부터 하나하나 정리해 보려 한다. 

 


 

< 1. UI > 

 

 

 

 

 

우리가 필요한 정보들만 받을 수 있도록 간단하게 구성했다. 

 

 


 

 

< 2. Retrofit 통신 >

 

 : android client와 server와 http통신으로 RESTful하게 통신하기 위해 retrofit을 사용했다. 

(속도면에서나, 빈도수면에서나 가장 강력한것 같다.)

 

1) Internet permission


<uses-permission android:name="android.permission.INTERNET"/>

 

 

 

2) Service Interface

: retrofit에서 중요한 역할을 담당하는 service api가 먼저 정의되어 있어야 한다. 

-> 이때 중요한 점은, (POJO class로 선언된) return받는 class의 '변수명'은 반드시 서버가 보내주는 JSON파일의 'key값'과 이름을 맞춰줘야 한다는 것! 


public interface ServiceApi
{
    @FormUrlEncoded
    @POST(LOGIN_ADDITIONAL_URL)
    Call<LoginResult> login(@Field("user_id") String id,  // 얘네는 server에서 받을 data들. (server에서 받을때는 'request.body.user_id'로!)
                            @Field("user_pw") String pw); // 얘네는 server에서 받을 data들.

    @FormUrlEncoded
    @POST(REGISTER_ADDITIONAL_URL)
    Call<RegisterResult> resister(@Field("res_email") String res_email, // email을 id로 사용
                                  @Field("res_pw") String res_pw,
                                  @Field("res_birth") String res_birth,
                                  @Field("res_address") String res_address,
                                  @Field("res_phone") String res_phone
    );
}

 

 

 

 

3) 초기화 & 사용

: retrofit은 동기/비동기 방식 모두 지원한다. 

(최근 version부터 interface가 아닌 받아오는 함수로 synchronous/asynchronous를 구분하게 되었다고 한다.)

/** < retrofit2 : POST > **/

// 1. for logging (okhttp log)
//Here a logging interceptor is created
logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);

//The logging interceptor will be added to the http client
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.addInterceptor(logging);

// 2. retrofit setting
retrofit = new Retrofit.Builder()
.client(httpClient.build()) // okhttp client for logging
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();

// 3. 받아온거 뽑아내기 (동기)

new Thread(new Runnable()
{
@Override
public void run()
{
try {
loginRes = res.execute().body().getLoginResult();

// test log
if(loginRes != null)
{
if (loginRes.equals(LOGIN_QUERY_ERROR)) {
Log.i("TEST", "Login query error.. " + "loginRes값 : " + loginRes);
} else if (loginRes.equals(LOGIN_SUCCESS)) {
Log.i("TEST", "Login 성공! " + "loginRes값 : " + loginRes);
} else if (loginRes.equals(LOGIN_FAILURE)) {
Log.i("TEST", "중복된 아이디.. " + "loginRes값 : " + loginRes);
}
} else {
Log.i("TEST", "Login 실패.. ");
}

} catch(IOException ie) {
ie.printStackTrace();
}
}
}).start();

// 3. 받아온거 뽑아내기 (비동기)
res.enqueue(new Callback<LoginResult>() {
@Override
public void onResponse(Call<LoginResult> call, Response<LoginResult> response) {
Log.d("LOGIN", "서버통신 성공!(받아오기)");
loginRes = response.body().getLoginResult();
}

@Override
public void onFailure(Call<LoginResult> call, Throwable t) {
Log.d("LOGIN", "서버통신 실패..");
//loginRes = LOGIN_FAILURE;
loginRes = LOGIN_SUCCESS; // 조작
}
});

 

 

 

4) Server 

: 서버코드는 사실 좀더 복잡한데, 보기쉽게 핵심적인 부분만 가져왔다. 

 

서버에서 JSON으로 받게 되는데, 'req.body.user_id' 이런식으로 body에서 빼오게 되며, 

이때 'user_id'는 interface에서의 @Field의 parameter 이름과 같아야 한다! 

 

위에서 언급했듯이, 여기서의 'login_res'는 POJO class의 변수명과 이름을 맞춰줘야, 받는 client가 알아보고 받아올 수 있다. (ex) String login_res; 등) 

 

 

 

 

5) Testing

: 다음과 같이 송수신을 확인할 수 있다. 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함