주니어 백엔드/DevOps의 우당탕탕 스토리

Story of Jr. Backend/DevOps Developer.
ko en

3. Spring 시작해 보기: Spring Boot 에서 간단한 API Controller 만들어 보기.

2023-01-13 spring-study

Intro

이번 동아리에서 진행하는 Spring Study을 통해서 인프런 강의를 듣고, 관련 내용을 정리합니다.

특히 해당 강의 내용은 Java Spring Boot을 기준으로 설명하지만, 적절히 현재 현업에서 사용중인 ASP.NET Core과 비교도 하면서, 관심이 많았던 Kotlin 언어를 적절히 적용해서 정리합니다.

이번 정리의 핵심

  • 간단하게 API Controller 짜보기
  • ASP.NET 과 비교해 보기.

간단하게 API Controller 짜 보기.

개요

정적인 객체를 JSON 으로 직렬화 해서 반환하는 예제인데, 다른 언어/프레임워크에서 API개발을 해 보았으면 간단한 예제일 것으로 생각됩니다.

코드

전체적으로 Controller 클래스에 Routing과 HTTP Method를 정의해 주고, Response Body를 반환 하는 정도입니다.

package com.kangdroid.initspringboot.controllers

import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.ResponseBody

@Controller // 1. 해당 클래스는 컨트롤러 클래스.
class HelloController {

    @GetMapping("api/hello") // 2. api/hello Route Match
    @ResponseBody // 3. Response Type is application/json (object)
    fun helloApi(): UserProjection {
        return UserProjection(
                nickName = "KangDroid",
                email = "kangdroid@test.com",
                role = "Role.Developer"
        )
    }
}

data class UserProjection(
        val nickName: String,
        val email: String,
        val role: String
)

실행 결과

ASP.NET 코드와 비교해 보기

먼저 코드(C#)

public class UserProjection 
{
    public string NickName { get; set; }
    public string Email { get; set; }
    public string Role { get; set; }
}

[ApiController]
public class HelloController: ControllerBase 
{
    [HttpGet("/api/hello")]
    public ActionResult HelloApi()
    {
        return Ok(new UserProjection 
        {
            NickName = "KangDroid",
            Email = "kangdroid@test.com",
            Role = "Role.Developer"
        });
    }
}

분석(은 아니지만 그냥 개인적인 생각)

사실 위 예제는 CRUD API도 아니고 그냥 정적인 객체를 READ하는 GET API 입니다. 따라서 제대로 된 분석은 할 수 없겠지만, 그래도 첫 인상은 비슷한 부분이 있네! 정도인 것 같습니다.

두 언어/프레임워크 모두 공통적인 부분을 어느정도 포함하는데요,

  • 클래스가 Controller 역할을 한다는 Attribute/Annotation([ApiController] vs @Controller)
  • HTTP Method와 라우팅을 정의하는 Attribute/Annotation([HttpGet("route-path")] vs @GetMapping("route-path"))
  • 응답 값에 우리가 원하는 객체(UserProjection) 포함 여부

지금 이 부분들은 API 로직 중, 미들웨어/필터를 제외한 가장 앞단을 비교한 것인데요, 앞으로 조금 더 배우면서 미들웨어/필터 개념이나, 실제 DB로직 부분도 비슷한지 분석하는 것이 기대가 됩니다.