본문 바로가기
SW - 안드로이드

안드로이드스튜디오 스터디 _ 네트워킹 - (웹으로 요청하기) HTTP Thread

by 상승남 2019. 1. 5.
728x90
반응형

본 글은 네이버 edwith 안드로이드 부스트코스 과정을 듣고

학습내용을 반복 및 복습 학습의 장으로서 메모하고자 합니다.


저는 코딩 강의를 들으면서 듣지만 이해가 안되며 들리지 않아

금방 졸리게 되어 지속적으로 공부하기가 힘들었습니다.


가장 큰 이유는 강사분이 말씀하시는 언어 및 단어의 해석자체가

안되기 때문이라고 생각하였습니다.


그래서 모든 설명을 일반적인 언어로 변화 하여 알기 쉽게하여

저같은 비전공자 및 디자이너가 쉽게 이해할 수 있는 수준의 자료로

만드는 것이 목표 입니다.



들어가기 전에

앱에서 웹서버에 요청하는 방식은 표준 자바를 이용해 요청할 때와 크게 다르지 않습니다.

다만 스레드를 사용해야 한다는 점을 꼭 기억해야 합니다.

웹으로 요청을 하고 응답을 받으면 응답 데이터를 확인하여 화면에 보여줄 수 있습니다.

그리고 그 응답 데이터는 웹페이지일수도 있고 일반 데이터일 수도 있습니다.

웹브라우저에서는 보통 웹페이지를 응답으로 받아 보여주지만 앱에서는 화면을 이미 보여주고 있으므로 데이터만 받아 화면에 있는 뷰에 데이터를 표시하는 경우가 많습니다.

그러면 앱에서 HTTP로 요청하고 응답을 받는 방법에 대해 알아봅시다.


학습 목표


  1. 웹으로 요청하고 응답을 받는 방법에 대해 이해
  2. 응답을 받은 데이터를 화면에 표시하는 과정을 이해


핵심 단어

  • 웹 (Web)
  • HttpURLConnection



학습의 나온 내용 
  1. 웹은 HTTP(표준 프로토콜) 라고 불린다.

  2. 웹 사용의 장점
      - 데이터의 방식 (표준으로 정해져 있는 방식 사용) 
          -> 빠른 제작 가능 
          -> 문제에 대한 빠른 파악의 장점

    3. 웹 사용의 단점
        - 보안에는 취약 (해킹의 위험) 
          -> 보안에 대한 강화 시키는 방법 적용 필요
          -> 필요시 보안 강화에 대한것도 제작 가능

  4. HTTP 라는 웹방식 요청 방법
         - HttpURLConnection 이라는 것을 사용

                    -> 가장 단순하고 가장 기본적인 방법
            -> 안드로이드 에서 가장 기본적인 클래스

              코드양이 많아지는 불편함 존재
             *  일일히 스레드를 만들며 핸들러를 써야 되는 경우 발생

          - HttpURLConnection 단점 극복 방법

            -> 라이브러리라는 것을 사용
            -> OkHttpvolley라는 라이브러리 사용
             
              라이브러리 사용시 스레드를 신경 안쓰도록 도와준다.
             volley 라이브러리가 대표적
             *  때문에 실제 앱 제작라이브러리를 구성하는 경우가 많다.

  5. textView.append()적용
       의미 : 추가를 해준다.
       - 메서드 호출 시 안드로이드 메인화면에서 만든 영역(스크롤뷰 등) 한줄 씩 
         내용을 추가가 가능하게 해준다.

public  void pritln(String data){

textView.append(data + "|n" );

// append() 추가를 해준다.
}


  6. Thread 상속
       - 스레드를 상속해서 만들 시 run 메서드가 기본적으로 들어가 있어야 된다.
         ex) class RequestThread extend Thread{}

class RequestThread extends Thread{
@Override
public void run() {
}
}

     7. Http 요청  

        - printStackTrace() 
            이 메소드를 호출하면 메소드가 내부적으로 예외 결과를 화면에 출력한다. 
            printStackTrace는 가장 자세한 예외 정보를 제공한다.

        - openConnection()
           URLConnection 객체를 생성해준다. URLConnection 클래스는 추상 클래스이기
           때문에 객체를 생성할 수 없고, URL 클래스의 openConnction() 메서드를 이용
           해서 객체를 생성할 수 있다.
            
           * URLConnection 클래스
              URLConnection클래스는 원격 자원에 접근하는데 필요한 정보를 가지고 있다.
              필요한 정보란 원격 서버의 헤더 정보, 해당 자원의 길이와 타입 정보, 언어등을
              얻어 올 수 있습니다. URL 클래스는 원격 서버 자원의 결과만을 가져 오지만,
              URLConnection 클래스는 원격 서버자원의 결과와 원격 서버의 헤더 정보를
              가져 올 수 있습니다. 

            URLConnection 클래스의 생성
               URLConncetion 클래스는 추상 클래스이기 때문에 단독적으로 객체를 생성 
               할 수 없습니다. URL 클래스의 객체를 생성해서 URL 클래스의  
               openConnection()메서드를 이용해서 객체를 생성해야 됩니다. 
               URLConnection객체가 생성 되었다면 URLConnection 클래스의 
               connect()메서드를 호출해야 객체가 완성 됩니다. 


  class RequestThread extends Thread {
@Override
public void run() {

String urlStr = editText.getText().toString(); // 사용자가 입력한 정보가 보인다.
//urlStr 이라고 하는 문자열로 받아본다.

try {
URL url = new URL(urlStr); //Exception이 발생 할 수 있어 try catch로 묶어 준다.
HttpURLConnection conn = (HttpURLConnection) url.openConnection();

// URL 이라는 객체가 만들어지면 url.openConnection()이라는 메서드를 호출해서
// HttpURLConnection으로 리턴 받을 수가 있다.
// HttpURLConnection으로 캐스팅해서 받아봅니다.

} catch (Exception e) {
e.printStackTrace();
} //문자열이 있으면 이것을 가지고 URL 객체를 만들 수가 있다.
}
}
 URL url = new URL(urlStr); //Exception이 발생 할 수 있어 try catch로 묶어 준다.
