[비주얼 스튜디오 코드] WSL2에서 VcXsrv X Server 사용하기(Java 팝업 다이얼로그 띄우기)
생활코딩의 Java 01 강좌를 듣다가,
이클립스에서 .swing이 포함된 자바 코드를 실행했을 때
저런 팝업 다이얼로그 GUI가 자동으로 뜨는 부분을 발견할 수 있었는데요.
우선 강좌에서 사용된 JOptionPane 이란 클래스는 엄청난 양의 정적 메소드들이 있고,
이 메소드를 이용하여 메시지 박스를 띄우게 됩니다. 이 메소드에는 4가지 종류가 있습니다.
showConfirmDialog
showMessageDialog
showInputDialog
showOptionDialog
// JOtionPan 클래스에 대한 더욱 자세한 내용은
// https://blog.naver.com/khk6435/50126162914 블로그를 참고해주세요
강좌에서 사용된 JOptionPane.showInputDialog("msg") 는 한 줄을 입력받는 텍스트 필드가 있고,
사용자로부터 입력을 받는 다이얼로그를 생성해 보여주는 메소드입니다.
이 코드가 포함된 소스코드를 컴파일 후 실행하면 아래와 같은 GUI가 출력되어야 합니다.
문제는 저는 이클립스가 아닌 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)