게임 개발의 피할 수 없는 운명은 높은 렌더링을 처리하기 위해 다른 개발에 비해서 높은 그래픽 하드웨어 성능이 필요하다는 점이었다. 그래서 항상 외부에서는 게이밍 노트북와 노트북 쿨러와 함께 묵직한 배터리를 함께 들고 다녀야했다.
그러다가 당장 이번 주에 오프라인 게임잼에 참가하게 되었는데 게이밍 노트북을 구할 수가 없었다. 게이밍 노트북을 빌려주는 업체에 연락해볼까하다가 3일 사용에 6~7만원을 지불하는 것이 썩 마음에 내키지 않아 고민하다가 오래전부터 도전해보고 싶었던 집에 있는 로컬 컴퓨터와 나의 mac노트북 간의 원격접속을 해보기로 하였다.
다행히도, Mac에서 Window 환경에 원격 접속을 지원해 주는 프로그램이 이미 존재했다. 과거에는 "Remote Desktop"이라는 이름이었지만, 현재는 Windows App
라는 이름으로 바뀐듯 했다.
먼저, Windows App
으로 LAN 환경에서 테스트를 해보았는데 window로 돌아가는 내 데스크탑의 private IP만 설정에 입력하니 아주 쉽게 Mac -> Window 원격접속이 가능했다.
하지만, 게임잼에 참여하는 환경에서는 당연히 나의 집에 존재하는 라우터의 범위밖에서 로컬로 접근하기 때문에 설정에 publicIP와 게이트웨이 주소를 입력하고 시도해보았다. 이렇게 해보니 접속이 계속 실패하여서 원인 요소를 찾다보다가 Port Forwarding을 처리해주어야 한다는 사실을 알게 되었다.
Port Forwarding은 외부 네트워크에서 특정 포트를 통해 들어오는 요청을 내부 네트워크의 지정된 장치나 서비스로 전달하는 네트워크 설정이다. cmd에 ipconfig
를 치면 다양한 네트워크 속성을 확인할 수 있는데 여기서 게이트웨이의 주소를 가지고 이를 인터넷 검색창에 치게 되면 Port Forwarding 할 수 있는 설정창이 나오게 된다. 3389 포트가 Remote Desktop Protocol(RDP)를 관할하는 포트인데 정확히 이 포트로 Port Forwarding 해주면 된다.
1번에서 끝났으면 정말 편리하게 원격접속을 했었겠지만 한가지 간과한 사실이 있었다. 바로 publicIP가 때에 따라서 변한다는 것이다. 변동되는 publicIP 주소를 특정 도메인 이름에 연결해 고정된 주소처럼 사용할 수 있게 해주는 DDNS라는 방법이 있는데, 내가 사용하는 SK broadband 라우터에서는 이를 무료로 도와주는 no-IP라는 사이트의 지원을 해주지 않아서 다른 방법을 생각해야 했다.
사실 자신이 사용하는 환경의 publicIP는 https://www.whatismyip.com/ 와 같은 사이트로 매우 쉽게 확인할 수 있다. https://api.ipify.org 같은 주소에서는 아예 REST API형태로 이를 지원해주고 있었고, 여기서 publicIP를 주기적으로 확인하고 있다가 변경된 시점이 있으면 이를 이메일로 알려주는 python script를 작성해 보았다.
import requests
from datetime import datetime
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# Email 설정
EMAIL_ADDRESS = "---@gmail.com" # 보내는 이메일
EMAIL_PASSWORD = "---" # Gmail Auth 비번
TO_EMAIL = "---@gmail.com" # 받을 이메일
SMTP_SERVER = "smtp.gmail.com" # Gmail SMTP server
SMTP_PORT = 587 # SMTP Port
# IP 주소 저장하는 text 파일
IP_FILE = "last_ip.txt"
def get_public_ip():
"""public IP fetch"""
try:
response = requests.get("https://api.ipify.org?format=json")
response.raise_for_status()
return response.json()["ip"]
except requests.RequestException as e:
print(f"Error fetching public IP: {e}")
return None
def send_email_notification(old_ip, new_ip):
"""public IP 변경시 email 전송함수"""
try:
# Email 생성
msg = MIMEMultipart()
msg["From"] = EMAIL_ADDRESS
msg["To"] = TO_EMAIL
msg["Subject"] = "Public IP Address Changed"
body = (
f"Your public IP has changed:\n\n"
f"Old IP: {old_ip}\n"
f"New IP: {new_ip}\n"
f"Timestamp: {datetime.now()}"
)
msg.attach(MIMEText(body, "plain"))
# SMTP server에 연결 -> email 전송
with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as server:
server.starttls()
server.login(EMAIL_ADDRESS, EMAIL_PASSWORD)
server.send_message(msg)
print("Notification sent.")
except Exception as e:
print(f"Error sending email: {e}")
def get_last_ip():
"""가장 최근 public IP fetch"""
try:
with open(IP_FILE, "r") as file:
return file.read().strip()
except FileNotFoundError:
return None
def save_ip(new_ip):
"""IP text 파일에 저장"""
with open(IP_FILE, "w") as file:
file.write(new_ip)
def main():
current_ip = get_public_ip()
if not current_ip:
return
last_ip = get_last_ip()
if current_ip != last_ip:
print(f"Public IP changed from {last_ip} to {current_ip}")
send_email_notification(last_ip, current_ip)
save_ip(current_ip)
else:
print("No change in public IP.")
if __name__ == "__main__":
main()
물론, 작성한 python script를 그냥 IDE에서 돌려 버릴 수도 있겠지만 IDE를 실수로 꺼버릴 수도 있고 작업 표시줄에 굳이 이 작업이 보여질 필요가 없겠다라는 생각에 AWS Lambda와 같이 자동으로 script를 실행해주는 프로그램의 사용을 생각해보고 있었다. 그러던 와중, window에 이와 같은 작업을 지원해주는 built-in 프로그램인 Task Scheduler
이 있다는 사실을 알게 되었다.
Task Scheduler
에 Task를 추가하기 위해서는 이 Task가 언제 trigger 될 것인지, 어떤 작업을 수행할 것인지, 얼마나 자주 수행할 것인지에 대한 설정을 입력하여야 한다. 여담이지만 어떤 작업을 수행할 것인지(Task의 동작 부분)에 대한 설정에서 작동하지 않는 python 경로를 기입해서 많은 시간을 허비했다.(cmd에 where python
을 입력하면 python설치 경로가 뜨게 되는데, 직접 그 경로로 들어가서 잘 작동되는지 수동으로 다시 한번 확인해보자!)