안녕하세요 윾진입니다.
웹을 만들었는데 앱으로도 바로 만들기가 가능하다 ?
이거 완전 럭키웹앱이잖아?🍀
1. 웹앱(Web App)
- 웹앱(Web Application) : 브라우저에서 실행되는 앱임.
- 서버에서 데이터를 가져와서 화면에 보여주고, 사용자가 입력한 데이터를 서버로 보내는 방식임.
- 보통 인터넷만 있으면 PC나 모바일 어디서나 접근 가능함.
=> 웹앱 특
- 접근성 좋음: 인터넷만 되면 브라우저에서 바로 사용 가능.
- 배포 쉬움: URL만 알려주면 누구나 접속 가능, 스토어에 등록 필요 없음.
- 유지보수 편함: 서버에서 업데이트하면 모든 사용자에게 바로 반영됨.
=> 웹앱 단점 ㅠㅠ
- 네이티브 기능 부족: 카메라, GPS, 푸시 알림 같은 기능 사용 어려움.
- 오프라인 사용 어려움: 기본적으로 인터넷 연결이 필요함.
2. PWA(Progressive Web App)
- PWA는 웹앱에 네이티브 앱 같은 기능을 더한 앱임.
- 설치 가능하고, 오프라인 지원, 푸시 알림 기능까지 제공함.
- 앱처럼 보이지만, 사실은 웹앱임.
=> PWA 간단한 구현법
manifest.json
파일 추가: 앱의 기본 정보와 아이콘을 설정하는 파일임.
json
{
"name": "PWA Example",
"short_name": "PWA",
"start_url": "/",
"display": "standalone",
"background_color": "#ffffff",
"theme_color": "#000000",
"icons": [
{
"src": "/icon-192x192.png",
"sizes": "192x192",
"type": "image/png"
}
]
}
2. 서비스 워커 설정: 네트워크 요청을 캐싱해서 오프라인에서도 동작하게 만듦.
// service-worker.js
self.addEventListener('install', (event) => {
event.waitUntil(
caches.open('static-cache').then((cache) => {
return cache.addAll(['/', '/index.html', '/styles.css']);
})
);
});
self.addEventListener('fetch', (event) => {
event.respondWith(
caches.match(event.request).then((response) => {
return response || fetch(event.request);
})
);
});
=> PWA 장점
- 설치 가능: 브라우저에서 바로 설치할 수 있음. 앱처럼 홈 화면에 추가 가능.
- 오프라인 사용 가능: 캐싱을 통해 인터넷 연결이 없어도 작동함.
- 푸시 알림 지원: 브라우저를 통해 푸시 알림 받을 수 있음.
- 네이티브 앱 따로 공부 안해도 됨 ㅋㅋ
- 기존의 웹사이트를 앱으로 만들 수 있기 때문에, 추가로 유지관리해야 하는 코드베이스가 적음
- 기본적으로 반응형(responsive)
=> PWA 단점 ㅜㅜ
- 브라우저 의존적: 브라우저가 PWA를 지원해야 함.
- 제한된 네이티브 기능: 일부 네이티브 기능은 여전히 지원 어려움.
=> PWA 적용 기업
스타벅스
스벅 홈페이지 (starbucks.com)을 모바일 환경에서 접속하면 , PWA를 홈 화면에 설치 가능하다!
별 차이가 없지요 ?
기능도 차이 없다.
트위터
Twitter Lite 라는 이름으로 제공중이다.
인터넷 속도나 기기 성능이 낮은 모바일 사용자를 위한 경량화 버전.
대기시간 30% 이상 감소 , 로딩 속도 75% 이상 향상됨!
그 외 트리바고 , 넷플릭스 등등 PWA 기술 적용하는 기업이 많다!
3. Expo에 대해서
- Expo : React Native를 이용해서 네이티브 모바일 앱을 쉽게 만들 수 있게 도와주는 도구임.
- 웹앱을 네이티브 앱으로 포팅하는 데 유용함.
=> Expo 간단한 구현법
1. Expo CLI 설치 : 전역 설치 필요
npm install -g expo-cli
2. 새 프로젝트 생성 : 기본 설정으로 시작
expo init KnowGet
3. WebView 추가 : 웹앱 표시하기 위해 사용함
// App.js
import React from 'react';
import { StyleSheet, View } from 'react-native';
import { WebView } from 'react-native-webview';
export default function App() {
return (
<View style={styles.container}>
<WebView source={{ uri: 'https://your-web-app-url' }} style={styles.webview} />
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
},
webview: {
flex: 1,
},
});
4. 실행 : Expo 앱으로 실행해서 테스트
expo start
5. pwa 설정 추가
{
"expo": {
"name": "My PWA App",
"platforms": ["ios", "android", "web"],
"web": {
"favicon": "./path-to-favicon.png",
"config": {
"manifest": {
"short_name": "MyPWA",
"theme_color": "#ffffff",
"background_color": "#ffffff",
"display": "standalone",
"scope": "/",
"start_url": "/"
}
}
}
}
}
6. 배포
npx expo build:web
=> Expo 장점
- 네이티브 기능 사용 가능: 카메라, 위치 정보, 푸시 알림 등 다양한 네이티브 기능 사용 가능.
- 스토어 배포 용이: iOS, Android 스토어에 배포 가능. 크로스 플랫폼 애플리케이션을 쉽게 구축
- 빠른 개발 환경: 다양한 도구와 라이브러리가 이미 설정되어 있어 개발 속도가 빠름.
- Expo를 사용하면 PWA 개발이 단순
=> Expo 단점
- 패키지 크기 증가: Expo의 모든 기능이 포함되면서 앱의 크기가 커질 수 있음.
- 맞춤화 제한: Expo가 지원하지 않는 네이티브 기능은 사용하기 어려움.
4. Spring + Vue 기반에서 실시간 알림 서비스 구현 시 적합한 방법
일단 우리는 spring + vue3 사용해서 만든 웹 서비스를 웹앱으로 구현하는 것이 목표이기 때문에 그에 맞는 적합한 방법을 찾아두자.
=> 정답은 없지만 Expo 를 사용한다면 ?
실시간 API 연동과 푸시 알림 기능이 필요하면 Expo를 이용한 네이티브 앱이 적합함.
이유는 아래와 같음.
1. 네이티브 기능 지원 :
Expo는 WebSocket, Firebase, 네이티브 푸시 알림 등을 완전히 지원함.
이 덕분에 실시간 데이터와 푸시 알림 기능을 원활하게 구현할 수 있음.
Expo는 WebSocket, Socket.io와 같은 라이브러리를 사용하여 실시간 데이터 전송 및 상호작용을 지원
Expo는 자체 푸시 알림 서비스를 제공하여 iOS 및 Android에서 푸시 알림을 쉽게 설정하고 관리할 수 있게 함.
WebSocket 및 Socket.io 지원 =>
npm install socket.io-client
import io from 'socket.io-client';
const socket = io('http://your-server-url');
socket.on('connect', () => {
console.log('Connected to server');
});
Expo 푸시 알림 서비스:=>
npx expo install expo-notifications
import * as Notifications from 'expo-notifications';
Notifications.setNotificationHandler({
handleNotification: async () => ({
shouldShowAlert: true,
shouldPlaySound: true,
shouldSetBadge: false,
}),
});
async function sendPushNotification() {
const message = {
to: 'ExponentPushToken[xxxxxxxxxxxxxx]',
sound: 'default',
title: 'New Notification',
body: 'You have a new message!',
data: { data: 'goes here' },
};
await fetch('https://exp.host/--/api/v2/push/send', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Accept-encoding': 'gzip, deflate',
'Content-Type': 'application/json',
},
body: JSON.stringify(message),
});
}
2. 크로스 플랫폼 지원 :
Expo 앱은 iOS와 Android 스토어에 배포할 수 있어 사용자들에게 설치를 쉽게 제공할 수 있음.
좀 급하게 쓴 게시글이라 추후 보완 (예제 코드들 추가 등등..) 해서 올리겠슴니다.
윾진이었습니다,