어느 날 갑자기 쇼츠에 이런 영상이 떴다.
https://www.youtube.com/shorts/hFlx1tzeZJg
생각해보니까 나는 AWS ec2 같은 것만 써봤지, 집컴으로 서버를 만들어본적이 없다.
그래서 오늘 스프링부트, 스프링, AWS 등을 쓰지 않고 간단한 서버를 만드는 러다이트 운동을 해보기로 했다
1. 서버 띄우고 로컬에서 접속해보기
일단 코드는 지피티 형님한테 짜달라고 했다 (러다이트 운동이라며 지피티 쓰는게 어불성설 같긴 하지만..)
import com.sun.net.httpserver.HttpServer;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpExchange;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;
public class SimpleServer {
public static void main(String[] args) throws IOException {
HttpServer server = HttpServer.create(new InetSocketAddress("0.0.0.0", 8085), 0);
server.createContext("/hello", new HtmlHandler());
server.setExecutor(null);
server.start();
System.out.println("서버 실행 중: http://localhost:8085/hello");
}
static class HtmlHandler implements HttpHandler {
@Override
public void handle(HttpExchange exchange) throws IOException {
if (!"GET".equalsIgnoreCase(exchange.getRequestMethod())) {
exchange.sendResponseHeaders(405, -1); // Method Not Allowed
return;
}
// HTML 응답 문자열
String html = """
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<h1>Hello, World!</h1>
<p>This is a simple HTML response from pure Java.</p>
<img src="https://i.pinimg.com/736x/94/e4/0d/94e40d61756a1d0fe0aa36061dbd9089.jpg" />
</body>
</html>
""";
byte[] responseBytes = html.getBytes(StandardCharsets.UTF_8);
exchange.getResponseHeaders().set("Content-Type", "text/html; charset=utf-8");
exchange.sendResponseHeaders(200, responseBytes.length);
OutputStream os = exchange.getResponseBody();
os.write(responseBytes);
os.close();
}
}
}
이런 자바 파일을 만들어주고, 아래처럼 javac로 컴파일하고, java 명령어로 실행시켜주자.
javac SimpleServer.java # 컴파일
java SimpleServer # 실행

이렇게 실행하고, localhost:8085/hello에 접속해보면 잘들어가진다.
여기까지는 매우 쉽다.

2. 내부망에서 접속해보기
이제는 내부망(같은 와이파이에 연결된) 다른 기기(=내 폰)에서 이 서버에 요청을 보내보려고 한다.
나는 이걸할 때 스벅에 앉아있었기 때문에 두 단말이 같은 망에 있도록 하기 위해 맥북과 아이폰 둘다 스벅 와이파이에 연결했다.
일단 내부망에서 접근하려면 내부망 안에서의 내 맥북 아이피를 알아야한다.
MacOS 기준 아래 명령어로 알 수 있다.
ifconfig | grep inet
"inet" 뒤에 있는게 내 아이피이다.
당연히 맥북에선 잘 접속되고,

폰에서는 안됐는데, 그 이유는 방화벽 때문이다.
접속이 안된다면 아래 2가지를 시도하고 맥북을 재부팅 해보자.
java에 대한 방화벽 열어주기
SimpleServer를 실행할 때 사용한 java 실행 스크립트에 대한 방화벽을 열어주자
설정 -> 네트워크 -> 방화벽 -> 옵션 클릭 -> "+" 버튼 눌러 사용하고 있는 java의 실행 파일을 등록


중요한 점은, 맥에 java가 여러개 설치되어 있다면 SimpleServer.class 파일을 실행할 때 사용한 java를 등록해주어야 한다는 것이다.
어떤 java를 쓰고 있는지 모르겠다면, 아래 명령어를 통해서 java의 경로를 알아내자
which java
pf 방화벽 설정에서 포트 열기
위와 같이 방화벽을 열고 맥북을 재시동해도 여전히 안된다면 아래 방법을 시도해보자 (지피티 형님이 알려준 방법)

맥북과 폰을 같은 와이파이에 연결해서 접속해보면, 같은 망에 들어와 있는 상태이기 때문에 별다른 추가 처리 없이도 잘 접속되는 것을 볼 수 있다.

