이번 포스트는 Maven Project에 Spring Boot Framework를 사용하여 간단한 REST API를 구현해보도록 하겠다. 간단하게 지만 Interceptor와 Exception Handling 등 일부 기능들도 구현을 할 계획이다.
1. Eclipse Maven Proejct 생성.
1-1. Maven Project 선택 후 [ Next ] 클릭.
1-2. Workspace 위치 지정 후 [ Next ] 클릭.
1-3. maven-archetype-quickstart 1.1버전 선택 후 [ Next ] 클릭.
1-4. GroupId, ArtifactId 입력 후 [ Finish ] 클릭.
1-5. Proejct 생성 완료.
2. pom.xml 작성.
- Project Object Model로 Maven Project에 필요한 정보들을 담고 있는 파일.
2-1. <parent> 추가.
- Spring Boot에 필요한 의존성을 관리해줌.
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/>
</parent>
2-2. <dependencies> 추가.
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
- [ spring-boot-starter-web ]은 embeded-tomcat을 사용하여 WebServer를 개발할 수 있는 패키지.
- [ spring-boot-configuration-processor ]는 application.yml에서 Custom한 설정을 만들 수 있도록 도와주는 패키지, @ConfigurationProperties을 사용하려면 이 의존성을 추가하는 것을 권장함.
- [ spring-boot-devtools ]는 리소스가 변경되었을 때 서버의 재실행없이 자동으로 반영시켜주는 패키지.
- 위 패키지들은 이외에도 다양한 기능들이 있으니 천천히 살펴보도록 하자.
3. 프로젝트 구성 변경.
3-1. [ Application.java ]은 메인 Java로써 Spring Boot의 실행파일.
3-2. [ config, error, home 패키지 ]는 하나씩 구현해 나갈 계획.
3-3. [ application.yml ]은 Spring을 설정할 수 있는 Properties 파일.
3-4. [ dev_myapi.pid ]는 실행시 ProcessID가 저장되는 파일로 설정을 통해 자동생성 됨.
4. 실행 파일 작성.
4-1. Application.java 작성.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
package com.dochi.prj;
import java.util.Iterator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.ApplicationPidFileWriter;
@SpringBootApplication(scanBasePackages="com.dochi.prj")
public class Application implements ApplicationRunner {
final static Logger logger = LoggerFactory.getLogger(Application.class);
public static void main( String[] args ){
SpringApplication app = new SpringApplication(Application.class);
app.addListeners(new ApplicationPidFileWriter());
app.run(args);
}
@Override
public void run(ApplicationArguments args) throws Exception {
logger.info("Start REST API server!!!");
Iterator<String> iter = args.getOptionNames().iterator();
while( iter.hasNext() ) {
String key = iter.next();
Object value = args.getOptionValues(key);
logger.info("{}={}", key, value );
}
}
}
|
cs |
- 12 ln: @SpringBootApplication은 SpringBoot를 사용하기위한 어노테이션.
- 13 ln: ApplicationRunner Interface 등록.
- 15 ln: Logging을 위한 Logger.
- 18 ln: 현재 클래스를 SpringApplication으로 생성.
- 19 ln: 실행시 ProcessID를 파일에 기록하도록 설정.
- 20 ln: SpringBoot로 재실행.
4-2. ApplicationRunner Interface는 SpringBoot가 실행되는 것을 제어할 수 있는 Interface로 args에 필수 옵션이 정의되어있지 않으면 실행되지 않도록 구현할 수 있음.
4-3. @SpringBootApplication 어노테이션은 다음 3개의 어노테이션으로 구성됨.
- @Configuration: Java 설정 어노테이션.
- @ComponentScan: 메인 Java를 기준으로 Component를 탐색하는 어노테이션.
- @EnableAutoConfiguration: 추가 설정들을 자동으로 등록해주는 어노테이션.
4-4. application.yml 작성.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
server:
ports: 8080
spring:
profiles:
active: dev
---
spring:
profiles: dev
pid.file: dev_myapi.pid
devtools:
livereload:
enabled: true
logging:
level:
web: DEBUG
---
spring:
profiles: prod
|
cs |
- 1~3 ln: Spring Boot Web을 실행할 Port 설정, 미입력시 Web이 실행되지않음.
- 4~6 ln: 실행모드(Profile) 설정, dev, prod 등으로 구분해서 개발과 배포 환경을 설정할 수 있음.
- 8 ln: 각 Profile의 Block을 나눠주는 구분자.
- 10 ln: 현재 Block은 dev(개발) 모드.
- 11 ln: ProcessID를 내보낼 파일명.
- 12~14 ln: 리소스가 수정됐을 때 서버 재실행 없이 자동으로 반영되도록 설정.
- 16~18 ln: Web에 대한 Logging Level 설정.
- 20~22 ln: prod(배포) 환경에 대한 Block
5. Controller 작성.
5-1. HomeController 작성.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
package com.dochi.prj.home;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.configurationprocessor.json.JSONObject;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HomeController {
final static Logger logger = LoggerFactory.getLogger(HomeController.class);
@RequestMapping(value="/", method={ RequestMethod.GET, RequestMethod.POST })
public String home( HttpServletRequest request ) throws Exception {
JSONObject json = new JSONObject();
json.put("success", true);
json.put("data", 10);
json.put(null, 10);
return json.toString(4);
}
}
|
cs |
- 13 ln: REST API를 위한 어노테이션, @Controller에 @ResponseBody가 추가됨.
- 18 ln: URI 및 Method 매핑.
- 20~26 ln: 테스트용 데이터 작성.
6. 그냥 실행.
6-1. Application.java 오른쪽 클릭 후 [ Run As ] - [ Java Application ] 선택.
7. Arguments를 전달하여 실행.
- 한번 설정하고 5번처럼 실행하면 Arguments가 유지된 채로 실행됨.
7-1. Application.java 오른쪽 클릭 후 [ Run As ] - [ Run Configurations... ] 선택
7-2. [ Arguments ] - [ Program arguments ]에 값을 입력하여 메인 Java에 args를 전달할 수 있음.
- [ --key=value ] 형식으로 입력.
- 한줄에 하나의 Argument 추가 가능.
7-3. [ Run ] 클릭.
8. 접속.
8-1. [ http://localhost:8080/ ]에 접속하여 테스트 데이터가 정상적으로 출력되는지 확인.
9. 마치며.
- 그동안 빠르게 서버를 생성할 수 있는 Python Flask나 Javascript의 Express를 주로 사용했었는데 Java로도 쉽게 API를 생성할 수 있어서 놀라웠다. Python이나 Javscript에 비해서는 손이 많이 가긴 하지만 그래도 이정도가 어딘가..
- 다음 포스트에서는 Interceptor를 구현해보도록 하겠다.
'Back-end > JAVA' 카테고리의 다른 글
[Replace] 확장된 Replace로 첫 글자만 대문자로 치환 (0) | 2020.02.19 |
---|---|
[JAVA] Spring으로 REST API 구현하기 (5) - Filter (0) | 2019.12.11 |
[JAVA] Spring으로 REST API 구현하기 (4) - ControllerAdvice (0) | 2019.12.05 |
[JAVA] Spring으로 REST API 구현하기 (3) - Error Controller (0) | 2019.12.05 |
[JAVA] Spring으로 REST API 구현하기 (2) - Interceptor (0) | 2019.12.05 |
댓글