[Spring Boot] 2. 간단한 GET API를 만든다(1/3)

0. 목표

 

[Mission 02] feat: add simple GET API by ssoyeong · Pull Request #4 · ssoyeong/spring-boot-study

미션 간단한 GET API를 만든다. 만든 API를 로컬 환경에서 테스트해본다. 호출 GET localhost:8080/test/hello 응답 Hello world! 세부 내용 GET API 개발 로컬 환경에서 테스트 공부 포인트 [Spring Boot] 2. 간단한 GET

github.com

- 간단한 GET API를 만들기
- 만든 API를 로컬 환경에서 테스트하기

 

아래 API를 개발하자

 

호출

GET localhost:8080/test/hello

응답

Hello world!

 

1. API란?

- Application Programming Interface

- 응용 프로그램에서 다른 프로그램이나 서비스에 요청을 보내고 데이터를 받을 수 있게 하는 인터페이스

- 즉, 프로그램들 간의 상호 작용을 도와주는 규약이나 규칙의 모음

- 프로그램이 데이터를 요청하거나 전달할 때 사용하는 명세서라고 보면 됨

 

2. API 서버란?

- 다양한 클라이언트 애플리케이션이 데이터를 요청하고 응답을 받을 수 있도록 하는 서버

- 클라이언트가 서버에 요청을 보내면, API 서버는 해당 요청을 처리하고 필요한 데이터를 응답으로 제공함

 

WEB 서버와 API 서버

- WEB 서버는 클라이언트의 HTTP 요청을 받아들이고, 정적인 웹 페이지(HTML, CSS, 이미지 등)를 제공하는 역할을 수행함

- Apache, Nginx 등이 있으며, 이러한 서버들은 동적인 콘텐츠를 처리할 수도 있지만 주로 정적인 콘텐츠를 제공하는 데 사용됨

 

- API 서버는 클라이언트의 API 요청을 받아들이고, 해당 요청에 따라 데이터를 처리하고 제공하는 역할을 수행함

- 주로 동적인 데이터를 처리하고, 클라이언트 애플리케이션에게 응답을 제공하는 역할을 함

- API 서버는 RESTful API, SOAP API 등의 형태로 클라이언트가 요청한 데이터를 반환함

- Spring, Express.js, Django 등이 있으며, 이러한 프레임워크를 사용해 API 서버를 개발함

- 일부 상황에서 API 서버와 WAS 서버가 동일하게 사용되기도 하고, 규모가 커지면 분리해 별도로 서버를 운영하는 것이 일반적임

 

3. REST API란?

3.1. REST란?

- Representational State Transfer

- HTTP를 잘 사용하기 위한 아키텍처 스타일

- 자원을 URI를 통해 명시하고, HTTP 메서드를 통해 해당 자원에 대한 행위를 표현하는 것

- 같은 /users 이지만 URI와 메서드로 다른 동작들을 수행함

- 또한 자원의 상태는 여러 형식(HTML, XML, JSON 등)으로 표현될 수 있음

- 클라이언트는 이러한 표현을 통해 자원의 상태를 이해하고 조작함

- 기존의 전송 방식(View를 반환)과는 달리, 서버는 요청으로 받은 리소스에 대한 순수한 데이터(JSON, XML 등)를 전송함

- 자원을 표현할 때 Collection(문서, 객체의 집합)과 Document(하나의 문서, 객체)를 사용

 

3.2. REST API란?

- Representational State Transfer API

- REST 기반으로 서비스 API를 구현한 것

- 웹을 기반으로 한 자원을 이름(URI)으로 표현하고, 해당 자원에 대한 행위(HTTP 메서드)를 정의해 클라이언트와 서버간 데이터 교환을 하는 API

- Stateless한 특징을 가지고 있음

 

3.3. RESTful API란?

- REST API는 단순히 REST 아키텍처 스타일을 따르고 있는 API를 의미함

- 즉, RESTful한 아키텍처 스타일을 적용하려고 노력하지만 모든 원칙을 엄격하게 준수하지는 않을 수 있음

- RESTful API는 REST 아키텍처 스타일을 엄격하게 준수하며, 모든 REST 원칙을 따르는 API를 의미함

 

3.4. REST API를 사용하는 이유

(1) 간결하고 읽기 쉬움

- URL만 보고 어떤 자원에 접근하는지, 메서드를 보고 어떤 행위를 하는지 쉽게 알 수 있음

 

(2) 자원을 아낄 수 있음

- 1개의 URI로 4개의 행위(CRUD)를 명시할 수 있어 효율적임

 

(3) stateless한 상태를 유지할 수 있음 (가장 중요)

- 각 요청은 클라이언트의 모든 정보를 포함하고, 서버는 클라이언트의 상태를 저장하지 않음

- 그르므로 서버의 부하를 줄이고 확장성을 향상시킴

- 모든 정보를 포함한다는 말은, 요청이 서버로 전송될 때 필요한 모든 정보가 요청의 헤더, 쿼리 매개변수, 바디 등에 포함되어 있다는 것

 

3.4. URI의 구조

 

4. Spring에서 (GET) API를 만드는 방법

지난 시간에 Spring Initializr로 스프링 부트 프로젝트를 세팅했다.

GET API를 만드는 방법을 단계적으로 알아보자.

 

4.1. 의존성 추가

Spring Web과 Lombok 의존성을 추가하자

build.gradle.kts 파일은 Gradle 프로젝트의 설정을 담당하고, 여기에 의존성을 추가할 수 있다

 

아래 두 줄을 추가한다

