Quantcast
Channel: 샤코군의 블로그
Viewing all 19 articles
Browse latest View live

기다림은 끝났다. Logic Pro X 발매!

$
0
0

Logic Pro X

4년간의 기다림이 끝났습니다. 로직 프로 X가 며칠 휴가 다녀온 사이에 소리 소문 없이 발매된 것입니다. 그동안 로직 팀이 해체되었다는 루머도 있었고, 파이널 컷 프로 X(FCPX)가 엄청난 혹평에 시달렸던 것을 생각해보면, 유저들이 GarageBand Pro가 나오는 것은 아닌가 하는 우려를 했던게 당연하다는 생각도 해봅니다.

하지만 새로운 버전의 로직은 이러한 우려를 완전히 종식시켜 주었습니다. 완전히 새로운 UI, 드디어 추가된 미디 플러그인, 음정 보정 기능인 플렉스 피치(Flex Pitch), 추가된 사운드 라이브러리, 드러머(Drummer) 등의 바람직한 기능들로 꽉꽉 차있습니다. 뒤에서도 언급 하겠지만, 특히 드러머는 편의성이 좋을 뿐 아니라 사운드 퀄리티도 훌륭한 편이라 스케치 작업시 유용하게 사용될 수 있습니다.

뿐만 아니라 FCPX와는 달리(!), 로직 프로 9에서 동작하던 것들이 제대로 다 동작합니다. 인바이런먼트(Environment), 트랜스폼 에디터(Transform editor), 하이퍼 데이터(Hyper editor) 등등이 모두 그대로 있습니다. 애플이 로직을 망치지 않았다는 거죠. 다만, 32비트 Audio Unit 플러그인을 지원하지 않는 다는 점은 아쉽습니다. 대다수의 제작사들이 이미 64비트로 업데이트를 마친 상태이지만 애용하던 몇몇 플러그인이 제대로 동작하지 않는 것은 피할 수 없을 듯 합니다. 32비트 플러그인의 의존도가 높으신 분은 업그레이드를 미루시기를 권장합니다. FCPX에서 처럼 이 부분이 가루가 되도록 까인다면 .1 버전대에서 지원해줄 가능성도 있겠지만 현재로서는 요원해보입니다. 로직 프로 X의 경우 9 버전과 동시에 실행도 가능하니 참고 하시기 바랍니다.

앱 스토어에서 600메가 남짓한 프로그램을 다운 받고 실행하면 2기가의 필수 라이브러리를 다운받게 되고, 이어서 30기가 이상의 라이브러리 컨텐츠를 다운받으라는 창이 뜹니다. 출시 직후의 경우 사용자들이 엄청 몰려서인지 다운 속도가 굉장히 느립니다. 외장 하드에 라이브러리를 설치하기는 이번 버전도 쉽지 않습니다. Symbolic link를 통해 이동시키는 방법이 있지만 복잡한게 사실이죠.


시크한 새 인터페이스
제일 먼저 눈에 들어오는 변화는 바뀐 UI입니다. 시크하고 차가운 도시 남자를 연상시키는 색상입니다. 조도가 낮은 스튜디오에서 장시간 화면을 볼 때 눈의 피로도를 줄여준다고 합니다.

Interface

곳곳에 GarageBand에서 영감을 얻은 그래픽들이 눈길을 끕니다. 아래 그림을 보시면 트랙 목록에 볼륨 조절 컨트롤과 볼륨 게이지가 생긴 것을 보실 수 있습니다. 그러면서도 전반적으로 프로 어플리케이션이라는 느낌을 충분히 잘 살렸습니다. 그 밖에도 구석구석 UI를 정비한 흔적이 보입니다. 조니 아이브가 최근에 보여준 영상에서 처럼, 처음부터 새롭게 고민을 하면서도 기존의 유저들이 가질 위화감을 최소화하는데 성공했다고 평가하고 싶습니다. 애플이 이매직(Emagic)을 인수한지 10여년이 된 시점에서, 이제서야 두 회사의 시너지가 제대로 나오는 듯 합니다. 더 룹(The Loop)이 언급하기를, "로직 프로 X는 전문 기능들을 추가하면서도 더 많은 사용자들이 쉽게 사용할 수 있도록 바뀌었다. 이는 굉장히 어려운 일이다."라고 하네요. 저도 동의합니다. 다만, 아이브 형님이 많이 바쁘셨는지 몇몇 예전 플러그인들은 그래픽 refresh에서 제외되었습니다.

Track

리전(Region)의 색상 팔레트도 정비되었습니다. 기존 팔레트는 파스텔톤의 색상들과 형광톤의 색상들이 함께 있어서 잘 선택하지 않으면 이뻐보이지(!) 않았는데, 이제는 어떤 색상을 조합해서 배치해도 톤이 잘 어울어집니다. 곡 작업에 있어서 리전의 색상이 뭐가 중요하냐고 하실 수도 있지만요. 우리가 받은 영감을 표시하는 방법 중에 색 만한게 없다고 개인적으로 생각합니다. ^^ 다만, 정해진 팔레트 외의 사용자(custom) 색상을 지정할 수 없는 점은 아쉽네요.

Palette

편의성도 많이 강화되었는데요, 이제 피아노 롤에서 퀀타이즈와 스윙 옵션을 줄 수가 있구요, 스코어 에디터는 아예 뜯어 고쳐서 편의성과 기능성이 많이 향상되었습니다. 트랜스포트 영역은 화면 위로 이동했고 주요 버튼들의 위치도 다시 조정되었습니다. 메뉴들의 로직 구성도 싹 정리를 한 느낌인데요. 프로 어플리케이션을 이렇게 뜯어 고칠 수 있는 애플의 강단도 대단하다는 생각이 듭니다. 하지만 일분일초를 다투는 현장에서는 비판을 피할 수 없겠습니다.

믹서도 크게 바뀌었습니다. 전반적으로 사용이 쉬워 졌으며 이펙트의 순서도 이제는 쉽게 바꿀 수 있습니다. (드디어!) Option 버튼을 누르지 않고도 마우스를 위에 띄운 상태로 플러그인을 켜고 끄는 것도 쉬워졌습니다. 컴프레서나 리미터를 건 경우 게인 리덕션 미터(gain reduction meter)가 믹서에 포함되어 보이는 것도 바뀐 점입니다.

Mixer


드럼 킷 디자이너(Drum Kit Designer)
드럼 킷 다지아너는 로직 프로 X에 새로 추가된 드럼 샘플러 악기입니다. 20기가 이상의 고퀄리티 드럼 샘플을 탑재하고 있습니다. 울트라비트(Ultrabeat)의 소리를 듣고 실망하셨더라도, 이번에는 조금 다릅니다. 사운드가 번들 퀄리티를 뛰어넘기 때문이죠. 멀티 아웃(Multi out) 샘플을 받은 경우 Aux 단자로 별도의 소리를 보낼 수 있습니다. 전반적으로 킷을 고르고 사운드를 조작하는 것이 굉작히 쉽고 직관적입니다.

Drum Kit Designer

드러머(Drummer)
드럼킷 디자이너와 함께 드러머가 추가되었습니다. 원하는 장르 스타일과 사용되는 키트의 종류, 그리고 연주 방식에 대한 지정을 해주면 알아서 드럼을 쳐주는 녀석입니다. 실제로 유명 드러머들과 함께 작업했기 때문에 그들의 시그니처를 따서 프리셋으로 존재합니다. 말로는 설명 드리기 어려우니 아래 영상을 한번 보시기 바랍니다. 로직 프로 X에서는 트랙의 종류에 "드러머 트랙"이 새로 추가될 정도로 굉장히 중요하게 존재감을 가지고 있습니다.

영상 보기

보시는 바와 같이, 곡의 도입부에는 킥드럼만 플레이하고 심플하게 연주를 하다가, 후반부에 갈 수록 더 많은 킷을 추가하고 fill in을 추가하는 것이 가능하게 되어있습니다. XY 그래프에는, Loud - Soft와 Simple - Complex를 정할 수 있게 되어있습니다. 그 뿐 아니라 드럼 킷 디자이너에 있는 샘플이 맘에 들지 않을 경우 미디 트랙에 드래그 드랍하시면, 드러머를 통해 만들어진 그루브를 그대로 이용하여 타 샘플을 재생할 수 있습니다.

드러머가 만들어내는 그루브는 굉장히 자연스럽고 제한된 장르에 한해서이지만 표현력이 좋습니다. 4분의 4박자가 아닌 3박자, 5박자, 7박자 계열에서도 잘 동작합니다. 실제 투입하기에는 무리가 따르겠지만 스케치 단계에서는 매우 유용하게 사용될 수 있을 정도입니다. 드럼 킷 디자이너에 포함된 15개의 킷 자체적으로 사운드가 뛰어날 뿐 아니라 세세하게 믹싱할 수 있도록 여러 가지 마이킹된 샘플이 포함된 점 등이 인상적입니다.


스마트 컨트롤(Smart Controls)과 iPad 리모트
악기를 직접 조작하는 느낌을 줄 수 있도록, 한 채널에서 사용되는 다양한 이펙터들의 파라메터를 할당해서 한번에 조작할 수 있게 해 줍니다. 예를 들면 보컬 트랙의 경우 EQ high와 mid, low, 컴프레서의 gain, overdrive 등 여러 플러그인이 가진 값을 한 화면에서 조작하게 세팅할 수 있습니다. 매번 해당 이펙터의 세부 창에 들어가서 값들을 조정했어야 했는데요, 전문 엔지니어보다 일반 싱어송라이터들이 더 환영할 만한 기능인 것 같습니다.

Logic Remote

뿐만 아니라 이번 버전의 로직과 연동되는 iPad 리모트 앱이 동시에 출시되었습니다. 같은 네트워크에 있는 경우 자동으로 인식을 해서 연결이 되게 되며, 믹싱 화면을 조작할 수 있기도 하고, 가상 악기를 연주할 수도 있습니다. 스마트 컨트롤로 지정해놓은 파라메터를 직접 조작할 수도 있습니다. 특히나 화면에 트랙들을 띄워 놓고 아이패드로 믹서 화면을 불러서 손으로 직접 조작하는 느낌은 참 좋았습니다. 개인적으로 애플은 예전부터 이런 류의 앱을 가장 먼저 낼 수 있는 역량을 보유한 회사임에도 불구하고 여태 내놓지 않는 점이 참 의아했었는데요. 뒤늦었지만 지금이라도 쓸만한 컨트롤 앱을 출시한 것은 반길만한 일입니다. 다만 봉쥬르 네트워크를 지원하는 공유기(멀티 캐스팅 기능을 지원해야 함)에서만 사용이 가능한 점과 현재 버전에서 네트워크 접속이 불안정한 점은 개선이 되어야 할 것 입니다.


플렉스 피치(Flex Pitch)
또 하나의 주요 기능은 Flex Pitch입니다. 로직 프로 9에서 추가된 Flex Time과 더불어 단성의 오디오를 손쉽게 편집하게 해 줍니다. 오디오 파일을 분석하게 되면 피아노 롤에서 한 노트에 있는 6개의 점을 통해 음정(pitch)과 크기(gain), 바이브레이션(vibrato) 등을 편집할 수 있습니다. 굉장히 사용이 용이할 뿐만 아니라 사운드도 훌륭합니다. 원래 음정에서 너무 많이 멀어지지 않는 한 자연스럽고 열화가 적은 편입니다. 이렇게 인식한 노트들은 MIDI로도 변환할 수 있습니다. 오토튠을 주로 사용하시는 분들은 계속 오토튠을 쓰실 확률이 높겠지만, 멜로다인을 주력으로 써오셨다면 플렉스 피치로의 이전을 심각하게 고려해보셔도 좋을 듯 합니다.

Flex Pitch


트랙 스택(Track Stack)
여러 개의 트랙을 묶는 기능인 "폴더" 기능에서 한 단계 업그레이드 해서 트랙 스택이 생겼습니다. 묶는 방법은 예전처럼 단순히 폴더로 묶을지, 아니면 summing 스택(내부적으로 한번 믹스를 해주는 트랙)으로 묶을지를 선택할 수 있습니다. 이렇게 묶은 스택은 전체적인 솔로, 뮤트, 볼륨 조절 등을 손쉽게 할 수 있게 합니다. Summing 스택으로 묶게 될 경우 가상악기에 사이드 체인을 통한 입력으로 활용도 가능합니다. (올레!)

Track Stack

미디 악기의 경우 여러 개의 트랙을 스택해서 레이어로 연주되는 새로운 악기를 만들어 낼 수 도 있습니다. 트랙 스택을 중첩적으로 만들수 있기 때문에, 스택 안에 스택이 있는 것도 가능합니다. 뿐만 아니라 트랙 스택을 patch의 형태로 저장해 두었다가 나중에 불러오는 것도 가능합니다.


미디 플러그인
이 기능이 왜 이제서야 되었는지 의문이 가지만 드디어 미디 플러그인이 추가 되었습니다. 물론 예전부터 인바이런먼트(Environment)를 통해서 사용할 수 있는 기능이었지만 버전 8 이후로 로직을 접하신 분들에게는 이상한 외계인의 장난 같은 환경이였던 것이 사실입니다. 무엇보다도 손쉽게 아르페이지에이터(Arpeggiator)를 사용할 수 있게 된 것은 환영할 만 합니다.

MIDI ARP


새로운 악기의 추가
빈티지 아날로그 악기, B3 에뮬레이션, Clav, EP가 새로운 룩으로 다시 태어났습니다. 특히 B3와 EP는 워낙 명성이 자자하기 때문에 기존의 사운드에 새 UI 및 사용성이 증대된 것만 해도 환영할만 하다는 생각이 듭니다.

1

2

3

4


그 외에도 베이스 앰프 디자이너(Bass Amp Designer)가 추가되었고 다양한 기타 이펙터 페달 보드들이 추가되었습니다. 뿐만 아니라 사운드 클라우드(Sound Cloud) 업로드가 가능해졌고 기본 단축기 할당이 더 많이 되어 있는  등 편의 기능이 많이 추가되었습니다. 혹자는 애플에 인수된 이후 최대의 로직 릴리즈라고 하기도 합니다. 몇 시간 동안 사용하는 내내 간헐적인 UI 오류 외에 큰 버그가 없이 안정적인 모습이었습니다. 현재 맥 앱스토어에도 별 5개의 리뷰가 줄을 잇고 있습니다. 0점대 버전치고 너무 안정적이라는 거죠.

하지만 개인적으로 이번 버전의 의의는 무엇보다도, 애플이 아직 로직에 대한 관심을 저버리지 않고 있으며, Final Cut Pro X에서 보여주었듯이 꾸준히 업데이트를 통해 개선을 하리라는 믿음을 유저들에게 심어준 부분이 크지 않나 싶습니다. 실제로 많은 매체들이 로직이 버림받았다는 비판을 많이 했었는데요. 로직같은 프로 application은 한 번 손에 익으면 바꾸기가 쉽지 않은 만큼 제작사의 꾸준한 지원이 보장되지 않을 경우 선뜻 사용하기가 쉽지 않은 것이 사실이죠. 많은 유저들이 4년간의 메이저 업데이트 공백을 보면서 훨씬 지원 주기가 빠른 큐베이스 등의 DAW로 갈아탈랑 말랑하는 이 시점에 로직 프로 X를 스리슬쩍 내놓는 애플(Apple, AAPL)을 보면. 밀당의 천재이지 않나 하는 생각이 듭니다. ^^;


로직 프로 X 10.0.1 업데이트

$
0
0

이 업데이트는 다음을 포함한 전체적인 안정성 및 성능 문제를 향상합니다.


  • 콘텐츠가 다운로드 도중 멈추던 문제 수정
  • 프로젝트를 AAF로 보낼 때 24비트 오디오 파일이 더 이상 16비트로 변환되지 않음
  • Flex Pitch가 활성화되어 있는 동안 오디오 편집기를 전환할 때의 안정성 향상
  • 소프트웨어 악기 및 오디오 트랙이 모두 포함된 Track Stack이 더 이상 Patch를 로딩하여 실수로 축소되지 않음
  • Track Stack에 오디오 트랙이 포함되도록 선택할 때 이제 Tuner 사용 가능
  • Score Editor에서 그래픽 및 선택 동작 문제 해결

이 릴리즈는 모든 Logic Pro X 고객에게 권장됩니다.

Stability

  • Logic Pro X should no longer quit unexpectedly when:
    • A Track Stack is flattened during playback.
    • Trimming an audio file in the Audio File Editor.
    • Switching from the Audio File Editor to the Audio Track Editor after enabling Flex Pitch.
    • Selecting or moving notes in the Piano Roll.
    • Saving a patch with an edited Smart Controls layout.
    • Several Software Instrument tracks are created in quick succession from Logic Remote.
    • Changing a velocity range in the EXS Editor while playing a note.
    • Deleting an arrangement marker.
    • A second lane of MIDI data is added with the pencil in the Step Editor.


  • Fixes an issue that could cause content downloading to hang.
  • Logic Pro X should no longer hang if the Length parameter in the Step Editor was double-clicked.
  • Logic Pro X no longer hangs when a settings folder containing more than 138 settings files is accessed from Logic Remote.

Track Stacks

  • Tuner is now available when selecting the main track of a Track Stack.
  • The output routing on a Drummer Track that has been manually reassigned to an Aux is no longer reassigned to No Output when changing drum characters.
  • It is again possible to switch Aux channels that are part of a Multi Output Software Instrument between mono and stereo.
  • Resolves an issue in which a copied main track of a Summing Track Stack did not maintain the correct routing for sub-tracks.
  • Track Stacks that contain both software instrument and audio tracks will no longer be inadvertently flattened by loading a Patch.
  • Multi-timbral tracks are no longer created as track stacks by default.

Score

  • Text styles in the Score window event inspector pop-up menu now display the currently selected language.
  • You should now be able to import custom Text Styles into a new project.
  • Edit focus on selected regions should now be properly maintained when opening the Staff Style window.
  • You should now be able to select rests and bar repeat objects in the Score window.
  • Mapped Staff Styles no longer improperly show a Transpose value.

General

  • Create New Track with Next Channel now works as expected for multi-timbral Software Instrument or External MIDI tracks.
  • When Follow is selected in the Drummer Editor, a track is now automatically assigned for Drummer to follow.
  • When exporting projects to AAF, 24-bit audio files are no longer converted to 16-bit.
  • Resolves an issue in which in some cases notes copied in the Piano Roll ended up at unexpected positions.
  • Shift-clicking in the timeline to adjust the cycle range now works as expected.
  • The Mixer now correctly shows channel strips when navigating between multiple folders in the Main window.
  • Take regions now appear consistently in the Track Audio Editor when they are selected.
  • Resolves an issue in which arrangement markers were improperly resized after being dragged in projects with a start point before bar 1 1 1 1.
  • Resolves an issue in which undo did not work after an arrangement marker was copied.

출처: http://support.apple.com/kb/TS4498

워드프레스 3.8 업데이트

$
0
0

워드프레스가 3.8 버전으로 업데이트 되었습니다. 비밥(Bebop)의 창시자인 찰리 파커(Charle Parker)를 따라 "Parker"라는 코드 네임으로 개발되었습니다. 현존하는 가장 아름다운 업데이트라고 합니다 ^^; 이곳에서 다운로드 받을 수 있습니다.

워드프레스 최근 릴리즈에는 멋진 소개 영상들이 함께 배포되었는데요, 이번 버전도 예외가 아닙니다.

더 넥스트 웹이 전하는 주요 기능은 다음과 같습니다.


현대적인 새 디자인

깔끔하게 컨텐츠 중심으로 정리되었습니다. Open Sans 폰트를 통해 여러 기기에서 깔끔함과 높은 가독성을 제공합니다. 또한 전반적으로 화면 대비가 증가되었습니다.

Layout

취향에 맞게 관리자 컬러 테마를 변경할 수도 있습니다.

Color Theme

새로운 태마/위젯 관리

테마 목록보기가 대폭 개선되었습니다. 키보드를 통해서 네비게이션을 할 수도 있고 썸네일을 클릭해서 세부 정보를 볼 수 있게 변경되었습니다. 위젯 화면도 다시 정리되었습니다.

Theme List

새로운 테마, Twenty Fourteen

매거진 룩의 새로운 테마가 포함됩니다. 다양한 기기에서 최적화되어 보일 수 있도록 반응형으로 설계되었고, 잡지 컨텐츠를 보는 것 처럼 그리드 구성을 하였습니다.

Twenty Fourteen

워드프레스 3.7은 10월에 출시되었었고, 최근 개발 주기가 빨라진 상태이므로 3.9 버전은 내년 2월 중에 예상해볼 수 있을 듯 합니다. 새로운 마이크로블로깅 툴이 개발되고 있지만 명실공히 최고의 블로깅 툴로서 점점 진화해가는 모습이 보기 좋습니다.

스타트업을 위한 디자인 프레임워크

$
0
0

Startup Design Framework (by Designmodo)는 소규모 회사 홈페이지를 만드는데 필요한 공통적인 요소들로 만들어진 디자인 프레임워크입니다.


처음 회사를 창업하고 가장 고민이 되는 것 중 하나가 회사 홈페이지 만들기입니다. 예산을 많이 배정할 수 없을 뿐만 아니라, 예산을 많이 투자한다 하더라도 기대에 부합하는 결과물을 얻기는 힘든 일이니깐요. 이런 고민을 어느 정도 해결해줄 수 있는 도구가 나왔습니다. Flat UI로 유명한 Designmodo에서 발표한 Startup Design Framework인데요, 이 프레임워크는 회사소개 홈페이지에서 자주 사용되는 요소들을 블럭으로 정의하고 이들을 조합하여 전체 사이트를 구성할 수 있게 해 줍니다. 제공되는 블럭들은 헤더(header), 컨텐츠 레이아웃, 블로그, 가격표, 포트폴리오 레이아웃, 푸터(footer) 등입니다. 게다가 모든 블럭들은 반응형으로 구현되었기 때문에 다양한 해상도의 기기에서 최적화되어 보여집니다.

Blocks

디자인
무엇보다도 트렌디한 사이트를 만들 수 있도록 최신 디자인 스타일이 반영되어 있는 것이 장점입니다. 최근 사이트들을 보면 원색들이 많이 사용되고 있고, 베젤 없이 화면을 채우는 커버 이미지들이 사용되고 있는데, 이런 레이아웃을 손쉽게 구성할 수 있습니다. 블럭들 전반적으로 일관성 있는 스타일이 적용 되어있기 때문에 다양한 방법으로 조합해도 한 부분이 튀거나 어색해지지 않습니다.

