Categories
Objective-C

2019년에 Objective-C 정리하기 #1

현 시점에서 뜬금없이 Objective-C 이야기를 왜 하는가 싶겠지만 아무리 Swift 만 사용하여 앱을 만들었다 하더라도 우리의 앱은 Objective-C 런타임에서 실행되게 된다.(아직까지는…), 때문에 Objective-C 에 대하여 알고있다면 Swift를 사용하여 앱을 작성할 때 조금이나마 도움이 될 것이다.

나는 2009년에 Objective-C 2.0 부터 이후 Modern Objective-C 기능이 추가되고 Swift가 출시되면서 Swift 1.0부터 최근 5.1 까지 사용하며 애플 플랫폼에서 개발을 해왔다.(현재는 Swift를 주력으로 사용하지만, 개인적으로는 Objective-C를 더 좋아한다.)

Objective-C 간단 소개

Objective-C(Object-C 아님, Objective-C 임!)는 애플 플랫폼 소프트웨어를 개발할 때 사용하는 기본 프로그래밍 언어이다. C 언어의 상위 집합이고 객체 지향 프로그래밍과 동적 런타임을 제공한다. Objective-C는 C 언어의 문법, 기본 타입, 흐름 제어 구문을 모두 상속하고 클래스 및 메소드 정의를 위한 문법이 추가되어 있다고 생각하면 된다. 또한 언어 수준에서 객체 그래프 관리 및 객체 리터럴을 지원하고 동적 타이핑 및 바인딩을 제공한다.

환경

  • Xcode 11 GM
  • macOS Catalina 10.15 beta 8
  • MRR(Manual Retain-Release)(애플은 ARC의 반대를 MRC라고 부르지 않는다.)

프로젝트 생성

시작하기에 앞서 Xcode 11을 사용하여 Objective-C 프로젝트를 생성하고 MRR을 사용하여 진행할 것이므로 ARC를 끄는 방법을 설명하겠다.

Xcode에서 File > New > Project...(⇧⌘N) 을 눌러 새로운 프로젝트를 생성한다. 템플릿은 macOS > Command Line Tool을 선택한다.

다음 Product Name을 적당히 넣어주고, LanguageObjective-C를 선택한다.

Language가 Objective-C로 설정했는지 확인한다.

이제 Modern Objective-C와 ARC를 사용하는 프로젝트가 생성되었다. 우리는 아직 ARC를 사용하지 않을 것이므로 Build Settings에서 ARC를 꺼준다.

이제 Project navigator에서 main.m 파일을 선택하여 소스코드를 살펴본다. 자동으로 생성된 코드는 아래와 같을 것이다.

C 언어의 상위집합 언어이므로 Objective-C 도 프로그램의 진입점 역할을 하는 main 함수가 있고 Autorelease를 위한 Autorelease pool block이 하나 있고 내부에 로직이 들어가게 된다.

ARC 환경 이전의 코드에서는 Autorelease pool block 대신 NSAutoreleasePool을 사용했지만 NSAutoreleasePool은 내부적으로 객체가 아니어서 ARC가 도입되면서 Autorelease pool block으로 대체되었다. 하지만 MRR모드에서도 Autorelease pool block은 사용할 수 있으며 속도 또한 더 빠르므로 NSAutoreleasePool 대신 Autorelease pool block을 사용하도록 하자.

Autorelease pool block 개념은 ARC를 사용하는 Swift에서도 유효하다.

NSAutoreleasePool을 사용하는 코드는 아래와 같다.

NSAutoreleasePool의 drain 메소드는 일반적으로 release 메소드와 같다. GC 환경에서의 동작이 달라지는데 어차피 Objective-C의 GC 환경은 사라진지 오래됬다.

그냥 속도도 빠르고 읽기에도 편한 Autorelease pool block을 사용하자.

다음으로 내부 로직을 보면 NSLog(@"Hello, World!"); 구문이 있다. NSLog는 애플 시스템 로그에 메시지를 기록하는 Foundation 프레임워크의 함수이다. 디버그 용도로 콘솔에 출력할 때에는 NSLog 를 사용하자.(printf 같은 C 함수를 사용할 수도 있긴하다.)

여기서는 NSLog 함수의 첫번째 인자로 @”Hello, World!” 를 넘겨주고 있는데 Objective-C 에서 @ 심볼로 시작하는 경우는 객체 리터럴이다. @”” 형식은 문자열을 의미하는 NSString 리터럴이다.

Categories
AWS

