Spring Boot로 시험용 시뮬레이터 만들기

18923 단어 자바spring-boot
다양한 시스템과 연계하는 업무용 웹 앱을 개발하는 일을 하고 있습니다.
연계처의 시스템과의 연동이 개발 공정의 후기가 되는 경우가 많기 때문에, 그때까지의 기간중에 사용하는 다른 시스템 시뮬레이터를 제대로 준비하고 싶고, 이번은 Spring Boot로 작성해 보겠습니다.

환경



macOS Big Sur
Visual Studio Code 1.53.1

요구사항


  • HTTP
  • REST API
  • JSON
  • 응답의 코드, 본문을 소스 수정없이 변경할 수 있도록 하고 싶다

  • 준비



    Java는 설치되었습니다.
    Maven이 들어 있지 않기 때문에 brew로 설치한다.
    % mvn -v
    zsh: command not found: mvn
    
    % brew install maven
    ...
    
    % mvn -v            
    Apache Maven 3.8.1 (05c21c65bdfed0f71a2f2ada8b84da59348c4c5d)
    Maven home: /usr/local/Cellar/maven/3.8.1/libexec
    Java version: 15.0.2, vendor: N/A, runtime: /usr/local/Cellar/openjdk/15.0.2/libexec/openjdk.jdk/Contents/Home
    Default locale: ja_JP, platform encoding: UTF-8
    OS name: "mac os x", version: "11.2.1", arch: "x86_64", family: "mac"
    

    만들기



    4. 최초의 Spring Boot 애플리케이션 개발 의 대로에 진행해 간다.

    POM 만들기



    모든 폴더에 pom.xml을 만듭니다.

    pom.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.example</groupId>
        <artifactId>myproject</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.4.4</version>
        </parent>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
        </dependencies>
    
        <description/>
        <developers>
            <developer/>
        </developers>
        <licenses>
            <license/>
        </licenses>
        <scm>
            <url/>
        </scm>
        <url/>
    
        <!-- Additional lines to be added here... -->
    
    </project>
    

    터미널에서 pom.xml이있는 곳으로 이동하여 mvn package를 실행하면 target 아래에 myproject-0.0.1-SNAPSHOT.jar가 생성됩니다.
    처음에는 라이브러리를 Maven Central Repository에서 다운로드하기 때문에 시간이 걸린다.

    샘플 컨트롤러 작성



    소스에 대한 src/main/java/ 디렉토리를 작성하고 아래에 Example.java를 작성하십시오.

    Example.java
    import org.springframework.boot.*;
    import org.springframework.boot.autoconfigure.*;
    import org.springframework.web.bind.annotation.*;
    
    @RestController
    @EnableAutoConfiguration
    public class Example {
    
        @RequestMapping("/")
        String home() {
            return "Hello World!";
        }
    
        public static void main(String[] args) {
            SpringApplication.run(Example.class, args);
        }
    
    }
    

    터미널에서 mvn spring-boot:run를 실행하면 응용 프로그램이 시작됩니다.
    % mvn spring-boot:run
    .....
    
      .   ____          _            __ _ _
     /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
    ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
     \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: Spring Boot ::                (v2.4.4)
    .....
    2021-04-11 09:53:43.339  INFO 33707 --- [           main] Example                                  : Started Example in 1.892 seconds (JVM running for 2.311)
    

    브라우저에서 http://localhost:8080에 액세스하면 Hello World!가 출력되는지 확인할 수 있습니다.

    구현



    main 메소드는 컨트롤러로부터 잘라낸다.
    또한 적절하게 패키지를 자른다.
    ※상에서 작성한 Example.java 는 삭제

    Application.java
    package mamfrog;
    
    import org.springframework.boot.*;
    import org.springframework.boot.autoconfigure.*;
    
    @SpringBootApplication
    public class Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    
    }
    

    요청 매개 변수로 응답 코드 지정



    GET 파라미터 code 로 지정한 수치를 리스폰스 코드로 설정하는 컨트롤러를 작성한다.

    RestTestController.java
    package mamfrog.controller;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import org.springframework.http.HttpStatus;
    import org.springframework.http.ResponseEntity;
    import org.springframework.web.bind.annotation.*;
    
    @RestController
    @RequestMapping("/rest")
    public class RestTestController {
    
        @RequestMapping("/")
        public ResponseEntity<Map<String, Object>> home(
                @RequestParam(value = "code", required = false, defaultValue = "200") String code) {
    
            Map<String, Object> map = new HashMap<>();
            map.put("code", code);
    
            return new ResponseEntity<Map<String, Object>>(map, HttpStatus.resolve(Integer.parseInt(code)));
        }
    
    }
    

    호출 예) http://localhost:8080/rest/?code=201

    부정한 값을 지정했을 경우의 고려는 하지 않는다.
    응답 본문은 요청의 code를 그대로 반환합니다.

    응답을 임의의 JSON으로 설정



    상기 컨트롤러를 개조하여, 소정의 장소에 있는 JSON 파일의 내용을 응답 본체로서 반환하도록 한다.
    이번에는 JSON 라이브러리로 Jackson을 사용. (pom.xml 약어)
  • 소정의 장소 BASE_PATH 는 고정값
  • JSON 파일 이름은 요청 매개 변수 dataId로 지정됩니다.
  • [dataId].json 지정하지 않거나 해당 파일이 없으면 빈 JSON을 반환합니다.

    RestTestController.java
    package mamfrog.controller;
    
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.HashMap;
    import java.util.Map;
    
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.ResponseEntity;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("/rest")
    public class RestTestController {
    
        private static final String BASE_PATH = "./";
    
        @RequestMapping("/")
        public ResponseEntity<Map<String, Object>> home(
                @RequestParam(value = "code", required = false, defaultValue = "200") String code,
                @RequestParam(value = "dataId", required = false) String dataId) {
    
            Map<String, Object> map = new HashMap<>();
    
            if (StringUtils.isNotEmpty(dataId)) {
                try {
                    InputStream getLocalJsonFile = new FileInputStream(BASE_PATH + dataId + ".json");
                    map = new ObjectMapper().readValue(getLocalJsonFile, HashMap.class);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
    
            return new ResponseEntity<Map<String, Object>>(map, HttpStatus.resolve(Integer.parseInt(code)));
        }
    
    }
    

    JSON 파일 샘플

    test.json
    {
        "key1": "aaaaaaaa",
        "key2": false
    }
    

    호출 예) http://localhost:8080/rest/?dataId=test

    연계 시험용으로 내부에서 사용할 뿐이므로, 요건을 충족하는 최저한의 코드는 이 정도.
    에러 처리 등은 필요에 따라 추가해 가는 느낌.

    보충



    Rest API의 동작 확인은 Google 크롬의 확장 기능 「Talend API Tester」가 편리.

  • 좋은 웹페이지 즐겨찾기