Examples

부트스트랩(Bootstrap)
반응형으로 사이트를 구성하기 위해서 Twitter의 Bootstrap 2.3.2를 기반으로 합니다. CSS 버전과 LESS 버전이 지원되기 때문에 이미 LESS 파일을 구성해놓은 것이 있다면 바로 적용할 수도 있습니다.

가격은 $249로 조금 높게 책정되었다는 의견도 있습니다. 하지만 지금까지 나온 어떤 디자인 프레임워크 보다도 가성비가 높고 활용성이 좋은 프레임워크인 것은 확실합니다. 멋진 프로모 영상을 보면 더더욱 구매하고 싶어진다니깐요.

애플과 반응형 디자인

$
0
0

by Anthony Colangelo

이 글은 A List Part에 기고된 "Apple and Responsive Design" 글을 번역한 것입니다.


애플은 반응형 디자인과는 영 거리가 먼 회사였다. 자사 홈페이지 조차도 미디어 쿼리를 통해 반응형으로 만들고 있지 않고 있다.

물론 화면의 크기가 달라질 때 마다 UI를 "한땀 한땀" 새롭게 구성하는 방식이 애플답기는 하다. 아이폰을 처음 발표했을 때에도 반쪽짜리 기능을 제공하는 모바일 웹이 아닌 풀(full) 웹을 브라우징을 '핀치 줌'을 통해 가능하다라는 장점을 부각시켜왔다. 그래서 마치 애플이 일부러 할 수 있는데도 안하고 있는 것일까 하는 착각을 불러 일으키기도 한다.

만야 아이폰이 3.5인치의 크기로 계속 머물러 있었다면 애플은 이러한 고집을 끝까지 지켜나갔을 수도 있었을 것이다. 하지만 몇 년 사이에 10인치 아이패드, 4인치 아이폰, 7인치 아이패드 미니가 출시되었고, 올해 가을에는 화면이 더 큰 아이폰이 출시될 것이라고 한다.

애플과 iOS 개발자들이 새로운 기기 화면크기에 맞는 앱을 개발하기 위해서 취해온 접근 방식은 지난 10년간 웹개발자들이 취해온 방식과 많은 부분이 닮아있다. 적응형(adaptive) 먼저, 그 다음에 반응형(responsive)으로 개발하는 것이다. (Responsive vs. Adaptive Design 참조)

아이패드가 처음 도입되었을 때, 개발자들은 아이폰과 아이패드를 위해 각각의 페이지를 만들었다. 웹으로 치면 모바일과 PC 버전의 두 개의 페이지를 별도로 만드는 것과 같다. 레이아웃, 스타일, 인터랙션 방법 등을 기기의 종류 수 만큼 제작하였고, 이런 방식을 적응형이라고 한다. 당시에는 지원해야 할 기기의 종류가 많지 않았기 때문에 이 방법은 먹혀들었다.

iOS 6와 함께 세로로 더 길어진 아이폰 5가 출시되었다. 애플은 오토 레이아웃(Auto Layout)이라 불리는 관계기반의 레이아웃 엔진을 도입하였다. 별도의 페이지를 만들어야 했던 아이패드와는 달리 오토 레이아웃을 제대로 적용하기만 하면 하나의 앱으로 3.5인치와 4인치 아이폰에 각각 최적화 될 수 있도록 화면 구성을 할 수 있었다. 오토 레이아웃은 반응형 디자인에 접근하기 위해 처음으로 제대로 접근한 시도라고 할 수 있다. 웹과 마찬가지로 동일한 코드(컨텐츠) 기반에 다양한 레이아웃 규칙을 적용할 수 있었기 때문이다.

지난 주에 애플은 iOS 8과 함께 어댑티브 UI(Adaptive UI)라고 불리는 개념을 발표하였다. 어댑티브 UI의 주요 기능은, 레이아웃 규칙을 사이즈 클래스(Size Classes) 기반으로 정할 수 있게 해준다. 쉽게 말하면, 화면의 크기를 임의로 "경계점(breakpoint)"에 의해서 분류하고 (가령 아이폰의 가로 크기는 '작은' 크기, 아이패드의 가로 크기는 '일반' 크기) 각각에 해당하는 레이아웃 규칙을 따로 정의할 수 있게 하는 것이다. 이 경계점은 애플에 의해서 정의되었다.

이제 개발자들은 하나의 코드(컨텐츠)에 이러한 경계점(breakpoint)에 따라 다양한 레이아웃 규칙을 정하기만 하면, 모든 크기의 기기들을 지원할 수 있게 되었다. 지금은 컴팩트(Compact)와 레귤러(Regular), 총 2개의 사이즈 클래스밖에 존재하지 않지만 나중에 얼마든지 더 추가될 수 있을 것이다. 개발자에게 이 경계점를 직접 정의하도록 할 수도 있을 것이다.

용어 자체에 adaptive라는 단어가 포함되어 있기 때문에, 또한 경계점이 이미 정해져 있기 때문에 적응형 방식이 아닌가 싶겠지만, 내장 iOS 앱들에 우선 적용된 것을 보면 반응형 디자인으로 가고 있음을 알 수 있다. 향후 애플이 정적(static) 디자인으로부터 적응형, 반응형으로 발전을 이루어가는 과정을 지켜보는 것은 흥미로울 것이다. 또한 유저들이 이러한 반응형 앱 디자인에 익숙해짐에 따라 써드파티 개발자들이 이를 충분히 잘 활용한 앱들을 만들어 내는 것을 지켜보는 것은 더더욱 흥미로울 것이다.

애플이 먼 길을 돌아서 이제야 반응형 디자인에 신경을 쓰게 되었다. WWDC 2014에서 이와 관련된 세션도 있다. 당장 내년에 애플이 제대로 된 반응형으로 홈페이지를 리뉴얼 한다고 해도 이제는 그리 놀랄 일은 아닐 것 같다.

개발자 입장에서 본 iOS 8의 변화점

$
0
0
개발자 입장에서 본 iOS 8의 변화점

이번 WWDC는 개발자가 주인공이라는 느낌을 주는 행사였다고 생각합니다. iOS 8에서 기존 개발자들이 주구장창(!) 개방할 것을 요구해왔던 키보드와 위젯, 카메라 API 등을 드디어 열어 주었고, 앱들간의 데이터 연결은 더 긴밀하게 이루어지게 되었습니다. 헬스 제품들과 홈 오토메이션 제품들의 난립이 이루어지고 있는 가운데 이들로 부터 얻은 정보들을 한 곳에 모으고, 제어하는 플랫폼도 도입했습니다. 더 많은 종류의 화면 크기를 염두에 둔 반응형 레이아웃도 이번에 소개 되었습니다. (애플과 반응형 디자인 참조)

개발자 입장에서 본 iOS 8의 변화점

무엇보다도 새로운 프로그래밍 언어인 Swift가 발표되었습니다. Python이 가진 명료하고 파워풀한 문법과, LLVM 런타임이 가진 최적의 성능이 만나 꿈의 언어가 만들어졌습니다. 개발자 입장에서 본 iOS 8의 변화점을 간략하게 정리해보았습니다. 이 포스팅은 Apple 개발자 문서인 What's New in iOS에서 iOS 8.0 부분을 의역해서 작성되었습니다.


앱 익스텐션(App Extensions)

개발자 입장에서 본 iOS 8의 변화점

iOS 8부터 앱 익스텐션을 통해서 시스템의 기능을 확장할 수 있습니다. 애플이 폰에 최적화하기 위해서 제한된 멀티태스킹을 처음 도입했을 때와 비슷하게, 일단은 제한적인 사용자 동작에 해당하는 부분들만 건드릴 수가 있습니다. iOS 8에서 지원하는 익스텐션은 다음과 같습니다.

  • 공유(Share): 소셜 웹사이트 등에 공유할 수 있게 해줍니다.
  • 실행(Action): 선택한 컨텐츠에 대해 간단한 동작을 실행합니다.
  • 투데이 위젯(Today): 알림 센터에 있는 "오늘" 영역에 위젯을 추가할 수 있습니다. 내용 표시와 간단한 작업이 가능합니다.
  • 사진 편집(Photo editing): 사진 앱에서 서드파티 앱을 통해 이미지 편집이 가능해졌습니다.
  • 스토리지 제공자(Storage provider): 앱들간에서 공통적으로 사용되는 문서 저장장소에 OneDrive같은 서드파티 클라우드 서비스 제공자를 지정할 수 있게 되었습니다.
  • 커스텀 키보드(Custom keyboard): 드디어! 커스텀 키보드를 설치할 수 있게 되었습니다.

자세한 내용은 App Extension Programming Guide를 참조할 수 있습니다.


터치 아이디(Touch ID)를 통한 인증

개발자 입장에서 본 iOS 8의 변화점

지문인식 센서가 탑재된 아이폰 5s가 출시된 후 잠금화면 해제와 앱 구매할때만 지문인식 센서를 사용할 수 있다는 점이 아쉬움을 가져왔었는데요, 이제는 활용도가 훨씬 좋아질 것 같습니다. 보안이 필요한 앱들은 Local Authentication 프레임워크를 통해서 지문인증을 요청할 수 있게 되었습니다. 인증이 필요한 이유를 화면에 표시하고 지문인식을 요청한 후 인식 결과에 따른 처리를 앱에서 해줄 수 있습니다. 자세한 내용은 Local Authentication Framework Reference를 참조할 수 있습니다.


사진

사진 프레임워크(Photos Framework)

사진, 비디오 라이브러리들에 직접 접근할 수 있는 프레임워크입니다. 기존의 Assets Library 프레임워크를 대체하며, 쓰레드에 안전하게 썸네일 또는 풀사이즈 컨텐츠를 가져오고 캐싱하며, 편집할 수 있습니다. 다른 앱들이 편집한 이벤트도 인식할 수 있습니다. 자세한 내용은 Photos Framework Reference를 참조할 수 있습니다.

Photos UI 프레임워크를 통해서 네이티브 사진 앱 안의 컨텐츠들을 편집할 수 있는 익스텐션을 작성하려면 App Extension Programming Guide를 참조할 수 있습니다.

카메라 세부 조작

AV Foundation 프레임워크를 통해서 사진을 찍을 때 각종 파라메터를 직접 조작할 수 있게 되었습니다. 초점(focus), 화이트 밸런스(white balance), 노출(exposure) 값등을 건드릴 수 있습니다. 다양한 노출값을 동시에 찍은 결과물에도 접근할 수 있습니다. 자세한 내용은 AV Foundation Framework Reference를 참조할 수 있습니다.


게임

메탈(Metal)

개발자 입장에서 본 iOS 8의 변화점

이번에 애플이 새롭게 내놓은 그래픽 연산관련 프레임워크입니다. 최근에는 OpenGL을 직접 건드릴 일이 많이 적어졌기 때문에 어떤 용도로 만들어진건지 개인적으로도 궁금했었는데요. 기존의 OpenGL이 담당하던 레이어의 오버헤드를 획기적으로 줄이고 iOS 기기들에 탑재되어 있는 A7 칩셋의 성능을 극대화해주는 코드를 생성할 수 있다고 합니다.

WWDC 키노트에서 언급한 내용 중에 특히 주목을 끌었던 것은, Unity를 포함한 대부분의 멀티플랫폼 게임 저작툴들이 메탈을 지원할 예정이라는 사실과, 일반 게임 개발자들은 코드 한 줄 바꾸지 않고 툴 업데이트와 컴파일 과정만을 거쳐 iOS에서 최대 10배의 성능 향상을 가져온다는 점입니다. 자세한 내용은 Metal Programming Guide, Metal Framework Reference, Metal Shading Language Guide에 나와 있습니다.

씬 킷(Scene Kit)

개발자 입장에서 본 iOS 8의 변화점

이번에 새로 도입된 3D 게임관련 프레임워크입니다. Objective-C 기반으로 작성되어 있고, 비교적 고성능 렌더링 기능을 상위언어로 구현할 수 있다는 장점이 있습니다. OS X 10.8부터 있었는데 이번에는 iOS에도 포함되게 되었습니다. OpenGL ES같은 로우레벨 API들은 개발자가 렌더링 알고리즘을 세세하게 구현해야 하지만, 씬 킷을 이용하면 기하 구성요소(geometry), 물질(material), 광원(lights), 카메라(camera) 등을 오브젝트로 구성하고, 이 오브젝트들의 값을 변경해서 애니메이션을 줄 수 있다고 합니다. 물리엔진도 포함이 되어 있고, 계층관계의 행동(behavior) 지정을 통해서 자동차와 같은 바퀴달린 물체들을 다루기 쉽게 되어있다고 합니다.

쉐이더 부분은 OpenGL ES나 GLSL로 구현해서 커스텀화도 가능한 것으로 보입니다. 자세한 내용은 Scene Kit Framework Reference에서 확인할 수 있습니다.

스프라이트 킷(Sprite Kit)

개발자 입장에서 본 iOS 8의 변화점

작년에 처음 도입되었던 스프라이트 킷도 여러 가지 업데이트가 이루어졌습니다. 고급 이펙트들과 커스텀 OpenGL ES 세이더, 광원효과, 고급 물리효과, 애니메이션을 사용할 수 있게 되었고 씬 킷과 통합 구성이 가능해졌습니다. SKFieldNode 클래스를 통해 역장을 구성할 수 있습니다. 강체(rigidbody)는 픽셀단위로 지정할수 있게 되어서 충돌감지를 세밀하게 할 수 있습니다. 강체들 관계에 따른 고정(pin)이 가능하기 때문에 복잡한 시뮬레이션 하기에 수월해졌습니다.

Xcode 6에 새로운 쉐이더들과 씬 에디터가 추가되었고, 이를 통해 작업속도의 비약적인 향상을 기대할 수 있습니다. 씬 에디터를 이용해서 씬 컨텐츠를 생성하고 노드들의 특성을 지정해서 물리효과를 줄 수 있습니다. 추후에 씬 전체를 파일로 저장해서 게임 구동시 로딩해서 사용할 수 있습니다. 자세한 내용은 Sprite Kit Framework Reference, Sprike Kit Programming Guide를 참조하세요.

AV 오디오 엔진(AV Audio Engine)

AV Foundation 프레임워크를 사용하면, 골치 아프고 복잡한 Core Audio를 쓰지 않고도 다양한 범주의 오디오 함수들을 사용할 수 있습니다. 새로운 오디오 기능들은 iOS와 OS X에서 모두 사용할 수 있습니다. 오디오 입력과 출력에 자동 접근, 오디오 녹음과 재생, 파일 파싱과 변환을 할 수 있습니다. 특수 이펙트나 필터, 음정/재생속도 관리, 스테레오/3D 오디오 환경, 미디 악기 제어를 위해 Audio Unit에 접근할 수도 있습니다.

자세한 내용은 AV Foundation Framework Reference에서 확인할 수 있습니다.


헬스 킷 프레임워크(Health Kit Framework)

개발자 입장에서 본 iOS 8의 변화점

헬스 킷은 사용자의 건강과 관련된 정보를 관리해주는 프레임워크입니다. 건강 관련 앱들이 넘쳐나고 있는 가운데, 측정되거나 입력된 정보들이 산재되어 저장되고 있었는데 이를 한 군데에서 관리하기 위해서 도입되었습니다. 보안절차가 고려된 저장공간에 정보들을 안전하게 보관하고, 헬스 앱에서 모든 정보를 한 눈에 볼 수 있습니다.

앱에서 헬스 킷을 지원하면, 측정기기에 직접 연결하지 않고도 필요한 건강 정보들을 받아올 수 있습니다. 사용자는 앱별로 어떤 정보들을 공유할지 제한할 수 있습니다. 정보들이 업데이트 되는 시점도 세세하게 정할 수 있습니다. 예를 들면, 혈압을 잴 때마다 정보를 받아올 수도 있고, 혈압이 너무 높아지는 특정 지점에만 받아올 수도 있습니다.


홈 킷 프레임워크(Home Kit Framework)

개발자 입장에서 본 iOS 8의 변화점

헬스 킷과 마찬가지로, 홈 네트워크 기기들을 관리해주는 허브로서 야심차게 준비한 듯 합니다.

홈 킷을 이용해서 집에 있는 기기들은 인식하고, 일련의 동작들을 수행하게 할 수 있습니다. 동작들을 그룹화 하고, Siri를 통해 이를 실행하게 하는 것도 가능합니다. 예를 들면, 집에 들어와서 "잘준비 해줘"라고 하면, 문을 잠그고 조명을 끄고 가스를 잠근다던가 하는 동작들이 한꺼번에 수행되게 할 수 있는 겁니다.

홈 킷 악세서리 시뮬레이터를 통해 테스팅이 가능하며, Home Kit Framework Reference에 자세한 정보가 나와 있습니다.


아이클라우드(iCloud)

문서 기반의 데이터 이전

아이클라우드는 처음 발표되었을 때부터 버그가 많았습니다. 이를 의식해서인지, iOS 8이나 OS X 10.10으로 아이클라우드에 접속을 하면, 최초 1회에 한해서 전체 문서변환을 하게 됩니다. 이렇게 변환된 문서들은 iOS 8과 OS X 10.0 이상에서만 접근이 가능합니다. 서버와 클라이언트간의 동기화와 관련된 안정성 업데이트가 많이 이루어졌다고 합니다. (예전에 동기화 도중 문서들이 사라지는 버그는 악명이 높습니다.) 문서 이전을 마치고 기존 버전의 OS에서 아이클라우드에 접속하게 되면, 이전 저장소에 남아있는 데이터들을 볼 수는 있지만 새로 만들어진 데이터에는 접근할 수 없게 됩니다.

클라우드 킷(Cloud Kit)

클라우드 킷을 통해 앱과 아이클라우드간에 이루어지는 데이터 교환을 직접 컨트롤 할 수 있습니다. 기존 아이클라우드 개념과는 달리 로컬 저장소가 따로 존재하지 않습니다. 공개 저장소(public repository)와 비공개 저장소(private repository)가 있는데, 공개 저장소에 기록된 정보는 앱 사용자들 모두가 접근이 가능하고 비공개 저장소는 사용자만 접근이 가능합니다.

클라우드 킷을 사용하면, 서버 개발을 따로 하지 않고도 앱에서 서버 로직을 구현할 수 있습니다. 제약사항은, 아이클라우드 계정이 있어야 데이터 기록을 할 수 있다는 것입니다. 애플이 원래도 자사 플랫폼 독점(exclusive) 앱을 많이 장려했었는데요, 클라우드 킷을 통해 앱 개발사와 사용자들을 iOS와 OS X 플랫폼에 더욱 묶어두려는 계략이 엿보입니다만, 서버 개발과 유지보수 비용 부담이 부담스러운 인디 개발자로서는 매력적이지 않을 수 없습니다.

도큐먼트 피커(Docuemnt Picker)

UIDocumentPickerViewController를 통해서 앱 샌드박스 밖에 있는 파일들을 접근 할 수 있습니다. 하나의 문서를 여러 앱을 통해 편집하는 것이 가능해집니다. 개발사마다 자사 저장공간에 접근할 수 있는 도큐먼트 프로바이더(document provider)를 제작하는게 가능하기 때문에, iCloud Drice, OneDrive, Dropbox 같은 서비스들은 한 곳에서 사용할 수 있게 될 전망입니다.


핸드오프(Handoff)

개발자 입장에서 본 iOS 8의 변화점

올해 키노트에서 가장 박수를 많이 받았던 기능이 아닐까 합니다. 맥을 통해 아이폰에서 걸려온 전화를 받고, 수신된 문자에 대한 답장을 하는 기능이 특히 눈길을 끌었습니다. 핸드오프는 같은 Apple ID를 사용하는 기기끼리 동작합니다. 예를 들어, 아이폰에서 작성을 시작한 메일을 맥에서 이어서 작성한다던가, 아이패드에서 보고 있던 Safari 웹 페이지를 아이폰에서 같은 스크롤 위치에서 바로 이어서 본다던가 하는 시나리오들이 가능해집니다.

이런 앱들을 서드파티 앱에도 적용하려면, 파운데이션의 API들을 적용해야 합니다. 각각의 작업들을 다른 기기에서 이어서 할 수 있는 정보들을 액티비티(activity) 객체에 담아두어야 합니다. 자세한 정보는 Handoff Programming Guide에서 참고할 수 있습니다.


유니버셜 앱에서 하나의 스토리보드 사용

iOS 8부터는 하나의 스토리보드를 이용해서 아이폰과 아이패드를 동시에 지원할 수 있습니다. 자세한 설명은 이 포스팅에서 확인하실 수 있습니다. 요컨대 화면 크기별로 앱을 따로 만들게 아니고 반응형으로 잘 지정해서 대응하는 것이 가능해졌습니다. 향후에 발매될 아이폰 6, iWatch나 Apple TV 등을 염두에 둔 행보가 아닐까 싶습니다.

반응형 레이아웃을 위해서 사이즈 클래스라는 것을 도입했는데요, 쉽게 말하면 다양한 화면 크기를 카테고리화 하자는 것입니다. 크기는 레귤러(regular)와 컴팩트(compact) 두 가지가 정의되어 있습니다. 아이패드의 경우 너비와 높이가 모두 레귤러라고 정의하고, 아이폰의 경우 세로모드에서는 너비가 컴팩트, 가로모드에서는 너비와 높이가 모두 컴팩트라고 정의했습니다. 컴팩트의 경우에는 작은 크기로 정보들을 축약해서 보여줘야 하는 상황이고, 레귤러의 경우에는 넉넉한 화면 크기가 보장되며 폭도 고정되어 있지 않는 상황이라고 보시면 될듯 합니다. 아래 이미지에서 확인하실 수 있습니다.

개발자 입장에서 본 iOS 8의 변화점

개발자 입장에서 본 iOS 8의 변화점

