본문 바로가기

카테고리 없음

모의 면접 정리

sharedpreference란 앱의 데이터를 키값으로 저장 하도록 하는 안드로이드 클래스입니다
루팅을 통해 쉽게 정보가 보여집니다
그뿐만 아니라 동기적으로 작동하며 값을 읽거나 쓸 때 블로킹 될수 있습니다.
 ui 스레드에거 사용할 경우 응답성을 저하 시킬 수 있습니다
 

RESTful API 설계 원칙
웹 표준을 활용하여 시스템 간의 상호 운용성을 제공하는 방법입니다. REST는 자원(Resource)의 표현(Representation)에 의한 상태 전달을 의미하며, 웹의 기본적인 기술과 프로토콜을 사용합니다.

RESTful API의 핵심 원칙에는 자원의 식별, 메시지를 통한 자원의 조작, 자기 서술적 메시지, 애플리케이션 상태의 엔진으로서의 하이퍼미디어 등이 있습니다.
이러한 원칙을 통해 RESTful API는 플랫폼 독립적이며, 언어 독립적인 인터페이스를 제공합니다. 따라서, 다양한 환경에서의 상호 운용성이 보장됩니다.

첫째, 자원(Resource)의 식별입니다. 모든 자원은 고유한 URI를 가지며, 이를 통해 자원을 식별합니다. URI는 인터넷 상에서 자원을 고유하게 식별하고 위치를 지정하는 표준 방법이기 때문
둘째, 자원에 대한 행위는 HTTP 메서드(GET, POST, PUT, DELETE)를 통해 표현합니다. HTTP 프로토콜의 기본 메서드를 활용하여, 자원에 대한 CRUD(Create, Read, Update, Delete) 연산을 명확하게 표현할 수 있기 때문입니다.
셋째, 메시지는 자기 서술적이어야 합니다. 메시지 포맷과 HTTP 메서드 등을 통해 요청의 의도를 명확하게 할 수 있어야 합니다.
넷째, 애플리케이션의 상태는 Hypermedia를 통해 관리됩니다. 클라이언트는 Hypermedia 링크를 통해 애플리케이션의 상태를 전환할 수 있어야 합니다.


Retrofit 안드로이드 서버간의 REST API 통신을 도와주는 라이브러리로 OkHTTP에 기반을 두고 있는 통신 라이브러리
Retrofit 장점

가독성이 좋다 Annotation으로 HTTP 메소드를 정의함으로서 코드의 구현이 쉬워지며 개발자의 행위를 손쉽게 알아볼 수 있게 되어 직관적으로 코드를 설계할 수 있게 된다

쉬운 유지보수 : Retrofit은 서버 연동 시 주로 주고받는 데이터인 JSON,XML 작동을 파싱해주는 Converter연동을 지원해주기 때문에, 유지보수가 매우 편리하다

서버와 클라이언트 통신과정
서버 : 서비스를 제공하는 컴퓨터 
- 다수의 클라이언트에게 서비스를 제공하기 때문에 고사양의 하드웨어를 갖춘 컴퓨터이지만 사양과 관계없이 서비스를 제공하는 소프트웨어가 실행되는 컴퓨터르 서버라고 합니다

클라이언트 :  서비스를 사용하는 컴퓨터
- 서버와 이어진 모든 기기와 단말기에서 이용하sms 웹에 접근하는 SW이며 주로 서버에 요청을 보내고 응답을 받는 역할을 합니다.

클라이언트는 웹 브라우저를 통해 서버에 접속하고, 서버는 클라이언트의 요청에 알맞은 응답을 전달


Room
 Android  일부인 지속성 라이브러리이며 Room은 [SQLite]데이터베이스 위에 있는 추상화  라이브러리입니다.

SQLite는 특수 언어(SQL)를 사용하여 데이터베이스 작업을 실행합니다. SQLite를 직접 사용하는 대신 Room은 데이터베이스 설정과 구성, 상호작용 작업을 간소화합니다. Room은 SQLite 문의 컴파일 시간 확인도 제공합니다.
Room의 주요 3요소

1. **Entity**
    - 데이터 구조를 표현하기 위한 클래스입니다. DBMS에 이용되기 위한 **데이터를 위한 클래스로 테이블**이라고 생각하면 됩니다.
    - **@Entity 어노테이션으로 표현되는 클래스**
    - 클래스 내에 @PrimaryKey, @ColumnInfo 등의 어노테이션으로 변수 선언
2. **DAO(Data access objects)**
    - **실제 DBMS를 위해 호출되는 함수를 선언하는 인터페이스**입니다. 단지 인터페이스나 추상 클래스를 선언하고 추상 함수를 선언하면 이를 구현해 DBMS를 수행하는 코드는 자동으로 만들어집니다(Retrofit의 Service와 똑같음)
    - **@DAO 어노테이션으로 선언**
    - @Query, @Update, @Insert, @Delete 등의 어노테이션으로 함수 선언
