IT기술/플러터 (flutter)

Flutter에서 WebSocket을 활용한 실시간 앱 개발 완벽 가이드

후스파 2025. 7. 4. 23:33
반응형

실시간 데이터 전송과 양방향 통신은 현대 모바일 앱에서 필수적인 기능입니다. Flutter는 WebSocket을 활용해 채팅, 실시간 알림, 주식 시세, 스포츠 중계 등 다양한 실시간 서비스를 쉽게 구현할 수 있습니다.
아래에서 플러터에서 WebSocket을 적용하는 방법과 주요 팁을 정리합니다.

WebSocket이란?

WebSocket은 클라이언트(앱)와 서버 간에 항상 연결이 유지되는 양방향 통신 채널을 제공합니다. HTTP와 달리, 매번 연결을 새로 만들 필요 없이 한 번 연결하면 서버와 클라이언트가 자유롭게 데이터를 주고받을 수 있습니다.

장점

  • 실시간 데이터 전송
  • 낮은 지연시간
  • 서버와 클라이언트 모두에서 메시지 전송 가능

활용 예시

채팅 앱, 실시간 알림, 라이브 데이터 피드, IoT 데이터 스트림 등

Flutter에서 WebSocket 적용 방법

의존성 추가

pubspec.yaml에 아래와 같이 web_socket_channel 패키지를 추가합니다.

dependencies:
  flutter:
    sdk: flutter
  web_socket_channel: ^3.0.0

WebSocket 연결 및 메시지 송수신

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

 

반응형