이전화를 바탕으로 API 서버에 대한 개념과 문서를 작성하는 방법을 진행해 봤습니다. 이제 본격적인 API서버를 구현해야 합니다. API 서버를 구현하기 위해서는 여러 언어중 자신이 개발하기 편한 언어로 개발하면 됩니다. 언어 선택의 기준은 본인이 가장 익숙함,숙련도,유지보수 및 협업의 용이성 그리고 속도가 됩니다. 아래 표를 참고 하셔서 본인의 상황에 적합한 언어를 선택하면 됩니다.
출처 : http://www.techempower.com/benchmarks/ 저는 제가 제가 자주 사용하는 스프링 프레임워크(Spring Framework) 3를 선택해서 API 개발을 진행해보겠습니다. 일단 라이브러리를 선택해야하겠지요. 언어 선택과 마찬가지로 라이브러리 선택의 기준 역시 본인이 가장 익숙함,숙련도,유지보수 및 협업의 용이성 그리고 속도가 됩니다. 일반적으로 많이 개발자분들이 많이 사용하는 라이브러리는 Jackson이나 GSON을 많이 사용합니다. 아래의 막대 그래프를 보면 GSON보다 Jackson이 좋은 퍼포먼스를 보이고 있습니다. 이런 이유로 저는 Jackson을 선택하여 진행하겠습니다. 이제 pom.xml에 Jackson을 추가합니다. |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<!-- jackson -->
<
dependency>
<
groupId>com.fasterxml.jackson.core</
groupId>
<
artifactId>jackson-core</
artifactId>
<
version>2.2.3</
version>
</
dependency>
<
dependency>
<
groupId>com.fasterxml.jackson.core</
groupId>
<
artifactId>jackson-databind</
artifactId>
<
version>2.2.3</
version>
</
dependency>
<
dependency>
<
groupId>com.fasterxml.jackson.core</
groupId>
<
artifactId>jackson-annotations</
artifactId>
<
version>2.2.3</
version>
</
dependency>
<
dependency>
<
groupId>org.codehaus.jackson</
groupId>
<
artifactId>jackson-mapper-asl</
artifactId>
<
version>1.7.7</
version>
</
dependency>
|
cs |
@ResponeBody Annotation을 사용하기 위해 아래 xml을 하나 따로 만들어 servlet-annotaion.xml에 코드를 설정합니다.
servlet-annotaion.xml
1
2
3
4
5
|
<
mvc:annotation-driven>
<
mvc:message-converters>
<
bean
class=
"org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"
/>
</
mvc:message-converters>
</
mvc:annotation-driven>
|
cs |
이제 컨트롤러에 Json으로 리턴하기 받기 위해
@RequestMapping을 이용하여 주소를 설정하고
@ResonseBody를 이용하여 JSON으로 리턴을 해주게 됩니다.
ApiNoticeController.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@RequestMapping(value
=
"/v1/api/notice/index")
public @ResponseBody Map
<
String,Object
> apiNoticeIndex () {
Map
<
String,Object
> resultMap
=
new HashMap
<
String,Object
>();
try {
resultMap.put(Constants.RESPONSE_RESULT, Constants.RESPONSE_SUCCESS);
resultMap.put(Constants.RESPONSE_CODE, Constants.RESPONSE_CODE_SUCCESS);
resultMap.put(Constants.RESPONSE_MSG, Constants.RESPONSE_MSG_SUCCESS);
resultMap.put(Constants.RESPONSE_DATA, mNoticeService.getNoticeList());
}
catch (CommonException e) {
resultMap.put(Constants.RESPONSE_RESULT, Constants.RESPONSE_FAILED);
resultMap.put(Constants.RESPONSE_CODE, Constants.RESPONSE_CODE_ERROR);
resultMap.put(Constants.RESPONSE_MSG, Constants.RESPONSE_MSG_FAILED);
resultMap.put(Constants.RESPONSE_DATA,
null);
}
return resultMap;
}
|
cs |
이제 브라우저에 테스트를 진행합니다.
http://IP:PORT/v1/api/notice/index
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
{
result:
"s",
code:
"200",
msg:
"요청 성공 하였습니다.",
data: {
notice_list: [
{
title:
"공지사항 테스트 1",
date:
"2016-01-18",
author:
"관리자",
id:
"00014530958013379"
},
{
title:
"공지사항 테스트 2",
date:
"2016-01-18",
author:
"관리자",
id:
"00014530958013380"
},
]
}
}
|
cs |
정상적으로 작동되는 걸 확인 할수 있습니다.
위와 같이 정상적으로 작동되는 것을 확인하면 이전화에 작성한 문서에 맞춰 계속해서 작업을 하게됩니다.
[개발자가 하는 일 1] 서버 구축에 앞서..
[개발자가 하는 일 3] 본격적인 서버 구축 - 기본 설정 및 확인
[개발자가 하는 일 4] 본격적인 서버 구축 - vsftpd설치
[개발자가 하는 일 5] 본격적인 서버 구축 - 웹 서버 설치
[개발자가 하는 일 6] 본격적인 서버 구축 - 웹 어플리케이션 서버 설치
[개발자가 하는 일 7] 본격적인 서버 구축 - 도메인과 서브도메인
[개발자가 하는 일 8] 본격적인 서버 구축 - 로드밸런싱을 위한 Haproxy
[개발자가 하는 일 9] 본격적인 서버 구축 - API 서버 개념과 API 문서작성
참조
이전화를 바탕으로 API 서버에 대한 개념과 문서를 작성하는 방법을 진행해 봤습니다.
이제 본격적인 API서버를 구현해야 합니다.
API 서버를 구현하기 위해서는 여러 언어중 자신이 개발하기 편한 언어로 개발하면 됩니다.
언어 선택의 기준은 본인이 가장 익숙함,숙련도,유지보수 및 협업의 용이성 그리고 속도가 됩니다.
아래 표를 참고 하셔서 본인의 상황에 적합한 언어를 선택하면 됩니다.
Framework |
Best performance (higher is better) |
Cls |
Lng |
Plt |
FE |
Aos |
DB |
Dos |
Orm |
IA |
urweb-postgres |
293,753 |
100.0% |
Ful |
Ur |
Ur/ |
Non |
Lin |
Pg |
Lin |
Mcr |
gemini-postgres |
162,985 |
55.5% |
Ful |
Jav |
Svt |
Res |
Lin |
Pg |
Lin |
Mcr |
cpoll_cppsp-raw |
153,078 |
52.1% |
Plt |
C++ |
Cpl |
Non |
Lin |
My |
Lin |
Raw |
urweb-mysql |
130,988 |
44.6% |
Ful |
Ur |
Ur/ |
Non |
Lin |
My |
Lin |
Mcr |
servlet-raw |
119,813 |
40.8% |
Plt |
Jav |
Svt |
Res |
Lin |
My |
Lin |
Raw |
gemini-mysql |
118,920 |
40.5% |
Ful |
Jav |
Svt |
Res |
Lin |
My |
Lin |
Mcr |
undertow |
105,273 |
35.8% |
Plt |
Jav |
Utw |
Non |
Lin |
My |
Lin |
Raw |
undertow edge |
103,088 |
35.1% |
Plt |
Jav |
Und |
Non |
Lin |
My |
Lin |
Raw |
go-prefork |
100,669 |
34.3% |
Plt |
Go |
Go |
Non |
Lin |
My |
Lin |
Raw |
php5-raw |
97,373 |
33.1% |
Plt |
PHP |
FPM |
ngx |
Lin |
My |
Lin |
Raw |
fasthttp-postgresql |
95,684 |
32.6% |
Plt |
Go |
Go |
Non |
Lin |
Pg |
Lin |
Raw |
wt-postgres |
94,291 |
32.1% |
Ful |
C++ |
Wt |
Non |
Lin |
Pg |
Lin |
Ful |
wt |
94,047 |
32.0% |
Ful |
C++ |
Wt |
Non |
Lin |
My |
Lin |
Ful |
php-raw |
91,912 |
31.3% |
Plt |
PHP |
FPM |
ngx |
Lin |
My |
Lin |
Raw |
undertow |
91,595 |
31.2% |
Plt |
Jav |
Utw |
Non |
Lin |
Pg |
Lin |
Raw |
undertow edge |
91,069 |
31.0% |
Plt |
Jav |
Und |
Non |
Lin |
Pg |
Lin |
Raw |
openresty |
90,925 |
31.0% |
Plt |
Lua |
OpR |
ngx |
Lin |
My |
Lin |
Raw |
fasthttp-mysql |
88,965 |
30.3% |
Plt |
Go |
Go |
Non |
Lin |
My |
Lin |
Raw |
go-raw |
86,177 |
29.3% |
Plt |
Go |
Go |
Non |
Lin |
My |
Lin |
Raw |
go |
85,883 |
29.2% |
Plt |
Go |
Go |
Non |
Lin |
My |
Lin |
Raw |
gin |
84,564 |
28.8% |
Plt |
Go |
Go |
Non |
Lin |
My |
Lin |
Raw |
plain |
83,180 |
28.3% |
Ful |
Sca |
Pla |
Non |
Lin |
My |
Lin |
Mcr |
undertow |
80,360 |
27.4% |
Plt |
Jav |
Utw |
Non |
Lin |
Mo |
Lin |
Raw |
undertow edge |
78,470 |
26.7% |
Plt |
Jav |
Und |
Non |
Lin |
Mo |
Lin |
Raw |
goji |
77,659 |
26.4% |
Plt |
Go |
Go |
Non |
Lin |
My |
Lin |
Raw |
echo |
76,429 |
26.0% |
Plt |
Go |
Go |
Non |
Lin |
My |
Lin |
Raw |
lapis |
62,489 |
21.3% |
Ful |
Lua |
OpR |
ngx |
Lin |
Pg |
Lin |
Ful |
dart |
62,481 |
21.3% |
Plt |
Dar |
Dar |
Non |
Lin |
Pg |
Lin |
Raw |
grizzly-jersey |
52,801 |
18.0% |
Mcr |
Jav |
Svt |
Grz |
Lin |
My |
Lin |
Ful |
nodejs |
51,445 |
17.5% |
Plt |
JS |
njs |
Non |
Lin |
My |
Lin |
Raw |
play-scala-anorm |
50,870 |
17.3% |
Ful |
Sca |
Nty |
Non |
Lin |
My |
Lin |
Ful |
start |
45,070 |
15.3% |
Mcr |
Dar |
Dar |
ngx |
Lin |
Pg |
Lin |
Raw |
play-java-jpa |
44,320 |
15.1% |
Ful |
Jav |
Nty |
Non |
Lin |
My |
Lin |
Ful |
dropwizard |
41,271 |
14.0% |
Ful |
Jav |
Jty |
Jty |
Lin |
Pg |
Lin |
Ful |
dropwizard |
39,207 |
13.3% |
Ful |
Jav |
Jty |
Jty |
Lin |
My |
Lin |
Ful |
php-phalcon-micro |
38,966 |
13.3% |
Mcr |
PHP |
FPM |
ngx |
Lin |
My |
Lin |
Ful |
stream |
38,820 |
13.2% |
Mcr |
Dar |
Dar |
ngx |
Lin |
Pg |
Lin |
Raw |
bottle-mysql-raw |
37,982 |
12.9% |
Mcr |
Py |
Mei |
Non |
Lin |
My |
Lin |
Raw |
tapestry |
37,099 |
12.6% |
Ful |
Jav |
Svt |
Res |
Lin |
My |
Lin |
Ful |
plain-servlet-linux |
35,358 |
12.0% |
Ful |
Sca |
Pla |
Non |
Lin |
My |
Lin |
Ful |
http-kit |
34,862 |
11.9% |
Plt |
Clj |
htk |
Non |
Lin |
My |
Lin |
Raw |
falcore |
34,338 |
11.7% |
Mcr |
Go |
Go |
Non |
Lin |
My |
Lin |
Raw |
wildfly-ee7 |
33,079 |
11.3% |
Plt |
Jav |
Svt |
Wil |
Lin |
My |
Lin |
Ful |
redstone-postgresql |
32,730 |
11.1% |
Mcr |
Dar |
Dar |
Non |
Lin |
Pg |
Lin |
Mcr |
start |
31,396 |
10.7% |
Mcr |
Dar |
Dar |
ngx |
Lin |
Mo |
Lin |
Raw |
compojure-raw |
30,999 |
10.6% |
Mcr |
Clj |
Svt |
Res |
Lin |
My |
Lin |
Raw |
undertow-jersey-hika |
29,920 |
10.2% |
Mcr |
Jav |
Svt |
Utw |
Lin |
My |
Lin |
Ful |
stream |
27,832 |
9.5% |
Mcr |
Dar |
Dar |
ngx |
Lin |
Mo |
Lin |
Raw |
flask |
26,867 |
9.1% |
Mcr |
Py |
Mei |
Non |
Lin |
My |
Lin |
Raw |
undertow-jersey-c3p0 |
26,271 |
8.9% |
Mcr |
Jav |
Svt |
Utw |
Lin |
My |
Lin |
Ful |
sinatra-sequel-puma- |
25,908 |
8.8% |
Mcr |
Rby |
Rac |
Pum |
Lin |
My |
Lin |
Ful |
redstone-mongodb |
25,848 |
8.8% |
Mcr |
Dar |
Dar |
Non |
Lin |
Mo |
Lin |
Mcr |
wheezy.web |
24,450 |
8.3% |
Mcr |
Py |
Mei |
Non |
Lin |
My |
Lin |
Ful |
api-hour+aiohttp.web |
23,480 |
8.0% |
Mcr |
Py |
API |
Gun |
Lin |
Pg |
Lin |
Raw |
sabina jetty mongodb |
23,218 |
7.9% |
Mcr |
Jav |
Svt |
Non |
Lin |
Mo |
Lin |
Raw |
sabina |
23,121 |
7.9% |
Mcr |
Jav |
Svt |
Non |
Lin |
Mo |
Lin |
Raw |
sabina jetty mysql |
23,114 |
7.9% |
Mcr |
Jav |
Svt |
Non |
Lin |
My |
Lin |
Raw |
spring |
23,019 |
7.8% |
Ful |
Jav |
Svt |
Tom |
Lin |
My |
Lin |
Ful |
출처 : http://www.techempower.com/benchmarks/
저는 제가 제가 자주 사용하는 스프링 프레임워크(Spring Framework) 3를 선택해서 API 개발을 진행해보겠습니다.
일단 라이브러리를 선택해야하겠지요.
언어 선택과 마찬가지로 라이브러리 선택의 기준 역시
본인이 가장 익숙함,숙련도,유지보수 및 협업의 용이성 그리고 속도가 됩니다.
일반적으로 많이 개발자분들이 많이 사용하는 라이브러리는 Jackson이나 GSON을 많이 사용합니다.
아래의 막대 그래프를 보면 GSON보다 Jackson이 좋은 퍼포먼스를 보이고 있습니다.
이런 이유로 저는 Jackson을 선택하여 진행하겠습니다.
이제 pom.xml에 Jackson을 추가합니다.