BACKEND/SPRING

05. API를 작성하는 다양한 방법 - GET API 만들기

우진하다 2023. 7. 30. 12:07

프로젝트 생성

인텔리제이 IDEA로 프로젝트를 생성합니다. gradle로 생성해봅니다.

plugins {
    id 'java'
    id 'org.springframework.boot' version '2.5.6'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
}

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

java {
    sourceCompatibility = '11'
}

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
    useJUnitPlatform()
}

 

GET API 만들기

GET API는 웹 에플리케이션 서버에서 값을 가져올때 사용하는 API입니다.
controller package를 만들고 하위 GetController를 만들어
@RestController, @RequestMapping 어노테이션을 클래스에 추가해줍니다.

package com.springboot.api.controller;

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

@RestController
@RequestMapping("/api/v1/get-api")
public class GetController {
    
}

클래스 수준에서 @RequestMapping을 설정하면 내부 선언한 메서드의 URL 리소스 앞에
@RequestMapping 값이 공통 값으로 추가 됩니다.

@RequestMapping으로 구현하기

@RequestMapping 어노테이션을 별다른 설정없이 선언하면 HTTP의 모든 요청을 받습니다.
그래서 GET 형식의 요청을 받기 위한 method 요소 값을 RequestMethod.GET 로 설정해 줍니다.

package com.springboot.api.controller;

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

@RestController
@RequestMapping("/api/v1/get-api")
public class GetController {
    
    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String getHello() {
        return "Hello World!";
    }
    
}

스프링 4.3 버전 이후로는 새로운 어노테이션이 나와 @RequestMapping은 사용하지 않고
각 HTTP 메서드에 맞는 어노테이션을 사용합니다.

    @GetMapping
    @PostMapping
    @PutMapping
    @DeleteMapping

 

매개변수가 없는 GET 메서드 구현

별도의 매개변수 없이 GET API를 구현하는 경우 아래와 같이 적용할 수 있습니다.

package com.springboot.api.controller;

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/v1/get-api")
public class GetController {
    
    // http://localhost:8080//api/v1/get-api/hello
    @GetMapping("/hello")
    public String getHello() {
        return "Hello World!";
    }
}

 

@PathVariable을 활용한 GET 메서드 구현

웹 통신의 기본 목적은 데이터를 주고 받는 것이기에 대부분 매개변수를 받는 메서드를 작성합니다.
매개변수르를 받을 때 자주 쓰이는 방법 중 하나는 URL 자체에 값을 담아 요청하는 것입니다.

// http://localhost:8080/api/v1/get-api/variable/hello
    @GetMapping("/variable/{input}")
    public String getVariable(
            @PathVariable String input
    ) {
        return "입력받은 매개변수는 " + input + " 입니다.";
    }

@GetMapping 어노테이션 값으로 URL 입력시 중괄호를 이용해 매개변수를 지정할 수 있으며
@PathVariable 어노테이션을 사용해 매개변수와 동일한 이름으로 명시해주면 됩니다.

 

@RequestParam을 활용한 GET 메서드 구현

쿼리 형식으로 값을 전달할 때 사용합니다.
URL 에서 ?를 기준으로 우측에 {키}={값} 형태로 구성된 요청을 전송하는 방법입니다.

// http://localhost:8080/api/v1/get-api/request1?name=잔망루피&email=loopy@loppy.com&mobile=01011112222
    @GetMapping("/request1")
    public String getRequest1(
            @RequestParam String name,
            @RequestParam String email,
            @RequestParam String mobile
    ) {
        return "이름 : " + name + "<br>"
                + "email : " + email + "<br>"
                +  "mobile : " + mobile;
    }

이는 원시적인 방법이기도 하고 보안 및 유지보수에 불리하기 때문에 
@PathVariable을 사용하거나 Map 객체를 활용해 응답을 JSON 형식으로 보내는 방법이 적합합니다.

    @GetMapping("/request2")
    public Map getRequest2(
            @RequestParam String name,
            @RequestParam String email,
            @RequestParam String mobile
    ) {
        Map<String, String> response = new HashMap<>();
        response.put("name", name);
        response.put("email", email);
        response.put("mobile", mobile);
        return response;
    }

    @GetMapping("/request3")
    public String getRequest3(
            @RequestParam Map<String, String> param
    ) {
        StringBuilder sb = new StringBuilder();
        param.entrySet().forEach(map -> {
            sb.append(map.getKey() + " : " + map.getValue() + "\n");
        });
        return sb.toString();
    }

DTO 객체를 활용한 GET 메서드 구현

DTO는 Data Transfer Object 의 약자로, 다른 레이어 간의 데이터 교환에 활용됩니다.
각 클래스 및 인터페이스를 호출하면서 전달하는 매개변수로 사용되는 데이터 객체입니다.

DTO는 데이터를 교환하는 용도로만 활용되기에 별도의 로직이 포함되지 않습니다.
프로젝트 패키지 안에 dto 패키지를 생성하고 MemberDto를 추가합니다.

package com.springboot.api.dto;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class MemberDto {
    private String name;
    private String email;
    private String mobile;

    @Override
    public String toString() {
        return "MemberDto { " +
                "name'" + name + '\'' +
                ", email='" + email + '\'' +
                ", mobile'" + mobile + '\'' +
                "}";
    }
}
    @GetMapping("/request4")
    public String getRequest4(MemberDto memberDto) {
        return memberDto.toString();
    }

데이터 베이스를 활용한 부분은 추후에 다시 정리하겠습니다.