[앱 서비스 구축을 위해 개발자가 하는 일 10] API 서버 구현 예시 디자인 및 개발
2016.10.02. 11:23


이전화를 바탕으로 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을 추가합니다.

pom.xml
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


정상적으로 작동되는 걸 확인 할수 있습니다.


위와 같이 정상적으로 작동되는 것을 확인하면 이전화에 작성한 문서에 맞춰 계속해서 작업을 하게됩니다.





이전화를 바탕으로 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을 추가합니다.

개발의뢰