본문 바로가기
프로그래밍/Java

스프링 없이 HTTP서버를 만들어 보았다.

by yonmoyonmo 2021. 4. 23.

자바 기초 다지기를 마무리 하는 차원에서 자바의 기본 HttpServer 를 이용해서 간단하게 서버를 만들어보았다.
이번에 새롭게 익히게 된 Stream API도 살짝 찍먹해 보았다.

docs.oracle.com/javase/8/docs/jre/api/net/httpserver/spec/com/sun/net/httpserver/package-summary.html

 

com.sun.net.httpserver (Java HTTP Server )

Interface Summary  Interface Description HttpHandler A handler which is invoked to process HTTP exchanges. Class Summary  Class Description Authenticator Authenticator represents an implementation of an HTTP authentication mechanism. Authenticator.Failur

docs.oracle.com

요걸 써서 만들었는데 나름 간단하게 서버를 만들 수 있게 해준다.

아래 처럼 간단히 서버 클래스를 만들 수 있다.
createContext로 라우팅 -> HttpHandler를 구현하여 요청 처리 + 응답
하는 패턴으로 만들 수 있다.

public class JavaJjangServer {
    private Integer port = 8000;
    private HttpServer server = null;
    public JavaJjangServer() throws IOException {
        System.out.println("Java JJang Server On! port : 8000");
        server = HttpServer.create(new InetSocketAddress(port), 0);
        server.createContext("/javajjang", new JavaJjangPostHandler());
        server.setExecutor(null);
        server.start();
        }
    }

아래 코드는 /javajjang 으로 오는 요청을 처리하는 handler 이다. HttpHandler를 implements하여 쓰면 된다.
RandomMaker에서 얻은 결과를 JSON으로 응답해준다.

public class JavaJjangPostHandler implements HttpHandler {

    @Override
    public void handle(HttpExchange exchange) throws IOException {
        System.out.println("JavaJJANG Post Handler-------");

        InputStreamReader isr = new InputStreamReader(exchange.getRequestBody(), "utf-8");
        BufferedReader br = new BufferedReader(isr);

        String query = br.readLine();
        System.out.println("쿼리 : \"" + query + "\"");

        Integer seed = getSeedFromQuery(query);
        System.out.println(seed);

        RandomMaker randomMaker = new RandomMaker(seed);
        List<Integer> result = randomMaker.getRandomThree();

        System.out.println(result.toString());

        String response = "{\"result\":\"" + result.toString() + "\"}";
        System.out.println(response);
        exchange.getResponseHeaders().set("Content-Type", "appication/json");
        exchange.sendResponseHeaders(200, response.length());
        OutputStream os = exchange.getResponseBody();
        os.write(response.getBytes());
        os.close();

    }

    private Integer getSeedFromQuery(String query) throws UnsupportedEncodingException {
        Map<String, Object> parameters = new HashMap<>();
        System.out.println("query : " + query);
        Integer result = 0;

        if (query != null) {
            String pairs[] = query.split("[&]");
            for (String pair : pairs) {
                String param[] = pair.split("[=]");
                System.out.println("0 : " + param[0]);
                System.out.println("1 : " + param[1]);
                result = Integer.parseInt(param[1]);
            }
            return result;
        }else return 0;
    }
}

자바 Stream API를 연습하기 위해 만든 클래스이다. 정수 하나를 받아서 0부터 입력받은 정수 사이의 자연수 중 랜덤으로 3개를 골라서 리턴하는 메소드를 갖고있다. 정수 입력은 해당 클래스를 생성할 때 넣거나 setter로 넣거나 하면 된다.

public class RandomMaker {
    private Integer seed;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        RandomMaker that = (RandomMaker) o;
        return seed.equals(that.seed);
    }

    @Override
    public int hashCode() {
        return Objects.hash(seed);
    }

    public Integer getSeed() {
        return seed;
    }

    public void setSeed(Integer seed) {
        this.seed = seed;
    }

    public RandomMaker(Integer seed) {
        this.seed = seed;
    }
    public RandomMaker() {this.seed = 0;}

    //억지 스트림과 람다를 써 봄
    public List<Integer> getRandomThree(){
        System.out.println("random maker on!");
        List<Integer> result = Stream.iterate(new Random().nextInt(this.seed), x ->{
            return new Random().nextInt(this.seed);
        }).limit(3).collect(Collectors.toList());
        return  result;
    }
}

메인 함수는 매우 간단하다.

public class Main {

    public static void main(String[] args) throws IOException {
        JavaJjangServer server = new JavaJjangServer();
    }
}

요렇게 요청 하면 저렇게 응답이 온다.
request body를 얻기 위해 HttpExchange라는 객체를 이용하는데 나름 편리하게 되어 있다.  
InputStreamReader와 BurfferedReader를 쓰면 문자열로 만들 수 있어서 만든 문자열 가지고 어떻게 어떻게 하면 된다.

느낀점 :

스프링, 다시 보니 선녀 같다.

 

원모 사이버 깃허브 리포지토리 : github.com/yonmoyonmo/java-remind

 

yonmoyonmo/java-remind

자바 기초를 리마인드 해 보았다. Contribute to yonmoyonmo/java-remind development by creating an account on GitHub.

github.com

 


'프로그래밍 > Java' 카테고리의 다른 글

JVM과 JRE와 JDK를 알아보았다.  (0) 2021.04.20
Optional 에 대해서 알아보았다.  (0) 2021.04.15

댓글