본문 바로가기

공부일지

231213 (Android)

안드로이드에서 데이터 입출력

  • 요청 → 데이터로 컨트롤러가 응답을 처리(resp가 처리)
  • REST API : 안드로이드와 데이터베이스 중간을 연결해주는 미들웨어를 말한다.

안드로이드 미들웨어 연동하기

  1. manifests.xml에 내용을 추가한다.
    • <**uses-permission android:name="android.permission.INTERNET"**/>
      • 앱이 인터넷을 사용한다는 것을 명시한다.
      • 안드로이드는 3단계 위험도 구분이 있고, 인터넷은 낮은 권한으로 가능하다.
      • 카메라는 사용자 허가가 필요하다.
    • android:usesCleartextTraffic="true"
      • application 태그 내부에 작성한다.
      • http 프로토콜을 사용하도록 한다.
      • 안드로이드는 보안상 이유로 기본값으로 http 요청을 막아두었다. https만 사용 가능
      • https는 SSL, TLS 등 암호화된 정보를 주고받는다.
      • 기본값으로 암호화 된 정보를 사용하지 않고 암호화 되지 않은 정보를 사용한다.
  2. 라이브러리 추가
    • Retrofit : HttpClient 처리를 쉽게 가능하게 하는 라이브러리(Volley, OkHttp 등)
    • Retrofit에 사용할 스칼라 컨버터 : 데이터를 단일 String으로 양쪽이 표준을 맞춘다.
    • Gson : 어떤 객체, 데이터를 전부 Json으로 쉽게 바꾸게 해준다. Json을 객체로 바꾸는 역할도 해준다.
    // <https://mvnrepository.com/artifact/com.squareup.retrofit2/retrofit> 레트로핏 코어
        implementation group: 'com.squareup.retrofit2', name: 'retrofit', version: '2.9.0'
    
        // <https://mvnrepository.com/artifact/com.squareup.retrofit2/converter-scalars> 레트로핏 스칼라 컨버터 단일행 데이터를 받기 위한 컨버터 중 가장 간단함
        implementation group: 'com.squareup.retrofit2', name: 'converter-scalars', version: '2.9.0'
    
        // <https://mvnrepository.com/artifact/com.google.code.gson/gson> Json 변환하기 위한 라이브러리
        implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.9'
    

retrofit 사용

  • 데이터 입출력을 위한 메소드를 인터페이스에 만들어서 사용한다.
  • 콜백을 위한 메소드를 만들고 요청할 url(매핑), 파라메터 타임을 지정한다.
public interface ApiInterface{
        //@GET("users/{user}/repos")
        //Call<List<Repo>> listRepos(@Path("user") String user);
		@FormUrlEncoded //@Url을 같이 사용해야만 가능하다. 어노테이션이 없는 경우 동작이 불가능하다.
    @POST
    Call<String> getData(@Url String url, @FieldMap HashMap<String, Object> params);

//get 방식의 메소드
		@GET("{mapping}")
    Call<String> clientGetMethod(@Path("mapping") String url, @QueryMap HashMap<String, Object> params);
}

  • 레트로핏 객체를 생성해 줄 메소드를 static으로 생성한다.
  • baseurl은 웹 프로젝트의 기본 주소를 나타낸다.
  • 레트로핏 컨버터 스칼라를 사용하기 때문에 컨버터 팩토리를 추가한다.
    • String Json을 사용 가능하게 한다.
public static Retrofit getApiClient(){
        Retrofit retrofit = new Retrofit.Builder()//레트로핏 빌더로 레트로핏 객체 생성
                .baseUrl("<https://192.168.0.57/mid/>")//요청을 전송할 url을 지정. 내 톰캣 프로젝트
                .addConverterFactory(ScalarsConverterFactory.create())//String Json 사용이 가능해진다.
                .build();
        
        return retrofit;
    }
  • 사용할 클래스에서 ApiInterface를 service라는 이름으로 선언하고 ApiClient의 스태틱 메소드인 getApiClient.create를 사용하여 초기화 한다.
  • getData()의 내부에 서블릿 매핑에 해당하는 url과 같이 보낼 파라메터를 넣어준다.
  • 데이터를 요청할 때 service.getData().enqueue()를 사용하여 비동기로 요청을 처리할 수 있다.
    • excute는 동기화 처리기 때문에 앱이 정지될 수 있다. 사용 x
  • enqueue의 파라메터로 콜백 메소드를 생성하고 오버라이딩 처리를 한다.
    • onResponse : 응답이 있는 경우의 처리를 한다.
    • onFailure : 응답이 없는 경우의 처리를 한다.
ApiInterface service = ApiClient.getApiClient().create(ApiInterface.class);
service.getData("aaa.and", params).enqueue(new Callback<String>() {
            @Override
            public void onResponse(Call<String> call, Response<String> response) {
                //응답이 있는 경우
                
            }

            @Override
            public void onFailure(Call<String> call, Throwable t) {
                //응답이 없는 경우
            }
        });
  • 안드로이드에서 JsonString을 생성하기 위한 코드이다.
String jsonData = new Gson().toJson(vo);
  • 서블릿에서 요청시 받은 json String을 해석할 때 사용하는 코드이다.
MiddleVO vo = new Gson().fromJson(req.getParameter("andParam"), MiddleVO.class);

옵저버 패턴의 순서

  1. 응답을 위한 메소드를 가진 인터페이스를 하나 만든다.
  2. public interface CdCallBack { public void onResult(boolean isResult, String data);//MainActivity에서 new로 생성 후 CommonConn의 결과가 onResult를 실행하도록 한다. }
  3. onExcute 메소드의 파라메터로 인터페이스를 넣어준다.
  4. public void onExcute(CdCallBack callBack)
  5. 메소드의 성공, 실패에서 콜백 메소드가 실행되도록 한다.
  6. callBack.onResult(true, response.body());
  7. 호출한 위치에서 콜백 인터페이스를 이용한 메소드를 작성한다.
  8. new CommonConn(this,"cd.cd").onExcute(new CommonConn.CdCallBack() { @Override public void onResult(boolean isResult, String data) { Log.d("Common", "onResult: "+data); Log.d("Common", "onResult: "+isResult); } });

Glide

  • url을 이용하여 이미지를 붙이는 툴
  • 그래들을 통해 디펜던시를 추가해준다.
  • 주의점 : wrap_content 사용 시 오류가 발생할 수 있기 때문에 사용하지 않도록 한다.
Glide.with(this)
                .load("<https://i1.ruliweb.com/ori/17/04/23/15b9a751497159acd.gif>")
                .error(R.drawable.ic_launcher_foreground)//에러 발생
                .fallback(R.drawable.ic_launcher_background)//null 반환시
                .into(binding.imgvLogo);

'공부일지' 카테고리의 다른 글

231220 (Spring)  (0) 2023.12.20
231219 (Android)  (0) 2023.12.20
231211 (Android)  (0) 2023.12.11
231206 (Android)  (0) 2023.12.06
231205 (JavaScript)  (1) 2023.12.05