HttpURLConnection conn = (HttpURLConnection) url.openConnection();

if(conn != null){
conn.setConnectTimeout(10000); //10초 동안 응답이 없으면 끝내는 형태
conn.setRequestMethod("GET");
conn.setDoInput(true); //서버로 부터 받는것
conn.setDoOutput(true); //서버로 보내는 것 // 입력과 출력이 다 될 수 있도록
     
  7. HttpURLConnection   

        - setConnectTimeout(숫자입력 여기서 1000 = 1초이다.) 
            (초)동안 응답이 없으면 끝낸다.

        - setRequestMethod()
                HttpURLConnection로 요청시 GET 방식과 POST방식이 있다.
            
            사용법은
            HttpURLConnection.setRequestMethod("GET")
            HttpURLConnection.setRequestMethod("POST")
            두가지 이다.

            setRequestMethod("GET")라고 하면 GET 방식으로 요청 하겠다는 뜻.
            
         setDoInput(true)
              서버로 부터 받는것 

         setDoOutput(true)

              서버로 보내는것   // 위 값이 (true)일 경우 입력과 출력이 다 될 수 있다.

          - getResponseCode()
               이 지점에서 호출하면 이때 연결을 하게 된다.
               여기서 res코드라는 것이 리턴이 된다.
               res코드가 정상적이라면 그 코드를 확인 후 한줄 씩 읽어 화면에다가 출력
               할 수 있다.

          - HttpURLConnection.HTTP_OK
            이 지점에서 호출하면 이때 연결을 하게 된다.

  int resCode =  conn.getResponseCode();// 라는것 호출하면 이때 연결을 하게 된다.
//리턴되는 것은 res코드라는 것이 리턴이 된다.
// res코드가 정상적이라면 그 코드를 확인 후 한줄 씩 읽어서 화면에다가 출력할 수 있다.
if(resCode == HttpURLConnection.HTTP_OK);
            - getInputStream()
             들어오는 데이터를 받을 수 있는 통로를 만들 수 있게 된다.


          - BufferReader
             Reader라고 하는 것은 바이트 배열이 아니라 문자열로 처리 할 수 있으며
             한줄씩 읽어들일 수 있는 것이 BufferReader이다.   

         - close()
             


          - disconnect()

 8. Android.Mainfest.xml 인터넷 권한 추가

    HTTP를 사용하기 위해서는  Android.Mainfest.xml 에다가 인터넷 권한을 추가
    해주어야 된다.

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

10.final
public void pritln(final String data) {

handler.post(new Runnable() {
@Override
public void run() {
textView.append(data + "|n");
} //data 라고 접근을 못하는데 final를 붙여주면 바깥에 있는게 상수처럼 접근이 된다.
});
// append() 추가를 해준다.
}
 
 data는 접근을 못하지만 final를 붙여주면 바깥에 있는게 상수처럼 접근이 된다.

11. 핸들러와 스레드 신경 안 쓰는 방법

      라이브러리 사용 OkHttp 와 Volley 라이브러리 사용 (상황에 맞게 사용)


 
 
학습 후기

총 20분 정도 강의 이지만 상당하게 모르는 단어가 많이 나왔습니다.
이전에는 모르는 단어가 나와도 그냥 흘려들어서 따라치는 학습하기에 바빴습니다.

이번에는 학습방법을 바꾸어 단어를 이해하도록 찾기 위해 리서치를 하였습니다.
모든 단어를 이해하기 위하여 20분 강의지만 의미를 알기위해 총 3~4시간의 학습시간
을 소요 한것 같습니다. 그렇지만 단순히 강의의 말을 듣고 넘어갔을땐 잠이 오고 무엇을
배웠는지 모르게 되는 상태가 되었지만 이해를 통해 학습이 된 뿌듯함을 가지게 되었습니다.

강사분이 말씀하시는 단어가 이해가 안된다면 잠시 일시정지를 하여 그에 대한 단어를
구글링을 하여 다른 사용자가 사용하는 부분과 강사분이 말씀하신 단어의 뜻을 찾아 이해하여야 제 지식이 되는 것 같았습니다.

저 같은 비전공자 이신분은 그냥흘러 듣는것 보다 오래걸리지만 말씀하시는 단어 하나
하나 자신이 이해할 수 있는 언어로 체득하는 것이 자신의 지식에 도움이 되실 것 
같습니다.

감사합니다.
                           






반응형

댓글