saltfactory's blog


하이브리드 앱 개발을 할 때 UIWebView 에서 JavaScript 디버깅하기

서론

이전에는 Native 앱 (순수 Objective-C와 C 기반 라이브러리를 이용하여 만든 앱)을 주로 만들었다면, 최근 HTML5 앱 기술이 발달하고 자료가 많아지면서 Hybrid 앱 (웹 개발 기술과 클라이언트 개발 기술을 접목하여 개발하는 앱)이 큰 인기를 얻고 있다. 실제 앱을 개발하면서 느낀 것인데 각각의 장점을 충분히 살릴 수 있으면 어렵게 구현할수 밖에 없는 코드를 아주 효과적으로 개발할 수 있기도 한다. HTML은 Native 앱과 랄리 UIWebView 안에서 HTML, Javascript, CSS로 개발이 되어 렌더링되기 때문에 순수 Objective-C로 개발한 것 보다는 속도가 느리지만 유연하고 상대적으로 개발하기 편리한 언어로 C의 복잡함을 단순하게 구현할 수 있다. 또한 웹 언어로(HTML, Javascript, CSS)로 개발된 코드는 다른 디바이스에서 재사용성이 가능하기 때문에 이론적으로는 코드 재사용성의 장점도 가지고 있다. 왜 이론적이라고 이야기하냐면 사실 각각 디바이스마다 가지고 있는 내장 브라우저 앤진의 해석능력이 다르기 때문에 100% 호환된다고는 말할 수 없기 때문이다. 하지만 Objective-C를 Java로 구현하는 것 보다 상대적으로 매우 완벽하게 재사용성이 가능한것은 사실이다.

Continue Reading

Homebrew를 이용하여 Mac OS X에서 Unix 패키지 사용하기

서론

Mac OS X는 훌륭한 운영체제다. Windows 와 Mac은 항상 비교 대상이 되어서 어느것이 더 좋고 나쁜지 이야기들 하지만 두가지 운영체제는 각각 장단점이 있는 것은 분명하며 사용자에게 가장 맞는 운영체제를 선택하면된다. Mac OS X을 훌륭한 운영체제라고 말하는 이유는 Unix 기반이기 때문이다. 그럼 Unix 는 더 좋지 않느냐? 라는 질문을 받게 될지도 모르겠지만 Unix의 명령어와 프로그램을 사용하면서도 빠른 반응과 개발자(사용자)를 즐겁게해주는 빠른 반응을 가진 UI를 가지고 있기 때문이다. (Unix는 command 만으로도 충분히 훌륭하다). 이러한 이유로 IDE를 사용하기에도, command를 사용하기에도 너무나 좋은 장점을 가지고 있다.

이러한 Unix기반에 Mac OS X에는 기본적인 Unix 프로그램과 명령어들이 설치되어 있어서 개발자에게 참 좋은 개발 플랫폼으로 사용될 수 있다. 하지만 Mac에서도 모든 Unix 프로그램이 설치되어 있는 것은 아니다. 그래서 때로는 source를 받아서 configuration을 하여 make를 하는 작업 등을 해야한다. 하지만 이러한 과정에서 Mac OS X 커널만의 문제로 컴파일이 제대로 되지 않는 문제가 생기기도 하는데 이러한 문제를 고쳐가면서 설치하기란 여긴 어려운것이 아니다. (물론 슈퍼 개발자들은 가능할지 모르겠다.) 그래서 이런 프로그램들을 BSD의 port 처럼 패키지 관리툴로 패키징 관리를 편리하게 할 수 있는 툴이 macport라는 것이 있다. 여러 오픈소스 개발자들이 Mac에 맞게 Unix 프로그램을 포팅해서 패키지 관리를 할 수 있게 노력하고 있어서 최근 라이브러리들이 빠르게 업데이트되고 있다. 처음에는 Macport를 사용했는데 macport은 기본적으로 macport가 사용하는 디렉토리에 실행파일은 실행파일대로, 라이브러리는 라이브러리 대로 설치가 되어진다.

