자바로 간단한 API 웹 프로그래밍을 해야 해서 알아보다 보니


http://sparkjava.com/ 이 경량화 이면서 자바 초보인 내가 알아보기 쉽게 되어 있어서 선택했는데


문제는 배포방법을 모르겠어서 삽질이 시작되었다.


이클립스에서의 실행은 아주 쉽다.


이클립스용 Gradle를 설치해주고 (마켓에서 설치) 새로운 GradleProjet를 생성한다.




build.gradle에 sparkjava dependencies 를 넣어준다.


http://mvnrepository.com/artifact/com.sparkjava/spark-core/2.0.0


그리고 최종적으로는 war로 배포를 할것이니 war플러그인도 설정






테스트용 클래스를 하나 생성하고 코드를 sparkjava 홈페이지에서 그대로 가져온다음 실행을 누른다.

아..그전에 프로젝트 팝업메뉴Gradle -> Refresh All , Gradle -> Enable Dependency Managment





http://localhost:4567/hello 에 접속하면 끝!


개발은 이상태로 계속 하면 된다.


문제는 이렇게 개발한것을 어떻게 배포를 하느냐 인데

자바 초보인데다가 웹프로젝트도 처음이고 war파일을 톰캣이나 jetty에 wabapps경로어 넣으면 된다 정도의

아주 기초적인 지식만 가지고 하루종일 구글링을 해보고 밤잠 설쳐 가면서 삽질을 했는데 도데체 모르겠는것이다.


결국은 maven까지 깔아서 해봤는데도 잘 안되었다.

( 이 과정에서  gradle이 얼마나 쉬운지 체험했다.)


안되면 처음부터 천천히 보자..공식문서에는 다음과 같이 나온다.


Other webserver

To run Spark on a web server instead of standalone first of all an implementation of the interface spark.servlet.SparkApplication is needed. In the init() method the routes should be initialized. In your web.xml the following filter needs to be configured:

어쩌라고?



자세히보니 init()을 하란다....


어쩌라고?????



다시 구글링..


범인은 가까운데 있다지..ㅡ.ㅡ;;


Git의 Test코드에서 sample을 찾아 볼 수있었다.


다른 웹서버에서 사용하기 위한 web.xml 설정과

https://github.com/perwendel/spark/blob/master/src/test/webapp/WEB-INF/web.xml


이를 사용하기 위한 샘플 코드

https://github.com/perwendel/spark/blob/master/src/test/java/spark/servlet/MyApp.java



이대로 지금 작업중인 HelloSpark에 추가를 한다.


src/main/webapp/WEB-INF/web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Archetype Created Web Application</display-name>
    <filter>
        <filter-name>SparkFilter</filter-name>
        <filter-class>spark.servlet.SparkFilter</filter-class>
        <init-param>
            <param-name>applicationClass</param-name>
            <param-value>org.gradle.Spark</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>SparkFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

자바 코드도 수정을 한다.


아까 테스트한 Hello World에 github에서 가져온 소스를 덧붙인다.

package org.gradle;
import static spark.Spark.*;
import spark.servlet.SparkApplication;

public class Spark implements SparkApplication{

    public static void main(String[] args) {

        staticFileLocation("/public"); // Static files
        get("/hello", (req, res) -> "Hello World");
    }

    @Override
    public void init() {
        // TODO Auto-generated method stub
        before("/protected/*", (request, response) -> {
            halt(401, "Go Away!");
        });
        get("/hi", (request, response) -> {
            return "Hello World!";
        });
        get("/:param", (request, response) -> {
            return "echo: " + request.params(":param");
        });
        get("/", (request, response) -> {
            return "Hello Root!";
        });
        post("/poster", (request, response) -> {
            String body = request.body();
            response.status(201); // created
                return "Body was: " + body;
            });
        after("/hi", (request, response) -> {
            response.header("after", "foobar");
        });
        try {
            Thread.sleep(500);
        } catch (Exception e) {
        }
    }
}

이클립스 메뉴에서 Window->Show View -> Other 에서 Gradle Tasks를 추가 하고

작업중인 프로젝트를 선택한 후 build를 더블클릭하면 build\libs 경로에 HelloSpark-1.0.war 파일이 생성되며

이것을 톰캣이나 다른 jetty 서버에 배포를 하면 된다.


ps.

staticFileLocation("/public"); // Static files

이함수는 임베디드 jetty에서는 아무데서나 써도 되지만 war로 배포 하겠다고 한다면

꼭 main에서 실행해야 한다. 이것 때문에 하루 삽질!