3. 외부망에서 접속해보기
이제는 외부망에서(=핸드폰의 데이터를 켜고) 서버에 접속해보자.
그렬려면 공인아이피를 알아야하고, 공유기에서 포트포워딩이 필요하다.
공인 아이피 알기
공인 아이피란 인터넷 사용자의 로컬 네트워크를 식별하기 위해서 ISP(인터넷 공급자)가 제공하는 아이피 주소이다.
공인 IP는 전세계에서 유일한 주소를 갖는다.
공인 아이피가 외부에 공개 되어 있기 때문에 인터넷에 연결된 다른 PC로부터의 접근이 가능하다. 따라서 공인 IP 주소를 사용하는 경우에는 방화벽 등의 보안 프로그램을 설치할 필요가 있다.
공인 아이피를 아는 방법은, 아래 사이트에 들어가보면 알 수 있다.
포트 포워딩 설정
포트 포워딩이란?
외부(인터넷)에서 공유기의 공인 IP + 포트 번호로 요청이 오면, 이를 내부망에 있는 특정 기기(IP) + 포트로 전달해주는 기능이다.
비유하자면 공유기는 경비실, 노트북 같은 기기는 아파트 세대가 된다.
택배 기사가 경비실에 "00동 00호로 전달해주세요"라고 택배를 전달하면 경비실에서는 해당 택배를 올바른 호수가 가져갈 수 있게 중개하는 역할을 할 수 있는 것이다.
내 로컬에서 돌아가고 있는 자바 프로그램이 8085 포트를 열고 있어도, 외부에서 8085 포트로 요청이 오면 이를 차단한다(보안 때문)
따라서 공유기에게 8085로 요청이 오면 어떤 로컬 아이피의 어떤 포트로 보내줘라고 미리 알려주는 것이 포트 포워딩 설정이라고 볼 수 있다.
공유기에는 하나의 공인 IP만 존재한다. 이 공인 IP로 들어온 요청을 내 컴퓨터(내부 IP)로 포트 번호 기반으로 전달하려면 공유기에 설정이 필요하다.
우리집은 sk 공유기를 쓰고 있어서 아래 주소로 접속하면 들어갈 수 있었다.

로그인과 포트포워딩을 아래 블로그 글을 참고했다.
MERCURY Corparation(머큐리 코퍼레이션) 포트 포워드 - 포트를 직접 열어서 좀 더 쾌적한 환경에서 게
온라인 게임을 하다 보면 가끔씩 'NAT 유형'이라는 것을 본 적이 있을 것이다. 이 NAT 유형이 폐쇄형 혹은 제한형이거나 혹은 중간형 일 때도 인터넷 연결이 원활하지 않다고 느껴지거나 게임을 하
illhyhlequalgaesaeki.tistory.com

그러면 이제 공인아이피를 통해서 서버에 접속할 수 있다.

이제 공인 아이피로 접속할 수 있으므로, 외부망에서도 접속 가능해진다.
즉, 다른 와이파이에 연결돼 있어도 접속 가능하다.
핸드폰 데이터를 켜서 접속해보자

4. 도메인 주소 연결
공인 아이피로 외부에서 연결할 수 있게 되었지만, 저런 의미없는 IP주소를 외워서 접속할 수 있는 사람은 별로 없을 것이다..
그래서 기억하기 쉬운 도메인 주소를 통해서 접속할 수 있도록 해보자.
일단 도메인으로 접속할 수 있는 설정을 하기 위해 가비아로 들어갔다.
나는 예전에 사놓았던 도메인이 있어서 바로 그 도메인 관리페이지로 들어갔다.
"DNS 정보" 클릭

"DNS 관리" 클릭

"레코드 수정" 클릭

아래와 같이 입력하고 저장

이렇게 되면
http://www.clean01.store:8085/hello로도 접속할 수 있게 된다.
가비아 DNS 레코드 설정을 하면 적용되는데 수분이 걸리는 것으로 알고 있다.
만약 기다렸다 접속해도 아직 접속이 되지 않는다면, 브라우저의 캐시를 한번 지워보자


외부망에서도 도메인네임으로 잘 접속되는 것을 확인했다!
이제 원래대로 방화벽도 잘 닫아주고, 공유기 포트 포워딩 설정도 다시 삭제해주어야겠다
보안상 안좋을 것 같아
'프로젝트 기록 > 기타' 카테고리의 다른 글
| [IntelliJ / local LLM] devoxx genie, ollama를 활용하여 intelliJ에 local LLM Assistant 만들기 (7) | 2025.05.09 |
|---|---|
| 포스트맨으로 Mock Server 만들기(API mocking) (0) | 2025.03.14 |
| Linux에서 AWS-CLI 설정하기 (1) | 2024.12.12 |
| Linux 크론(Cron)과 크론탭(Crontab) (0) | 2024.12.12 |
| [Redis AOF] AOF 설정한 Redis Docker Container 실행하기 (2) | 2024.12.10 |