3. **Database**
    - **데이터베이스 이용을 위한 DAO 객체 획득 함수를 제공하는 클래스**입니다. DAO 획득 함수는 추상 함수로 정의하며, 데이터베이스를 이용하기 위해 가장 먼저 호출됩니다.
    - **@Database 어노테이션으로 만드는 클래스**
    - 추상 클래스로 작성
    - Entity를 어노테이션 매개변수로 지정


SQLite와 Room을 비교했을 때,  Room을 사용하는 이유

SQLite는 특수 언어(SQL)를 사용하여 데이터베이스 작업을 실행합니다. SQLite를 직접 사용하는 대신 Room은 **데이터베이스 설정과 구성, 상호작용 작업을 간소화**합니다. Room은 SQLite 문의 컴파일 시간 확인도 제공합니다.

**SQLite vs ROOM**

- SQLite 는 쿼리에 대한 에러를 컴파일 타임에 확인할 수 없지만 ROOM 은 컴파일 타임에 SQL 에 대한 유효성을 검사 할 수 있다.
- SQLite 는 schema 가 변경이 될경우 SQL 쿼리를 수동으로 업데이트 해야하지만 ROOM 은 쉽게 해결이 가능하다.
- SQLite 는 java 데이터 객체를 변경하기 위해 많은 boilerplate code 를 사용해야 하지만 ROOM 은 boilerplate code 없이 매핑 가능하다.