AWS Lightsail에 Docker 설치하고 WordPress 운영하기(feat. Let’s Encrypt)

원래 집에서 운영하던 서버가 Docker에 MySQL, WordPress, Nginx 컨테이너를 사용하여 운영하였으므로 Lightsail에도 똑같이 셋팅해보았다. 역시 CMS는 WordPress지!

AWS Lightsail 인스턴스 생성

Lightsail의 인스턴스 생성기능을 사용하면 WordPress가 미리 설치된 블루프린트를 제공하지만 나는 WordPress외에도 개인적인 서비스들을 운영할 생각이므로 Docker를 설치하고 그 위에 WordPress를 운영하기 위해 OS 전용 블루프린트 중 내가 사용하기 편한 Ubuntu 18.04 이미지를 선택했다.

서버에 접속하기 위한 SSH 키도 적절히 설정한다.

AWS Route53 연결

Lightsail 인스턴스를 생성하고 실행이 완료되었다면 퍼블릭 IP를 할당 받는다. 기본 설정으로는 동적 IP를 부여 받으므로 이것을 고정 IP(무료인 것 같다.)로 변경하고 가지고 있는 도메인에 연결한다. Lightsail에도 DNS를 제공하는 것 같지만 나는 Route53을 더 선호하기 때문에 Route53에 DNS 영역을 생성하고 네임서버를 연결한다.

Route53에 레코드를 추가할 때 지원되는 AWS 서비스는 Alias로 추가하는 것이 좋지만 Lightsail 인스턴스는 Route53에서 Alias로 연결할 수 없는 것 같다. 그래서 고정 IP를 부여했고 해당 IP를 DNS 영역에 A 레코드로 연결했다.

Lightsail에 Docker 설치

Docker 설치는 공식 문서(Install using the repository)를 참고했다.

1. apt 패키지 인덱스 업데이트

2. apt가 https를 통해 저장소를 사용할 수 있도록 패키지 설치

3. Docker 공식 GPG 키 추가

4. Docker stable 저장소를 추가

x86_64 / amd64 아키텍처를 선택한다.

Docker에 Certbot 사용해서 인증서 발급

https 프로토콜을 사용하기 위해 Certbot을 사용해서 Let’s Encrypt 인증서를 발급 받아서 사용한다. CloudFront 같은 것을 사용하면 인증서 갱신 신경 쓸 필요 없이 아마존 인증서를 사용할 수도 있지만 지금은 무료 인증서를 사용하기로 했다.

명령어의 환경변수나 이메일 값은 자신의 환경에 맞는 값으로 설정한다.

Docker에 MySQL 5.7 실행

WordPress에서 사용하기 위한 데이터베이스 컨테이너를 실행한다. Lightsail의 관리되는 데이터베이스를 사용해도 무방하다.

자신의 환경에 맞는 환경변수 및 인자 값을 설정한다.

참고로 앞으로 실행할 컨테이너가 모두 동일한 네트워크에 있어야 호스트 이름 검색이 가능하다.

Docker에 WordPress 실행

데이터베이스가 준비되었으면 WordPress 컨테이너를 실행한다.

자신의 환경에 맞는 환경변수 및 인자 값을 설정한다.

Docker에 Nginx 실행

이제 인증서, 데이터베이스, 워드프레스 컨테이너가 모두 준비되었다면 외부에서 접속하기 위해 리버스 프록시 역할을 할 Nginx 컨테이너를 실행한다.

외부로 공개될 포트의 설정과 Let’s Encrypt로 받아온 인증서를 마운트해서 사용한다.

Nginx의 설정은 각자의 환경에 맞게 설정하고 systemd를 사용하여 각 컨테이너가 시스템이 재부팅되어도 실행되도록 설정하면 관리가 수월해진다.

외부에서 접속이 되지 않을 때에는 Lightsail의 방화벽을 확인하고 DNS 설정을 확인해 보면 좋다.

또한 Lightsail의 가장 저렴한 인스턴스의 경우 메모리가 매우 적으므로 컨테이너 실행에 문제가 있을수 있는데 인스턴스 타입을 올리지 말고 그냥 swap을 추가하여 해결했다. 개인 서버에는 이 정도면 충분하다.

Categories
일상

블로그 초기화

기존 블로그는 집에서 돌리던 작은 서버였는데 최근 집에 정전이 잦으면서 서버에 장애가 자주 발생하여 AWS Lightsail이 월 3달러 정도 하길래 서버를 이전해보았다.

물론 기존 글은 다 날리고 하하하.하하하.