AutobahnJava를 활용한 WebSocket과 WAMP 개발 가이드

AutobahnJava를 활용한 WebSocket과 WAMP 개발 가이드

AutobahnJava는 Java 8 및 Android 플랫폼을 위한 강력한 클라이언트 라이브러리로, WebSocket(RFC 6455)와 Web Application Messaging Protocol(WAMP)을 지원합니다. 이 라이브러리는 실시간 통신 애플리케이션을 쉽게 구축할 수 있도록 도와줍니다. 본 문서에서는 AutobahnJava의 핵심 기능과 실전 팁을 다루며, 환경 설정부터 고급 응용 프로그램 개발까지 안내합니다.

AutobahnJava 선택 이유

AutobahnJava는 다음과 같은 장점으로 인해 선택받고 있습니다:

  • 크로스 플랫폼 지원: Android와 Netty/Java8/JVM 환경 모두에서 사용 가능
  • 비동기 비차단: WebSocket 계층은 콜백 API를 사용하여 UI 스레드 차단 방지
  • 현대적 프로그래밍 모델: WAMP 계층은 Java 8 CompletableFuture와 관찰자 패턴을 통해 비동기 작업 처리
  • 완전한 프로토콜 지원: WebSocket과 WAMP 프로토콜 완전 지원, 다양한 인증 메커니즘 포함
  • 엔터프라이즈 기능: MIT 라이선스, 포괄적인 테스트 커버리지, Maven 저장소 지원

초기 설정: 환경 구성 및 기본 설정

AutobahnJava 설치

Maven을 통해 종속성을 추가할 수 있습니다:

<dependency>
    <groupId>io.crossbar.autobahn</groupId>
    <artifactId>autobahn-android</artifactId>
    <version>21.7.1</version>
</dependency>

Gradle 사용 시:

dependencies {
    implementation 'io.crossbar.autobahn:autobahn-android:21.7.1'
}

Android가 아닌 경우 autobahn-java artifactId를 사용합니다.

소스 코드로부터 빌드

소스 코드로부터 빌드하려면:

  1. 리포지토리를 클론합니다:
git clone https://gitcode.com/gh_mirrors/aut/autobahn-java
  1. Android 빌드: Android Studio를 사용하여 프로젝트를 가져오고 Build > Rebuild Project를 통해 AAR 파일 생성
  2. Netty 빌드:
make build_autobahn

빌드 결과물은 autobahn/build/libs/ 디렉토리에 위치합니다.

WebSocket 개발 실습

기본 연결 예제

다음은 Android 플랫폼에서 WebSocket 에코 클라이언트 구현입니다:

WebSocketConnection conn = new WebSocketConnection();
conn.connect("wss://echo.websocket.org", new WebSocketConnectionHandler() {
    @Override
    public void onConnect(ConnectionResponse response) {
        System.out.println("서버에 연결되었습니다.");
    }

    @Override
    public void onOpen() {
        conn.sendMessage("Autobahn Echo");
    }

    @Override
    public void onClose(int code, String reason) {
        System.out.println("연결이 종료되었습니다.");
    }

    @Override
    public void onMessage(String payload) {
        System.out.println("수신 메시지: " + payload);
        conn.sendMessage(payload);
    }
});

WebSocket 연결 처리 클래스는 autobahn/src/main/java/io/crossbar/autobahn/websocket/WebSocketConnection.java에 위치하며, 전체 연결 관리 기능을 제공합니다.

WAMP 프로토콜 핵심 기능

WAMP(Web Application Messaging Protocol)는 WebSocket 위에 구축된 고급 메시징 프로토콜로, 원격 프로시저 호출(RPC)과 게시/구독(PubSub) 두 가지 통신 모드를 제공합니다.

WAMP 세션 설정

public static void main(String[] args) {
    Session sess = new Session();
    sess.addOnJoinListener(AutobahnExample::demonstrateWAMPFeatures);
    
    Client client = new Client(sess, url, realm);
    CompletableFuture<ExitInfo> exitFuture = client.connect();
}