dependencies {
	implementation("org.springframework.boot:spring-boot-starter")
	testImplementation("org.springframework.boot:spring-boot-starter-test")
	implementation("org.springframework.boot:spring-boot-starter-web")
	compileOnly("org.projectlombok:lombok")
}

 

그리고 빌드 스크립트를 적용하기 위해 "./gradlew build" 명령으로 빌드한다

 

Lombok이란?

- Lombok은 Java 라이브러리로 반복되는 메소드를 어노테이션을 사용해 자동으로 작성해주는 라이브러리임

- 보통 DTO, Model, Entity의 경우 여러 속성이 존재하고, 이들이 가지는 프로퍼티에 대해서 Getter, Setter, Constructor 등을 매번 작성해줘야 하는 경우가 있음. 이러한 부분을 자동으로 작성해주는 라이브러리임

- Lombok을 사용해 작성한 코드는 컴파일 과정에서 어노테이션을 이용해 코드를 생성하고 .class에 자동 컴파일 됨

 

Lombok은 왜 compileOnly 옵션으로 추가할까?

dependencies 블록에는 의존성을 정의해 프로젝트가 사용하는 외부 라이브러리나 모듈을 관리할 수 있다.

이때 implementation, api, runtimeOnly, compileOnly 등의 구성 옵션을 사용한다.

 

우선 Classpath에 대해 알아보자.

Classpath는 클래스나 jar 파일이 존재하는 위치이다.

Classpath는 Compile classpath와 Runtime classpath로 나뉜다.

 

compileOnly : compile classpath에서 필요한 경우

runtimeOnly : runtime classpath에서 필요한 경우

implementation, api : 위 두 가지에 모두 필요한 경우

 

이렇게 경우들을 나누어 의존성을 추가했을 때, 컴파일 시간이 단축되고 프로그램 복잡도를 낮출 수 있다.

 

그렇다면 implementation api의 차이는 무엇일까?

클래스 A <- B <- C가 있다고 하자.

 

implementation을 사용한 의존성은

A 수정 시 직접 의존하는 B만 다시 빌드하면 되기에 속도면에서 유리하다.

내부에서 사용되는 의존성을 선언하는데 사용된다.

 

api를 사용한 의존성은

A 수정 시 B, C와 같이 의존하고 있는 모든 오브젝트들이 다시 빌드되어야 한다.

의존성을 다른 모듈에게 노출한다.

 

그러므로 lombok은 컴파일 과정에서 코드를 생성하고, 런타임에는 사용하지 않기에 compileOnly 옵션을 사용했다.

 

4.2. Controller 클래스 생성

다음과 같은 위치에 Contoller 클래스를 생성한다

 

그리고 HTTP GET 요청을 처리할 메서드를 작성한다

package com.ssoyeong.studyapplication.controller;

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

@RestController
public class TestController {

    @GetMapping("/test/hello")
    public String getHello() {
        return "Hello world!";
    }
}

 

애플리케이션을 실행하여 API 서버를 실행한다

 

 

5. @Controller와 @RestController의 사용 용도, 방법, 차이

5.1. @Controller

- Spring MVC에서 사용되며, 일반적인 웹 애플리케이션에서 HTTP 요청을 처리하는 컨트롤러 클래스를 정의할 때 사용됨

- @Controller로 지정된 클래스의 메서드는 주로 HTML 페이지를 반환하거나 뷰 템플릿을 렌더링하여 사용자에게 동적인 HTML을 전달하는 역햘을 수행함

- @Controller로 지정된 메서드는 데이터와 뷰를 함께 반환할 수 있음

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

@Controller
public class SampleController {

    @GetMapping("/hello")
    public String hello(Model model) {
        // 데이터 추가
        model.addAttribute("message", "Hello, World!");

        // 뷰의 이름을 반환
        return "helloView";  // 뷰의 이름
    }
}

 

5.2. @RestController

- @Controller와 달리 데이터를 반환하는 API 엔드포인트(특정 URL)를 정의할 때 사용됨

- @RestController로 지정된 클래스의 메서드는 주로 JSON 또는 JML과 같은 데이터를 반환하며, 데이터는 직렬화된 형태로 HTTP 응답에 포함됨

- @RestController는 @Controller와 @ResponseBody를 합친 것과 동일한 효과를 가짐

- 사용 방법은 "4.2 Controller 클래스 생성"에서 작성한 클래스를 참고

 

5.3. 차이점

- @Controller는 주로 뷰를 반환하는 데 사용되며, 데이터와 뷰를 함께 반환할 수 있음

- @RestController 데이터를 반환하는 API 엔드포인트를 정의하는 사용되며, 주로 JSON 또는 XML 같은 데이터를 반환함. 이는 @Controller + @ResponseBody 단축된 형태임

 

참고자료

 

REST, REST API란?

안녕하세요. 오늘은 REST 에 대해서 알아보겠습니다. REST란, (=REpresentational State Transfer) 자원을 URI를 통해 명시하고, Method를 통해 해당 자원에 대한 행위를 정의하는 것을 의미합니다. 쉽게 말해서

java-man.tistory.com

 

 

[Spring] Gradle 파일 implementation, api, runtimeOnly, compileOnly... 등에 대해

Gradle 파일 implementation, api, runtimeOnly, compileOnly ... 등에 대해 아무 생각없이 gradle을 사용해왔는데 우테코 미션에 대한 리뷰 중 다음과 같은 것이 달렸다. 그래서 공부해보았다! 먼저, Classpath에 대

bepoz-study-diary.tistory.com