본문 바로가기

전체 글56

안드로이드 방향 전환 안드로이드 액티비티는 고유의 생애주기를 가지고 있다.안드로이드의 화면 방향이 전환이 되면 액티비티는 소멸되었다가 다시 생성되게 된다. 화면이 전환될 때 콜백 메소드의 호출 순서를 살펴보면1.onSavedInstanceState() - 현재 액티비티 상태 저장(EditText에 입력중인 텍스트 같은)2.onPause()3.onStop()4.onDestroy()5.onStart()6.onRestoreInstanceStae() - 액티비티 상태 복구7.onResume() 액티비티의 방향이 전환될 때 방향 변화에 대응할 수 있도록 해주는 속성을 같이 정의해주면, 방향이 변하더라도 액티비티가 소멸되지 않는다. 대신에 onConfigurationChanged(Configuration) 메소드가 호출되면서 환경이 바.. 2018. 12. 6.
안드로이드 컴포넌트 안드로이드 어플리케이션은 어떤 구조를 가지고 있는지 살펴보자. 안드로이드 구조는 사용자가 눈으로 보면서 상호작용을 하는 컴포넌트 - Activity , Notification이 있고, 눈에 보이지 않거나 백그라운드에서 실행되는 컴포넌트 - Broadcast Receiver, Content Provider, Service가 있다.intent와 notification은 안드로이드의 컴포넌트라고는 할 수 없지만 매우 밀접한 연관이 있으므로 같이 다룬다. 애플리케이션은 이들 컴포넌트의 여러 구성요소로 이루어져 있고 이들을 서로 호출하기 위해서는 intent를 사용한다. Activity액티비티는 애플리케이션의 한 화면을 뜻한다. 또한 실제 사용자와 소통하여 상호작용하는 컴포넌트이다. 안드로이드는 메모리 관리를 위.. 2018. 12. 6.
안드로이드 AlaramManager 안드로이드 백그라운드 작업먼저 첫번째 분류로서 처리하는 작업의 실행 시점에 따라서 1)당장 실행되어야 하거나2)설정한 조건에 맞으면 실행이 되거나로 나눌 수 있다. 두번째 분류는 작업의 결과가1)항상 작업이 실행이 되어야 한다.2)경우에 따라서 실행이 되지 않을 수 있다. 두 가지 기준에 따라서 사분면으로 나눌 수 있다.상황에 따라서 적절한 백그라운드 작업을 실행해야 한다. 초기에 안드로이드의 백그라운드 작업은 어렵지 않았다. 개발자는 필요에 따라 브로드캐스트 리시버로 앱을 깨우는 것도 가능했고 iOS와 대비되는 차이점이기도 했다. 그러나 장점이 높은만큼 앱들이 각자 백그라운드 작업을 돌린다면 안드로이드의 한정된 메모리와 CPU자원을 소모하게 되고, 안드로이드는 리눅스 커널과 다르게 스왑 공간이 없고 O.. 2018. 12. 5.
자바의 NIO 기존의 자바I/O 는 느리다는 편견이 존재했다. Blocking 방식 때문이었을까. FileReaderPrintReaderFileWriterPrintWriter위와 같은 클래스는 쓰기 어려움은 없이 I/O 작업은 할 수 있었지만, 커널 버퍼를 직접 접근하는 Direct Buffer를 핸들링 할 수 없었다. 소켓이나 파일에서 Stream이 들어오면 커널 버퍼에 쓰여지게 되는데, 자바 코드에서 이를 접근할 수가 없었기 때문. 커널에서 JVM 내부로 옮겨와야 하는 오버헤드로 인해 속도 이슈가 있었다. 세부적인 이유는JVM 내부로 복사할 때 CPU 사용(디스크에서 커널버퍼로 복사하는 과정은 CPU가 하지 않고 DMA가 해준다.) 복사 Buffer 사용 후 GC를 통해 정리(GC의 대상이 된다.)쓰레드 Block.. 2018. 12. 5.
Android Material CalendarView 안드로이드에서 제공하는 기본 캘린더는 날짜를 다중 선택할 수가 없고, custom 하기에는 제한적이다. Material CalendarView 오픈소스 라이브러리를 활용해보자. https://github.com/prolificinteractive/material-calendarview 위 주소에서 사용방법을 볼 수 있다. 프로젝트에 적용해서 활용했던 기능은 다음과 같다. widget = findViewById(R.id.calendar_access_search); widget.setCurrentDate(new Date(System.currentTimeMillis())); widget.setDateSelected(new Date(System.currentTimeMillis()), false); widget... 2018. 12. 5.
안드로이드 Camera의 영상 출력하기 항상 정리되지 않았던 부분이라 짚고 넘어간다. 이번 장의 목표는 Camera 영상을 저번에 만든 Surface에 뿌려주는 것. SurfaceView의 코드에서 Camera 객체를 추가하여 preview까지 하는 코드를 우선 살펴보자. public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback { SurfaceHolder mHolder; Camera mCamera; public MySurfaceView(Context context) { super(context); mHolder = getHolder(); mHolder.addCallback(this); } @Override public void surfaceCreated(.. 2018. 12. 5.
Android SurfaceView SurfaceView란? SufaceView라는 이름에서 알 수 있듯이 Textview나 ImageView처럼 내용을 표시할 수 있는 View이다. SurfaceView에서 직접 내용을 뿌려주지는 않고, SurfaceHolder를 통해 데이터를 받아서 처리한다. Android Thread편에서 알 수 있듯이 안드로이드의 모든 컴포넌트에서 동작하는 행위들은(View처리) Android의 UI 쓰레드에서 동작한다. 그러나 Camera Preview나, 동영상 재생 같은 처리들은 1초에 몇 십 프레임을 출력해야하는 제법 무거운 작업들이고 Android UI 혼자 감당하기에는 자원이 부족, 이는 곧 치명적인 ANR이 발생하는 원인이 된다. SurfaceView는 UI 쓰레드와는 별도로 백그라운드 쓰레드에서 동작.. 2018. 12. 4.
응용 계층 : 애플리케이션에 데이터 전송하기 웹 페이지를 볼 때는 크롬같은 웹 브라우져를 사용하고, 메일을 보내고 받을때는 Outlook 같은 메일 프로그램을 사용하게 된다. 여기서 응용계층은 OSI의 5계층 세션 계층과 6계층 표현 계층도 포함한다. 응용계층에서는 주로 사용자 측(클라이언트)의 요청을 전달하기 위해 통신 대상(서버) 등이 이해할 수 있는 메세지(데이터)로 변환하고 전송 계층으로 전달하는 역할을 한다. 이때 응용 계층의 프로토콜을 사용한다. 웹 사이트를 볼 때는 HTTP , 파일을 전송할 때는 FTP , 메일을 보낼 때는 SMTP , 메일을 받을때는 POP3라는 프로토콜을 사용한다. 또한 네트워크에서 컴퓨터나 네트워크 장비에 붙여진 이름을 기반으로 IP주소를 알아내는 것을 이름해석이라고 하는데, 이를 위해 DNS를 사용한다. 웹 서.. 2018. 12. 2.
OSI 7계층 ​ 더 안외워진다. 응, 표, ... 뭐? 2018. 12. 1.
실력이 부족한 주니어 개발자의 이직기(1) 연봉도 나름 중요한 요소겠으나, 3년 이내의 주니어 개발자에겐 큰 의미는 없다고 생각한다. 그리고 이 3~5년을 어떻게 보내느냐가 전체 개발 커리어와 연봉을 좌우할 수도 있기 때문에 신입 개발자가 성장할 수 있는 환경 조성은 매우 중요하다. 나는 첫 회사를 SI는 아니고 그렇지만 SI같은 회사에서 약 1년 8개월정도 근무하고 있다.대학교 4학년때 내로라 하는 IT기업들을 모두 도전했으나 코딩테스트와 기술면접의 벽을 넘지 못한 상황이었다. 그러다가 지금 회사의 대표님을 어찌어찌 알게되었고 외주를 받아 앱을 개발하던 중, 적당한 연봉에 입사 제안을 해주신터라 일단 경험이라도 쌓자! 하고 덜컥 입사를 하게 된다. 회사 상황에 대해 자세히 적지는 않겠으나 연구소라 불리는 개발팀에서 나는 신입 개발자로서 항상 '.. 2018. 11. 21.
안드로이드 쓰레드(1) 목표1.안드로이드 쓰레드에 대해 알아본다.(정의, 메인쓰레드가 동작하는 방식, 필요한 이유, ANR)2.핸들러, 루프, 메세지 큐 등에 대해 알아본다.3.Message와 Runnable에 대해 알아본다.4.HandlerThread 클래스에 대해 알아본다.5.AsyncTask에 대해 간략히 알아본다. 5.쓰레드 구현 방법에 대해서 알아본다.(Thread 클래스 상속, Runnable 인터페이스 구현) 안드로이드 멀티쓰레딩안드로이드와 같은 클라이언트 프로그래밍에서 가장 복잡하고도 중요한 부분은 여러 쓰레드에서 실행되는 코드를 작성해야 하는 경우이다.공식 안드로이드 문서에서는 "기본적으로 같은 애플리케이션의 모든 컴포넌트는 같은 프로세스 및 쓰레드(메인 쓰레드 혹은 UI쓰레드)에서 실행된다." 라고 말한다. .. 2018. 11. 12.
트랜잭션 목표1.트랜잭션의 개요2.트랜잭션의 특성(ACID)2.동시성 제어3.회복 트랜잭션 개요항공기 예약, 은행, 신용카드 처리 등에서는 대규모 데이터베이스를 수백, 수천명 이상의 사용자들이 동시에 접근한다. 많은 사용자들이 동시에 서로 다른 부분 또는 동일한 부분을 접근하면서 데이터베이스를 사용하는 것이다. 동시성 제어란 동시에 수행되는 트랜잭션들이 데이터베이스에 미치는 영향은, 이들이 순차적으로 수행되었을때의 영향과 같도록 보장하는것을 말한다. 다수 사용자가 데이터베이스를 동시에 접근해서 사용하더라도 데이터베이스의 일관성을 유지하는 것이다. 회복이란 데이터베이스를 갱신하는 도중에, 시스템이 고장나도 데이터베이스의 일관성을 유지하는것을 말한다. 데이터베이스 시스템에서 볼 수 있는 몇 가지 트랜잭션의 예를 보자.. 2018. 10. 31.
뷰(VIEW) 목표1.뷰에 대해서 알아본다. 뷰(View)관계 데이터베이스에서 뷰는 일종의 가상 릴레이션을 의미한다. 뷰는 기존의 기본 릴레이션에 대한 SELECT문의 형태로 정의된다.사용자는 여러 개의 릴레이션과 뷰를 사용할 수 있으며, 릴레이션으로부터 데이터를 검색하거나 갱신할 수 있는 동적인 창의 역할을 한다.스냅샷이란 어느 시점의 SELECT문의 결과를 기본 릴레이션의 형태로 저장해놓은 것이다. 어떤 시점의 조직체의 현황, 예를 들어 몇년, 몇월 시점에 근무하던 사원들의 정보, 재고 정보 등이 스냅샷으로 정의될 수 있음. 또한 뷰는 뷰와 다른 기본 릴레이션의 조합으로도 만들어질 수 있다. 뷰를 만드는 예시를 보자. 이렇게 뷰를 정의해놓고, 뷰에 대해서 질의를 날렸을때 DBMS는 어떻게 처리를 할까?먼저 시스템 .. 2018. 10. 31.
데이터베이스 정규화 목표1.정규화의 개요2.함수적 종속성3.릴레이션 분해4.제 1정규형, 제 2정규형, 제 3정규형, BCNF 정규화(Normalization)부주의한 데이터베이스 설계로 제어할 수 없는 데이터 중복을 야기하여 여러가지 갱신이상을 유발한다. 데이터베이스 정규화를 통해 주어진 릴레이션 스키마를 함수적 종속성과 기본 키를 기반으로 분석하여, 원래의 릴레이션으로 분해함으로써 중복과 세 가지 갱신이상을 최소화 하는것이다. 그렇다면 좋은 데이터베이스란 무엇일까? 정보의 중복과 갱신 이상이 생기지 않고, 정보의 손실을 막으며, 실 세계를 훌륭히 표현했으며, 애트리뷰트들 간의 관계가 잘 표현되는것을 보장하며 어떤 무결성 제약 조건의 시행을 간단하게 하여 효율성까지 고려하는것을 말한다. 갱신이상(Update anomaly.. 2018. 10. 30.
데이터베이스의 인덱스 목표1.단일 단계 인덱스에 대해 알아본다.2.다단계 인덱스에 대해 알아본다. 3.인덱스 선정 지침과 데이터베이스 튜닝에 대해 알아본다. 단일 단계 인덱스 만일 데이터베이스 접근을 오직 순차적으로만 한다면 인덱스는 필요하지 않을것이다. 인덱스된 순차 파일은 인덱스를 통해 임의의 레코드를 접근할 수 있는 파일이다. 단일 단계 인덱스의 각 엔트리는 로 구성된다. 따라서 인덱스를 잘 활용하면 쿼리의 응답시간이 빨라진다.엔트리들은 탐색 키 값의 오름차순으로 정렬된 상태이다.인덱스는 기본적으로 데이터 파일으 10% 내외의 크기를 가지므로 순차탐색시 훨씬 빠르게 찾을 수 있으며 정렬되어 있으므로 이진 탐색을 이용할 수 있다. 인덱스는 데이터 파일과는 별도로 다른 파일에 저장된다.(당연히 크기는 데이터 파일에 비해 훨.. 2018. 10. 28.
SQL 목표 1.SQL의 개요에 대해서 알아본다.2.DDL을 살펴보고 무결성 제약조건을 이해한다.3.DML의 여러 조건과 예시를 살펴본다.4.트리거(Trigger)와 주장(Assertioin)에 대해서 이해한다. SQL의 개요 SQL(Structed Query Language)은 현재 DBMS 시장에서 관계 DBMS가 압도적인 우위를 차지하는 중요한 요인중 하나이다. 다양한 상용 DBMS마다 지원하는 SQL은 다소 차이가 있으며 여기서 다루는SQL은 SQL2를 따른다.SQL은 비절차적 언어(선언적)으로 사용자는 자신이 원하는 바(what)만 명시하며, 원하는 것을 처리하는 방법(How)는 명시할 수 없다. 대화식SQL과 내포된SQL이 있는데 대화식 SQL을 다룬다. DDL과 무결성 제약조건 *스키마를 생성과 제.. 2018. 10. 28.
메모리 관리 전략(2) 목표1.세그멘테이션에 대해서 알아본다.2.페이징 기법에 대해서 알아본다.3.메모리 관리 전략에 대한 차이를 알아본다. 세그멘테이션 배경사용자가 인식하는 메모리의 모습과 실제 물리 메모리의 모양은 같지 않다. 물리적 특성을 고려하여 프로그래머가 메모리를 관리하는 방식은 효율적이진 않다. 그래서 프로그래머가 인지하는 메모리의 모습을 실제 물리 메모리의 모습으로 변환해주는 기법을 제공한다. 시스템은 메모리 관리하는데 있어서 더 많은 자유로운 선택을 할 수 있고, 프로그래머 또한 자연스러운 프로그래밍이 가능하다. 기본방법프로그래머는 메모리를 일부는 명령어를 저장하고, 나머지는 데이터를 저장하는 바이트의 배열로 생각하는가? 아니다. 프로그래머들은 가변적인 길이를 가진 세그먼트의 집합 그리고 세그먼트 사이에는 어떤.. 2018. 10. 28.
관계 데이터 모델과 제약조건 목표 1. 관계 데이터 모델에 대해 알아본다.2.릴레이션(테이블)의 특성과 키에 대해 알아본다.3.무결성 제약 조건에 대해 알아본다. 관계 데이터 모델 관계 데이터 모델은 현재까지 제안된 데이터 모델 중 가장 단순한 개념의 모델이며 가장 널리 쓰이고 있다. 바탕이 되는 데이터 구조로서 간단한 테이블을 사용하고 중첩된 구조가 없다. 숙련되지 않은 사용자도 쉽게 접근할 수 있으며 관계 데이터베이스 설계와 효율적인 질의 처리 면에서 장점을 가지기 때문이다. 조금 더 살펴보자.-동일한 구조(테이블) 관점에서 모든 데이터를 논리적으로 구성한다.-선언적 질의를 통해 데이터에 접근한다.-응용 프로그램과 데이터베이스 내의 레코드의 순서는 무관하다. -사용자는 원하는 데이터(what)만 명시하고 어떻게 찾을 것인가(ho.. 2018. 10. 27.