Session 클래스는 autobahn/src/main/java/io/crossbar/autobahn/wamp/Session.java에 구현되어 있으며, WAMP 통신의 핵심입니다.

게시/구독 모드

주제 구독
public void subscribeTopic(Session session, SessionDetails details) {
    CompletableFuture<Subscription> subFuture = session.subscribe("com.myapp.hello", this::onEvent);
    subFuture.whenComplete((subscription, throwable) -> {
        if (throwable == null) {
            System.out.println("주제 '" + subscription.topic + "'에 구독되었습니다.");
        } else {
            throwable.printStackTrace();
        }
    });
}

private void onEvent(List<Object> args) {
    System.out.println(String.format("이벤트 수신: %s", args.get(0)));
}
메시지 게시
public void publishMessage(Session session, SessionDetails details) {
    CompletableFuture<Publication> pubFuture = session.publish("com.myapp.hello", "안녕하세요!");
    pubFuture.thenAccept(publication -> System.out.println("메시지 게시 성공"));
    pubFuture.exceptionally(throwable -> {
        throwable.printStackTrace();
        return null;
    });
}

원격 프로시저 호출

프로시저 등록
public void registerProcedure(Session session, SessionDetails details) {
    CompletableFuture<Registration> regFuture = session.register("com.myapp.addTwo", this::addTwo);
    regFuture.thenAccept(registration ->
            System.out.println("프로시저 '" + registration.procedure + "' 등록 성공"));
}

private List<Object> addTwo(List<Integer> args, InvocationDetails details) {
    int result = args.get(0) + args.get(1);
    return Arrays.asList(result, details.session.getID(), "Java");
}
프로시저 호출
public void callProcedure(Session session, SessionDetails details) {
    CompletableFuture<CallResult> callFuture = session.call("com.myapp.addTwo", 10, 20);
    callFuture.thenAccept(callResult ->
            System.out.println(String.format("호출 결과: %s", callResult.results.get(0))));
}

고급 기능 및 최적화

인증 메커니즘

AutobahnJava는 여러 WAMP 인증 방법을 지원합니다:

티켓 인증
IAuthenticator auth = new TicketAuth(authid, ticket);
Client client = new Client(session, url, realm, auth);
챌린지-응답 인증
IAuthenticator auth = new ChallengeResponseAuth(authid, secret);
Client client = new Client(session, url, realm, auth);
Cryptosign 인증
IAuthenticator auth = new CryptosignAuth(authid, privkey, pubkey);
Client client = new Client(session, url, realm, auth);

인증 관련 클래스는 autobahn/src/main/java/io/crossbar/autobahn/wamp/auth/ 디렉토리에 위치합니다.

POJO 지원

AutobahnJava는 복잡한 데이터 교환을 단순화하기 위해 POJO(Plain Old Java Objects) 직렬화 및 역직렬화를 지원합니다:

// Person 객체를 반환하는 원격 프로시저 호출
CompletableFuture<Person> callFuture = mSession.call("com.example.get_person", 1);
callFuture.whenCompleteAsync((person, throwable) -> {
    if (throwable != null) {
        // 오류 처리
    } else {
        // Person 객체 처리
    }
}, mExecutor);

POJO를 반환하는 프로시저 등록:

private Person getPerson() {
    return new Person("john", "doe", "hr");
}

CompletableFuture<Registration> regFuture = session.register(
        "io.crossbar.example.get_person", this::getPerson);

오류 처리 최적화

  1. CompletableFuture의 예외 처리 메커니즘 사용:
pubFuture.exceptionally(throwable -> {
    // 예외 처리
    log.error("게시 실패", throwable);
    return null;
});
  1. 전역 오류 리스너 구현:
session.addOnErrorListener(error -> {
    // 통합 오류 처리
    log.error("WAMP 세션 오류: {}", error);
});
  1. 연결 중단 시 재연결 처리:
client.connect().whenComplete((exitInfo, throwable) -> {
if (throwable != null) {
// 연결 실패 시 재연결 로직 구현
scheduleReconnect();
}
});

태그: AutobahnJava websocket WAMP java Android

6월 13일 20:33에 게시됨