
실시간 데이터 전송과 양방향 통신은 현대 모바일 앱에서 필수적인 기능입니다. Flutter는 WebSocket을 활용해 채팅, 실시간 알림, 주식 시세, 스포츠 중계 등 다양한 실시간 서비스를 쉽게 구현할 수 있습니다.
아래에서 플러터에서 WebSocket을 적용하는 방법과 주요 팁을 정리합니다.
WebSocket이란?
WebSocket은 클라이언트(앱)와 서버 간에 항상 연결이 유지되는 양방향 통신 채널을 제공합니다. HTTP와 달리, 매번 연결을 새로 만들 필요 없이 한 번 연결하면 서버와 클라이언트가 자유롭게 데이터를 주고받을 수 있습니다.
장점
- 실시간 데이터 전송
- 낮은 지연시간
- 서버와 클라이언트 모두에서 메시지 전송 가능
활용 예시
채팅 앱, 실시간 알림, 라이브 데이터 피드, IoT 데이터 스트림 등
Flutter에서 WebSocket 적용 방법
의존성 추가
pubspec.yaml에 아래와 같이 web_socket_channel 패키지를 추가합니다.
dependencies:
flutter:
sdk: flutter
web_socket_channel: ^3.0.0WebSocket 연결 및 메시지 송수신
1) 채널 생성 및 연결
import 'package:web_socket_channel/web_socket_channel.dart';
final channel = WebSocketChannel.connect(
Uri.parse('wss://echo.websocket.events'), // 테스트용 echo 서버
);2) 메시지 수신(StreamBuilder 활용)
StreamBuilder(
stream: channel.stream,
builder: (context, snapshot) {
return Text(snapshot.hasData ? '${snapshot.data}' : '');
},
)3) 메시지 전송
channel.sink.add('Hello, WebSocket!');4) 연결 종료
channel.sink.close();실전 예제: 채팅 UI
import 'package:flutter/material.dart';
import 'package:web_socket_channel/web_socket_channel.dart';
class WebSocketDemo extends StatefulWidget {
@override
_WebSocketDemoState createState() => _WebSocketDemoState();
}
class _WebSocketDemoState extends State {
final channel = WebSocketChannel.connect(
Uri.parse('wss://echo.websocket.events'),
);
final TextEditingController _controller = TextEditingController();
List messages = [];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('WebSocket Demo')),
body: Column(
children: [
Expanded(
child: StreamBuilder(
stream: channel.stream,
builder: (context, snapshot) {
if (snapshot.hasData) {
messages.add(snapshot.data.toString());
}
return ListView.builder(
itemCount: messages.length,
itemBuilder: (context, index) => ListTile(
title: Text(messages[index]),
),
);
},
),
),
Padding(
padding: EdgeInsets.all(8.0),
child: Row(
children: [
Expanded(
child: TextField(controller: _controller),
),
IconButton(
icon: Icon(Icons.send),
onPressed: () {
if (_controller.text.isNotEmpty) {
channel.sink.add(_controller.text);
_controller.clear();
}
},
),
],
),
),
],
),
);
}
@override
void dispose() {
channel.sink.close();
_controller.dispose();
super.dispose();
}
}실시간 앱 개발 시 유의사항 및 팁
핵심 고려사항
- 연결 상태 관리: 연결 끊김/재연결, 에러 처리 로직을 반드시 구현하세요.
- 보안: wss(SSL) 프로토콜 사용, 인증 토큰 등 추가 보안 적용 필요
- 메시지 구조: JSON 등 표준 포맷으로 메시지 구조화
- 성능 최적화: 불필요한 메시지 송수신 최소화, keep-alive 핑 등 적용
- 테스트 서버: 개발 단계에서는 echo 서버나 자체 테스트 서버 활용
고급 구현 팁
연결 상태 관리 예제:
class WebSocketService {
WebSocketChannel? _channel;
bool _isConnected = false;
Future connect() async {
try {
_channel = WebSocketChannel.connect(
Uri.parse('wss://your-websocket-server.com'),
);
_isConnected = true;
// 연결 상태 모니터링
_channel!.stream.listen(
(data) {
// 메시지 처리
},
onError: (error) {
_isConnected = false;
_reconnect();
},
onDone: () {
_isConnected = false;
_reconnect();
},
);
} catch (e) {
print('WebSocket 연결 실패: $e');
_reconnect();
}
}
void _reconnect() async {
await Future.delayed(Duration(seconds: 3));
if (!_isConnected) {
connect();
}
}
}마무리
Flutter에서 WebSocket을 활용하면 다양한 실시간 앱을 쉽고 효율적으로 개발할 수 있습니다. web_socket_channel 패키지와 StreamBuilder, TextField 등 Flutter의 강력한 위젯을 조합하면, 실시간 채팅, 알림, 데이터 스트림 등 다양한 서비스를 빠르게 구현할 수 있습니다.
WebSocket의 특성을 잘 이해하고 연결 관리, 보안, 성능 최적화 등을 고려하여 구현하면 사용자에게 뛰어난 실시간 경험을 제공할 수 있습니다.
Flutter에서 Firebase Cloud Messaging(FCM)을 활용한 푸시 알림 완벽 구현 가이드
모바일 앱에서 사용자 참여도를 높이는 가장 효과적인 방법 중 하나가 바로 푸시 알림입니다. Firebase Cloud Messaging(FCM)을 사용하면 Flutter 앱에서 Android, iOS, 웹 플랫폼 모두에 일관된 푸시 알림을
hoosfa.tistory.com
'IT기술 > 플러터 (flutter)' 카테고리의 다른 글
| Flutter 상태 관리 솔루션 완벽 비교: Provider vs Bloc vs Riverpod vs GetX (0) | 2025.07.06 |
|---|---|
| Flutter 앱 아키텍처 완벽 가이드: MVC, MVVM, Clean Architecture 비교 분석 (0) | 2025.07.05 |
| Flutter에서 Firebase Cloud Messaging(FCM)을 활용한 푸시 알림 완벽 구현 가이드 (2) | 2025.07.04 |
| [Flutter] 플러터와 피그마 연동하여 디자인을 코드로 변환하는 실전 가이드 (2) | 2025.04.29 |
| [Flutter] Android Studio에서 사용 가능한 플러터 단축키 모음 (2) | 2025.04.19 |