최근에 나만의 간단한 HTTP 서버를 만들어보았습니다. 이 프로젝트의 이름은 "CrazyHttpServer"입니다. CrazyHttpServer는 Java로 작성되었으며, 간단한 웹 서버의 기능을 수행합니다. 여기에는 HTTP 프로토콜을 처리하는 데 필요한 핵심적인 기능이 구현되어 있습니다.
CrazyHttpServer는 Java의 NIO(Non-blocking I/O)를 활용하여 구현되었습니다. NIO를 사용함으로써 블로킹되지 않는 다중 클라이언트 연결을 처리할 수 있습니다. 이 서버는 간단한 로고를 출력하고 HTTP 요청을 받아들이며, 적절한 핸들러를 통해 요청을 처리합니다.
// CrazyHttpServer.java
public class CrazyHttpServer {
public static void main(String[] args) {
HttpServer httpServer = new HttpServer();
httpServer.start();
printLog();
}
private static void printLog() {
System.out.println(logo);
}
}
CrazyHttpServer의 진입점 클래스는 CrazyHttpServer입니다. 이 클래스에서는 HttpServer를 생성하고 시작한 후 간단한 로고를 출력합니다.
CrazyHttpServer의 핵심 기능을 담당하는 클래스는 HttpServer입니다. 이 클래스는 Selector를 사용하여 다중 클라이언트 연결을 관리하며, 각 클라이언트 요청에 대한 핸들러를 호출합니다.
HttpServer 클래스
// HttpServer.java
public class HttpServer extends Thread {
// 중략...
@Override
public void run() {
while (true) {
try {
int select = selector.select(100);
if (select < 0) {
System.out.println("no select. continue");
continue;
}
Set<SelectionKey> selectionKeys = selector.selectedKeys();
for (SelectionKey selectionKey : selectionKeys) {
dispatch(selectionKey);
addTimeoutMap(selectionKey);
}
selectionKeys.clear();
} catch (IOException e) {
e.printStackTrace();
HttpUtils.closeSocket((SocketChannel) key.channel());
} catch (CancelledKeyException e) {
e.printStackTrace();
}
}
}
// 중략...
}
HttpServer 클래스는 Thread를 상속하여 멀티스레딩으로 동작하며, Selector를 사용하여 비동기적으로 다중 클라이언트 요청을 처리합니다.
핸들러와 다른 클래스들
서버의 핵심인 HttpServer 외에도 핸들러, 소켓 핸들러, 모니터링 스레드, 설정 클래스 등 다양한 클래스들이 CrazyHttpServer에 구현되어 있습니다. 이들 클래스는 서버의 동작을 지원하고 다양한 기능을 담당합니다.
마무리
CrazyHttpServer 프로젝트를 통해 간단한 HTTP 서버를 어떻게 구현할 수 있는지 살펴보았습니다. 이 서버는 학습 및 개인 프로젝트 용도로 적합하며, 좀 더 복잡하고 안전한 서버를 구축하려면 추가적인 기능과 보안 강화가 필요할 것입니다.
이 프로젝트는 계속해서 발전시켜 나가고, 필요한 기능을 추가하며 개선해 나갈 계획입니다. 더 많은 기능과 안정성을 갖춘 서버를 만들기 위해 노력할 것이며, 다양한 기술을 접목하여 CrazyHttpServer를 더욱 강력하게 만들어 나가겠습니다.
Happy coding! 🚀
상기 글은 내 프로젝트 클래스들을 일일히 챗GPT에 붙여 넣고
마지막에 블로그 글로 정리해달라고 한 글이다.
나름 꽤 괜찮게 쓴 것 같은데
https://github.com/Crazykwak/CrzayHttpServer
깃헙 링크는 상기와 같다. 수정점이 아직 많은데, 뭐 시간 남으면 천천히 리팩토링하고 보안점 추가하면 되겠다.
참고로 챗 지피티에게 물어본 보완점은 ㅋㅋㅋ