Dao : 클래스를 DAO(Data Access Object)로 지정하는 annotation (기본적인 insert, delete,update SQL은 자동으로 만들어주며, 복잡한 SQL은 직접 만들 수 있습니다

주석을 뜻하지만 우리가 알고있는 그 주석보다 훨씬 강력한 녀석입니다. 주석과 다르게 특정 코드에 달아 어떤 의미를 부여하거나 기능을 주입할 수 있습니다.

Annotation 은 크게 3가지로 나누어 보려 합니다.

1. Kotlin/Android 에 내장되어있는 built in annotation
2. Annotation 에 대한 정보를 나타내기 위한 어노테이션인 meta annotation
3. 개발자가 직접 만드는 custom annotation
    1. Using Reflection
    2. Using Code Generation

**어노테이션 종류**

1. **@Database**
    - 데이터베이스 클래스를 정의할 때 사용합니다.
    - 데이터베이스에 포함될 엔티티와 버전을 명시합니다.
2. **@Entity**
    - 데이터베이스 내의 테이블을 정의할 때 사용합니다.
    - 클래스 이름이 테이블 이름으로 사용되며, 필드는 컬럼으로 매핑됩니다.
3. **@PrimaryKey**
    - 엔티티의 기본 키(primary key)를 정의할 때 사용합니다.
    - 유니크한 값이어야 하며, 데이터베이스 내에서 각 엔티티를 구분하는 데 사용됩니다.
4. **@ColumnInfo**
    - 테이블의 컬럼 정보를 세부적으로 정의할 때 사용합니다.
    - 컬럼의 이름, 타입, 인덱스 등을 설정할 수 있습니다.
5. **@Dao**
    - 데이터 접근 객체(Data Access Object)를 정의할 때 사용합니다.
    - 데이터베이스의 CRUD(Create, Read, Update, Delete) 연산을 위한 메소드를 포함합니다.
6. **@Insert**
    - 데이터를 삽입하는 메소드에 사용합니다.
    - 해당 메소드는 엔티티를 인자로 받아 데이터베이스에 추가합니다.
7. **@Query**
    - 복잡한 SQL 쿼리를 실행하는 메소드에 사용합니다.
8. **@Update**
    - 데이터를 업데이트하는 메소드에 사용합니다.
    - 인자로 받은 엔티티의 데이터로 기존 레코드를 갱신합니다.
9. **@Delete**
    - 데이터를 삭제하는 메소드에 사용합니다.
    - 인자로 받은 엔티티를 데이터베이스에서 제거합니다.
10. **@Transaction**
    - 메소드가 하나의 트랜잭션으로 실행되어야 함을 나타냅니다.
    - 여러 연산을 하나의 작업으로 묶어 실행할 때 사용합니다.
11. **@ForeignKey**
    - 엔티티 간의 외래 키 관계를 정의할 때 사용합니다.
    - 참조 무결성을 유지하는 데 도움을 줍니다.
12. **@Index**
    - 특정 컬럼에 인덱스를 생성할 때 사용합니다.
    - 쿼리 성능을 향상시키는 데 유용합니다.


Activity 생명 주기
- onCreate(): 액티비티가 생성될 때 호출되는 메서드입니다. 초기화 작업이나 인터페이스 설정 등을 수행합니다.
- onStart(): 액티비티가 화면에 보여지기 직전에 호출되는 메서드입니다. 액티비티가 사용자에게 보여지기 시작합니다.
- onResume(): 액티비티가 사용자와 상호작용을 시작하고 활동 상태에 들어갈 때 호출되는 메서드입니다. 액티비티가 포그라운드에 있으며 사용자 입력을 받을 수 있습니다.
- onPause(): 액티비티가 일시 중지되거나 다른 액티비티가 화면을 가리는 등 포그라운드에서 벗어나기 전에 호출되는 메서드입니다. 데이터 저장이나 네트워크 연결 해제 등의 작업을 수행합니다.
- onStop(): 액티비티가 더 이상 사용자에게 보여지지 않고 화면에서 완전히 가려질 때 호출되는 메서드입니다. 자원 해제나 정리 작업을 수행합니다.
- onRestart(): 액티비티가 onStop() 상태에서 다시 시작되기 전에 호출되는 메서드입니다. 일시 중지된 액티비티를 다시 시작할 때 필요한 초기화 작업을 수행합니다.
- onDestroy(): 액티비티가 소멸될 때 호출되는 메서드입니다. 액티비티에 할당된 자원을 해제하고 종료 작업을 수행합니다.


인텐트(Intent)
안드로이드의 기본 구성요소는 액티비티,서비스,브로드 캐스트 리시버,컨텐트 프로바이더가 있다 인텐트란 이러한 어플리 케이션의 구성요소 간의 작업 수행을 위한 정보를 전달하는 역할을 한다

인텐트는 메시징 객체로 다른 앱 구성 요소로부터 작업을 요청하는데 사용한다

인텐트는 명시적 인텐트와 암시적 인텐트 두가지로 구분 할 수 있는데

인텐트에 클래스 객체나 컴포넌트 이름을 지정하여 호출된 대상을 확실히 알 수 있는 경우에 **명시적 인텐트**    호출될 대상의 속성들을 지정했지만 호출될 대상이 달라질수 있는 경우에는 암시적 인텐트라고 합니다
   

Android 4대 컴포넌트는 Activity (액티비티), Service (서비스), Broadcast Receiver (브로드캐스트 수신자),  Content Provider (콘텐츠 제공자)** 이렇게 네가지가 있습니다

액티비티는 **액티비티는 사용자 인터페이스를 포함한 화면 하나**를 나타냅니다. 예를 들어 이메일 앱이라면 목록을 표시하는 액티비티가 하나 있고, 이메일을 작성하는 액티비티가 또 하나가 존재합니다. 

서비스는 서비스는 **백그라운드에서 실행되는 구성 요소**로, 오랫동안 실행되는 작업을 수행하거나 원격 프로세스를 위한 작업을 수행합니다.. 예를 들어 서비스는 사용자가 다른 일을 하는 동안에 백그라운드에서 음악을 재생하거나, 데이터를 가져옵니다.  -- 포그라운드에서 작업되나요

브로드캐스트 수신자는 브로드캐스트 수신자는 시스템이 정기적인 사용자 플로우 밖에서 이벤트를 앱에 전달하도록 지원하는 구성 요소입니다. **안드로이드 시스템이나 다른 앱으로부터 전송되는 브로드캐스트 메시지를 수신하는 구성 요소입니다.** 예를 들면 배터리 부족 경고, SMS 수진 등의 이벤트를 감지하고 처리하는 기능을 합니다.

콘텐트 제공자는 파일 시스템, 데이터베이스, 웹상이나 앱이 액세스할 수 있는 다른 모든 영구 저장 위치에 저장 가능한 앱 데이터의 공유형 집합을 관리합니다


MVVM 패턴
- View와 Model이 서로 전혀 알지 못하기에 **독립성을** 유지할 수 있다
- 독립성을 유지하기 때문에 효율적인 유닛테스트가 가능하다
- **View와 ViewModel을 바인딩하기 때문에 코드의 양이 줄어든다**
- View와 ViewModel의 관계는 N:1 관계이다
- **유닛테스트를 하기가 좋습니다. 그 이유는 ViewModel에는 UIKit 관련 코드가 없고 Controller와의 의존성도 없기 때문이다**유닛테스트(Unit Test)는 하나의 메서드의 특정 루틴을 검사한다.

동시에 데이터 수정시 공유데이터주위


DAO :Database에 접근하는 역할을 하는 객체.DTO :데이터를 전달하기 위한 객체 VO : 값 자체를 표현하는 객체 .Entity :실제 DB 테이블과 매핑이 되는 클래스.


프로세스가 메모리에 올라갈 때 운영체제로부터 시스템 자원을 할당받는다 이 때 운영체제는 프로세스마다 각각 독립된 메모리 영역을, Code/Data/Stack/Heap의 형식으로 할당해 준다. 각각 독립된 메모리 영역을 할당해 주기 때문에 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없다.
스레드는 메모리를 서로 공유할 수 있다고 언급했었다. 이에 대해 더 자세히 설명하자면, 프로세스가 할당받은 메모리 영역 내에서 Stack 형식으로 할당된 메모리 영역은 따로 할당받고, 나머지 Code/Data/Heap 형식으로 할당된 메모리 영역을 공유한다. 따라서 각각의 스레드는 별도의 스택을 가지고 있지만 힙 메모리는 서로 읽고 쓸 수 있게 된다.
차이
프로세스 끼리는 오류가 발생해 종료가 되도 간섭이 없지만 스레드 끼리는 종료가 되었을때 다른 스레드들도 모두 종료 된다

728x90