이를 위해서 새롭게 추가된 클래스들이 있습니다.

  • UITraitCollection: 현재 화면을 구성하는 정보들의 집합입니다. 너비와 높이의 사이즈 클래스, 레티나 여부, 기기 구분(idiom)으로 이루어집니다.
  • UIImageAsset 클래스는 이미지들을 관리해주며 trait collection에 따라 적절한 이미지를 고를 수 있게 도와줍니다. 예를 들면, 컴팩트 사이즈의 너비와 컴팩트 사이즈의 높이, 레티나이면서 아이폰인 경우 해당하는 이미지를 이미지 어셋이 반환해줍니다. 예전에는 @2x, ~ipad 등과 같은 단어를 통해 조합했어야 했습니다.
  • UIAppearance는 특정 trait collection일때만 적용할 수도 있도록 변경되었습니다.
  • UIViewController는 자식 view의 trait collection을 받아올 수 있게 변경되었습니다. 가로모드/세로모드 전환시에는 trait collection이 변경이 되는 것으로 간주해서 그동안 써왔던 메소드들을 모두 없앴고, 이제는 viewWillTransitionToSize:withTransitionCoordinator: 메소드를 오버라이드해서 구현해야 합니다.

추가적인 프레임워크 변경사항

API 모던화

  • Objective-C 기반의 프레임워크에서 getter가 대부분 property로 변경되었습니다.
  • 생성자(initializer)는 id 타입 대신 instancetype을 반환하도록 변경되었습니다.
  • Designated initializer가 필요한 경우 선언됩니다.

AV 파운데이션 프레임워크(AV Foundation Framework)

비디오 캡쳐할 때 임의의 메타 데이터를 기록할 수 있습니다. 예를 들면 촬영 장소값을 넣을 수도 있습니다.

AV 킷 프레임워크(AV Kit Framework)

예전에 OS X에 도입되었던 프레임워크고 이번에 iOS 8부터 포함됩니다.

코어 이미지 프레임워크(Core Image Framework)

  • iOS에서 커스텀 이미지 커널을 만들 수 있습니다.
  • 이미지에서 QR 코드나 사각형을 인식할 수 있습니다.

코어 로케이션 프레임워크(Core Location Framework)

  • 몇층에 있는지 정보를 받아올 수 있습니다.
  • Visit service를 이용해서 관심있는 장소에 방문할 때 significant location change service를 사용하지 않고서도 인지할 수 있게 되었습니다.

파운데이션 프레임워크(Foundation Framework)

  • NSFileVersion 클래스를 통해 아이클라우드에 저장된 문서의 이전 버전들에 접근 가능합니다.
  • NSURL 클래스에 문서 섬네일을 메타 데이터로 저장하는 기능이 추가되었습니다.
  • NSMetadataQuery 클래스를 통해 앱에서 열었던 아이클라우드 문서를 찾을 수 있습니다.

게임 컨트롤러 프레임워크(Game Controller Framework)

  • 컨트롤러가 기기에 접속하게 되면 Game Controller 프레임워크에서 모션 데이터를 직접 받아올 수 있게 되었습니다.
  • 버튼 입력에 대해서 감도를 신경쓰지 않아도 눌린 여부를 알 수 있게 되었습니다.

게임 킷 프레임워크(Game Kit Framework)

  • iOS 7에서 추가되었던 기능이 OS 10.10에도 추가되어 크로스 플랫폼으로 구현 가능합니다.
  • GKSavedGame 클래스를 통해 아이클라우드에 게임 저장정보를 쉽게 동기화할 수 있습니다.
  • 사용자를 인식하기 위해 identifier 스트링을 이용하던 메소드들이 없어졌습니다. GKPlayer 클래스를 통해서 사용자를 인식하도록 변경되었습니다.

iAD 프레임워크(iAD Framework)

  • AV Kit을 이용해서 비디오를 재생한다면, 비디오 재생 전에 광고를 표시할 수 있게 되었습니다.
  • 앱에서 진행중인 광고의 효율성을 확인하기 위한 정보가 추가되었습니다.

미디어 플레이어 프레임워크(Media Player Framework)

메타 데이터 정보를 위한 클래스들이 추가되었습니다.

스프라이트 킷 프레임워크(Sprite Kit Framework)

  • 많은 기능들이 추가되었습니다.
  • 자세한 사항은 Sprite Kit Framework Reference, Sprite Kit Programming Guide를 참고하시기 바랍니다.

UI 킷 프레임워크(UIKit Framework)

  • 로컬/푸쉬 노티피케이션(Local/push notification)을 등록하기 위해서 UIUserNotificationSettings 객체를 이용하도록 변경되었습니다.
  • 노티피케이션을 받았을 때 액션(action)을 취할 수 있도록 지정이 가능합니다.
  • 컬렉션 뷰(collection view)의 셀 크기를 동적으로 변경할 수 있습니다. 성능 향상을 위해서 화면에 뿌려진 셀을 무효(invalidate)하는 방법들도 추가되었습니다.
  • 검색과 관련하여 UISearchController가 UISearchDisplayController를 대체합니다.
  • UIViewController는 trait와 사이즈 클래스를 지원합니다.
  • UISplitViewController를 아이폰에서도 사용이 가능합니다. 또한 한번의 구성으로 아이폰과 패드에서 모두 최적화해서 보여줄 수 있습니다.
  • UINavigationController의 바 영역을 제스쳐를 통해 숨길수 있게 되었습니다.
  • UIVisualEffect 클래스를 통해 블러(blur) 효과를 손쉽게 적용할 수 있습니다. (올레!)
  • UIPresentationController 클래스를 통해 컨텐츠와 테두리를 분리할 수 있습니다.
  • UIPopoverPresentationController 클래스를 통해 팝오버에서 보여지는 컨텐츠를 조절할 수 있습니다.
  • UIAlertController가 UIActionSheet와 UIAlertView를 대체합니다.
  • UIPrinterPickerController를 통해 프린터를 선택할 수 있습니다.
  • 환경설정 앱에서 앱설정을 직접 건드릴 수 있습니다. UIApplicationOpenSettingsURLString 키를 UIApplication 클래스의 openURL: 메소드에 전달해서 구현이 가능합니다.

비디오 툴박스(Video Toolbox) 프레임워크

  • 하드웨어 비디오 인코딩과 디코딩을 직접 제어할 수 있습니다.

제거된 API

  • UIApplication을 통해 notification을 등록하는 메소드
  • UIViewController에서 인터페이스 방향과 관련된 메소드
  • UISearchDisplayController 클래스
  • Game Kit에서 identifier 스트링을 이용한 사용자 인식

One more thing... Swift!

무엇보다 이번 WWDC의 하이라이트는 iOS 8도 아니요, OS X 10.01도 아니요, Swift의 발표가 아니었나 생각됩니다.

개발자 입장에서 본 iOS 8의 변화점

Swift는 코코아와 코코아 터치를 위해서 최적화되어 만들어진 프로그래밍 언어입니다. 적은 줄의 코드로 많은 일들을 할 수 있고, 성능향상도 가져다 주면서 가독성이 높습니다.

파이선(Python)이 가진 가독성과 LLVM 기반에서 동작하는 C언어의 성능을 합쳤다고 합니다. 이게 허풍이라고 볼 수 없는 것이, LLVM 컴파일러를 만들었던 천재 엔지니어 Chris Lattner가 런타임을 확실히 컨트롤 하고 있고, 애플은 이미 클로저(colsure) 등을 통해 프로그래밍 언어에 손댄 경력이 있습니다. Swift는 향후 10년간 iOS + OS X 플랫폼을 이루는 주축으로 자리잡을 것으로 기대됩니다.

당장 Swift를 스터디할 수 있도록, Apple에서 iBooks 도서를 배포합니다. 이번 WWDC가 우리에게 남겨준 것은 역시 공부, 또 공부입니다. (비명)

관련링크

Ubuntu 서버 14.04 초기설정 가이드

$
0
0

Ubuntu 서버를 처음 설치한 후 기본적으로 해야 하는 셋업이 몇 가지 있습니다. 이번 포스팅에선 DigitalOcean에 정리되어 있는 블로그 포스팅Ubuntu 보안 가이드 블로그 포스팅을 참고하여, 보안 강화를 위해서 또는 쉬운 관리를 위해서 꼭 필요한 서버 초기설정에 대해서 알아보겠습니다.

이 가이드는 Ubuntu 14.04를 기준으로, vultr.com VPS에서 테스트 되었습니다.


1단계. 루트(root) 로그인

모든 작업을 위해서 가장 먼저 필요한 서버 로그인을 해보겠습니다.

서버에 접속하기 위해서는 IP 주소와 root 계정의 비밀번호를 알아야 합니다. vlutr.com과 같은 VPS 서비스를 이용하여 가상서버 인스턴스를 생성하게 되면 IP 주소와 초기 root 계정 비밀번호를 제공해줍니다. 현재는 root 계정으로만 접근할 수 있습니다. OS X나 Unix 계열의 OS를 사용할 경우 터미널에서 다음과 같은 명령어로 서버에 접속할 수 있습니다.

$ ssh root@{server-ip-address}

처음 접속할 경우에는 다음과 같은 메시지를 볼 수 있습니다. 접속한 적이 없는 원격 서버라고 경고하는 것입니다. "yes"를 누르면 다음으로 넘어갑니다.

The authenticity of host '0.0.0.0 (0.0.0.0)' can't be established.
ECDSA key fingerpring is 79:95:46:1a:ab:37:11:8e:86:54:36:38:bb:3c:fa:c0.
Are you sure you want to continue connecting (yes/no)?

2단계. Hostname 설정

서버에 연결될 도메인 주소를 입력합니다. 아래와 같이 입력하면 즉시 반영되지만 재부팅시에는 설정이 유지되지 않습니다. (yourdomain.com 값은 해당하는 값으로 변경하시기 바랍니다.)

$ sudo hostname yourdomain.com

서버를 재부팅해도 값을 유지하기 위해서 /etc/hostname 파일을 다음과 같이 수정합니다.

yourdomain.com  

3단계. 언어(locale) 설정

/etc/default/locale 파일을 다음과 같이 수정합니다. (각 행의 마지막에 빈칸이 포함되지 않도록 합니다.)

LANG="en_US.UTF-8"  
LANGUAGE="en_US.UTF-8"  
LC_ALL="en_US.UTF-8"  

다음과 같이 서버를 재부팅하면 설정이 적용됩니다.

$ sudo reboot

4단계. 계정 생성

로그인할 수 있는 새로운 계정을 만들어 보도록 하겠습니다. 아래 {username} 부분을 원하시는 이름으로 바꾸시면 됩니다.

$ adduser {username}

비밀번호를 포함하여 몇 가지 정보를 입력하게 됩니다. 비밀번호를 제외하고는 필수 입력사항이 아니므로 그냥 엔터를 입력해도 됩니다.


5단계. 루트 권한

윗 단계에서 만든 계정은 일반 계정입니다. 일반적인 작업은 수행할 수 있지만 관리자 작업은 수행할 수 없습니다.

일반 계정에서 관리자 작업을 수행할 수 있도록 일반 계정에 "sudo" 권한을 부여할 수 있습니다. 이를 통해 일반 계정도 명령어 앞에 sudo를 붙이면 관리자 작업을 할 수 있게 됩니다.

일반 계정에 루트 권한을 부여하기 위해서 먼저 루트 계정으로 로그인 한 후에 다음과 같이 입력합니다.

$ adduser {username} sudo

6단계. 방화벽 설정

ufw는 Ubuntu에 기본적으로 설치되어 있는 방화벽입니다. SSH 접속을 위해서 해당포트(기본값 22)를 열어줍니다. 필요한 경우 http 포트도 열어줍니다.

$ sudo ufw allow ssh
$ sudo ufw allow http

이제 설정을 마쳤으므로 다음과 같이 enable할 수 있습니다.

$ sudo ufw enable

현재 동작여부와 열려있는 포트의 목록을 보려면 다음과 같이 입력합니다.

$ sudo ufw status

7단계. SSH 보안

SSH의 경우 무차별 아이디/패스워드 대입 공격을 당할 수 있으므로 root 계정을 비활성화 하고, 반복된 로그인 실패시 딜레이를 주도록 설정해야 합니다.

root 계정 비활성화

/etc/ssh/sshd_config 파일에서 다음 부분을 찾아서 no로 변경합니다.

PermitRootLogin no

다음과 같이 서비스를 다시 시작합니다.

sudo service ssh restart

반복 접속시 딜레이 주기

$ sudo apt-get install sshguard

8단계. apt-get 업데이트

OS를 새로 설치한 후 최신 업데이트를 합니다. apt-get update를 통해 최신 업데이트 목록을 가져올 수 있으며, apt-get upgrade를 통해 실제로 업데이트를 할 수 있습니다.

$ apt-get update
$ apt-get upgrade

이후에는?

이것으로 기본적인 서버 설정을 모두 마쳤습니다. 동적 웹 서비스를 위해서 웹 서버와 DB 등을 설치할 수 있습니다. 자세한 내용은 Ubuntu 서버 14.04에 LEMP 스택 설치하기 (Nginx, MySQL, PHP)를 참고하시기 바랍니다.


참고: VULTR를 통한 가상서버(VPS) 호스팅

Ubuntu 서버 14.04에 LEMP 스택 설치하기 (Nginx, MySQL, PHP)

$
0
0

(Nginx 1.8, MySQL 5.7, PHP 7.0 기준으로 업데이트 되었습니다.)

LEMP 소프트웨어 스택은 동적 웹 어플리케이션을 구현하기 위해서 필요한 Linux + Nginx + MySQL + PHP를 모아서 부르는 말이라고 합니다. (LNMP가 아니고 LEMP인게 특이하네요.) Nginx 서버 대신에 Apache 서버로 구성된 LAMP 스택도 있습니다.

이 포스팅에서는 Ubuntu 14.04 서버에 LEMP 스택을 설치하는 방법에 대해서 소개합니다. 이후 작업을 위해서 다음 사항들이 준비되어야 합니다. Ubuntu 서버 14.04 초기설정 가이드를 참고하셔서 필요한 사항들을 세팅하실 수 있습니다.

  • Ubuntu 14.04 서버
  • root 계정이 아니면서 sudo 권한을 가지고 있는 사용자 계정
  • SSH 서비스

출처: DigitalOcean


1단계. Nginx 웹 서버 설치하기

Apache 서버의 대안으로 떠오르고 있는 Nginx 서버를 설치해보도록 하겠습니다. Apache와의 성능을 비교했을때 확실한 우위를 가지고 있고 많은 관점에서 모던함이 묻어나는 프로젝트입니다.

apt-get 명령어를 통해 설치할 수 있습니다. Ubuntu 14.04 LTS에 포함되어 있는 기본 패키지는 구버전(1.4)이기 때문에 최신 버전 설치를 위해 다음과 같이 repository를 추가해주니다.

$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:nginx/stable
$ sudo apt-get update
$ sudo apt-get install nginx

Nginx는 설치만으로도 Ubuntu 14.04에서 바로 실행할 수 있습니다. 서버를 설치한 직후라 IP 주소를 알 수 없다면 다음과 같이 입력해서 알아내실 수 있습니다.

$ sudo apt-get install curl
$ curl http://icanhazip.com

브라우저 창에 다음과 같이 주소를 입력하시면 아래와 같이 기본 환영화면을 보실 수 있습니다.

http://{server_domain_name_or_IP}

Welcome to Nginx

혹시 이전에 ufw를 활성화한 상태라면 다음과 같이 Nginx Full을 추가해서 http 포트와 ssl 포트를 방화벽 예외처리해야 합니다.

$ sudo ufw allow "Nginx Full"

2단계. MySQL 설치하기

이제 웹 서버의 데이터를 저장할 수 있는 MySQL 데이터베이스를 설치해보도록 하겠습니다. (최신 버전의 설치를 위해서는 다음을 확인하세요.) 설치를 위해서 다음과 같이 입력합니다.

$ sudo apt-get update
$ sudo apt-get install mysql-server

설치 화면이 진행되고, MySQL root 계정의 비밀번호를 입력하는 화면이 나옵니다. 사용하실 비밀번호를 입력합니다.

보안 강화를 위해서 기본값들을 변경해주는 스크립트를 다음과 같이 실행합니다.

$ sudo mysql_secure_installation 

root 계정의 비밀번호를 입력하고, 이후에 물어보는 몇 가지 질문에 대해 답을 합니다.

  • MySQL root 비밀번호 변경: N + [Enter]

3단계. PHP 설치하기

Nginx 서버와 MySQL 데이터베이스를 연결해주는 스크립팅 런타임이 필요합니다. Nginx는 다른 웹서버와 같이 PHP를 네이티브로 지원하지 않기 때문에 fastCGI process manager(FPM)으로 구현되어 있는 php7.0-fpm을 설치해야 합니다.

PHP 7.0에 따라 다음과 같이 최신 repository를 추가하고 설치해 줍니다. 5.x 버전과 비교, 특정 부분에서 2-3배의 속도 향상이 있다고 합니다.

$ sudo add-apt-repository ppa:ondrej/php
$ sudo apt-get update
$ sudo apt-get install php7.0-fpm
$ sudo apt-get install php7.0-mysql

이제 PHP가 설치되었습니다. 보안을 위해서 몇 가지 단계를 더 진행해야 합니다. /etc/php/7.0/fpm/php.ini 파일을 열어서 cgi.fix_pathinfo 부분을 찾아서 주석처리를 해제하고, 다음과 같이 값을 0으로 변경합니다.

cgi.fix_pathinfo=0

저장한 후 종료하고 다음과 같이 입력하여 php5-fpm 서비스를 다시 시작합니다.

sudo service php7.0-fpm restart

4단계. PHP를 위한 Nginx 서버 설정하기

이제 필요한 모든 컴포넌트는 설치되었습니다. 이제 Nginx 서버 설정에서 .php 파일을 처리해주는 부분만 적용하면 됩니다. /etc/nginx/sites-available/default 파일을 열었을 때 주석을 제외하면 다음과 같이 되어 있을 것입니다.

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /usr/share/nginx/html;
    index index.html index.htm;

    server_name localhost;

    location / {
        try_files $uri $uri/ =404;
    }
}

다음 사항을 수정합니다.

  • index.html 앞에 index.php를 추가합니다.
  • server_name을 도메인 이름이나 IP 주소로 변경합니다.
  • 에러처리 루틴을 주석 해제합니다.
  • 실제적인 PHP 프로세싱을 위해 필요한 부분을 주석 해제합니다. try_files 부분도 추가해서 잘못된 요청이 전달되지 않도록 합니다.
