본문 바로가기

STUDY LOG/앱 | 툴 | 플러그인

[비주얼 스튜디오 코드] WSL2에서 VcXsrv X Server 사용하기(Java 팝업 다이얼로그 띄우기)

728x90
반응형

생활코딩의 Java 01 강좌를 듣다가,

이클립스에서 .swing이 포함된 자바 코드를 실행했을 때

저런 팝업 다이얼로그 GUI가 자동으로 뜨는 부분을 발견할 수 있었는데요. 

 

우선 강좌에서 사용된 JOptionPane 이란 클래스는 엄청난 양의 정적 메소드들이 있고,

이 메소드를 이용하여 메시지 박스를 띄우게 됩니다. 이 메소드에는 4가지 종류가 있습니다.

 


	showConfirmDialog
        showMessageDialog
        showInputDialog
        showOptionDialog

        // JOtionPan 클래스에 대한 더욱 자세한 내용은
        // https://blog.naver.com/khk6435/50126162914 블로그를 참고해주세요

 

강좌에서 사용된 JOptionPane.showInputDialog("msg") 는 한 줄을 입력받는 텍스트 필드가 있고,

사용자로부터 입력을 받는 다이얼로그를 생성해 보여주는 메소드입니다.

이 코드가 포함된 소스코드를 컴파일 후 실행하면 아래와 같은 GUI가 출력되어야 합니다.

 

https://blog.naver.com/khk6435/50126162914

 

문제는 저는 이클립스가 아닌 WSL2 환경에서 VSC를 사용하고 있는데,

소스코드를 컴파일 하고 실행해도, 자동으로 저런 GUI가 팝업되지 않고 계속 소스코드만 출력되더라고요.

 

 

 

 

 

X 서버란?


 

 

한 시간 동안 구글링을 해서 해결방법을 찾아냈습니다😂

 

WSL(Windows Subsystem for Linux) 내에서 컴파일된 소스의 그래픽 출력을 하려면 X 서버가 필요합니다.

리눅스(+유닉스)의 GUI는 대개가 X 윈도우 시스템이기 때문에,

윈도우에서 WSL을 사용하기 위해 X 서버를 설치해야 된다는 사실을 알게 되었습니다.

 

X 서버는 X 클라이언트의 요청에 대한 결과를 디스플레이 장치에 줄력하거나,

키보드, 마우스, 입력창, 터치스크린과 같은 사용자 입력을 X 클라이언트에 전달하는 역할을 합니다. 

클라이언트가 무언가 그래픽적인 요구를 X 서버로 전달하면, X 서버가 요청을 처리하여 클라이언트로 반환해줍니다.

 

다시 말해, VSC와 같은 IDE는 X 클라이언트가 됩니다.

여기서 작성한 Java 코드는 GUI 출력이 포함된 명령(ex. JOptionPan.showInputDialog)을 포함하고 있습니다.

 

 

 

WSL2에 VcXsrv X (X 서버) 설치하기


우선 아래 소스포지 링크에서 VcXsrv Windows X Server를 다운받아 설치해줍니다.

 

VcXsrv Windows X Server

Download VcXsrv Windows X Server for free. Windows X-server based on the xorg git sources (like xming or cygwin's xwin), but compiled with Visual C++ 2012 Express Edition. Source code can also be compiled with VS2008, VS2008 Express Edition and VS2010 Expr

sourceforge.net

 

설치 후 xlaunch를 검색하여 실행해줍니다.

 

xlaunch를 실행하면 GUI를 어떤 창으로 띄울 것인지 선택하라고 합니다.

Multiple Windows를 선택하고 다음(N)> 버튼을 눌러줍니다.

 

 

SSH를 사용하는 원격 프로그램을 시작할 것인지, 클라이언트 없이 시작할 것인지 선택하라고 합니다.

Start no client를 선택하고 다음(N)> 버튼을 눌러줍니다.

 

Disable access control을 체크해줍니다 (중요)

이 부분을 체크하지 않고 X 서버를 연결하면, 실행 할 때마다 다음과 같은 오류를 보게 됩니다.

제가 겪은 오류도 이 부분인데요, access control이 able 되어 있으면 호출 권한이 없어지게 됩니다.

 

Authorization required, but no authorization protocol specified
Error: Can't open display: localhost:0.0

 

만약, 프로그램 실행 시 위와 같은 오류를 보게 된다면

XLaunch를 재실행해서 Disable access control 을 체크해줍니다.

 

 

마지막으로 WSL 셸을 열고(ex. Ubuntu) 다음과 같이 입력합니다 (DISPLAY 환경 변수 설정)

export DISPLAY=내 로컬 IP 주소:0.0 이렇게 설정해주면 됩니다.

WSL 사용중인 경우 WSL2 IPv4 주소를 입력해주어야 합니다.

export DISPLAY=localhost:0.0

// localhost = 내 IP 주소

 

.bashrc 파일 또는 zsh 쉘을 쓰는 경우 .zshrc 에도 export 값을 넣어주라는 답변이 있었지만,

저는 .zshrc 파일은 따로 수정하지 않고, 쉘에서 바로 export DISPLAY로 환경변수를 설정해주었습니다.

 

echo $DISPLAY

// localhost:0.0 가 출력되면 잘 설정된 것입니다.

 

여기까지 진행하고 나면, 이후로는 어떤 X 응용프로그램이든 GUI 앱을 실행하게 되면 

별도로 분리된 윈도우에 호출한 프로그램이나 GUI 앱이 실행되게 됩니다.

 

 

 

 

Swing GUI 가 포함된 .Java 파일 출력


 

이제 X 서버에 "JOptionPane.showInputDialog()" 에 포함된 내용을

X 서버로 "가로세로 크기는 이 만큼, 배경과 색은 이렇게, 버튼은 이렇게" 하고

JOpntionPane에 저장되어 있는 X 프로토콜을 날립니다.

 

 

위의 X 서버 설치 및 XLaunch 옵션 설정, DISPLAY 환경변수까지 설정을 마쳤다면

VSC에서 따로 설정해야 하는 부분은 없고, 평소 하던대로 .java 파일을 컴파일 하고 실행하면 됩니다.

이제 X 서버는 그래픽 카드와 모니터로 하여금 호출된 그래픽이 표시되게 합니다.

 

Input Diagloue 창이 잘 출력됩니다.
위 코드는 가상의 OkJavaHome 이란 공간의 사물인터넷(ioT)을 구현해 본 코드로, 방 번호를 입력하면

번호에 해당하는 방의 에어컨을 켜거나 불을 끄거나 하는 메소드를 실행합니다.

 

Aircon, Security, Lighting 메소드를 실행할 인풋 값으로 입력 필드에 "1004" 를 입력합니다.

 

실행내역

1. 1004번 방의 에어컨을 켜고 온도를 20.5도로 맞춥니다 (Aircon on)

2. 1004번 방의 보안을 해제합니다 (Security off)

3. 1004번 방의 Hall 및 Floor 램프를 켭니다(Lighting on)

 

728x90