React Native로 앱을 구현하고, 최근 프로젝트에 WebView 도입이 결정되면서 구현을 위해 이것저것 공부하게 되었다. 그러던 중 문득 앱이란 무엇이고, React Native로만 만들어진 앱과 WebView는 정확하게 어떤 부분에서 다른지, 일반 웹 페이지를 반응형으로 구현한 것과 WebView는 어떤 부분이 다른지에 대한 궁금증이 생겼다.
앱의 종류에 대해 자세하게 알아보기에 앞서, 간단하게 앱이 무엇이고 어떤 과정으로 발전해왔는지를 알아보자.
스마트폰, 태플릿, PC 같은 기기에서 설치해 사용하는 소프트웨어를 의미한다. 넓은 의미로는 응용 소프트웨어와 비슷한 의미로 쓰여 사용자가 원하는 기능을 수행하기 위해 제작된 소프트웨어를 통칭한다.
일반적으로는 스마트폰 앱, 모바일 앱처럼 모바일 기기용의 응용 소프트웨어를 의미하는데 iPhone에서 사용하는 애플리케이션을 App Store(모바일 애플리케이션 마켓)에서 사고 팔기 시작하면서 스마트폰용 애플리케이션을 앱이라고 부르기 시작했다고 한다.
1994년
iPhone과 Android 이전에 최초의 스마트폰인 IBM의 Simon Phone이 등장한다. 이 핸드폰은 달력, 주소록, 메일, 노트, 그리고 그림판을 포함한 10개의 내장 앱을 제공했다.
1997년
스마트폰에 도입된 최초의 게임 앱인 snake가 등장했다. Nokia 6610에서 처음 출시했으며, 초록색 바탕에 검은색 사각형이 움직이는 단순한 형태의 게임 애플리케이션이다.
1999년
2002년
RIM의 Blackberry 5810이 스마트폰의 새로운 지평을 열었다. 이 핸드폰에는 벨소리 편집기, To-Do 리스트와 같은 내장 앱도 있었지만, 무엇보다도 무선 이메일 기능을 최초로 갖춘 핸드폰이었다는 점에서 특별하다. 또한 푸쉬 알림 기능을 구현한 최초의 핸드폰이기도 하다. (참고로, 디자인이 예쁜 핸드폰으로 소소하게 유명한 Blackberry 핸드폰의 이름은 제작자가 QWERTY 자판이 베리 씨앗처럼 생겼다고 생각하여 붙인 이름이라고 한다.🫐)
2007년
지도, 날씨, 사진 갤러리처럼 이전의 핸드폰에서는 볼 수 없었던 기능을 탑재한 최초의 iPhone이 출시된다. 이 직후 Apple은 앱 개발 회사를 위한 SDK를 제공함으로써 모바일 기기에서 최초로 타사 앱을 허용하는 혁신을 보여주었다.
2008년
Apple은 다양한 업종의 500개 앱으로 구성된 최초의 모바일 App Store를 선보였다. Developers can reach every single iPhone user through (one) store. 개발자가 하나의 스토어로 모든 iPhone 사용자에게 도달할 수 있도록 하는 것이 이 출시의 배경이자 목적이었다. 앱 스토어는 출시 3일 만에 1,000만 건이 넘는 다운로드 수를 기록했으며, 이 중 75%가 무료 앱이었다고 한다.
Google도 Android OS를 발표하고 Google Play Store를 출시하면서 본격적으로 앱 생태계의 발전이 시작되었다. 이때 다양한 네이티브 앱들이 등장하며 사용자들의 모바일 경험을 풍부하게 했다.
하이브리드 및 웹 앱의 부상 (2010 - 2015년)
2010년대에 들어서면서, HTML, CSS, JavaScript를 사용해 Native 앱처럼 작동하는 하이브리드 앱 개발이 인기를 끌게 된다. 이때 PhoneGap, Cordova와 같은 프레임워크가 등장하여 개발자들로 하여금 웹 기술을 사용한 네이티브 앱 개발이 가능하도록 지원하였다.
Google은 Android 마켓, Google Music, Google Books, 그리고 동영상 서비스를 하나의 마켓 플레이스인 Google Play Store 로 통합하였다. 이후 Apple과 Android 앱 스토어에 수백 개의 앱이 추가되고, 2013년에는 두 시장 모두에서 500억 건 이상의 앱 다운로드가 이루어졌다.
모바일 앱의 고도화 (2015년 - 현재)
2015년, 페이스북이 React Native를 출시하여 JavaScript를 사용한 네이티브 앱 개발이 가능해졌다. 단일 코드 베이스로 iOS와 Android에 모두 배포가 가능한 RN의 등장으로 웹 개발자들이 기존의 기술을 활용해 모바일 앱을 개발할 수 있게 되었다.
Android Instant Apps나 Apple의 App Clips와 같이 사용자가 별도로 앱을 설치하지 않고도 웹이나 검색 결과에서 앱의 일부 기능을 사용할 수 있게 해주는 인스턴트 앱이 등장했다. 이를 통해 사용자들은 특정 기능만을 사용하기 위해 앱의 일부만 즉시 실행하고 완전한 앱 설치를 하지 않고도 앱의 기본적인 기능을 경험할 수 있게 되었다.
👩🏫 앱에 대해 간단하게 알아보았으니, 이제 앱의 종류에 대해 톺아보는 시간을 가져봅시다!
SDK (Software Development Kit)
응용 프로그램의 개발을 간편하고 용이하게 하기 위해 제공되는 특정 환경 또는 플랫폼 기반의 종합 개발 도구. 원래는 Microsoft가 Window 응용 프로그램 개발자들을 위해 만든 고급 API(응용 프로그램 인터페이스)를 의미했으나, 현재는 개발 도구 및 라이브러리, 관련 document set 등을 의미하는 일반 용어로도 사용한다.
SDK는 API를 포함하는 개념으로, Android SDK가 있다고 하면 이는 Android 애플리케이션 개발을 위한 도구 모음으로써 다양한 API를 포함하고 있다. Android SDK에는 API 뿐만 아니라 개발 도구, 디버깅 도구, 에뮬레이터 등이 포함되어 있다. 개발자들은 API를 사용해 애플리케이션의 UI를 구성하고, 애플리케이션 개발 및 테스트, 디버깅을 수행할 수 있다.
Java
Kotlin
JVM(Java Virtual Machine, Java를 실행하기 위한 가상 기계)에서 실행되고 Java와 호환 운용되는 최신 프로그래밍 언어이다.
2017년 Google이 안드로이드 앱 개발을 위한 공식 언어로 채택하였다.
반복적인 코드 섹션을 크게 줄일 수 있도록 설계되어 코드가 비교적 간결하며 확장된 프로그래밍 개념을 대입하여 확장 함수, 고차 함수, 데이터 클래스 등을 사용할 수 있다.
// Java에서의 데이터 클래스
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
// 하단 코드 생략 ...
}
// Kotlin에서의 데이터 클래스
data class User(val name: String, val age: Int)
앱개발의 표준으로 불리는 Java와 완벽하게 호환되므로 동일한 프로젝트에서 Java와 Kotlin을 모두 사용하는 것도 가능하다.
보다 복잡한 컴퓨팅과 JVM의 장점을 사용할 때 채택하면 좋다.
Objective-C
자유로운 문법을 사용할 수 있으며, 다양한 스타일로 코드를 작성하는 것이 가능하다. 하지만 C 언어를 기반으로 하기 때문에 구문이 복잡하고 장황할 수 있다.
// Objective-C로 간단한 Person 클래스를 정의한 뒤 해당 클래스의 인스턴스를 생성해 인사를 출력하도록 한 코드 예시이다.
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
- (void)greet;
@end
@implementation Person
- (void)greet {
NSLog(@"Hello, %@", self.name);
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *person = [[Person alloc] init];
person.name = @"Alice";
[person greet];
}
return 0;
}
1980년대에 만들어져 사용되었기 때문에 기존 Apple 앱의 코드와 라이브러리는 Objective-C로 작성되어 있으며 Cocoa 및 Cocoa Touch 프레임워크와 호환되어 iOS/macOS 애플리케이션에 많이 사용되었다.
C언어를 호환하지 않는 Swift와 달리 Briding Header 파일로 호환이 가능하다. 이는 Swift 프로젝트에서 Objective-C 클래스를 사용할 수 있게 해주는 파일로, C 언어와 직접 호환되지 않는 Swift를 Objective-C를 사용해 상호작용할 수 있게 해준다.
Swift
Objective-C에 비해 비교적 최근에 등장하여 코드가 조금 더 쉽고, 간결하고 직관적이다. 위에서 Objective-C로 구현한 기능을 Swift로 구현한다면 아래와 같이 코드를 작성할 수 있다.
// Swift 코드 예시
import Foundation
class Person {
var name: String?
func greet() {
if let name = name {
print("Hello, \(name)")
}
}
}
let person = Person()
person.name = "Alice"
person.greet()
변수와 상수 선언 시 변수 타입을 자동으로 추정해주는 타입 추론을 사용할 수 있다.
런타임 오류를 사전에 방지하는 optional이나 자동으로 메모리 관리를 처리하는 ARC(Automatic Reference Counting) 등을 지원하여 버그에 대한 고민을 줄여준다.
www.-
으로 시작하는 PC Web과는 다르게 m.-
으로 시작하는 URL을 가지며, 터치 스크린의 인터페이스를 통해 모바일에 특화된 기능을 제공한다. 둘 다 웹 개발과 동일하게 만들어지므로 운영체제에 따라 별도로 개발할 필요가 없어 시간과 비용을 절감할 수 있다.
하지만 브라우저를 이용하여 접속해야 하기 때문에 직접 검색을 하거나 URL을 통해야 한다는 점에서 접근성이 떨어진다.
그렇다면 모바일 웹과 웹 앱은 어떤 차이가 있을까? 실제로 보기에는 큰 차이가 있어 보이지 않는 두 개발 방식은 실행 방식에 차이가 있다. 상단 이미지가 모바일 웹의 Full Browing 방식과 흡사하다면, 아래의 SPA Lifecycle은 웹 앱의 실행 방식을 설명한다.
화면 일부분이 변경되면 화면의 전체 내용을 서버에서 새로 받아온다. 이로 인해 page reload 발생 시 속도가 느리고, 이동 중 서버 접속 장애가 발생할 위험이 존재한다.
브라우저에서 최초로 한 번 페이지 전체를 받아오고, 화면의 일부분이 변경되면 해당 부분만 Ajax를 사용해 데이터를 바인딩 하므로 실행 속도가 빠르다.
Ajax (Asynchronous JavaScript and XML)
웹 페이지가 서버와 비동기적으로 통신할 수 있게 해주는 기술으로, 이를 통해 전체 페이지를 새로 고치지 않고도 데이터를 가져오거나 보낼 수 있어 사용자 경험을 향상시킬 수 있다.
데이터 바인딩
UI 요소와 데이터 모델 간의 연결을 설정하여 데이터의 변경이 자동으로 UI에 반영되도록 하는 기술이다. 이를 통해 개발자는 복잡한 DOM 조작 없이 데이터의 상태를 쉽게 관리하고 업데이트할 수 있다.
// "Hello World"라는 메세지가 쓰여진 애플리케이션을 구현한다.
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
title: 'Hello World App',
home: Scaffold(
appBar: AppBar(
title: Text('Hello World'),
),
body: Center(
child: Text(
'Hello, World!',
style: TextStyle(fontSize: 24),
),
),
),
);
}
}
import React from 'react';
import { Text, View, StyleSheet } from 'react-native';
const App = () => {
return (
<View style={styles.container}>
<Text style={styles.text}>Hello, World!</Text>
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
},
text: {
fontSize: 24,
},
});
export default App;
flexbox
레이아웃 시스템을 기반으로 레이아웃을 계산한다. 웹뷰
내비게이션이 없는 윈도우 브라우저를 의미한다. HTML, CSS, JS를 사용하여 구현된 웹 사이트를 각각의 OS에 맞는 껍데기로 감싼 뒤 스토어에 올리면 앱으로 다운로드 받을 수 있게 된다.
다음 아티클에서 웹뷰 구현 과정에 대해 자세히 서술하겠지만, 어떤 순서로 하이브리드 앱을 만들 수 있는지 간략하게 소개하여 이해를 돕고자 한다. Cordova, Ionic과 같은 네이티브 컨테이너에 웹 페이지를 패키징하여 iOS와 Android에서 실행하는 방법도 있지만 이번에는 React Native 환경에서 웹뷰를 로드하는 방법에 대해서만 소개하겠다.
WebView
사용하기react-native-webview
라이브러리를 사용해 구현할 수 있다.import React from 'react';
import { SafeAreaView, StyleSheet } from 'react-native';
import { WebView } from 'react-native-webview';
const App = () => {
return (
<SafeAreaView style={styles.container}>
<WebView
source={{ uri: 'https://your-web-page.com' }}
style={{ flex: 1 }}
/>
</SafeAreaView>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
},
});
export default App;
source
: 위의 예시처럼 uri
로 웹 페이지를 로드할 수도 있고 ({ uri: 'https://your-web-page.com' }
), 로컬 파일을 소스로 사용하여({ uri: 'file:///android_asset/local-file.html' }
) 로컬 HTML 파일로 웹 페이지를 로드하는 것도 가능하다.각 예시에서도 볼 수 있듯, 최신 앱들도 다양한 방법을 차용하고 있는데 이는 곧 가장 좋은 방식은 무엇인가? 에 대한 정답이 없음을 의미한다.
네이티브 앱
모바일 웹, 웹 앱
하이브리드 앱
다음 글에서는 실제로 웹 뷰를 사용하여 간단한 투두리스트를 만들어본 기록을 작성할 예정이다.