Spring Initializr 시작하기, Health check API 만들기

JINNI·2024년 5월 16일
0

[TIL] Java+Spring

목록 보기
5/15

1. Spring Initializr로 프로젝트 시작하기

https://start.spring.io/

  • project : gradle-groovy
  • languange : java
  • project metadata : group, artifact, description 설정(패키지명은 작성한 내용 기반으로 자동 설정)
  • GENERATE 버튼 클릭 시 .zip 파일 다운로드

  • 다운로드한 파일 압축 푼 뒤 Intellij에서 폴더 열기
plugins {
	id 'java'
	id 'org.springframework.boot' version '3.2.5'
	id 'io.spring.dependency-management' version '1.1.4'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
	sourceCompatibility = '17'
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.named('test') {
	useJUnitPlatform()
}
  • build.gradle 확인
  • sync now 해주기
  • configurations의 compileOnly는 컴파일할 때에만 사용하고 런타임에는 사용되지 않겠다는 의존성의 범위를 지정해주는 것
  • spring starter web과 lombok을 dependency에 추가
plugins {
	id 'java'
	id 'org.springframework.boot' version '3.2.5'
	id 'io.spring.dependency-management' version '1.1.4'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
	sourceCompatibility = '17'
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springframework.boot:spring-boot-starter'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.named('test') {
	useJUnitPlatform()
}
  • 해당 파일을 확인한 후 프로젝트 파일 실행

  • 위와 같은 아스키 아트가 나오면 성공적으로 뜬 것.

2. TEST API 만들기

Health check API란?

보통 서버 애플리케이션을 구축하면 잘 동작하는지 확인하기 위한 Test API를 만들고, 이를 health check API라고 부른다.

  1. com.example.TodayILearnServer.controller controller 패키지를 새로 생성한다.
  2. controller 패키지 내부에 HealthCheckController class 파일을 생성한다.
package com.example.TodayILearnServer.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/health")
public class HealthCheckController {
    
    @GetMapping("/v1")
    public Map<String, String> healthCheck() {
        // response를 만드는 방식
        Map<String, String> response = new HashMap<>();
        response.put("status", "OK");
        
        return response;
    }
}
  • response.put()을 반복해서 사용하는 것은 좋지 않음
    1. ResponseEntity 활용하기
      Spring에서는 ResponseEntity 라는 HTTP 응답 객체를 제공하고 있음. 별도의 구현 없이 해당 객체를 활용하여 개발 가능
    2. API 응답 객체 정의
      ResponseEntity를 사용하지 않고 custom한 Java 객체를 만들어 사용할 수 있음
  1. Postman을 이용해 확인

API 여러 방법으로 설계해보기

response를 만드는 방식에 따라 여러 API를 만들어보자.

1. ResponseEntity 활용

    @GetMapping("/v2")
    public ResponseEntity<String> healthCheckV2() {
        return ResponseEntity.ok("v2 OK");
    }
     
    @GetMapping("/v5")
    public ResponseEntity<Map<String, String>> healthCheckV5() {
        Map<String, String> response = new HashMap<>();
        response.put("status", "v5 OK");
        return ResponseEntity.ok(response);
    }

2. API 응답 객체 사용자 정의해 사용하기

// API 응답 객체 정의
@Data
// lombok으로 사용할 수 있는 Data 어노테이션(getter/setter, 기본 생성자, toString())
// 여기서는 @Getter만 사용해도 작동함.
public class HealthCheckResponse {
    private static final String STATUS = "OK";
    private String status;

    public HealthCheckResponse() {
        this.status = STATUS;
    }
}

    // Controller.java
    ...
    @GetMapping("/v6")
    public ResponseEntity<HealthCheckResponse> healthCheckV6() {
        return ResponseEntity.ok(new HealthCheckResponse());
    }


3. String을 return

string을 반환하는 경우 plain/text 라는 media type으로 응답된다.
HealthCheck API와 같은 간단한 API의 경우 이런 식으로 간단하게 구현해 확인하면 좋을 것 같다.

    @GetMapping("/v3")
    public String healthCheckV3() {
        return "v3 OK";
    }
    
    // Person.java
    @Builder
    @AllArgsConstructor
    public class Person {
        private String lastName;
        private String firstName;
    }

    // Controller.java
    ...
    @GetMapping("/v4")
    public String healthCheckV4() {
        Person person = new Person("HA", "JIEUN");
        Person person2 = Person.builder() // Builder 패턴 적용
                .lastName("HA")
                .firstName("JIEUN")
                .build();
        return "v4 OK";
    }

응답은 순서대로 다음과 같다.

  {
    "status": "v1 OK"
  }
  
  v2 OK
  
  v3 OK
  
  v4 OK
  
  {
    "status": "v5 OK"
  }
  
  {
    "status": "OK"
  }


참고자료

Spring boot Starter Web
[Java] 빌더 패턴(Builder Pattern)을 사용해야 하는 이유

profile
천재 개발자 되기

0개의 댓글