Vert.x Web 서버를 만들 때 쓸 퀵스타트
프로젝트 디렉토리에 config.properties 파일이 존재합니다. 서버의 구동을 위한 정보들이 담기는 파일이므로, 필요에 따라 값들을 채우기 바랍니다. Maven 빌드 후 원격으로 서버를 열 경우 .jar 파일이 있는 디렉토리에 config.properties 파일을 붙여넣어 주시기 바랍니다.
// Port which server is run
serverPort=80
// AES Encryption Key
aesKey=key
// DataBase Table Name
dbTableName=tableName
// DataBase User Name
dbUserName=root
// DataBase Port : default is 3306
dbPort=3306
// DataBase Password
dbPassword=password
// SMTP Host
smtpHost=host
// SMTP id
smtpId=id
// SMTP password
smtpPw=password
// SMTP port
smtpPort=587
// Firebase server key
fbServerKey=key
별다른 조작 없이 바로 RESTful API 서버의 기능 구현에 집중하기 위해서 Route 어노테이션을 통해 구현하고자 하는 기능의 HTTP 메소드와 URI를 메타데이터로서 표현할 수 있습니다. 서버가 실행되면 Route 어노테이션이 선언된 클래스들을 자동으로 라우팅합니다.
@Route(uri = "/index", method = HttpMethod.GET)
public class Index implements Handler<RoutingContext> {
@Override
public void handle(RoutingContext ctx) {
...
ctx.response().setStatusCode(200).end();
ctx.response().close();
}
}
Route 어노테이션이 선언된 클래스에 API와 REST 어노테이션을 선언해두면 서버가 실행될 때마다 서버의 API 문서를 엑셀 파일로 자동 생성합니다.
@API(functionCategory = "인덱스", summary = "인덱스 라우터")
@REST(responseBody = "index.html", successCode = 200)
@Route(uri = "/index", method = HttpMethod.GET)
public class Index implements Handler<RoutingContext> {
@Override
public void handler(RoutingContext ctx) {
...
}
}
아래는 Quickstart를 실제로 적용하여 REST API 서버를 구축한 이후 자동으로 문서화된 엑셀 파일입니다.
utilities 패키지에 구현되어 있는 클래스들을 통해 쿼리문 조작, 로깅, 세션과 쿠키를 쉽게 다룰 수 있습니다.
Quickstart의 구성을 위해 사용된 라이브러리는 Maven으로 의존성 관리를 하기 때문에 기본 상태에선 라이브러리 추가에 시간 낭비를 하지 않아도 됩니다. 새로운 라이브러리(dependency)는 즉시 POM에 추가하여 프로젝트를 진행할 수 있습니다.
> main
> restful
> support.crypto
> support.routing
> support.utilities
> additional
> additional.networking_library
main 메소드가 위치하며, Vert.x 객체와 Verticle 배치 구문이 존재합니다.
main 메소드에서 분기, Router 객체에 Body, Cookie, Session, Static 핸들러, com.planb.restful 패키지 하위의 RESTful 핸들러 클래스들을 배치한 이후 80번 포트로 서버를 시작시킵니다.
RESTful 핸들러 클래스들을 위치시킬 패키지
퀵스타트의 코딩 스타일을 적용하여 /test URI에 매핑된 클래스입니다.
암호화 클래스들이 모인 패키지
AES256 암호화 클래스입니다. encrypt(String str)와 decrypt(String str) 메소드를 통해 암/복호화를 할 수 있습니다.
SHA256 암호화 클래스. encrypt(String str) 메소드로 단방향 암호화를 할 수 있습니다.
커스텀 어노테이션들이 선언되어 있으며, 리플렉션을 통해 라우팅과 문서화를 진행하는 패키지
RESTResource 타입의 List 객체를 생성자로 받아 엑셀 파일을 제작하는 클래스입니다.
REST 리소스가 정의되는 Value Object입니다. API 문서화를 위해 사용됩니다.
String uri, HttpMethod method 필드를 가진 커스텀 어노테이션. Route 어노테이션이 붙어있지 않은 클래스는 라우팅에서 제외됩니다.
클래스가 API로서 어떤 기능을 가지는지를 명시합니다.
@API(name = “로그아웃”, summary = “쿠키 또는 세션 삭제”)
리소스에 대한 추가 정보를 명시합니다.
@REST(requestBody = “id : String, password : String”, successCode = 201, failureCode = 204)
Router 객체와 가변 인자의 패키지 네임을 받아서 Route 어노테이션이 선언된 클래스들을 라우팅합니다. 추가적으로 API와 REST 어노테이션이 선언되어 있다면 엑셀 파일의 새로운 행에 기능을 문서화합니다.
유틸리티성 클래스들이 모인 패키지
config.properties에 접근하여 설정 정보를 읽습니다.
MySQL에 연결되어 쿼리를 수행합니다. MySQL은 기본적으로 8시간동안 요청이 없으면 커넥션을 해지합니다. 이를 해결하기 위해 static 블록에 6시간마다 'SELECT 1' 쿼리문을 수행하는 스레드를 등록해 두었습니다. 타임아웃에 관한 문제를 따로 해결했다면, 자원 낭비를 막기 위해 이 스레드를 지워주세요.
logs 디렉토리 하위에 서버의 작동 날짜로 이루어진 파일에 로그를 남깁니다.
세션과 쿠키를 다루기 위한 클래스입니다.
자바스크립트 AJAX 요청 시 CORS Header를 얹어주는 일을 하는 Handler입니다.
서버 구성 시 추가적으로 사용할만한 클래스들이 모인 패키지
Firebase 3rd-party 서버 구현을 돕기 위한 클래스입니다. Registration ID를 이용한 푸쉬 알림, topic 기반 푸쉬 알림이 구현되어 있습니다.
SMTP를 이용해 메일 전송을 하기 위한 클래스입니다.