다시 말해서 macport의 홈 디렉토리가 /opt/local 이라고 하면 (기본적으로 여기에 설치된다) /bin 밑에 명령어들이 모두 모여져 있다. 예를 들어 python도 ruby도 모두 /opt/local/bin/python, /opt/local/bin/ruby 등과 같이 말이다. 그리고 개발할 때 필요한 header 파일들도 모두 /opt/local/include/sqlite3.h, /opt/local/include/node/node.h 등으로 /opt/local/include 안에 모두 모여 있다. 마치 macport가 하나의 운영체제의 파일 시스템과 같은 형태로 하고 있는 것이다. 이것을 좀더 패키징화되어서 패키지마다 따로 관리하고 싶은 생각이 들었다. 그래서 찾게 된 것이 Homebrew 라는 것이다.

Continue Reading

MySQL에서 사용하는 Lock 이해

서론

운영체제에서 공유하고 있는 리소스의 접근을 경쟁하는 것을 제어하기 위해서 Lock이라는 개념을 사용한다. 데이터베이스도 리소스의 접근을 제어하기 위해서 Lock이라는 개념을 사용한다. Lock에 대한 이해 없이 사용하다가 다른 작업 때문에 테이블이나 행이 잠겨버 쿼리가 기다리는 상황이 발행해서 리소스 접근을 하는데 문제가 생기기도 한다. 뿐만 아니라 Lock을 어떻게 만들고 해지하는지에 대한 이해가 있어야 만약에 Lock이 발생하고 해지되지 않을 때 어떻게 Lock 프로세스를 멈추게 할 수도 있을 것이다. 트랜잭션 기반의 멀티프로세스나 멀티 쓰레 프로그램을 작성한다면 반드시 Lock의 개념을 알아야 데드락에 걸리거나 예외가 발생하는 프로그램을 작성하지 않을 수 있을 것이라고 생각이 든다. 실제 예제를 보면서 MySQL의 락을 어떻게 설정하는지 어떻게 동작하는지 이해하기 위해서 포스팅을 준비했다.

MySQL에서 Lock은 크게 Table Lock, Global Lock, Name Lock, User Lock 이 있다. 이 예제들을 살펴보고 마지막으로 InnoDB의 ROW 레벨의 락을 살펴 볼 것이다.

Continue Reading

iOS에서 Local Notification 사용하기

서론

운영체제 프로그램을 만들다보면 특별한 잡을 예약해두고 싶은 경우가 있다. 이런 경우 cron을 사용하거나 job schedule 데몬을 만들어서 사용한다. 만약 아이폰에서 서버에서 하는 예약 프로그램 처럼 어떤 스케줄을 등록 했다가 특정 시간이 되면 사용자에게 알람을 해주려면 어떻게 해야할까? 쉽게 생각하면 백그라운드 프로그램을 하면 된다고 생각할 수 있을지 모르나, 백그라운드 프로그램으로 동작한다는 자체가 우선 앱이 한번은 실행을 해야한다는 것을 의미한다. foreground 에서 실행하던 앱이 다른 앱이 foreground로 실행될때 background로 실행이 되는 것인데 흔히 우리가 사용하는 Music 앱이나 GPS 앱들이 그렇게 동작한다. 하지만 스케줄 알람을 위해서 앱을 계속 켜둘수가 없다. 또한 아이폰의 메모리 문제로 오래된 앱은 메모리에서 삭제되어진다. 즉, 앱이 구동되지 않아도 알아서 뭔가의 액션이 일어나야한다. 우리는 이렇게 비슷한 것을 이미 익숙하게 사용하고 있다. 바로 “푸시 알림 서비스”이다. Push Notification Services는 Apple의 푸시 서비스를 통해서 push 메세지를 전달 받아서 아이폰에서 뭔가 알림 정보를 받는 것이다. 만약 Push 서버 없이 나의 아이폰에 특정 시간에 push 알림이 발생하게 하면 어떨까? iOS 4 부터는 이런 기능이 제공된다. 바로 Local Notification 이라는 것이 이런 요구를 해결해 줄 수 있는 것이다.

Continue Reading