728x90
반응형
1. Android Recyclerview
- ListView와 RecyclerView의 차이가 무엇인가요?
- 둘 다 리스트를 나타내는 뷰라는 점은 동일하다. 데이터가 저장되어 있는 아이템들을 화면에서 리스트로 출력해주며 스크롤 기능을 통해 모든 데이터들을 보여준다.
- RecyclerVIew는 강제로 ViewHolder를 사용하여 뷰를 재활용함
- ListView는 스크롤을 내려서 새로운 아이템이 화면에 출력될 때마다 새 객체를 생성해야하고 이로 인해 과부하가 온다는 단점이 있어 RecyclerView가 이 단점을 보완하고자 만들어진 뷰이다. 새로운 아이템이 화면에 등장하면 이전에 사용했던 ( 화면 밖으로 사라진) 객체를 재활용하는 방식으로 이 문제를 해결
- RecyclerVIew는 ArrayAdapter가 아닌 Adapter를 따로 만들어 다양한 화면 가능
- Item에 대한 뷰의 변형이나 애니메이션할 수 있는 개념이 추가됨
- ListView에 ViewHolder를 넣을 수 있을까요?
- YES!! 리스트뷰에서 뷰홀더(ViewHolder Pattern) 패턴을 사용하면
- 리스트뷰에서 리스트의 개수가 많은 상황에서 findViewById를 통한 XML 리소스 접근이 빈번할 경우 성능저하가 발생하기 때문에 View 객체를 ViewHolder에 홀드시켜 성능을 개선
- Adapter
- ListView는 ArrayAdapter 제공, Recyclerview는 강제로 adapter 만들어야함
- 기존의 ListView에서 사용하는 Adapter와 같은 개념으로 데이터와 아이템에 대한 View 생성
- ViewHolder
2. Android HTTP 통신
- Restful API란?
- Representation State Transfer의 약자
- 웹상에 존재하는 모든 자원에 URI를 부여하여 사용하는 방법이다. (비연결성, URI로 자원에 접근)
- HTTP 웹 표준을 이용하며 http의 캐싱을 활용 할 수 있다는 장점이 있다. 그리고 구조가 명확하여 클라이언트와 서버에서 개발해야할 부분이 명확해지고 Uri만 봐도 어떤 요청인지 파악될 수 있게직관적이다라는 특징이 있습니다.
- RESTful API 이용한 통신 에러 발생 시 retry 등은 어떻게 처리하셨나요?
- RESTful API 의 정의와 활용법에 대해 설명해주세요.
- OkHttp와 Retrofit 차이점, 장단점
- Http vs. Https*Http **: Hypertext transfer protocol, 웹 서버와 사용자의 인터넷 브라우저 사이에 문서를 전송하기 위한 통신규약. 인터넷에서 하이퍼텍스트를 교환하기 위해 사용되는 통신규약.Https : http하고 거의 같지만 모든 통신 내용을 암호화. s가 secure socket, 안전한 통신망을 뜻함.암호화는 TLS라고 하여 Transport계층에서 이루어짐. L4의 전송계층에서 암호화가 이루어짐.https암호화를 하려면 웹 서버에 부하가 생김(암호화 과정 때문에 https가 더 느림), 비용이 비쌈.그래서 아무나 봐도 상관없는 페이지는 http로, 남에게 보이면 안되는 금융 정보나 메일 등 중요한 것은 https로 하는 것이다. GMail은 https를 지원한다.
- http는 비연결형으로 웹 페이지를 보는 중 인터넷 연결이 끊겼다가 다시 연결되어도 페이지를 계속 볼 수 있지만 https는 소켓(데이터를 주고받는 경로) 자체에서 인증을하기 때문에 인터넷 연결이 끊기면 소켓도 끊어져서 다시 https 인증을 해야한다. 그래서 시간이 또 걸린다.
- 근데 왜 http써?
- 패킷이 암호화 되어 있기 때문에 패킷캡쳐 프로그램으로 캡쳐를 해도 암호화된 내용만 보임.
- http에는 사용할 수 있는 메소드가 여러 가지 있다. HEAD, GET, POST, DELETE, OPTION등
- 공통점: 둘다 인터넷을 이용하는 프로토콜
- POST vs. GET
- GET : URL 마지막단에 ‘?’ 문자를 기준으로 모든 파라미터를 전달, 주소창에 값이 노출되기에 PW와 같은 민감한 정보를 전송하면 안됨,
- POST : 전달하려는 정보가 HTTP body 에 포함되어 전달 -> 사용자에게 직접적으로 파라미터 노출 X
- 길이에 제한 없음, 서버 혹은 DB의 값이나 상태를 바꿀 때 사용
- Sdk, Rest Api 차이 (카카오지도, 카카오로컬)
- SDK는 Software Development Kit
- 일반적으로 소프트웨어 기술자가 사용하여 특정한 소프트웨어 꾸러미
- SDK에는 소프트웨어를 개발하기 위한 실제 코드가 있으며 사용자가 사용할 수 있다.
- API는 Application Programming Interface
- 응용 프로그램에서 사용할 수 있도록 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스(환경)
- 쉽게 데이터베이스나 기능을 사용할 수 있도록 모듈화하여 만들어 두었다. API 사용자는 (아마도 개발자) A에 대한 정보가 필요할 때
DB에 접속하여 정보를 가져오는 것이 아닌getInfo같은 API를 통해 정보를 가져오게 된다(수정, 삭제 등) - B의 상황에선 가 API를 등 코드를 작성하는 방법, 정보를 받기 위해선 어떤 매개변수를 넘겨야 하는 지 등에 대한 정보를 제공하며 그 이후에 어떤 작업을 진행해야 하는지는 사용자의 몫
- REST는
- HTTP 프로토콜의 모범사례
- HTTP URI를 통해 서버의 주소에 접근하고, HTTP Method 행위을 적용하여, 적절한 표현으로 응답받음
- 자원: HTTP URI를 통해 자원(Resource)을 명시하고
- 행위: HTTP Method(POST, GET, PUT, DELETE)를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것을 의미
- 표현(json, xml): 서버의 응답방식
- SDK는 Software Development Kit
- REST API
- 남의 컴퓨터를 실행시키는 방법
- HTTP 프로토콜의 모범사례를 사용하는방법
- 등록된 키 해시와 일치하는 앱에서만 지도 API를 사용할 수 있기 때문에 반드시 등록해주세요 라고 나와있는데 여기서 키 해시를 등록하는 이유는?
- 민감한 정보일 수도 있는 앱의 사이닝 키(signing key)값이 아닌 그 값을 해시한(특히 SHA-1 함수를 통해) hash key를 통해 인증된 사용자인지 여부를 판단(무분별한 트래픽을 방지)
- 해시를 통한 사용자 인증의 장점은 해시값이 노출되어도 해시값만 가지고는 원본 데이터를 추론할 수 없기 때문
- https://manorgass.tistory.com/76
- Retrofit ?
- REST API 통신을 위해 구현된 OkHttp 라이브러리의 상위 구현체
- Callback을 통해 Main Thread에서 UI 업데이트 가능
- 장점
- 빠른 성능
- Okhttp는 AsyncTask를 사용 (AsyncTask의 3~10배의 성능차이)
- 간단한 구현
- HttpUrlConection : Connection / Input&OutputStream / URL Encoding 생성 및 할당의 반복작업
- OkHttp : 쿼리스트링, Request / Response 반복 설정 작업
- 가독성
- 동기/비동기 쉬운 구현
- 빠른 성능
- Retrofit 장점
- Retrofit 구성요소
- DTO (POJO) : 'Data Transfer Object', 'Plain Old Java Object' 형태의 모델(Model) / JSON 타입변환에 사용
- Interface : 사용할 HTTP CRUD동작(메소드) 들을 정의해놓은 인터페이스
- CRUD (Create/Read/Update/Delete) -> HTTP Method ( POST / GET / PUT / DELETE )
- Retrofit.Builder 클래스 - Interface를 사용할 인스턴스, baseUrl(URL) / Converter(변환기) 설정
- Json
- 데이터를 표현 표준
- 중괄호(객체), 대괄호(배열) 콜론(키, 벨류)
- Gson
- json object → Java object, Java object → json object 를 쉽게 해줌
3. Android 스레드 통신
- 스레드를 사용해야하는 이유
- 외부 Thread 가 없이 Main Thread 만으로만 구현하게 된다면, 이러한 문제가 생긴다. 어떠한 버튼을 눌렀을 때 Main Thread 내부적으로 10초 이상이 걸리는 작업을 한다고 치면, 사용자는 그 일이 끝날 때까지 멈춰있는 화면만 보고 있어햐 한다. 그렇기 때문에 개발자는 오래 걸리는 작업들을 외부 Thread를 통해 백그라운드 처리하지 않으면 ANR(Android Not Responding)을 보게 될 것이다.
- 스레트 통신종류
- AsyncTask
- Thread(Looper, Handler)
- Thread풀
- 코루틴
- rxjava
- AsyncTask deprecated 된 이유 - here
- 메모리누수(액티비티 종료시점과 어싱크가 끝나는 시점이 다르) 순차 실행으로 인한 속도저하 예외처리 메서드 없음 실행 순서가 보장되지 않음
- Thread간 통신방법에 대해 설명두 개 이상의 스레드를 사용할 때의 동기화 이슈를 차단하기 위해 Looper와 Handler를 사용
- Handler를 이용
- Thread 와 AsyncTask 의 다른점은 무엇인가?
- 스레드가 수행되기 위해서는, 메인 스레드에서 분리하여 실행된다. 그러나 스레드를 취소하는 것은 우아하게(elegantly) 되지 않는 경우가 많고, 안드로이드 설정이 변경되는 것을 처리할 수 없다. 또한 스레드에서는 UI를 변경할 수 없다. 자바의 메소드이다.
- AsyncTask 는 5ms 보다도 짧은 작업을 처리 할 수 있다. 또한 스레드와는 다르게 UI를 업데이트 할 수 있는 부분이 있다. 하지만 무겁고 다양한 작업들을 수행한다면 퍼포먼스는 저하된다. 안드로이드 라이브러리에 있는 메소드이다.
- Handler란?
- 핸들러는 스레드를 관리하기 위한 객체이다. 핸들러는 메세지를 받거나 처리하는 방법을 정의할 수 있다. 그들을 액티비티 라이프사이클 외에서 사용할 때에는 사용한 뒤 적절히 해제(Cleaned up) 시켜줘야 한다. 그렇지 않으면 메모리 누수(thread leaks)가 발생할 것 이다.
- 핸들러는 메인스레드와 백그라운드 스레드 혹은 백그라운드 스레드 사이의 커뮤니케이션을 가능하게 한다.
- 핸들러는 몇초나 몇분 단위로 정기적으로 해야하는 백그라운드 작업을 수행하는데 선호된다.
- Looper란?
- Looper는 스레드간의 신호이므로 handler에 보낸다고 해서 곧바로 처리되는 것이 아닙니다. 동시다발적으로 메세지가 발생할 수 있기 때문에 메세지 큐(Message Queue)에 쌓았다가 처리합니다. 큐(Queue)에 들어있는 내용을 하나하나 꺼내 처리하는 놈이 바로 루퍼입니다.
- 핸들러 스레드인 메인 스레드가 looper를 가지고 있으며 무한 루프를 돌며 큐의 내용을 처리합니다.
- Thread Pool 이란 ?
- new Thread() 생성해서 사용
- 몇개의 분리된 스레드에서 사용할 때 효율적으로 하는 방법은 무엇일까요 ?
- Executor의 클래스를 통해 thread 기능별 분리하여 처리
- background thread 에서 UI thread 접근하는 방식
- 1) Handler + Looper.getMainLooper()
- 일반적인 쓰레드간 상호작용하는 방법인 Handler/Looper 이용
- new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { // UI 스레드 작업 imageView3.setImageBitmap(bitmap); } });
- 람다식으로 간단하게 표현하면 다음과 같다
- new Handler(Looper.getMainLooper()).post(() -> imageView3.setImageBitmap(bitmap));
- 2) Activity.runOnUiThread
- UI 쓰레드의 메시지큐에 작업을 전달(post)하는 방법 activity 인스턴스에 액세스할 수 있는 경우에 사용
- runOnUiThread(new Runnable() { @Override public void run() { // UI 스레드 작업 imageView3.setImageBitmap(bitmap); } });
- 람다식으로 간단하게 표현하면 다음과 같다
- runOnUiThread(() -> imageView3.setImageBitmap(bitmap));
- 3) View.post(Runnable) API
- UI 쓰레드의 메시지큐에 작업을 추가
- 해당 view 객체에 접근가능한 경우 사용
- 4) AsyncTask
- 쓰레드나 Handler에 대한 지식없이 백그라운드 작업 후 UI 쓰레드에서 화면갱신 작업을 처리할 수 있게 코드를 단순화해주는 유틸리티 클래스
- 이제 안쓰는 방식
- 1) Handler + Looper.getMainLooper()
- 서비스와 스레드의 차이점 - here
- Process LifeCycle - here
- 멀티스레드를 사용할 때 주의할 점에 대해 설명해주세요.
- 스레드간 통신방법에 대해 설명해보세요.
728x90
반응형