본문 바로가기
Back-end/JAVA

[JAVA] Spring으로 REST API 구현하기 (1) - 프로젝트 생성 및 실행

by 허도치 2019. 12. 5.

이번 포스트는 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(null10);
                
        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를 구현해보도록 하겠다.

댓글