server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /usr/share/nginx/html;
    index index.php index.html index.htm;

    server_name server_domain_name_or_IP;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }

    location ~ \.php$ {
        fastcgi_index  index.php;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        fastcgi_buffers 256 4k;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

[추가사항] Ubuntu 14.10 버전에서 cgi가 동작하지 않는 경우 include fastcgi_params; 다음 줄에 다음과 같이 추가합니다. (얄리얄리얄라셩님 제보 감사 드립니다.)

    include fastcgi.conf;

위의 사항을 모두 반영했다면 Nginx 서버를 재시작합니다.

$ sudo service nginx restart

5단계. PHP 정상동작 테스트

이제 LEMP 스택이 모두 설치되었고 정상 동작하고 있습니다. 확인을 위해서 nginx 서버 루트 디렉토리(기본적으로 /usr/share/nginx/html에 위치합니다)에 info.php 파일을 만들고 다음과 같이 입력합니다.

<?php
    phpinfo();
?>

입력을 마친 후 주소창에 다음과 같이 입력합니다.

http://{server_domain_name_or_IP}/info.php

다음과 같은 (비슷한) 화면이 표시된다면 LEMP 스택을 성공적으로 설치한 것입니다.

PHP Info

이 파일을 그대로 두는 것은 보안적으로 좋지 않기 때문에, 테스트를 완료한 후 파일을 지우도록 합니다.


6단계. PHPMyAdmin 설치

$ sudo apt-add-repository ppa:nijel/phpmyadmin
$ sudo apt-get update
$ sudo apt-get install phpmyadmin

참고: VULTR를 통한 가상서버(VPS) 호스팅


iOS 8의 적응형(Adaptive) UI

$
0
0
iOS 8의 적응형(Adaptive) UI

하나의 정해진 화면 크기만 고려해서 개발하던 시대는 종말을 고했다. 3.5", 4", 4.7", 5.5", 7.9", 9.7" 크기의 디스플레이, 가로모드, 세로모드, 레티나 디스플레이 등... 고려해야 할 사항들이 늘어남에 따라 설계해야 할 화면의 조합은 기하급수적으로 증가하였다. 애플은 iOS 8에서 내놓은 적응형(adaptive) UI의 등장 배경과 기본적인 개념을 정리하였다.


아이폰 화면크기의 변천사

2007년. UX 보다는 기능에 치중한 PDA와 피쳐폰이 난무하던 시절이였고, 당시 멀티터치 기반 인터페이스의 무한한 잠재력을 내다 본 애플은 새로운 형태의 스마트폰을 구상하고 있었다. 모바일이라는 극히 제약적인 환경에서 수 많은 프로토타입을 거친 결과 3.5" 크기의 디스플레이가 최종적으로 결정되었다. 출시가 이루어진 후 이듬해인 2008년에 앱스토어가 서비스에 들어갔고 서드파티 개발자들은 320 x 480 (@1x)에 최적화된 앱들을 개발하기 시작했다. 당시에는 가로모드(landscape)도 없었으니 하나의 해상도의 하나의 방향만 고려하면 되는, 그야말로 행복한 세상이였다.

iOS 8의 적응형(Adaptive) UI

2010년에 아이패드가 등장했다. 1024 x 768 (@1x) 픽셀의 화면과 크기를 가졌고, 새롭게 가로모드가 도입되었다. 동시에 "Split View"라는 화면분할 방식을 추가했다. 아이폰에서는 두 화면에 걸쳐 보여지던 내용을 한 화면에서 볼 수 있게 된 것이다. 메일 앱의 경우를 예로 들면, 왼쪽에는 메일 목록을 보여주고 오른쪽에는 메일 세부내용을 동시에 보여줘서 화면 전체를 전환하지 않아도 메일 항목간에 번갈아가며 볼 수 있게 되었다.

iOS 8의 적응형(Adaptive) UI

아이폰 4는 레티나 디스플레이(Retina Display)라고 불리우는 고해상도 화면을 탑재하였다. 가로, 세로로 픽셀의 갯수가 각각 두배가 되어서 640 x 960 픽셀의 해상도였다. 기존 앱들과의 호환성을 위해 포인트(point)라는 개념을 도입하였는데, 이는 화면에 표시되는 크기에 대한 논리적인 단위이다. 이전 기기에서는 1 포인트 = 1 픽셀로, 레티나 기기에서는 1 포인트 = 2 픽셀로 정의를 해서 포인트 단위로 화면에 출력을 할 경우 두 기기에서 동일하게 보여지게 된다. 예전에는 1개만 필요했던 이미지 파일들도 이 때 부터 저해상도, 고해상도 버전으로 2개씩 제작을 해야 했다.

iOS 8의 적응형(Adaptive) UI

2012년도에는 레티나 아이패드가 출시되었다. 1024 x 768 (@2x) 포인트를 유지했지만 마찬가지로 가로, 세로 픽셀이 각각 두 배가 되어 2048 x 1536 픽셀이 되었다. 이 때 까지만 해도 다양한 화면 크기와 해상도를 지원하는 일은 그럭저럭 견딜만 했다. 두 가지의 크기(아이폰, 아이패드)와 두 가지의 방향(가로모드, 세로모드), 그리고 두 가지의 해상도(비-레티나, 레티나)를 고려해야 했고, 이를 조합하면 모두 8가지 경우의 수가 나왔다.

iOS 8의 적응형(Adaptive) UI

2012년 가을에 아이폰 5가 출시되었다. 2007년만 해도 광활하다고 여겨졌던 3.5"의 디스플레이는 경쟁 제품들에 비해 초라한 크기가 되어버렸다. 이에 대한 고심의 결과인지 320 x 568 (@2x) 포인트, 640 x 1136 픽셀이라는 다소 의아한 해상도를 가지고 출시되었다. 그로 인해 추가로 늘어난 320 x 88 (@2x) 포인트 공간에 대한 고민이 시작되기 시작했다. 어떤 앱들은 이 공간을 목록보기에서 항목을 더 보여주는 것으로 사용했고, 이미지를 표시할 때 더 표시하는 것으로 사용하기도 했다. 하지만 커스텀 UI는 새로 만들어져야 했다. 개발자들이 아무런 처리를 하지 않으면 이 공간은 상/하단의 검은 여백이 표시되었다. 이제 개발자들은 세 가지의 포인트 크기와, 두 가지의 화면 방향, 두 가지의 해상도를 지원해야만 했다.

iOS 8의 적응형(Adaptive) UI

다행히도 아이폰 3GS가 단종되면서 320 x 480 (@1x) 포인트 화면을 지원할 필요가 사라졌다. 하지만 아이패드 2와 1세대 아이패드 미니는 여전히 비-레티나 화면이였기 때문에 1024 x 768 (@1x)는 여전히 고려해야 할 대상이였다.

2014년에 아이폰 6와 아이폰 6 플러스가 출시됨에 따라 사태는 점입가경에 이르게 된다. 아이폰 6는 375 x 667 (@2x) 포인트였고, 아이폰 6 플러스는 414 x 736 (@3x) 포인트였다.

iOS 8의 적응형(Adaptive) UI

특히 아이폰 6 플러스가 @3x라는 새로운 해상도를 도입한 것 외에도, 물리적인 픽셀 수가 1080 x 1920의 변태 해상도(!)였기 때문에 혼란은 가중되었다. 기존에는 포인트에 @ 배수를 곱하면 물리 픽셀과 일치하였지만 아이폰 6 플러스는 1242 x 2208 픽셀을 렌더링한 후에 다운샘플링(downsampling)하여 최종적으로 1080 x 1920 픽셀로 보여주게 된다. 이로 인해 디자이너로부터 사랑받았던 1픽셀 크기의 헤어라인(hair line)은 정상적으로 구현하기 어려워졌다.

iOS 8의 적응형(Adaptive) UI

2015년 1월 현재까지 출시된 기기들의 종류는 다음과 같다.

iOS 8의 적응형(Adaptive) UI

이 시점에서 개발자들은 다섯 가지의 포인트 크기와, 두 가지의 화면 방향, 세 가지의 해상도를 지원해야 했다. 이를 조합하면 무려 30가지 경우의 수가 나오고, 이 중에서 의미 없는 조합을 제외하더라도 14가지 경우의 수를 고려해야 하는 상황이 되었다.

iOS 8의 적응형(Adaptive) UI

다양한 화면 크기와 해상도를 출시한 애플은 뒷수습을 위해 2012년에 오토 레이아웃(Auto Layout)을 도입하였다. 이는 화면에 표시되는 항목들을 제약조건(constraints)에 따라 표시하는 방식이다. 예를 들면, '두 버튼 사이의 간격은 10 포인트'라는 조건을 지정해 주면 화면에 모든 조건들을 만족시키도록 표시하는 방식이다. 하지만 오토 레이아웃만으로는 복잡한 해상도 문제를 궁극적으로 해결할 수 없었고 화면 크기라는 변수와 조합이 필요했다. 이로 인해 도입되게 된 것이 사이즈 클래스라는 개념이다.


사이즈 클래스(Size classes)

애플은 iOS 8에서 사이즈 클래스를 도입했다. 가로와 세로의 화면의 크기를 의미적으로 구분하기 위한 것으로, UIInterfaceOrientation와 UIUserInterfaceIdiom을 대체하게 될 것이다. 다음과 같이 네 가지가 정의되었다.

  • 가로 레귤러 (Horizontal Regular)
  • 가로 컴팩트 (Horizontal Compact)
  • 세로 레귤러 (Vertical Regular)
  • 세로 컴팩트 (Vertical Compact)

특별한 원칙에 따라 구분되었다기 보다는 그렇게 정의하기로 해서 정해진 느낌이 강하다. 아래에는 가로 사이즈 클래스의 경우를 보면 왼쪽과 같이 아이패드에서 뜨는 화면을 많이 차지하는 뷰는 '가로 레귤러'로 분류하고 있고, 오른쪽과 같이 아이폰에서 보여지는 경우 또는 아이패드에서 너비가 작게 표시되는 경우 '가로 컴팩트'로 분류하고 있다.

iOS 8의 적응형(Adaptive) UI

다음의 표는 전체화면 크기가 각 기기에서 어떻게 분류되는지를 보여준다. 특이하게도 아이폰 6 플러스의 경우에는 가로모드에서 다른 아이폰들과 달리 '가로 레귤러'로 표시된다.

iOS 8의 적응형(Adaptive) UI

애플이 제공하는 기본 UI중에서 사이즈 클래스의 변화에 따라 먼저 최적화된 것은 네비게이션 바(navigation bar)이다. 컴팩트/레귤러에서 컴팩트/컴팩트로 바뀌게 될 때 네비게이션 바의 높이가 작아지며 상태 바(status bar)는 사라지도록 하였다. 이는 화면에 컨텐츠를 최적화해서 보여주기 위함이다. iOS 9, iOS 10 이후에는 좀 더 많은 UI 요소들이 이런 최적화를 보여주리라 기대가 된다.

사이즈 클래스에 따라 화면을 구성하는 것이 가능해짐에 따라 개발자들은 좀더 쉽게 화면 크기에 최적화된 앱들을 만들 수 있다. 예를 들어 세로모드에는 위, 아래로 배치되어 있던 버튼들을 가로모드에서는 왼쪽과 오른쪽으로 배치해서 보여줄 수 있다. 또한 아이패드에서만 가능했던 Split View를 아이폰에서도 사용할 수 있게 되었다. 실제로 아이폰 6+에서는 가로모드에서 아이패드 같은 화면을 보여주게 된다.


트레잇 컬렉션(Trait Collection)

트레잇 컬렉션은 현재 스크린 정보를 담고 있다. 가로 및 세로의 사이즈 클래스(레귤러, 컴팩트), 인터페이스 이디엄(Interface Idium; 아이폰 또는 아이패드를 구분), 화면 비율(1.0 또는 2.0)들이 여기에 포함된다. 아래의 예는 레티나 아이폰 세로모드에서의 경우이다. 가로 사이즈 클래스는 컴팩트이고, 세로 사이즈 클래스는 레귤러이다. 아이폰/아이팟 터치인 경우이므로 userfaceIdiomPhone이고, displayScale2.0이다.

iOS 8의 적응형(Adaptive) UI

UIViewController에서 traitCollection을 통해 접근이 가능하며, 화면 방향이 바뀌게 되면 traitCollectionDidChange: 메소드가 호출되게 된다.


이미지 파일 관리

이미지 파일 관리에도 변화가 생겼다. Xcode 6에서 바뀐 이미지 어셋(Image Assets)을 통해서, 가로 및 세로 사이즈 클래스, 인터페이스 이디엄, 화면 비율 등의 정보를 트레잇 컬렉션을 통해 정보를 가져오고 꼭 필요한 이미지를 불러오게 된다. 예를 들면, 아이폰 가로모드에서 버튼 크기를 가로모드에서보다 좀 작게 하려면, 두 개의 이미지를 제작한 후 각각 상황에 지정하면 되는 방식이다. 다양한 이미지 파일을 만들어야 한다는 사실은 변함이 없지만만, 적어도 Xcode 안에서 파일들을 체계적으로 정돈하고 관리할 수 있는 길이 생긴 것이다.

iOS 8의 적응형(Adaptive) UI

위와 같이 이미지들을 지정해주면, 아이폰 가로모드의 경우 왼쪽과 같은 트레잇 컬렉션으로 인식하여 큰 이미지를 표시해주고, 아이폰 세로모드의 경우 오른쪽과 같은 트레잇 컬렉션으로 인식하여 작은 이미지를 표시해준다.

iOS 8의 적응형(Adaptive) UI


Split View Controller

Xcode 6에서는 하나의 스토리보드를 가지고, 다양한 화면을 대응할 수 있게 되었다. 이를 위해서 뭔가 엘레강스한 디자인 패턴이 필요했는데 이를 위해서 애플이 가장 먼저 손을 댄 것이 Split View Controller이다.

iOS 8의 적응형(Adaptive) UI

위는 환경설정 앱의 예이다. 왼쪽에는 주로 목록을 보여주는 마스터(master) 뷰, 오른쪽에는 주로 세부사항을 보여주는 디테일(detail) 뷰로 구성이 되어 있다. 계층 구조의 데이터를 표현해주는 많은 종류의 앱이 이러한 형태로 표현하기 좋다. 또한 현재 화면의 가로 사이즈 클래스의 값에 따라 다음과 같이 자동으로 화면 전환이 이루어진다.

  • 가로 레귤러일 경우 위 그림처럼 나란히(side-by-side) 표시된다.
  • 가로 컴팩트일 경우 마스터 뷰가 표시되고, 디테일 뷰는 숨겨진다.

아이패드는 가로모드, 세로모드 모두 가로 레귤러의 사이즈 클래스를 가지고 있기 때문에 화면 전환에 따라 위의 전환이 일어나지 않는다. 아이폰 6 플러스를 제외한 아이폰도 두 경우 모두 가로 컴팩트이므로 마찬가지로 위의 전환이 이루어지지 않는다. 아이폰 6 플러스의 경우 가로모드에서 세로모드로 전환할 경우, 위에 해당하는 전환이 이루어진다. 메일 앱을 아이폰 6 플러스에서 가로모드에서 볼 경우 다음과 같이 배치된다.

iOS 8의 적응형(Adaptive) UI


꽤 장문의 포스팅이 되었지만 개발자로서 고민을 해야 할 부분은 이제부터 시작이다. 아이폰 5가 처음 나왔을 때 추가로 늘어난 화면 크기에 대한 고민이 이루어졌던 것 처럼, 아이폰 6와 아이폰 6 플러스가 제공해주는 더 큰화면 영역이 어떻게 사용되어야 할지에 대한 고민이 필요해졌다. 아이폰용 앱과 아이패드용 앱을 따로 만들던 시대로부터 벗어남에 따라 같은 내용을 각각의 기기에서 어떻게 일관적으로 보여줄가에 대한 고민도 필요하다. 애플이 내놓은 Split View Controller 같은 패턴들이 좀더 다양하게 개발되어야 할 것이다.

반응형 웹이 처음 나왔을 때와 마찬가지로 정리가 되려면 시간이 좀 더 필요해 보인다. 현재로서는 아래와 같은 자료들을 참고할 수 있다.

Ghost 0.5.8 업데이트

$
0
0

Ghost 0.5.8 버전이 공개되었습니다. 개발사가 공개한 0.6 버전까지의 로드맵을 통해 알 수 있듯이 적은 수의 개선사항을 좀 더 빠른 주기로 공개하기 위한 작업의 일환입니다.

이번 버전에서 가장 주목할만한 점은 태그(Tag) 관리 기능의 추가입니다. 작성된 태그들의 삭제 및 URL 변경이 가능해졌습니다. 특히나 예전에 한글로 작성된 태그의 경우 괴상한 영문 표기로 URL이 할당되었으나, 이제는 원하는 값을 입력할 수 있게 되었습니다. 앞으로도 다양한 업데이트를 통해 태그 관리 기능을 개선한다고 하니 기대가 됩니다.

Tag management

그 외에도 실험적인 기능들을 테스트해볼 수 있는 Labs 페이지가 새로 추가되었고, 기존 블로그 데이터를 가져올 수 있는 마이그레이션 도구에서 이미지와 Markdown을 처리할 수 있게 되었습니다. 이 곳에서 기타 소소한 버그 픽스를 포함한 전체 변동내역을 확인할 수 있습니다.


업그레이드 방법

Ghost를 서버에 직접 설치하여 관리하는 경우, Ghost 0.5.8 링크를 통해서 다운받으실 수 있습니다. 업그레이드 문서에 자세한 방법이 설명되어 있습니다. 0.5.x 버전에서 바로 업데이트가 가능합니다.

Ubuntu 서버 14.04에 MEAN.JS 스택 설치하기 (MongoDB, ExpressJS, AngularJS, Node)

$
0
0

MEAN 스택은 JavaScript 기반의 풀스택 서버 개발환경으로, MongoDB, ExpressJS, AngularJS, Node를 포함합니다. 이번 가이드에서는 Ubuntu 14.04 서버에 설치하는 방법을 소개합니다.

준비사항

  • Ubuntu 14.04 서버
  • sudo 권한을 가진 계정 (root 제외)

설치에 필요한 사항은 Ubuntu 서버 14.04 초기설정 가이드을 참고하시기 바랍니다.

출처: Digital Ocean, Installing Node.js via package manager


MongoDB 설치

앞으로 이루어질 설치는 Ubuntu의 패키지 관리 시스템인 apt를 통해 이루어집니다. 먼저 해야 할 일은 최신 버전의 MongoDB 소스가 포함되어 있는 repository를 추가하는 것입니다. 기본적으로 Ubuntu에는 MongoDB를 설치할 수 있는 repository가 포함되어 있지 않습니다. 아래와 같이 신뢰할 수 있는 key를 추가한 후 repository 리스트 파일을 생성합니다.

$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
$ echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list

이제 MongoDB의 repository가 추가되었습니다. 다음에는 로컬에 저장되어 있는 패키지 캐쉬를 최신화 하고 설치하는 작업을 진행합니다.

$ sudo apt-get update
$ sudo apt-get install mongodb-org git build-essential openssl libssl-dev pkg-config

Node 설치

Node는 아직도 굉장히 빠른 속도로 개발중인 프로젝트입니다. 따라서 마찬가지로 다음과 같이 repository 추가가 필요합니다. (업데이트: 기존 소스 컴파일 방법으로부터 변경되었습니다.)

$ curl -sL https://deb.nodesource.com/setup_0.12 | sudo bash -

이후에 다음과 같이 설치를 진행합니다.

$ sudo apt-get install -y nodejs

다음과 같이 Node와 npm의 설치된 버전을 확인할 수 있습니다.

$ node -v
$ npm -v

Bower, Grunt 설치하기

프론트엔드 어플리케이션 관리를 위해서 bower라는 매니저를 사용하게 됩니다. 또한, Grunt Task Runner라는 것을 통해 반복적인 공통 작업을 수행하게 될 것입니다. 앞으로 많은 프로젝트에서 계속 사용되기 때문에 다음과 같이 글로벌하게 설치합니다.

$ sudo npm install -g bower grunt-cli

MEAN 스택 프로젝트 뼈대 생성(Scaffolding)

이제 필요한 소프트웨어는 모두 설치되었습니다. 새로운 프로젝트를 시작해야 하는데 매번 세팅하는 번거로움을 줄이기 위해 yo라는 generator가 있습니다.

$ sudo npm install -g yo
$ sudo npm install -g generator-meanjs

이제 폴더를 생성한 후 그 안에 들어가서 다음과 같이 명령어를 입력합니다. (현재 폴더에 파일을 생성해주므로 Desktop 같은 위치에서 실행하면 대략 난감해집니다 ^^)

$ yo meanjs

이제 스크립트가 물어보는 몇 가지 사항(프로젝트 이름, 제작자 이름 등)을 입력하면 프로젝트 생성이 완료됩니다.


참고: VULTR를 통한 가상서버(VPS) 호스팅

Ghost 0.5.9 업데이트

$
0
0

Ghost 0.5.9 버전이 공개되었습니다. Node v0.10.x 에서만 돌아가며 Node v0.12 버전과 io.js은 조만간 지원 할 예정입니다.

이번 버전에서 가장 주목할만한 점은 네비게이션(Navigation) 기능의 추가입니다. 업데이트된 Casper 테마에서 오른쪽에 다음과 같이 전체 메뉴가 추가되었습니다.

Navigation UI

다음과 같이 관리자 페이지에서 블로그에 표시될 전체 메뉴를 관리할 수 있습니다.

Navigation management

그 외에도 RSS 피드에서 이미지들이 표시되도록 수정되었고, 몇몇 버그들과 보안 이슈들이 수정되었습니다. 이 곳에서 전체 변동내역을 확인할 수 있습니다.


업그레이드 방법

Ghost를 서버에 직접 설치하여 관리하는 경우, Ghost 0.5.9 링크를 통해서 다운받으실 수 있습니다. 업그레이드 문서에 자세한 방법이 설명되어 있습니다. 0.5.x 버전에서 바로 업데이트가 가능합니다.

VULTR를 통한 가상서버(VPS) 호스팅

$
0
0

가상서버 호스팅의 시대

예전에는 서버(dedicated server)를 구축하려면 비싼 하드웨어를 구매하여 IDC에 입주시키거나, 느리고 제약이 많은 웹호스팅을 이용해야만 했었습니다. 이 두 사이의 간극을 메꿔주는 서비스가 있는데, 바로 가상서버(Virtual Private Server, VPS) 호스팅입니다.

VPS는 가상머신(virtual machine)을 서비스로 제공하는 것입니다. 관리자 권한이 있기 때문에 자체 OS를 설치할 수 있고, 어떤 프로그램이라도 설치할 수 있다는 장점이 있습니다. 단독서버(dedicated server)와 기능적으로 동일하게 사용할 수 있으면서도 물리적인 성능을 손쉽게 확장할 수 있습니다. 다만 주로 다른 가상서버와 하드웨어를 공유하기 때문에 단독서버만한 성능을 내지는 못한다는 단점이 있습니다.

Qing Wang이 2014년도에 비교한 자료에 의하면, VPS 분야에서 제일 잘 나가는 회사 세 군데(Digital Ocean, Linode, VULTR) 중에서 VULTR가 가장 높은 점수를 얻었습니다. 평가 기준은 성능과 지역 선택, 다양한 세팅 가능성 등이였습니다. 이 포스팅에서는 VULTR의 특징과 서비스를 신청하는 방법에 대해서 알아보겠습니다.


가격 정책

VULTR의 가장 저렴한 서비스는 월 $5에 15GB의 저장공간과 월 1TB의 트래픽을 제공합니다. 2015년 5월 기준으로 다음과 같은 가격대가 형성되어 있습니다. 트래픽은 북미와 유럽 기준이고 다른 지역은 더 비쌉니다. (한국과 가장 가까운 도쿄 서버의 경우 $5에 월 200GB를 제공합니다.)

CPU 메모리 SSD 저장공간 트래픽 가격
1 768MB 15GB 월 1TB 월 $5
1 1GB 20GB 월 2TB 월 $8
2 2GB 45GB 월 3TB 월 $16
2 4GB 90GB 월 4TB 월 $32
4 8GB 150GB 월 5TB 월 $64
8 16GB 300GB 월 6TB 월 $128
16 32GB 600GB 월 10TB 월 $256
24 64GB 700GB 월 15TB 월 $512

저장공간을 SSD보다 느린 SATA를 이용한 플랜도 존재하는데, 용량이 훨씬 많은 대신 제공 가능한 지역이 한정되어 있습니다. 2015년 5월 현재 뉴저지, 로스앤젤러스, 암스테르담에서만 서비스를 제공합니다.

SATA Plans


지역

Locations

VULTR가 지원하는 지역은 위와 같고 조금씩 늘어나는 추세입니다. 이곳에서 지역별로 속도 측정도 해볼 수 있습니다. 다음은 주요 지역에 대한 ping 속도를 한국에서 측정한 결과입니다. 2015년 5월 기준이고 특정 망에서 테스트한 결과이므로 참고만 하시기 바랍니다.

지역 평균 응답속도 비고
Tokyo, Japan 35ms (SSD중 한국에서 최저)
Los Angeles, California 149ms (SATA중 한국에서 최저)

기능/장점

이쯤되면 10ms대의 응답속도를 자랑하는 국내 VPS와 비교해서 어떤 장점이 있는가 궁금해 하실 것입니다.

  1. 가성비. 동일한 가격대에 현저히 빠른 SSD와 CPU를 제공합니다. 새로 가입할때 따로 설치비가 없고 과금도 시간단위로 이루어집니다.
  2. 자유로운 설치. 국내 서비스 대비 훨씬 다양한 OS를 지원하고 custom ISO 파일로도 설치가 가능합니다. 또한 재설치시 추가 비용이 발생하지 않고, 관리자 화면에서 버튼 하나로 간단히 진행할 수 있습니다. 설치 후 적어도 1분이 지나면 바로 사용할 수 있습니다.
  3. 편리한 부가기능. 특정 시점을 스냅샷으로 저장하여 이후에 추가할 서버를 그 시점부터 시작하도록 할 수 있습니다. 설치할 때 마다 반복적으로 이루어지는 작업들을 스크립트로 돌릴 수 있습니다. 20%의 추가비용으로 매일 자동백업을 지원합니다. (월 $5짜리 플랜일 경우 월 $1의 추가비용이 발생합니다.)

개인적으로 생각하는 국내서비스 대비 VULTR를 사용했을 때의 단점은 다음과 같습니다. 사실, 해외 VPS 이용시 공통적인 사항이기도 합니다.

  1. 가입할 때 영어의 압박
  2. 고객지원을 받을 때 영어의 압박
  3. 비교적 느린 응답속도
  4. 플랜의 다운그레이드가 불가

가입 및 신청

VULTR를 사용하기로 결정하셨다면, 다음과 같이 가입하고 신청하실 수 있습니다.

(1) VULTR 홈페이지에 접속합니다. 이는 글쓴이에게 소정의 수익이 발생하는 링크(affiliate program)로서 원치 않으신다면 이곳에 접속해서 동일하게 진행하실 수 있습니다.

(2) 'Get Started Now' 부분에 가입하실 메일주소와 사용할 비밀번호를 입력하고 'Deploy Now'를 클릭합니다. Step 1

(3) 결제정보를 입력하고 'Link Credit Card' 버튼을 누릅니다. Step 2

(4) 서버 종류를 선택합니다. 기본적으로 선택된 SSD를 선택합니다. 속도를 희생하는 대신 많은 용량을 원하신다면 SATA를 선택하실 수 있습니다. (단, SATA는 선택 가능한 지역이 제한적입니다.) Step 3

(5) 지역을 선택합니다. 아래는 한국에서 가장 빠른 도쿄 서버를 선택한 경우입니다. Step 4

(6) 설치할 OS를 선택합니다. 아래는 최근 가장 각광받고 있는 Ubuntu 서버의 최신버전을 선택한 경우입니다. Step 5

(7) 플랜을 선택합니다. 추후 업그레이가 가능하므로 (다운그레이드는 불가) 가장 경제적인 플랜을 선택하실 것을 추천 드립니다. Step 6

(8) 선택사항을 입력합니다. IPv6를 이용할 경우 체크하고, 자동 백업을 이용할 경우 체크합니다. (월 20%의 추가 비용이 발생합니다.) Step 7

(9) 'Place Order' 버튼을 누르면 완료됩니다.


이후의 가상서버 설정에 관련해서는 다음과 같은 가이드를 참고하실 수 있습니다.

개발자 입장에서 본 iOS 9의 변화점

$
0
0
개발자 입장에서 본 iOS 9의 변화점

올해의 WWDC에서는 많은 분들의 예상대로 애플 워치에서 네이티브 앱을 지원하는 watchOS가 소개되었습니다. 이제 애플 생태계는 iOS, OS X, watchOS의 세 플랫폼으로 구성되게 되었습니다.

개발자 입장에서 본 iOS 9의 변화점

이번 포스팅에서는 WWDC 2015에서 발표된 iOS 9의 바뀐 부분을 개발자 입장에서 정리해보도록 하겠습니다. Apple 개발자 문서인 What's New in iOS를 참고하여 작성되었습니다.


iPad를 위한 멀티태스킹

한 화면에서 두개의 앱을 동시에 실행할 수 있는 멀티태스킹이 도입되었습니다. 가칭 iPad Pro라고 불리우는 12인치 아이패드를 대비하는 신호라고도 볼 수 있는데요. 크게 세 가지 종류의 모드가 있습니다.

슬라이드 오버(Slide Over)
앱 사용중에 다른 앱을 잠시 화면 한쪽에서 작게 볼 수 있는 모드입니다.

개발자 입장에서 본 iOS 9의 변화점

스플릿 뷰(Split View)
화면을 분할하여 동시에 두 앱을 실행하는 모드입니다. 슬라이드 오버 상태에서 가운데 구분막대를 터치해서 활성화 할 수 있고, 구분막대를 움직여서 두 앱의 크기를 조절할 수 있습니다.

개발자 입장에서 본 iOS 9의 변화점

PIP(Picture in Picture)
동영상 재생프로그램의 경우 현재 재생중인 동영상을 다른 앱이 실행되는 중에도 재생되게 할 수 있습니다.

개발자 입장에서 본 iOS 9의 변화점

멀티태스킹이 이루어질 때 다양한 화면 크기에 최적화된 앱을 만들 수 있는 환경을 위해서 애플이 지난 몇 년 동안 다음과 같이 경로를 밟아 왔습니다.

  • iOS 6: 오토 레이아웃(Auto layout)
  • iOS 7: 다이내믹 타입(Dynamic Type)
  • iOS 8: 적응형 UI(Adaptivity)

그래서 위의 사항들이 적용되어 있는 유니버셜 앱들은 큰 수정 없이 바로 멀티태스킹 적용이 가능합니다. 슬라이드 오버로 보여줄 앱을 고를 때에는 이렇게 적용되어 있는 앱들만 목록에 표시해줍니다. PIP로 동영상을 띄우려면 AVKit이나 AVFoundation을 통해 비디오 재생을 해야 합니다. Media Player 프레임워크는 지원이 중단 되었습니다. 관련 문서는 Adopting Multitasking Enhancements on iPad입니다.


검색

이번 WWDC에서 개인적으로 가장 흥미로웠던 부분 중 하나인데요, 아이폰에 저장된 개인정보와 설치한 앱들이 가지고 있는 정보들 활용한 새로운 검색시스템이 도입되었습니다. 작년에 구글이 스마트폰 내 검색을 도입한 것과 같은 방향입니다. 인터넷 검색이야 외부 검색엔진을 사용할 수 있지만, 스마트폰 내 검색은 민감한 개인정보를 포함하기 때문에 자체 플랫폼이 있어야만 한다는 필요성에서 나온 것으로 보입니다.

앱 데이터를 검색한 결과를 선택하면 딥링크(Deep Link)를 통해 앱 안에 검색된 데이터를 보여주는 화면으로 바로 이동할 수 있습니다. 뿐만 아니라 설치되어 있지 않은 앱의 검색 결과를 보여주고 앱 설치 화면으로 이동할 수도 있습니다. 검색 결과는 Siri도 접근할 수 있기 때문에 Siri를 통해서 할 수 있는 일의 범위가 대폭 확대되었습니다.

개발자 입장에서 본 iOS 9의 변화점

검색결과에 포함되려면 앱과 웹에서 다음과 같이 처리를 해주어야 합니다.

검색결과는 가능하면 키워드와 관련이 있는 최소한의 항목으로 보여주는 것이 권장됩니다. 그렇지 않을 경우 랭킹 시스템에 의해서 걸러져서 나중에는 아예 검색결과에 포함이 되지 않을 가능성도 있기 때문입니다.


게임 관련

이번에 개인적으로 기대했던 TV 앱스토어가 열리지는 않았습니다만, 향후 TV와 게이밍에 관심이 많이 보여진다고 느낄 만큼 게임 관련 프레임워크가 대폭 보강되었습니다.

개발자 입장에서 본 iOS 9의 변화점

게임플레이킷(GameplayKit)
스프라이트킷, 씬킷과 같이 사용되기 위한 게임 로직관련 모듈입니다. 난수(random) 생성, 개체들의 재사용성을 극대화하기 위한 툴, 상태흐름(state machines) 등을 포함하고 있습니다. 특히 게임을 구현할때 공통적으로 사용되는 알고리즘도 포함하고 있는데요, 턴제 게임에서 인공지능, 길찾기 알고리즘 등이 포함되어 있습니다. GameplayKit Programming Guide에서 자세한 내용을 참고할 수 있습니다.

개발자 입장에서 본 iOS 9의 변화점

모델 I/O(Model I/O)
게임에서 사용되는 3D 데이터와 연관된 프레임워크입니다. 메쉬 데이터를 불러오거나 마테리얼, 광원, 카메라 설정 등을 가져올 수 있습니다. 이렇게 가져온 데이터를 가공하고 내보내기도 할 수 있습니다.

메탈킷(MetalKit)
메탈을 활용하는 앱을 쉽게 만들 수 있도록 제공하는 유틸리티 프레임워크입니다. 다양한 소스에서 텍스쳐를 불러오는 것, 모델 I/O 어셋과 관련된 메탈 API, 그래픽 렌더링 앱의 코드를 줄이기 위한 뷰 매니지먼트(view management)를 지원합니다.

메탈 퍼포먼스 쉐이더
메탈 앱에서 사용할 수 있는 고성능 쉐이더를 제공합니다. iOS GPU에서 최적의 성능을 발휘할 수 있도록 특별히 튜닝되었다고 합니다. 그리고 기기별로 따로 성능 최적화를 할 필요 없이 알아서 최적화 되어 적용된다고 합니다. 가우시안 블러(Gaussian blur), 이미지 히스토그램(Image histogram), 소벨 엣지 디텍션(Sobel edge detection) 등의 쉐이더를 지원합니다.

메탈의 새로운 기능
성능 최적화가 되어 렌더링 성능이 개선되었습니다. 메탈 쉐이딩 언어와 메탈 스탠다드 라이브러리가 적용되었습니다. 쉐이더에서 더 다양한 픽셀 포맷에 쓸 수 있게 되었고, OS X의 기능들과 평행하도록 많은 부분이 수정되었습니다.

씬킷(SceneKit)의 새로운 기능
SCNViewSCNScreenRenderer 클래스를 이용한 메탈 렌더링이 가능해졌습니다. SCNAudioPlayerSCNNode 클래스를 통해 지향성 오디오를 지원합니다. 또한, 아래와 같이 Xcode 상에서 씬을 편집할 수 있는 새로운 에디터가 추가되었습니다. (SceneKit Framework Reference 참조)

개발자 입장에서 본 iOS 9의 변화점

스프라이트킷(SpriteKit)의 새로운 기능
씬킷과 마찬가지로 메탈 렌더링 지원이 추가되었습니다. 메탈을 지원하는 기기에서는 OpenGL ES 쉐이더를 사용해도 알아서 메탈 렌더링이 제공됩니다. Xcode에서 씬 에디터가 개선되었고 액션 에디터가 추가 되었습니다. 스크롤링 게임을 쉽게 만들 수 있도록 카메라 노드가 개선되었습니다. 씬킷과 마찬가지로 지향성 오디오를 지원합니다. (SpriteKit Framework Reference 참조)


앱 씨닝(App Thinning)

애플이 지원하는 기기와 해상도가 점점 늘고 있고, 이에 따라 앱의 용량도 점점 늘어나게 되었습니다. 이를 위한 장기적인 해법으로 앱 씨닝을 도입하였습니다. 기기의 CPU 종류와 디스플레이 해상도에 따라 꼭 필요한 코드와 이미지만 다운받게 함으로써 약 40% 정도의 공간절약 효과가 있다고 합니다.

개발자 입장에서 본 iOS 9의 변화점

다음과 같이 세 가지 기술이 적용되어 있습니다.

슬라이싱(Slicing)
어셋 카탈로그(Asset Catalog)에서 관리하고 있는 이미지들은 자동으로 적용이 되고, 기기 해상도에 맞는 이미지들만 앱 다운로드에 포함되게 됩니다. 아래는 64비트 CPU에서 @2x 레티나 이미지 및 고해상도 텍스쳐로 이루어진 앱의 경우를 나타낸 그림입니다. 사용되지 않는 리소스는 앱을 다운받을 때 용량에서 제외됩니다.

개발자 입장에서 본 iOS 9의 변화점

온디맨드 리소스(On-Demand Resources, ODR)
앱에서 사용하는 데이터의 일부를 추후에 다운받을 수 있게 해주는 기능입니다. 앱에서 데이터가 필요한 시점에 백그라운드로 다운로드가 이루어지며, 기기에 공간이 부족하면 사용하지 않는 데이터를 우선으로 자동 삭제해준다고 합니다. 아래와 같이 게임이 여러 레벨로 구성된 경우 레벨별로 필요한 시점이 다르기 때문에 나중에 다운받는 영역을 지정할 수 있게 됩니다.

개발자 입장에서 본 iOS 9의 변화점

아래는 온디맨드 리소스(ODR)를 사용했을 때와 그렇지 않을때의 용량 비교입니다. ODR을 사용하면 최초로 받을 수 있는 앱의 크기는 2기가로 오히려 줄어드는 것 같지만, 추가 리소스를 계속 로드할 수 있기 때문에 전체적으로는 4기가보다 큰 앱을 만들 수 있게 됩니다.

개발자 입장에서 본 iOS 9의 변화점

비트코드(Bitcode)
앱스토어에 올릴 때 최종 컴파일 결과물을 올리는 것이 아니고 중간코드를 올리는 방식으로 변경할 수 있습니다. 차후에 새로운 CPU가 등장해도 앱스토어에서 이에 맞는 앱을 생성할 수 있게 됩니다. iOS 9 새 프로젝트에서 기본으로 선택되어 있고, watchOS 2 앱은 필수로 지원해야 합니다.

개발자 입장에서 본 iOS 9의 변화점


RTL 언어지원

중동 지방에서 많이 쓰는 RTL(Right to Left) 언어 지원이 대폭적으로 강화되었습니다. 즉 히브리어와 아랍어를 주 언어로 지정하면 화면의 모든 UI 요소가 아래와 같이 좌/우 바뀌어 표시되게 됩니다. 관련 세션에 나온 엔지니어에 의하면, 해당 지역 사용자들에게는 정말 자연스럽고 편하다고 합니다. LTR(Left to Right) 언어권에서는 뒤로가기가 왼쪽으로 이동하는데, RTL권에서는 반대로 오른쪽으로 이동하는게 자연스럽다는 것입니다.

개발자 입장에서 본 iOS 9의 변화점

홈화면에서는 아이콘들이 오른쪽부터 빈칸을 채워가도록 정렬 됩니다. 아이콘의 알림 갯수는 우상단이 아닌 좌상단에 표시되게 됩니다. 테이블뷰도 좌우가 바뀌어 표시가 되고, 컬렉션뷰도 오른쪽부터 빈칸을 채우게 됩니다.

앱에서도 고려해서 처리해주어야 할 요소들이 있습니다. RTL 언어권에서 뒤집혀야 할 내용과(주로 UI 요소) 그렇지 않아야 할 내용(주로 이미지)를 구분해야 하기 때문입니다. UIViewUIImage 클래스 등이 이를 고려해서 개선되었습니다. 자세한 내용은 Supporting Right-to-Left Languages를 참고하세요.


앱 트랜스포트(App Transport) 보안

앱의 Info.plist 파일에서 보안 전송 필요한 부분을 정의할 수 있게 되었습니다. 앱을 새로 개발한다면 전송부분을 모두 HTTPS 사용하는 것을 권장하고, 기존 앱이 있다고 해도 최대한 HTTPS 적용하는 것을 권장합니다. 이와 관련해서 NSURLSession 클래스가 크게 변경되었습니다.


익스텐션 포인트(Extension Points)

iOS 8에서 추가되었던 익스텐션에서 한 발짝 나아가 익스텐션 포인트라는 것이 추가되었습니다. 지원하는 목록은 다음과 같습니다.

  • 네트워크 익스텐션 포인트
    • Packet Tunnel Provider extension
    • App Proxy Provider extension
    • Filter Data Provider, Filter Control Provider
  • Safari 익스텐션 포인트
    • Safari의 공유 링크 관련 익스텐션 (Shared Links extension)
    • 광고 블럭을 위한(!) 컨텐츠 블러킹 익스텐션(Content Blocking extension)
  • 스팟라이트 익스텐션 포인트
    • 검색 데이터 저장을 위한 인덱싱 익스텐션(Indenxing extension)
    • 재인덱싱을 위한 인덱스 유지보수 익스텐션(Index Maintenance extension)
  • 오디오 유닛(Autio Unit) 익스텐션: 음악 프로그램에서 사용되는 가상악기, 이펙터 등을 플러그인의 형식으로 사용할 수 있게 되었습니다. 이로인해 음악 관련 프로그램들이 눈부시게 발전하는 계기가 되지 않을까 생각됩니다.

자세한 사항은 App Extension Programming Guide을 참고하세요.


새로운 주소록 API

아이폰 SDK 초기부터 있었던 Address Book / Address Book UI 프레임워크를 대신하여 새로운 주소록(Contacts) API가 도입되었습니다. (Contacts Framework Reference, ContactsUI Framework Reference 참조)


워치 커넥티비티(Watch Connectivity)

iOS와 Watch 앱간의 데이터를 양방향으로 주고받는데 사용되는 프레임워크입니다. 이렇게 데이터를 주고 받을 때 두 앱이 모두 실행중이면 바로 메시지를 보낼 수도 있고, 받을 앱이 실행중이지 않으면 백그라운드로 전송을 해준다고 합니다. (Watch Connectivity Framework Reference 참조)


키체인(Keychain)

키체인을 통해 기기간의 암호를 공유할 때 다음과 같은 개선사항이 적용되었습니다.

  • 터치 아이디와 암호입력에 따른 고유 데이터 지정 가능
  • 지문 데이터가 지워지면 따라서 지워지는 데이터 지정 가능
  • 앱 비밀번호 옵션을 통한 접근 가능

기타 프레임워크

AV Foundation 프레임워크
AVSpeechSynthesisVoice API가 언어기반이 아닌 식별자 기반으로 음성을 선택하도록 변경되었습니다.

AVKit 프레임워크
PIP 지원을 위해 AVPictureInPictureController가 추가되었습니다.

CloudKit 프레임워크
클라우드킷(CloudKit)을 웹 서비스로서 사용하기 위한 자바스크립트 기반 CloudKit JS 라이브러리가 추가되었습니다. Apple ID 인증 기반이고, 클라우드킷만 이용해서 iOS + 웹 앱까지는 따로 서버를 구현하지 않고도 서비스를 올일 수 있게 되었습니다. 사용자 수에 따라 무료제공 티어(Tier)가 있고, 이를 초과할 경우 과금이 이루어집니다.

개발자 입장에서 본 iOS 9의 변화점

Foundation 프레임워크
온디맨드 로딩을 위해서 NSBundle 클래스 등이 수정되었습니다.

HealthKit 프레임워크
헬스킷에서 측정 가능한 데이터에 UV 노출과 같은 항목이 추가 되었습니다.

Local Authentication 프레임워크
지문이 닿은 상태를 앱에서 감지 가능하도록 변경되었고, 지문입력을 프로그래밍적으로 취소할 수 있게 된 것 등의 개선이 이루어졌습니다.

Core Location 프레임워크
일회성으로 현재위치를 가져오는 과정이 대폭 간소화되었습니다.

MapKit 프레임워크
대중교통 도착시간을 가져올 수 있게 되었고, 3D 플라이오버 뷰를 사용할 수 있게 되었습니다. 어노테이션(annotations)을 사용자화 할 수 있는 폭이 늘어났고 검색결과에 타임존 정보를 포함 할 수 있게 되었습니다.

PassKit 프레임워크
앱에서 애플페이에 직접 카드를 추가할 수 있는 등 애플 페이와 관련한 사항들이 변경되었습니다.

Safari Services 프레임워크
SFSafariViewController가 추가되어 Safari와 쿠키, 데이터를 공유한 웹뷰를 앱에서 사용할 수 있게 해줍니다. 따라서 Safari 자동완성도 사용할 수 있게 되었습니다. WKWebViewUIWebView를 통해 웹 컨텐츠를 보여주고 있었다면 전환을 고려해봅직합니다.

UIKit 프레임워크
다양한 화면 크기에 최적화된 레이아웃을 구현하는데 도움을 주는 기능들이 대폭 추가되었습니다. UIStackView는 아래와 같은 스택구조의 레이아웃을 편하게 구현하게 해줍니다.

개발자 입장에서 본 iOS 9의 변화점

UIView에 새로운 앵커(anchor)가 추가되었습니다. 또한 아래와 같이 화면 크기에 따라 본문 텍스트가 좌/우 마진을 얼마나 가져야 하는지를 알아서 계산해주는 레이아웃 가이드도 추가되었습니다.

개발자 입장에서 본 iOS 9의 변화점

그 외에도 iOS 9에 도입된 멀티태스킹이나 앱간 링크를 위해서 다양한 부분이 변경되었습니다. 또 Blur 효과의 양을 애니메이션 줄 수 있는 방법이 생겼습니다. 알림이 표시될 바로 답장을 할 수 있는 것과 관련된 API도 공개되었습니다.


마치며

watchOS 2부터 드디어 네이티브 앱을 애플워치에서 실행할 수 있게 되었습니다. 또한 Swift가 2.0으로 버전업 되었습니다. 오픈소스화 계획을 발표하기도 했습니다. 이와 관련된 내용은 이후 포스팅에서 다루도록 하겠습니다.

관련링크

OS X 10.11 앨 캐피탄에 LEMP 개발환경 설치하기 (Nginx, MySQL, PHP 7.0)

$
0
0
OS X 10.11 앨 캐피탄에 LEMP 개발환경 설치하기 (Nginx, MySQL, PHP 7.0)

(이 포스팅은 PHP 2015년 12월, PHP 7.0 릴리즈에 맞춰 업데이트 되었습니다.)

LEMP 소프트웨어 스택은 동적 웹 어플리케이션을 구현하기 위해서 필요한 Linux + Nginx + MySQL + PHP를 모아서 부르는 말이라고 합니다. (LNMP가 아니고 LEMP인게 특이하네요.)

이 포스팅에서는 OS X 10.11 앨 캐피탄(El Capitan)에 LEMP 기반 웹 개발환경을 설치하는 방법에 대해서 소개합니다. OS X 10.11에는 보안 강화를 위해 루트리스(Rootless)가 도입되었는데요, 이제 일반 사용자가 /usr/bin 폴더에 접근할 수 없게 되었습니다. 앞으로 다룰 내용들은 Jonas Friedmann의 포스팅을 토대로 루트리스 환경에 맞게 수정되었습니다.

출처: Install Nginx, PHP-FPM, MySQL and phpMyAdmin on OS X Mavericks or Yosemite


1. Xcode 설치

가장 먼저 최신 버전의 Xcode를 설치해야 합니다. 이후에 설치할 프로그램들이 사용하는 라이브러리들이 Xcode 에서 제공하는 커맨드 라인 툴에 포함되어 있기 때문입니다. 앱스토어에서 Xcode 7 이상을 다운받습니다. Mac App Store에서 Xcode 다운받기

OS X 10.11 앨 캐피탄에 LEMP 개발환경 설치하기 (Nginx, MySQL, PHP 7.0)

다운이 완료되면 Xcode를 실행한 후 사용자 동의(Agree)를 누릅니다.

OS X 10.11 앨 캐피탄에 LEMP 개발환경 설치하기 (Nginx, MySQL, PHP 7.0)

이제 터미널(Terminal.app)을 열고 다음과 같이 명령어를 칩니다.

$ xcode-select --install

Software Update가 뜨게 되는데 여기서 Install을 눌러서 계속 진행합니다. 설치가 완료되면 Xcode 메뉴 중 Preference에서 Locations 탭에 들어가셔서 다음과 같이 Command Line Tools가 지정되어 있는지 확인합니다.

OS X 10.11 앨 캐피탄에 LEMP 개발환경 설치하기 (Nginx, MySQL, PHP 7.0)


2. Homebrew 설치

홈브류는 맥에서 리눅스 패키지를 손쉽게 설치할 수 있는 패키지 관리자입니다. 클린 설치한 OS X 10.11의 경우 터미널에 다음과 같이 명령어를 입력하여 설치합니다. 그 외의 상황에서는 이 포스팅을 참고하여 진행합니다.

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

설치가 완료되면 다음과 같이 입력하여 혹시 있을지 모르는 패키지 충돌을 체크합니다.

$ brew doctor

brew 자체를 최신으로 유지하기 위해 다음과 같이 입력합니다.

$ brew update && brew upgrade

3. PHP-FPM 설치

PHP-FPM은 PHP와 웹 서버(Nginx)를 연결해주는 모듈입니다. Homebrew에는 PHP-FPM의 설치정보가 기본적으로 포함되어 있지 않기 때문에 다음과 같이 입력하여 formula를 추가하여 줍니다. formula는 어떤 위치에서 파일을 받아야 하는지를 담고 있는 파일입니다.

$ brew tap homebrew/dupes
$ brew tap homebrew/php

이제 다음과 같이 입력하여 PHP를 설치합니다. 버전의 경우 php55나 php56 등과 같이 선택할 수 있습니다.

$ brew install --without-apache --with-fpm --with-mysql php70

OS X 10.11 앨 캐피탄에 LEMP 개발환경 설치하기 (Nginx, MySQL, PHP 7.0)

설치가 완료된 후 터미널에 표시된 대로 명령어를 추가 입력하여, 시스템이 재시작 될 때 자동으로 서비스가 시작되도록 설정합니다.

$ mkdir -p ~/Library/LaunchAgents
$ ln -sfv /usr/local/opt/php70/homebrew.mxcl.php70.plist ~/Library/LaunchAgents

다음으로 타임존 설정을 합니다. /usr/local/etc/php/7.0/php.ini 파일을 열어 다음과 같이 date.timezone 부분을 주석 해제하고 Asia/Seoul이라고 입력합니다.

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Asia/Seoul;  

다음과 같이 입력하면 PHP-FPM이 시작됩니다.

$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php70.plist

설치가 제대로 되었는지 확인을 위해서는 다음과 같이 입력합니다.

$ lsof -Pni4 | grep LISTEN | grep php

아래와 같이 9000번 포트에서 응답을 대기하고 있으면 정상적으로 설치된 것입니다.

php-fpm   687 user    6u  IPv4 0x0000000000000000      0t0  TCP 127.0.0.1:9000 (LISTEN)  
php-fpm   688 user    0u  IPv4 0x0000000000000000      0t0  TCP 127.0.0.1:9000 (LISTEN)  
php-fpm   689 user    0u  IPv4 0x0000000000000000      0t0  TCP 127.0.0.1:9000 (LISTEN)  

4. MySQL 설치

이번에는 MySQL을 설치합니다.

$ brew install mysql

설치를 마치면 다음과 같이 입력하여 PHP-FPM과 마찬가지로 시스템이 시작될 때 자동 실행하도록 합니다.

$ ln -sfv /usr/local/opt/mysql/*.plist ~/Library/LaunchAgents
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist

설치를 마친 후에 다음과 같이 입력하여 보안 설정을 합니다. MySQL은 최초 설치시에 보안적으로 느슨하게 설정되어 있는데 이를 재설정하는 것입니다.

mysql_secure_installation  

이제 순서적으로 나오는 질문에 다음과 같이 답변합니다.

Enter current password for root (enter for none): <엔터 입력>  
Set root password? [Y/n]  Y  
Remove anonymous users? [Y/n] Y  
Disallow root login remotely? [Y/n]  Y  
Remove test database and access to it? [Y/n] Y  
Reload privilege tables now? [Y/n] Y  

이제 다음과 같이 입력하면 root 사용자로 접속하게 됩니다.

$ mysql -u root -p

5. phpMyAdmin

phpMyAdmin은 오랜동안 사랑받아 왔던 MySQL 관리자 인터페이스입니다. 설치를 위해선 autoconf라는 모듈을 먼저 설치해야 합니다.

$ brew install autoconf

설치가 완료되면 다음과 같이 phpMyAdmin을 설치합니다.

$ brew install phpmyadmin

6. Nginx 설치

Nginx(엔진엑스)는 Apache 이후로 각광받고 있는 웹서버입니다. 다음과 같이 설치합니다.

$ brew install nginx

다음과 같이 입력하여 자동 실행되도록 합니다. 아래 방법은 80번 포트를 사용하기 위해서 /Library 폴더에 넣고 root 권한을 주는 방법입니다.

$ sudo ln -sfv /usr/local/opt/nginx/*.plist /Library/LaunchDaemons
$ sudo chown root:wheel /Library/LaunchDaemons/homebrew.mxcl.nginx.plist
$ sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.nginx.plist

이제 http://localhost:8080에 접속하여 다음과 같이 화면이 뜨는지 확인합니다.

OS X 10.11 앨 캐피탄에 LEMP 개발환경 설치하기 (Nginx, MySQL, PHP 7.0)

Nginx를 중지하려면 다음과 같이 입력합니다.

$ sudo launchctl unload /Library/LaunchDaemons/homebrew.mxcl.nginx.plist

7. 환경설정

이제부터 사이트 추가에 필요한 환경설정을 해봅니다. 먼저 /usr/local/etc/nginx/nginx.conf 파일을 다음과 같이 수정합니다. 가장 압축적으로 기본적인 사항만 담겨 있기 때문에 포함되지 않은 내용은 추가가 필요할 수 있습니다.

worker_processes  1;

events {  
    worker_connections  1024;
}

http {  
    include             mime.types;
    default_type        application/octet-stream;

    sendfile            on;
    keepalive_timeout   65;

    index               index.php index.html;

    include servers/*;
}

이제 /usr/local/etc/nginx/servers 폴더에 site.conf와 같이 설정파일을 추가하여 다음과 같이 입력합니다. 이 설정파일은 여러 개를 지정할 수 있습니다. server_name 부분은 뒤에서 설정할 개발용 도메인을 설정하는 부분입니다. /Users/user/Sites/site 부분은 실제로 지정할 홈 폴더로 지정합니다.

server {  
    listen      80;
    server_name site.app;
    root        /Users/user/Sites/site;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        try_files      $uri = 404;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
}

phpMyAdmin을 실행하기 위해 /usr/local/etc/nginx/servers/phpmyadmin.conf 파일을 다음과 같이 작성합니다.

server {  
    listen       80;
    server_name  pma.app;
    root         /usr/local/share/phpmyadmin;

    location ~ \.php$ {
        try_files      $uri = 404;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

이제 변경사항을 적용하려면 nginx를 재시작해야 합니다. 앞으로도 nginx 등의 서비스를 시작/정지/재시작 할 일이 많기 때문에 단축 명령어를 설정하겠습니다. 먼저 ~/.bash_aliases 파일을 다음과 같이 작성합니다.

alias nginx.start='sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.nginx.plist'  
alias nginx.stop='sudo launchctl unload /Library/LaunchDaemons/homebrew.mxcl.nginx.plist'  
alias nginx.restart='nginx.stop && nginx.start'  
alias php-fpm.start="launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php70.plist"  
alias php-fpm.stop="launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.php70.plist"  
alias php-fpm.restart='php-fpm.stop && php-fpm.start'  
alias mysql.start="launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist"  
alias mysql.stop="launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist"  
alias mysql.restart='mysql.stop && mysql.start'  
alias nginx.logs.error='tail -250f /usr/local/etc/nginx/logs/error.log'  
alias nginx.logs.access='tail -250f /usr/local/etc/nginx/logs/access.log'  
alias nginx.logs.default.access='tail -250f /usr/local/etc/nginx/logs/default.access.log'  
alias nginx.logs.default-ssl.access='tail -250f /usr/local/etc/nginx/logs/default-ssl.access.log'  
alias nginx.logs.phpmyadmin.error='tail -250f /usr/local/etc/nginx/logs/phpmyadmin.error.log'  
alias nginx.logs.phpmyadmin.access='tail -250f /usr/local/etc/nginx/logs/phpmyadmin.access.log'  

그리고 ~/.bash_profile 파일을 다음과 같이 작성합니다.

source ~/.bash_aliases  

이제 새 터미널을 실행해서 다음과 같이 입력해서 서비스를 정지하고 시작합니다.

$ nginx.stop
$ nginx.start

여기까지 진행 하셨다면 /Users/user/Sites/site/index.php 파일을 생성하신 후 다음과 같이 입력하여 테스트 페이지를 생성해보겠습니다.

<?php  
    phpinfo();

개발용 도메인 적용을 위해서 관리자 권한으로 /private/etc/hosts 파일을 수정합니다.

$ vi /private/etc/hosts

다음과 같이 아래 두 줄을 추가합니다.

##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1       localhost  
255.255.255.255 broadcasthost  
::1             localhost
127.0.0.1       site.app  
127.0.0.1       pma.app  

이제 http://site.app에 접속하셔서 다음과 같은 창이 뜨면 PHP가 정상적으로 동작하는 것을 확인하실 수 있게 됩니다.

OS X 10.11 앨 캐피탄에 LEMP 개발환경 설치하기 (Nginx, MySQL, PHP 7.0)


8. Composer 설치

Composer는 PHP계의 npm같은 패키지 매니저입니다. 터미널에서 다음과 같이 입력하여 설치합니다.

$ curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer

이렇게 로컬에 구성된 웹 개발환경은 이후 Laravel 등의 개발에 유용하게 사용하실 수 있습니다. Laravel 구동은 위의 환경설정에서 Pretty URL을 지원하기 위해 /usr/local/etc/nginx/servers/site.conf 파일에서 try_files 부분을 다음과 같이 수정하면 됩니다.

location / {  
    try_files $uri $uri/ /index.php?$query_string;
}

개발자 입장에서 본 iOS 10의 변화점

$
0
0
개발자 입장에서 본 iOS 10의 변화점

10번째 버전의 iOS가 발표되었습니다. 작년에 이어 올해도 키노트 전반에 느껴지는 흐름은 "공유"와 "개방"이였습니다. 사용자가 피부로 느낄 수 있는 전반적인 변경사항에 대해서는 이미 정리가 잘 된 글들이 많이 있기 때문에 다음 링크를 참조하시면 좋을 것 같습니다.

이번 포스팅에서는 WWDC16에서 공개된 iOS 10의 바뀐 부분을 개발자 입장에서 정리해보도록 하겠습니다. Apple 개발자 문서인 What's New in iOS를 참고하여 작성되었습니다.


SiriKit

개발자 입장에서 본 iOS 10의 변화점

드디어 서드파티 앱들이 Siri를 이용한 앱을 개발할 수 있게 되었습니다. 다만 iOS 10에서는 다음과 같은 종류의 앱들만이 Siri API를 사용할 수 있습니다. 아마 익스텐션(extension)과 마찬가지로 iOS 버전이 올라가면서 다른 종류도 차차 추가되지 않을까 싶습니다.

  • 음성/영상 전화
  • 메시징
  • 금액 주고 받기
  • 사진 검색
  • 예약
  • 운동 관리

몇 년 전 부터 Siri API가 오픈된다는 루머가 있었는데 개인적으로 "음성 입력을 실제로 어떤 형태로 앱에서 인식해서 처리를 하는가"하는 부분이 무척 궁금했었는데요, 이번 발표로 이에 대한 궁금증을 어느 정도 해결 할 수 있었습니다.

개발자 입장에서 본 iOS 10의 변화점

그것은 바로 입력된 음성에 대해 "의도(intent)"를 파악하는 것이였습니다. 위의 경우를 보면 입력한 문장에 대해 범주는 Payment이고, 의도는 sendPayment이며, 금액은 85 달러, 받는 사람은 Buttercup이라고 파악한 것을 알 수 있습니다. 이렇게 "의도(intent)"를 파악하고 난 후에는 "동작(action)"을 실행하고 "결과(response)"를 보여주게 됩니다.

개발자 입장에서 본 iOS 10의 변화점

SiriKit을 사용할 때 개발자가 신경 써 줘야 할 부분은 크게 세 가지가 있습니다. 첫째는 앱에서 사용되는 단어(vocabulary)을 지정해주는 것이고, 둘째는 실행 코드(app logic)를 구현하는 것이며, 셋째는 사용자에게 보여줄 UI를 구성하는 것입니다. 더 자세한 내용은 세션 217, "Introducing SiriKit"에서 설명하고 있습니다.


Proactive Suggestions

프로액티브(proactive)는 사용자에게 특정 앱이 필요한 순간을 미리 파악해서 제안하는 기능입니다. iOS 9에서 도입된 앱 검색(app search)을 적용했다면, 스팟라이트나 Safari 검색 결과, 핸드오프(Handoff), Siri 제안에 등에 앱을 노출시킬 수 있었습니다. iOS 10에서는 사용자가 앱에서 어떤 동작을 하는지에 대한 정보를 제공하여 퀵타입(QuickType) 제안이나 지도, 카플레이, 앱 전환기(app switcher), Siri 대화, 잠금화면(음악, 비디오 앱의 경우) 등에 앱을 추가적으로 노출시킬 수 있게 되었습니다.

개발자 입장에서 본 iOS 10의 변화점

NSUserActivity 클래스의 mapItem 속성을 통해 다른 상황에서도 사용될 수 있는 위치 정보를 제공할 수 있습니다. 호텔 리뷰정보를 보여주는 앱의 경우 사용자가 다른 앱을 사용할 때 그 호텔의 위치정보를 사용하게 할 수 있습니다.

개발자 입장에서 본 iOS 10의 변화점

앱에서 특정 장소를 공유할 때에는 주소 외에도 latitudelongitude 값, namedLocation, phoneNumbers 값 등을 함께 전달할 수 있습니다. 이럴 경우 공유된 장소의 이름이나 연락처 정보로 Siri에서 전화를 거는 등의 활용이 가능합니다.

iOS 9에서는 웹사이트에서 특정 마크업을 추가하면 스팟라이트나 Safari에서 검색할 수 있었습니다. 이와 더불어 iOS 10에서는 Schema.org에서 정의하고 있는 PostalAddress를 통해, 웹사이트에서 보고 있던 장소를 지도 앱으로 넘어가서도 동일하게 바로 보여지도록 구현 가능합니다.

UIKit에서 추가된 textContentType 속성을 통해서 사용자가 입력하는 텍스트의 종류에 대해 지정할 수 있게 되었습니다. 지정된 경우 상황에 맞는 종류의 키보드가 보여지게 되고, 오타 수정도 상황에 맞게 최적화 됩니다. UITextContentTypeFullStreetAddress을 사용하여 텍스트의 종류가 주소라고 지정을 하며 키보드 입력 제안 항목에 사용자가 현재 있는 위치의 주소가 표시될 것입니다.

MPPlayableContentManager API를 사용하여 잠금화면에서 사용자가 앨범아트를 보거나 재생할 수 있게 할 수 있습니다.

라이딩 쉐어링 앱에서 MKDirectionsRequest API를 사용하는 경우 사용자가 필요하다고 판단되는 순간 앱 전환화면에 표시해줍니다. 해당 기능을 사용하는 경우 Info.plist 파일에 특정 키를 추가해야 합니다. 앱에서 라이딩 쉐어링만 지원하는지, 다른 형태의 길찾기 정보를 같이 제공하는지에 따라 지도 앱에서 표시되는 문구가 다르게 표시됩니다.


메시지 앱 익스텐션(extension)

이번 iOS 10에서 크게 바뀐 앱 중 하나가 메시지 앱입니다. 각종 메시지 효과와 다양한 기능들이 추가되었으며 무엇보다 서드파티 앱들을 만들 수 있게 되었는데요, 페이스북의 메시지 앱 플랫폼에 대항하기 위한 것이라고 생각되어집니다. 복잡도에 따라 다음과 같이 두 가지 종류의 앱이 있습니다.

스티커 앱
정적인 이미지 파일을 포함한 스티커 팩 앱을 만들 수 있습니다. 코드 한 줄 건드릴 필요 없이 이미지 파일들을 드래그 앤 드랍 하는 것 만으로도 앱을 만들 수 있습니다.

개발자 입장에서 본 iOS 10의 변화점

iMessage 앱
커스텀 UI를 통해 텍스트, 이미지, 미디어 파일을 대화 안에서 생성하고, 보내고, 업데이트 할 수 있습니다. 이를 위해서는 Messages 프레임워크를 사용해야 합니다.

개발자 입장에서 본 iOS 10의 변화점


User Notifications

새로 추가된 User Notifications 프레임워크를 통해 기존에 따로 관리되었던 로컬 알림과 원격 알림을 모두 관리할 수 있게 되었습니다. 플랫폼 간의 사용 용법이 통일화 되었고 페이로드(payload)를 디코드하여 이미지를 표시하거나 종단간(end-to-end) 암호화를 지원할 수 있게 되었습니다.

또 새롭게 추가된 Notifications UI 프레임워크를 통해 알림 UI의 모양을 커스터마이징 할 수 있게 되었습니다.

개발자 입장에서 본 iOS 10의 변화점


음성 인식

iOS 10에서는 연속적으로 음성 인식을 할 수있는 API가 추가되어, 녹음되거나 실시간으로 재생되는 음성을 인식하고 텍스트로 변환할 수 있게 되었습니다. 다음과 같이 몇 줄의 코드만으로 연속 음성인식 기능을 구현할 수 있습니다.

let recognizer = SFSpeechRecognizer()  
let request = SFSpeechURLRecognitionRequest(url: audioFileURL)  
recognizer?.recognitionTask(with: request, resultHandler: { (result, error) in  
     print (result?.bestTranscription.formattedString)
})

음성 인식을 하기 위해서는 다른 민감한 정보에 접근할 때와 마찬가지로 사용자의 동의를 얻어야 합니다. 이는 음성인식의 정확도를 높이기 위해 사용자의 음성 정보가 애플 서버에 임시적으로 저장되기 때문입니다. 사용자의 동의를 얻기 위해 Info.plist 파일에 NSSpeechRecognitionUsageDescription 키를 추가해야 합니다. 또한, 앱에서 음성 인식이 이루어지고 있는 동안에는 사용자가 이를 알 수 있도록 적절하게 표시해야 합니다.


넓어진 색영역

개발자 입장에서 본 iOS 10의 변화점

아이패드 프로 디스플레이는 기존 sRGB 보다 더 넓어진 확장된 sRGB(extended sRGB) 색영역을 표현할 수 있습니다. 이를 지원하기 위해 Core Graphics, Core Image, Metal, AVFoundation 프레임워크 들이 내부적으로 변경되었으며 개발시 다음과 같은 사항을 고려해야 합니다.

  • UIColor 클래스에서는 더 이상 값들을 0과 1사의 값으로 한정하지 않게 되었습니다. 기존 앱에서 값들을 제한하고 있었다면 iOS 10에서 동작할 때에는 제한하지 않도록 변경해야 합니다.
  • UIView에서 커스텀 드로잉을 할 때 드로잉 환경은 확장된 sRGB 색영역에서 이루어져야 합니다.
  • 커스텀 이미지를 렌더링할 경우에는 새롭게 추가된 UIGraphicsImageRenderer 클래스를 사용해야 합니다.
  • Core Graphics이나 Metal을 사용해서 이미지 프로세싱을 하는 경우 16비트 플로팅 포인트를 지원하는 색영역을 사용해야 합니다.
  • Core Graphics, Core Image, Metal Performance Shaders는 색영역을 손쉽게 바꿀 수 있는 옵션을 제공합니다.

트루톤 디스플레이 지원
아이패드 프로 9.7인치에서 추가된 트루톤 디스플레이는 다양한 빛 환경에서 최적화된 색상으로 화면을 보여주게 됩니다. Info.plist 파일의 UIWhitePointAdaptivityStyle 키 값을 다음과 같이 적절하게 설정할 수 있습니다.

  • 사진관리 앱의 경우 UIWhitePointAdaptivityStylePhoto로 지정하여 영향을 덜 받게 할 수 있습니다.
  • 텍스트를 많이 포함한 앱의 경우 UIWhitePointAdaptivityStyleReading로 지정하여 시스템에 의해 영향받는 트루톤 값의 차이를 더 크게 할 수 있습니다.

앱 검색 개선

iOS 10에서 Core Spotlight 프레임워크를 통해 이루어진 개선사항은 다음과 같습니다.

앱내 검색
CSSearchQuery 클래스를 통해 따로 인덱싱하거나 검색 알고리즘을 구현할 필요 없이 스팟라이트의 강력한 검색기능을 앱 안에서도 사용할 수 있게 되었습니다.

이어서 검색하기(Search continuation)
사용자가 스팟라이트에서 시작한 검색을 앱에서 계속 이어서 검색할 수 있게 할 수 있게 되었습니다. 이 기능을 활성화 하려면 Info.plist 파일에 CoreSpotlightContinuation 키에 YES 값을 추가해야 합니다.

크라우드소싱을 이용한 딥 링크 인기도 (Crowdsourcing deep link popularity with differential privacy)
스팟라이트에서 검색되는 순위를 높이기 위해 앱 안에서 사용되는 딥 링크가 얼마나 인기있는지를 애플 서버에 저장할 수 있습니다. 이 때 사용되는 기술은 differential privacy라는 방법인데요, 간략하게 설명하면 개개인의 사용자의 데이터는 알 수 없게 하면서도 데이터가 많이 쌓였을 때 전체적인 데이터를 얻을 수 있는 방법이라고 할 수 있습니다. 애플이 보안과 관련하여 곳곳에 신경쓰고 있음이 보여지는 대목이라고 보여집니다. 아래 그림은 이를 위해 사용되는 공식이라고 하네요.

개발자 입장에서 본 iOS 10의 변화점

유효성 검사의 시각화
App Search API Validation tool을 사용하여 웹사이트의 마크업과 딥 링크의 유효성을 검사할 때 결과를 시작적으로 보여주게 되었습니다.

개발자 입장에서 본 iOS 10의 변화점


위젯 개선

iOS 10에서 이제 잠금화면에서도 위젯을 볼 수 있게 되었습니다. 위젯의 내용이 어떤 배경에서도 잘 보일 수 있도록 텍스트 색을 widgetPrimaryVibrancyEffect이나 widgetSecondaryVibrancyEffect로 지정할 수 있습니다.

개발자 입장에서 본 iOS 10의 변화점


애플 페이

2016년 가을 기준으로 애플 페이를 지원하는 플랫폼이 다음과 같이 늘어나게 됩니다.

개발자 입장에서 본 iOS 10의 변화점

눈에 띄는 부분은 이제 웹사이트에서도 애플 페이를 사용할 수 있게 된 것입니다. 사용자는 iOS나 macOS에서 구동되는 Safari로 접속할 때 이용할 수 있으며 개발자는 ApplePay JS 프레임워크를 통해서 구현할 수 있습니다.

이와 더불어 UIKit을 통하지 않고서도 PassKit에 접근할 수 있게 되었습니다. 따라서 다양한 플랫폼에서 단일 코드 베이스로 구현을 할 수 있습니다. 또한 카드 발급사들은 자사의 앱 안에서 해당 카드를 보여줄 수 있게 되었습니다.

애플 페이를 지원하는 국가와 금융 기관이 변경될 때 마다 앱을 다시 컴파일 할 필요 없이 availableNetworks 메소드를 통해 런타임 체크할 수 있습니다. 또한 iTunes Connect에서 새로운 결제 테스트 환경을 지원합니다.


보안 개선

  • Info.plist 파일에서 NSAllowsArbitraryLoadsInWebContent 키를 통해 ATS 보호를 하면서도 웹 컨텐츠를 모두 불러올 수 있게 설정할 수 있습니다.
  • Common Data Security Architecture (CDSA) API가 제거되고 새로운 SecKey API가 추가되었습니다.
  • Secure Transports API 관련 변경사항이 있습니다.
  • UIPasteboard 클래스에서 기기간의 복사 데이터이터가 공유되는데, 저장되는 종류와 만료 시점을 정할 수 있습니다.
  • 사용자의 데이터에 접근하기 위해 사용 용도를 밝혀야 하는 항목이 추가되었습니다. 예를 들어 Calendar 데이터에 접근하려면 Info.plist 파일에 NSCalendarsUsageDescription 키를 추가하여 사용 목적을 명시해야 하며 그렇지 않을 경우 데이터 접근시 앱이 튕기게 됩니다.

CallKit

이제 카톡 음성통화도 일반 전화가 오는 것과 동일한 화면에 표시 할 수 있게 됩니다. CallKit 프레임워크를 통해 접근이 가능하며, VoIP 앱을 이용한 기록이 네이티브 전화 앱의 즐겨찾기와 최근 사용 목록에 표시할 수 있게 됩니다. 또한 익스텐션(extension)을 통해 전화 방해(blocking) 관리나 전화를 건 사람에 대한 정보 표시가 가능합니다.

개발자 입장에서 본 iOS 10의 변화점


뉴스 퍼블리셔 개선

뉴스 퍼블리셔(News Publisher)를 통해 아름답게 디자인된 뉴스, 잡지, 웹 컨텐츠 등을 Apple News에 게시할 수 있게 되었습니다. 메이저 언론사부터 시작해서 개인 출판자나 블로거들도 누구나 가입할 수 있습니다. (https://newsresources.apple.com 참고)


Video Subscriber Account

iOS 10에서 추가된 Video Subscriber Account를 통해 케이블 사업자나 위성 사업자에 구독중인 계정을 인증하고 이를 통해 앱에서 권한을 조절할 수 있게 되었습니다. 이를 통해 Apple TV에서도 각 채널별로 회원가입하고 로그인하고 엄청 복잡하게 진행되던 것이 한방에 SSO(Single Sign-on)으로 해결 할 수 있게 되었습니다.


앱 익스텐션(App Extensions)

iOS 10에서 추가된 앱 익스텐션은 다음과 같습니다.

  • Call Directory
  • Intents
  • Intents UI
  • Messages
  • Notification Content
  • Notification Service
  • Sticker Pack

이와 더불어 키보드 익스텐션에서 개선된 사항으로는, 문서에 따라 적절한 언어를 선택할 수 있게 된 점과 handleInputModeListFromView:withEvent:를 통해 시스템에서 사용되던 언어변경 버튼을 표시할 수 있게 된 점입니다.


기타 프레임워크 변경사항

프레임워크별로 변경된 사항들에 대해 간략히 정리해 보면 다음과 같습니다.

AVFoundation
AVCaptureStillImageOutput이 제거되고 AVCapturePhotoOutput 클래스가 추가되었습니다. 이를 통해 라이브 포토나 RAW 이미지도 접근이 가능합니다. 하드웨어가 지원할 경우 wide-gaumt 색상 포맷으로 이미지 캡쳐도 가능합니다.

동영상 파일과 HLS에 따라 별도로 AVPlayerItem을 구현해야 할 필요가 없어졌고, AVPlayerLooper 클래스를 통해 특정 부분의 반복재생이 간편해졌습니다. AVAssetDownloadURLSessionAVAssetDownloadURLSession 클래스를 통해 HLS 스트림을 다운받고 나중에 재생할 수 있게 되었습니다.

AVKit
AVAssetDownloadURLSession 속성을 통해 Now Playing Info Center를 업데이트 할 수 있습니다.

Core Data
Xcode와 연계가 강화되어 모델을 변경함에 따라 NSManagedObject 서브클래스가 자동으로 업데이트 되게 되었습니다. 또한 NSPersistentStoreCoordinator, NSManagedObjectContext, NSPersistentContainer, NSManagedObject, NSFetchRequest 관련 변경사항이 있습니다. 자세한 사항은 Core Data Framework Reference를 참고하실 수 있습니다.

Core Image
A8, A9 CPU를 사용하는 기기에서 RAW 이미지 파일을 지원하게 되었습니다. DSLR에서 찍은 사진이나 지원하는 iOS 기기에서 찍은 사진을 디코드하여 프로세스하고 결과물로 만들 수 있습니다. UIImage의 디코딩 성능이 크게 개선되었고, UIImageView에서 확장된 sRGB 이미지를 표시할 수 있게 되었습니다. 그 외에도 필터와 색 영역 관련 변경사항이 있습니다.

Core Motion
만보계(pedometer) 이벤트를 수신할 수 있게 되었습니다. 이는 사용자가 운동을 중단하고 재개하는 이벤트를 실시간으로 받을 수 있게 된 것을 의미합니다. 지원하는 기기에 한해서 CMPedometer API를 통해 백그라운드에서도 이벤트를 받을 수 있습니다.

Foundation
NSDateInterval에 기간과 관련된 함수들이 대거 추가되었습니다. NSMeasurement에는 값을 다른 단위로 변활할 때 유용한 함수들이 추가되었고 NSMeasurementFormatter를 통해 값을 현지 표기에 맞게 보여줄 수 있습니다. NSUnit를 사용하여 쉽게 단위 표기를 할 수 있습니다.

GameKit
게임센터 앱이 사라짐에 따라 앱 안에서 점수판 등의 필요한 화면을 보여주는 기능이 추가되어야 합니다. 또한 GKCloudPlayer로 구현된 iCloud 전용 계정 종류가 추가되었습니다. GKGameSession을 통해 세이브 데이터 관리, 턴제 실시간 게임을 쉽게 구현할 수 있게 되었습니다.

GameplayKit
게임 맵(Game World)에 관련된 사항들, AI와 관련된 사항들이 개선되었습니다.

HealthKit
HKCDADocument에서 CDA 문서와 관련된 내용을 접근할 수 있게 되었고, HKWorkoutConfiguration를 통해 운동의 종류와 장소를 지정할 수 있게 되었습니다. 휠체어 이용자를 위한 HKWheelchairUseObject가 추가되었고 관련 속성들이 추가되었습니다.

HomeKit
iOS 10부터 아이패드를 통해 홈 악세서리를 컨트롤 하고 자동화 할 수 있습니다. 카메라와 초인종 액세서리에 접근할 수 있는 API가 추가되는 등의 다양한 개선사항이 있습니다. 자세한 사항은 HomeKit Framework Reference에서 확인할 수 있습니다.

Metal
테셀레이션(tessellation)을 지원함에 따라 더 복잡한 기하체를 생성할 수 있게 되었고 성능에 최적화된 함수들이 추가되었습니다. Resource Heaps와 Memoryless Render Targets를 통해 메모리 관리를 더 세밀하게 할 수 있게 되었습니다.

ModelIO
USD 파일포맷 지원되고, MDLMaterialPropertyGraph로 모델의 순차적인 변경을 쉽게 할 수 있습니다. 또한 MDLVoxelArray, MDLLightProbeIrradianceDataSource 관련 변경사항이 있습니다.

Photos
라이브 포토의 편집이 가능해졌습니다. 특히 PHLivePhotoEditingContext를 통해 동영상 파트와 정지영상 파트의 편집이 가능해졌습니다.

ReplayKit
게임 플레이 영상을 서드파티 사이트에 실시간으로 방송할 수 있게 되었습니다. 이를 위해서 서드파티들은 해당하는 앱 익스텐션을 구현해야 합니다.

SceneKit
물리 기반 렌더링(PBR)이 생겼고, SCNCamera 클래스에 HDR 기능을 통해 더 현실적인 묘사가 가능해졌습니다.

SpriteKit
다양항 모양의 타일맵을 사용할 수 있게 되었고 Xcode 편집기를 통해 관리가 가능해졌습니다.

WebKit
WKWebView에서 픽(peek), 팝(pop) 액션을 세부적으로 조절할 수 있게 되었습니다.

UIKit

  • 객체지향이고 완전히 인터랙티브한 애니메이션 시스템이 도입되었습니다. 제스쳐에 따라 반응하기도 하고, 중간에 취소도 되며, 중단 지점에서부터 이어서 애니메이션을 줄 수도 있습니다. iOS 10 사진 앱에서 확대된 사진을 쓸어 내렸을 때 컬렉션 뷰로 돌아간는데 적용이 되어 있습니다. UIViewPropertyAnimator 레퍼런스에서 더 자세한 내용을 확인할 수 있습니다.
  • UIPreviewInteraction 클래스와 UIPreviewInteractionDelegate 프로토콜을 통해 세부적인 픽(peek), 팝(pop) 동작을 지정할 수 있습니다.
  • UIPasteboard 클래스에 기기간 공유를 위한API와 옵션이 추가되었습니다.
  • Dynamic Type을 지원하기 위해 UIFont 클래스에 preferredFontForTextStyle:compatibleWithTraitCollection: 메소드가 추가되었습니다.
  • UIContentSizeCategoryAdjusting 프로토콜에 adjustsFontForContentSizeCategory 속성이 추가되어, 기기의 UIContentSizeCategory가 변경될 때 적절한 폰트를 적용할 수 있게 되었습니다.
  • 탭바 아이콘과 뱃지에 커스텀 색상을 지정할 수 있게 되었습니다.
  • UIApplicationopenURL:options:completionHandler: 메소드가 추가되어 비동기적으로 동작하게 되었고, 기존 openURL: 메소드를 대체하게 되었습니다.
  • UICloudSharingController 클래스와 UICloudSharingControllerDelegate 프로토콜을 통해 CloudKit 공유를 쉽게 할 수 있습니다.
  • UICollectionViewUICollectionViewDataSourcePrefetching 프로토콜을 통해 셀들을 미리 로딩할 수 있게 되어 스크롤 버벅임을 줄일 수 있게 되었습니다.

마치며
이제 iOS도 나온지 10년이 되어가고 macOS와 같이 성숙한 플랫폼이 되어감에 따라 눈에 확 띄는 새로운 것 보다는 점진적인 발전의 모습이 더 많이 보이는 것 같습니다. 서두에서도 말씀 드린 것 처럼 올해도 "공유"와 "개방"을 모토로 하여 이전 버전에는 막혀있던 것이 열렸던 부분이 많이 있고 올 가을에는 어떤 앱들이 새로 나올지 기대가 됩니다.

관련 링크

Ubuntu 서버 16.04 초기설정 가이드

$
0
0
Ubuntu 서버 16.04 초기설정 가이드

Ubuntu 서버를 처음 설치한 후 기본적으로 해야 하는 셋업이 몇 가지 있습니다. 이번 포스팅에선 Digital Ocean 튜토리얼을 참고하여 보안 강화를 위해서 또는 쉬운 관리를 위해서 꼭 필요한 서버 초기설정에 대해서 알아보겠습니다.

이 가이드는 Ubuntu 16.04 LTS 버전을 기준으로, vultr.com VPS에서 테스트 되었습니다. Ubuntu 버전에 따라 세부적인 명령어 등이 다를 수 있으므로 유의하시기 바랍니다. 참고로 Ubuntu의 경우 12.04, 14.04, 16.04 버전이 LTS(Long Term Support)로서 최대 5년까지 보안 업데이트를 받을 수 있기 때문에 대부분의 경우 이 버전을 선택하시는 것이 좋습니다. Ubuntu 14.04 LTS 버전 기준으로 작성된 포스팅도 있으니 참고하시기 바랍니다.

가상호스팅이 아직 없으시다면 다음 포스팅을 참고하시기 바랍니다: VULTR를 통한 가상서버(VPS) 호스팅


1단계. 루트(root) 로그인

모든 작업을 위해서 가장 먼저 필요한 서버 로그인을 해보겠습니다.

서버에 접속하기 위해서는 IP 주소와 root 계정의 비밀번호를 알아야 합니다. vlutr.com과 같은 VPS 서비스를 이용하여 가상서버 인스턴스를 생성하게 되면 IP 주소와 초기 root 계정 비밀번호를 제공해줍니다. 현재는 서버를 새로 설치했기 때문에 root 계정으로만 접근할 수 있습니다. OS X나 Unix 계열의 OS를 사용할 경우 터미널에서 다음과 같은 명령어로 서버에 접속할 수 있습니다.

$ ssh root@{서버-IP-또는-도메인}

처음 접속할 경우에는 다음과 같이 '처음 접속하는 원격 서버'라는 경고 메시지가 뜹니다. yes를 입력하면 다음으로 넘어갑니다.

The authenticity of host '0.0.0.0 (0.0.0.0)' can't be established.  
ECDSA key fingerpring is 79:95:46:1a:ab:37:11:8e:86:54:36:38:bb:3c:fa:c0.  
Are you sure you want to continue connecting (yes/no)?  

2단계. 언어(locale) 설정

시스템의 언어를 설정해 줄 차례입니다. 기본적으로 en_US로 설정되어 있지만, 각종 패키지를 설치할 때 필요한 LC_ALL을 포함하여 다음과 같이 지정하는 것이 편리합니다.

/etc/default/locale 파일을 찾아 다음과 같이 수정합니다. (각 행의 마지막에 빈칸이 포함되지 않도록 합니다.)

LANG="en_US.UTF-8"  
LANGUAGE="en_US.UTF-8"  
LC_ALL="en_US.UTF-8"  

다음과 같이 서버를 재부팅하면 설정이 적용됩니다.

$ reboot

3단계. 계정 생성

서버에서 새로운 계정을 만들어 보도록 하겠습니다. 보안을 위해서 root 계정을 비활성화 하고 생성된 계정을 사용하는 것이 일반적입니다. 서버를 재부팅하였다면 다시 접속하신 후, 다음과 같이 입력합니다. 여기서 {유저-아이디} 부분은 원하시는 아이디로 바꾸시면 됩니다.

$ adduser {유저-아이디}

비밀번호를 포함하여 몇 가지 정보를 입력하게 됩니다. 비밀번호를 제외하고는 필수 입력사항이 아니므로 그냥 엔터를 입력해도 됩니다.


4단계. 루트 권한

이전 단계에서 만든 계정은 일반 계정입니다. 일반적인 작업은 수행할 수 있지만 관리자 작업은 수행할 수 없습니다. 일반 계정에서 관리자 작업을 수행할 수 있도록 일반 계정에 관리자 권한을 부여할 수 있습니다.

서버에서 다음과 같이 입력합니다.

$ usermod -aG sudo {유저-아이디}

5단계. 공개키 인증 활성화 (선택사항)

이번단계에서는, 아이디-비밀번호 인증이 아닌 공개키(public key) 기반의 인증을 활성화 하도록 하겠습니다. 공개키 인증을 사용할 경우 터미널 또는 SFTP 접속시 매번 암호를 입력하지 않아도 되고, 더 나은 보안을 제공하여 줍니다.

로컬 PC 터미널에서 다음과 같이 입력하여 공개키를 생성합니다.

$ ssh-keygen

다음과 같이 암호 설정여부를 물어보게 됩니다. 암호를 설정하게 되면 공개키 인증과 더불어 암호 확인도 하게 됩니다. 암호 없이 편하게 쓸 것인가, 암호를 넣고 좀더 보안을 강화할 것인가는 상황에 따라 다를 수 있습니다. 다만 두 방법 모두 아이디-비밀번호를 통한 인증 보다는 훨씬 안전한 방법입니다.

Generating public/private rsa key pair.  
Enter file in which to save the key (/Users/username/.ssh/id_rsa):  

이제 다음과 같이 생성된 공개키를 서버에 복사합니다. (ssh-copy-id 명령어는 macOS 10.12 Sierra부터 내장되어 있습니다. 이전 버전의 macOS나 다른 OS의 경우 따로 설치하셔야 합니다.)

$ ssh-copy-id {유저-아이디}@{서버-IP-또는-도메인}

이제 서버 .ssh/authorized_keys 폴더에 해당 PC 공개키가 저장되게 되며 ssh 접속시 비밀번호를 따로 물어보지 않고 바로 접속하게 됩니다.


6단계. SSH 비밀번호 인증 비활성화 (선택사항)

공개키 기반의 인증을 활성화 하였다면 비밀번호 인증을 비활성화 함으로 좀더 보안을 강화할 수 있습니다. 서버에서 다음과 같이 입력하여 SSH 설정을 수정합니다.

$ vi /etc/ssh/sshd_config

파일에서 PasswordAuthentication을 찾아서 앞에 있는 #을 지우고 값을 no로 변경합니다. (먼저 편집모드 전환을 위해서 a 키를 누릅니다) 수정을 마친 후에는 명령어 :wq를 입력하여 저장하고 파일을 닫습니다.

PasswordAuthentication no  

이제 다음과 같이 입력하여 SSH daemon을 재시작합니다.

$ systemctl reload sshd

다만 이를 사용할 경우 인증된 PC에 새로 OS를 설치하거나 다른 PC로 접속시 ssh를 통한 접속이 되지 않기 때문에 호스팅 업체에서 제공하는 서버 콘솔을 통해서 접속해야 합니다. 이럴 경우 SSH 설정 파일에서 PasswordAuthentication를 임시로 yes로 수정하여 새로운 PC의 공개키를 등록할 수 있습니다.


7단계. 접속 테스트

여기까지 진행한 후 다음과 같이 로컬 PC에서 서버 접속이 되는지 확인하여 보겠습니다.

$ ssh {사용자-아이디}@{서버-IP-또는-도메일}

이제 관리자 권한이 필요한 명령어는 앞에 sudo를 붙이고 사용할 수 있습니다.

$ sudo {명령어-이름}

8단계. 방화벽 설정

ufw는 Ubuntu에 기본적으로 설치되어 있는 방화벽입니다. 다양한 app을 허용목록에 등록할 수 있습니다. 현재 등록되어 있는 app의 목록은 다음과 같이 확인할 수 있습니다.

$ sudo ufw app list

다음곽 같이 입력하여 OpenSSH를 추가합니다.

$ sudo ufw allow OpenSSH

이제 설정을 마쳤으므로 다음과 같이 활성화 시킬 수 있습니다.

$ sudo ufw enable

현재 동작여부와 열려있는 포트의 목록을 보려면 다음과 같이 입력합니다.

$ sudo ufw status

이것으로 기본적인 서버 설정을 모두 마쳤습니다. 동적 웹 서비스를 위해서 웹 서버와 DB 등을 설치할 수 있습니다. 이와 관련된 가이드는 추후에 작성 예정입니다.

참고: VULTR를 통한 가상서버(VPS) 호스팅

Ubuntu 서버 16.04에 LEMP 스택 설치하기 (Nginx, MySQL, PHP)

$
0
0

LEMP 소프트웨어 스택은 동적 웹 어플리케이션을 구현하기 위해서 필요한 Linux + Nginx + MySQL + PHP를 모아서 부르는 말이라고 합니다. (LNMP가 아니고 LEMP인게 특이하네요.) Nginx 서버 대신에 Apache 서버로 구성된 LAMP 스택도 있습니다.

이 포스팅에서는 Ubuntu 16.04 서버에 LEMP 스택을 설치하는 방법에 대해서 소개합니다. 이후 작업을 위해서 필요한 기본적인 셋업은 Ubuntu 서버 16.04 초기설정 가이드에서 다루고 있습니다. 서버가 없는 경우 VULTR를 통한 가상서버(VPS) 호스팅를 참고하시기 바랍니다.

이전 버전이 Ubuntu 14.04를 사용하신다면 이곳을 참고하시기 바랍니다.


1단계. Nginx 웹 서버

Apache 서버의 대안으로 떠오르고 있는 Nginx 서버를 설치해보도록 하겠습니다. Apache와의 성능을 비교했을때 확실한 우위를 가지고 있고 많은 관점에서 모던함이 묻어나는 프로젝트입니다.

앞으로 패키지의 설치는 apt 명령어를 통해 이루어집니다. 이전 버전에서 apt-get 등의 여러 명령어로 되어 있던 것이 하나로 합쳐졌습니다. 다음과 같이 패키지 목록 업데이트를 한 후에 Nginx를 설치합니다. 포스팅 시점 기준으로 1.10.0 버전이 설치되게 됩니다.

$ sudo apt update
$ sudo apt install nginx

이전 포스트에서 활성화한 ufw 방화벽에서 허용하려면 다음과 같이 입력합니다.

$ sudo ufw allow 'Nginx HTTP'

이제 Nginx 서버가 동작하게 됩니다. 브라우저에서 서버의 도메인이나 IP 주소를 입력해서 제대로 동작하는지 확인해 봅니다. 외부 IP 주소를 모른다면 다음과 같이 입력합니다.

$ curl -4 icanhazip.com

Welcome to Nginx


2단계. MySQL

이제 웹 서버의 데이터를 저장할 수 있는 MySQL 데이터베이스를 설치해보도록 하겠습니다.

$ sudo apt install mysql-server

포스팅 시점 기준으로 5.7 버전 설치 화면이 진행되고, MySQL root 계정의 비밀번호를 입력하는 화면이 나옵니다. 사용하실 비밀번호를 입력합니다.

다음으로 보안 강화를 위해서 기본값들을 변경해주는 스크립트를 다음과 같이 실행합니다.

$ sudo mysql_secure_installation

처음에 VALIDATE PASSWORD PLUGIN에 대해서 물어보게 되는데, 안전한 비밀번호 사용을 강제화할 것인지를 선택할 수 있습니다. LOW, MEDIUM, HIGH의 총 3단계가 있습니다. STRONG을 선택할 경우 숫자, 대소문자, 특수문자를 모두 포함해야 비밀번호를 지정할 수 있게 됩니다.

There are three levels of password validation policy:

LOW    Length >= 8  
MEDIUM Length >= 8, numeric, mixed case, and special characters  
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1  

이제 root 비밀번호를 변경할지 물어봅니다. 변경하지 않을 경우 n을 입력합니다.

Using existing password for root.

Estimated strength of the password: 100  
Change the password for root ? ((Press y|Y for Yes, any other key for No) : n  

이후에 나오는 항목들은 테스트 DB 삭제 등을 물어보는데 모두 y를 선택하시면 됩니다.

root 유저가 아닌 새로운 사용자를 추가하려면 먼저 다음과 같이 입력하여 MySQL에 접속합니다.

$ mysql --user=root mysql -p

MySQL 명령창에서 다음 명령어를 한 줄씩 입력합니다. {유저-아이디}{비밀번호} 부분은 적절한 값으로 입력합니다.

CREATE USER '{유저-아이디}'@'localhost' IDENTIFIED BY '{비밀번호}';  
GRANT ALL PRIVILEGES ON *.* TO '{유저-아이디}'@'localhost' WITH GRANT OPTION;  
FLUSH PRIVILEGES;  

이제 MySQL을 종료합니다.

exit  

3단계. PHP

Nginx 서버와 MySQL 데이터베이스를 연결해주는 스크립팅 런타임이 필요합니다. Nginx는 다른 웹서버와 같이 PHP를 네이티브로 지원하지 않기 때문에 fastCGI process manager(FPM)으로 구현되어 있는 php7.0-fpm을 설치해야 합니다.

Ubuntu 16.04에는 PHP 7.0을 기본적으로 설치할 수 있게 되어 있습니다. PHP 7.0은 5.x 버전대와 비교했을 때, 특정 상황에서 2-3배의 속도 향상이 있다고 합니다.

$ sudo apt install php-fpm php-mysql

이제 설정파일 편집을 위해 다음과 같이 입력합니다.

$ sudo vi /etc/php/7.0/fpm/php.ini

cgi .fix_pathinfo 부분을 찾아 앞에 주석(;)을 삭제하고 값을 1에서 0으로 변경합니다. 1의 경우 PHP 파일을 찾을 수 없을 경우 근접한 파일을 찾아서 실행하게 되므로 보안이 취약하게 됩니다.

cgi.fix_pathinfo=0  

저장 후 다음과 같이 입력하여 PHP FPM을 재시작합니다.

sudo systemctl restart php7.0-fpm  

4단계. PHP를 위한 Nginx 서버 설정

이제 필요한 모든 컴포넌트는 설치되었습니다. 이제 Nginx 서버 설정에서 .php 파일을 처리해주는 부분만 적용하면 됩니다. /etc/nginx/sites-available/default 파일을 열었을 때 주석을 제외하면 다음과 같이 되어 있을 것입니다.

server {  
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/html;
    index index.html index.htm index.nginx-debian.html;

    server_name _;

    location / {
        try_files $uri $uri/ =404;
    }
}

다음과 같이 수정하게 됩니다.

  • index.html 앞에 index.php를 추가합니다.
  • server_name에 도메인 이름이나 IP 주소를 입력합니다.
  • PHP 경로를 구성합니다.
  • Apache와 폴더를 공유할 경우를 대비해 .ht 관련 설정을 합니다.
server {  
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/html;
    index index.php index.html index.htm index.nginx-debian.html;

    server_name server_domain_or_IP;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}

수정된 설정파일에 {가 맞지 않는다던가 사소한 오타가 있으면 Nginx가 실행되지 않으므로 다음과 같이 입력하여 오류 여부를 확인합니다.

$ sudo nginx -t

이상이 없으면 다음과 같이 입력하여 서버를 재시작합니다.

sudo systemctl reload nginx  

5단계. PHP 정상동작 테스트

이제 LEMP 스택이 모두 설치되었고 정상 동작하고 있습니다. 확인을 위해서 /var/www/html/info.php 파일에 만들고 다음과 같이 입력합니다.

<?php  
    phpinfo();

이제 주소창에 다음과 같이 입력하면 PHP 정보 화면을 볼 수 잇게 됩니다.

http://{서버-IP-또는-도메인}/info.php  

정상적으로 표시되는 것이 확인되었다면, 이 파일은 그대로 두면 보안상 좋지 않으므로 다음과 같이 입력하여 파일을 삭제합니다.

$ sudo rm /var/www/html/info.php

이제부터는 사용할 앱 스택에 따라 맞는 환경을 설정하면 됩니다.

개발자 입장에서 본 iOS 11의 변화점

$
0
0
개발자 입장에서 본 iOS 11의 변화점

올해 WWDC는 소프트웨어에 집중되었던 작년과는 달리, 다양한 하드웨어가 발표되었습니다. 거의 전체 랩탑 라인업의 업데이트와 아이패드 프로, 아이맥 프로, 그리고 홈팟까지 공개되었습니다. tvOS 11과 watchOS 4는 좀 심심한 감도 있었지만, iOS 11은 어느 해 못지 않게 다양한 변화점을 담고 있습니다.

이 글에서는 WWDC 2017에서 공개된 iOS 11의 바뀐 부분을 개발자 입장에서 정리하였습니다. Apple 개발자 문서인 What's New in iOS를 참고하였고, 특정 토픽은 WWDC 세션 등을 참고하였습니다.


개발자 입장에서 본 iOS 11의 변화점

드래그 앤 드랍

이번에 아이패드 프로 2세대가 발표되면서, 아이패드를 위한 기능들이 많이 추가되었습니다. 드래그 앤 드랍도 그 중 하나인데요, 아이패드에서는 같은 앱에서, 또한 다른 앱으로 드래그 앤 드랍이 가능하며, 아이폰에서는 앱 내에서만 가능합니다. (베타 3 기준)

예전에 복사해서 붙여넣기(copy and paste) 기능도 뒤늦게 지원했지만 높은 편의성으로 호평을 받았었는데요, 이번 드래그 앤 드랍도 터치 운영체제에서 가장 최적화된 구현이라는 평가를 받고 있습니다.

기존에 테이블뷰(UITableView)나 컬렉션뷰(UICollectionView)를 사용하는 경우 쉽게 적용할 수 있습니다. 특정 뷰(view)가 드래그 시작점인지 끝점인지 지정 가능하고, 드래그 하는 동안 미리보기와 드랍하는 애니메이션을 사용자화 할 수 있습니다.


개발자 입장에서 본 iOS 11의 변화점

로컬, iCloud 문서 접근

이번에 추가된 파일(Files) 앱과 더불어, UIDocumentBrowserViewController를 통해서 로컬 문서와 iCloud 문서 접근하는 것이 가능해졌습니다. 브라우저에서 커스텀 액션을 지정할 수 있고, FileProvider, FileProviderUI 프레임워크를 통해 서드파티 클라우드 서비스를 접근할 수 있습니다.


개발자 입장에서 본 iOS 11의 변화점

향상된 다이나믹 타입(Dynamic Type) 지원

iOS 11에서는 시스템 글꼴이 아닌 사용자 지정 글꼴에 대해서도, 사용자가 설정한 값에 따라 적절한 글자 크기를 결정해주는 UIFontMetrics가 추가되었습니다. PDF 어셋을 벡터로 지정할 수 있게 되어 사용자가 글꼴 크기를 키운 경우 화면에 크게 아이콘을 표시할 수도 있게 되었습니다. 그 외에도 글자 크기에 따라 오토 레이아웃(Auto Layout)을 표현할 수 있도록 레이아웃 규칙(layout constraints) 관련 변경이 있습니다.


앱 비밀번호 자동완성(App Password Autofill)

앱 안에서 아이디, 비밀번호로 로그인할 경우 사파리 키체인(Keychain) 데이터를 이용해서 손쉽게 입력할 수 있게 되었습니다. 아이디, 비밀번호 필드의 경우 머신러닝을 통해서 인식한다고 하는데요, 명시적으로 .username, .password로 컨텐츠 속성을 지정할 수 있습니다. 그리고 운영중인 서버와 유니버셜 링크(Universal Link)를 설정할 때 하는 것과 비슷하게 앱과 서버를 묶어서 설정할 수 있습니다.


개발자 입장에서 본 iOS 11의 변화점

ARKit

이번 WWDC에서 가장 주목받은 프레임워크입니다. 이미 AR이라는 개념은 2000년대 전후에 한번 휩쓸고 갔기 때문에 큰 관심을 끌지 못하고 있었는데요. ARKit의 경우 추가적인 장비 없이 모션센서와 카메라만으로 쓸만한 성능을 내준다는 점과, 이미 출시된 iOS의 기기의 숫자가 커서 iOS 11 업데이트시 하루아침에 메이저 플랫폼으로 부각될 수 있다는 점 때문에 많은 관심을 받고 있는 것 같습니다.

10주년 아이폰에서는 AR 성능 향상을 위한 레이저 센서가 추가된다는 루머도 있는데, ARKit에 힘을 싣고 있는 중에 그럴듯해 보이기도 합니다. 당장 출시되기는 어렵겠지만 팀쿡이 얼마전 관심있다고 했던 스마트 글래스를 위해서도 필요한 단계이기도 하구요.

개발자 입장에서 본 iOS 11의 변화점

ARKit이 해주는 것은 크게 보면 카메라 위치 감지와 평면감지입니다. 카메라와 모션센서를 조합해서 현재 보이는 것들에 대해 3D 좌표상에서의 위치를 계산하고, 기기 자신의 위치를 추론합니다. 또한 테이블이나 바닥같은 평평한 곳을 인식할 수 있습니다. 평면인식은 현재 가로로만 가능한데, 추후에 세로 벽이 추가될 확률도 높아 보입니다.

이렇게 얻어진 정보를 가지고 화면에 뿌려주는 것은 SceneKit이나 SpriteKit, 또는 Metal을 이용해야 합니다. 이게 결국 ARKit에서 뭔가 구현하는 것 보다 3D/2D 컨텐츠를 어떻게 보여주는지가 더 중요해질 가능성이 농후해 보입니다. 그래서 그런지 Unity와 Unreal 엔진과 제휴맺었다는 언급도 있었고, Unity의 경우 ARKit 관련 플러그인도 벌써 나온 상태입니다.


메탈(Metal) 2

메탈이 버전 2로 올라감에 따라 내부적으로 많은 개선이 있었고, 메탈 1과 비교했을 때 성능적으로 꽤 향상이 있다고 합니다. 애플 문서에서 많은 부분을 할애해서 설명하고 있는데, 대다수의 개발자들은 메탈 2를 활용한 Unity나 Unreal Engine을 사용하며 혜택을 볼 것으로 보입니다.


개발자 입장에서 본 iOS 11의 변화점

Core ML

ARKit과 더불어 관심을 많이 받은 프레임워크입니다. 애플의 강점을 살려서, 하드웨어와 소프트웨어의 밀접한 협력을 통해 고성능이면서도 배터리 효율이 좋은 머신러닝 기능을 구현할 수 있다고 합니다. 객체 추적, 얼굴 인식, 언어 인식, 고유명사 인식 등의 많이 사용되는 기능들은 상위 프레임워크인 비전(Vision), NLP(자연어 처리) 프레임워크에 포함되어 있습니다.

머신러닝(ML)은 크게 트레이닝(training) 단계와 추론(inference) 단계로 구성되는데, Core ML은 추론 단계에만 특화되어 있기 때문에 범용적인 머신러닝을 구현하는데에는 적합하지 않아 보입니다. 다만 이미 트레이닝된 데이터가 있다면 이를 손쉽게 프로젝트에 불러올 수 있고, 성능 좋은 함수의 형태로 사용할 수 있기 때문에 간단히 활용하기에는 좋아 보입니다. Core ML을 계기로 머신러닝에 대한 관심이 늘어나고, 잘 트레이닝 데이터가 오픈소스로 공유되는 공간이 늘어나기를 기대해봅니다.


개발자 입장에서 본 iOS 11의 변화점

SiriKit

외형적으로는 음성 인식할 때 보여주는 비주얼에 살짝 변경이 있었고, 훨씬 자연스러운 새 목소리가 추가되었습니다. 영어와 중국어, 불어, 이탈리아어, 독일어, 스페인어만 지원하긴 하지만 시리를 통해 단문 번역도 할 수 있게 되었습니다.

개발자 입장에서 본 iOS 11의 변화점

작년에 처음 도입되어 한정적인 도메인만 지원했는데, 올해는 많은 분들의 예상대로 지원하는 도메인이 늘어났습니다. 회원카드 등을 보여줄 수 있는 "비주얼 코드(visual code 도메인", 할일 앱이나 노트 앱 컨텐츠를 이용할 수 있는 "노트, 할일(notes and to-do lists) 도메인", 택시 등을 예약할 수 있는 "라이드 부킹(ride booking) 도메인", 계좌 이체나 계좌 검색 등을 위한 "페이먼츠(payments) 도메인"이 추가되었습니다.


Multiple TCP

iOS 9에서서는 와이파이 어시스트(Wi-Fi Assist) 기능이 있어서 와이파이 망이 느릴 때 셀룰러 망에 접속할 수 있게 했었는데요, 이게 좀더 발전된 형태가 Multiple TCP입니다. 애플 내부적으로는 시리(Siri)가 다양한 네트워크 환경에서 응답하는 속도를 빠르게 하기 위해서 개발했다고 합니다. 가령 집에서 와이파이 망을 사용하고 있다가, 집 밖을 나가서 걷는 도중에 시리를 호출하게 되면, 기존에는 와이파이에 접속되어 있고 신호가 약하기 때문에 사용자가 무작정 기다려야 하는 상황이 발생했는데요. Multiple TCP를 사용하면 와이파이라도 신호가 약할 경우 셀룰러로 요청을 매끄럽게 돌려서 바로 결과를 받을 수 있게 할 수 있습니다.

Multiple TCP를 지원하기 위해서는 서버 커널에서 지원을 해야 하고, 또한 앱에서도 URLSessionConfiguration 속성을 지정해야 합니다. 자세한 것은 "Advances in Networking" 세션에서 참고하실 수 있습니다.


개발자 입장에서 본 iOS 11의 변화점

Apple Pay

메시지 앱을 통한 개인 간의 송금 기능이 추가되었고, 이에 따라 "애플 페이 캐쉬"도 추가되었습니다. 국내에도 도입이 된다 안된다 말이 많았었는데요, 일단 올해에도 별다른 소식은 없어 보입니다.

SDK 측면에서 보면, 애플 페이를 통해 결제를 진행할 때 발생할 수 있는 다양한 상황에 따른 에러메시지를 훨씬 다양하게 받을 수 있게 되었습니다. 주소를 입력했는데 포맷이 다르다던가 하는 "경고"성의 메시지도 받을 수 있게 되었고, 어떻게 변경하면 좋을지 "추천"도 받을 수 있게 되었습니다.


개발자 입장에서 본 iOS 11의 변화점

새로운 앱스토어(App Store) 앱

iOS 11에서 거진 10년동안 크게 바뀌지 않았던 앱스토어가 완전히 새롭게 디자인되었습니다. 이에 따라 앱개발자 입장에서 고려할 것들이 몇 가지 생겼습니다. 먼저, 인앱 결제를 프로모션 할 수 있게 되었습니다. 애플이 예전에도 인앱결제가 있는 앱들을 표시하는 방법을 "Free"에서 "Get"으로 변경했었는데요, 이번 변경에 따라 더더욱 무료 앱이면서 인앱결제가 주 수익원인 앱의 경우 무료가 아닌 느낌을 주려고 하는 것 같습니다.

필 쉴러가 공식적으로 앱 리뷰 속도가 개선된 것을 언급하기도 했습니다. 최근에는 24시간 안에 리뷰가 끝나는 경우도 있으니깐, 예전에 7-10일 걸리던 것에 비하면 정말 빨라진 것 같습니다. 동시에 여러 개의 버전을 TestFlight에서 테스트할 수 있게되었고, 새로운 버전을 출시할 때 7일의 간격 안에서 순차적으로 릴리즈(phased release)할 수 있도록 하는 기능도 생겼습니다.


개발자 입장에서 본 iOS 11의 변화점

메시지(Messages)

메시지 앱에서 앱들을 보여지는 방법이 개선되었습니다. 또한 Messages in iCloud로 인해서 모든 대화가 iCloud에 저장되고 동기화 된다고 합니다. (기존에도 거의 동기화 된다고 느낄만큼 비슷했었는데요, 이제는 아예 메시지 원본이 서버에 보관되는 듯 합니다)

라이브 메시지(live messages)가 새로 추가되었습니다. 게임과 같은 동적인 컨텐츠를 메시지 앱으로 보낼 수 있게 됩니다. 라이브 메시지는 각각 MSMessagesAppViewController를 가질 수 있고, 한 화면에 여러 개의 라이브 메시지를 보이게 할 수도 있습니다.


홈킷(HomeKit)

이번 WWDC 발표를 뜨겁게 달구었던 새로운 하드웨어인 홈팟(HomePod)의 발표와 함께, 많은 부분들이 개선되기를 바랬지만 생각만큼 눈에 띄는 변화는 적어보였습니다. 좋은 성능의 스피커, 똑똑한 음성인식 및 AI, 그리고 홈킷 허브 기능을 담당하는 기기를 기대했었는데, 발표된 것만으로 봐서는 꽤 성능 좋아보이는 스피커에 그칠 것 같다는 느낌이 듭니다. 자세한건 가을까지 기다려봐야 알겠지만요.

SDK 측면에서는, 각종 트리거(trigger) 관련하여 개선이 있었습니다. HMSignificantTimeEvent의 경우 일출, 일몰로부터의 시간을 지정할 수 있게 되었고 HMCalendarEvent로 날짜를 지정, HMDurationEvent로 소요시간을 지정할 수 있게 되었습니다. 그 외에도 온도 등이 일정 범위에 있는지 여부, 사용자가 부재한지 여부 등의 트리거가 추가되었고, 복수의 트리거를 묶은 트리거도 추가되었습니다.


맵킷(MapKit)

올해는 층별로 실내지도가 추가되었고, 네비게이션 모드시에 속도제한 표시 및 차선 표시가 추가되었습니다. (올레!) 아직 국내에서는 성능이 딸리지만, 미국에서는 캘린더 등과 연동되고 군더더기 없이 깔끔하게 표시되어서 꽤 쓸만한데요, 그래도 데이터 정확도는 구글맵을 따라잡으려면 갈길이 멀어 보입니다.

개발자 입장에서는, 맵 위에 보여주는 데이터를 부각시키기 위해서 맵 자체를 흐리게 보여주는 mutedStandard 모드가 추가 된 것과, 어노테이션(annotation)이 겹칠 때 어떻게 동작할 수 있는지 지정할 수 있게 된 것이 눈에 띕니다.


개발자 입장에서 본 iOS 11의 변화점

카메라, 사진

아이폰 7 플러스에서 두 개의 렌즈를 통해 포트레이트(portrait) 모드의 사진을 찍을 수 있었는데요, 이 때 저장된 깊이(depth) 정보를 활용할 수 있게 되었습니다. 예시로 보여준 앱은 예를 들어 피사체를 제외한 배경을 다른 배경으로 바꿔주는 앱이였습니다. 개인적으로 이 API를 통해 어떤 앱들이 나올지 기대가 됩니다.

이미지, 비디오를 효율적으로 저장하기 위한 코덱도 추가되었습니다. h.265 기반의 고성능 압축을 이용한다고 하고, 비디오 코덱은 HEVC(Hight Efficiency Video Coding), 이미지 코덱은 HIEF(High Efficiency Image Format, |히프|)입니다. 특히 라이브 포토는 HIEF 컨테이너가 가진 특성을 잘 활용해서 저장 공간을 획기적으로 아껴준다고 합니다.

이와 더불어 라이브 포토를 접근하고 수정하는 방법이 대폭 추가되었습니다. 루프, 바운스, 롱 익스포져 등의 다양한 효과가 추가되었습니다.


개발자 입장에서 본 iOS 11의 변화점

AirPlay 2

홈팟(HomePod)을 대비해서 나온 것 같습니다. 여러 기기에서 동시 재생을 지원하며, 음악, 팟캐스트 등의 롱폼 오디오(long-form audio) 재생시 알람이나 전화 통화가 재생을 방해하지 않게 할 수 있습니다.

AirPlay 2를 지원하려면 AVKit을 통해서 미디어를 재생하는 것이 가장 간단한 방법이고, 로우레벨 API를 통해서 재생하는 경우 고려해야 할 것이 많아 보입니다. 롱폼 오디오(long-form audio) 재생은 AVAudioSessionsetCategory(_:mode:routeSharingPolicy:options:) 메소드에서 AVAudioSessionRouteSharingPolicyLongForm를 지정해서 적용할 수 있습니다.


개발자 입장에서 본 iOS 11의 변화점

뮤직킷(MusicKit)

애플 뮤직 카탈로그에 접근할 수 있는 API가 생겼습니다. 서드파티 앱에서 애플 뮤직 구독을 끌어올리기 위해서 노력하는 것 같습니다. Spotify API에서 제공하는 것들이 대부분 가능하다고 보시면 될 것 같습니다. 앱 안에서 애플 뮤직 구독을 바로 할 수 있는데, 이럴 경우 개발자에게 수익을 분배합니다.


시스템

그 외에도 핫스팟 설정을 위한 네트워크 익스텐션이 추가되었고, 코어 블루투스(Core Bluetooth) 프레임워크에서 블루투스 리셋이나 기기 재부팅시 세션 복원기능이 향상되었습니다. 또한 Core NFC 프레임워크에서 NFC 데이터를 읽기가 가능해졌으며 (쓰기는 불가합니다), APFS(Apple File System)이 기본 파일시스템이 되었습니다.


여기까지는 굵직한 항목 위주로 정리한 내용입니다. 기타 자세한 사항은 What's New in iOS 문서의 iOS 11 섹션을 참고하시기 바랍니다.

관련링크

Viewing all 19 articles
Browse latest View live