자바 기초 다지기를 마무리 하는 차원에서 자바의 기본 HttpServer 를 이용해서 간단하게 서버를 만들어보았다.
이번에 새롭게 익히게 된 Stream API도 살짝 찍먹해 보았다.
요걸 써서 만들었는데 나름 간단하게 서버를 만들 수 있게 해준다.
아래 처럼 간단히 서버 클래스를 만들 수 있다.
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
끝
'프로그래밍 > Java' 카테고리의 다른 글
JVM과 JRE와 JDK를 알아보았다. (0) | 2021.04.20 |
---|---|
Optional 에 대해서 알아보았다. (0) | 2021.04.15 |
댓글