Spring boot로 Rest API 만들기

주성민·2022년 5월 26일
10
post-thumbnail

22.05.26
백엔드 업무를 시작하기에 앞서 가장 기초적인 Rest API를 만들어 보고자 합니다.
비전공자도 쉽게 따라 할 수 있도록 내용을 구성하였으니 참고 부탁드립니다.

Spring Boot

Spring Framework: 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크
Spring boot: Spring Framework 기반 프로젝트를 복잡한 설정 없이 쉽고 빠르게 만들어 주는 라이브러리

저는 자바 개발자로 Spring 프레임워크를 사용 중입니다.
하지만 스프링을 제대로 활용하기 위해선 어느 정도 복잡한 설정이 필요합니다.
하지만 저희는 간단한 API 서버를 만들 예정이기에 Spring boot 라이브러리를 활용해 미리 세팅된 있는 설정들로 바로 개발에 들어갈 수 있습니다.

Rest API ?

REST(Representational State Transfer): 자원을 이름으로 구분하여 해당 자원의 상태를 주고받는 모든 것
API(application programming interface): 애플리케이션 프로그래밍 인터페이스

즉, REST API는 컴퓨터와 컴퓨터, 서버와 클라이언트 등 다양한 애플레이케이션 연결 구조에서 프로그래밍 인터페이스 규격에 맞춰 자원의 이름으로 구분하여 자원의 상태를 주고받는 행위를 말합니다.

  • 혹시 RESTFUL API라는 말을 들어보셨나요?
    RESTFUL이란 REST의 원리를 따르는 시스템으로, REST를 사용했다 하여 모두가 RESTFUL 하지는 않습니다.
    즉 REST API의 설계 규칙을 명확하게 지킨 시스템만이 RESTFUL 하다고 말할 수 있습니다.

프로젝트 시작하기

우선 저는 IntelliJ IDEA를 사용하며, 앞으로 올리게 될 프로젝트 및 게시글 또한 해당 IDEA를 기반으로 작성할 예정입니다.
해당 프로젝트 시작하기에 앞서 IntelliJ IDEA, JDK 1.8, Advanced Rest client(또는 Postman) 설치가 필요합니다.
먼저 Intellij를 처음 실행하게 되면 보게 될 화면입니다.
저희는 새 프로젝트를 만들기 위해 우측 상단의 '새 프로젝트' 버튼을 클릭하도록 합시다.

프로젝트명: 프로젝트 이름 (저의 경우 demo)
위치: 프로젝트의 위치 경로
언어: Java
타입: Maven

빌드 관리 도구

생성한 프로젝트에서 각종 xml, properties, jar 등 파일들을 JVM이나 WAS가 인식할 수 있도록 패키징해 주는 '빌드 자동화 도구' 이다.
그뿐만 아니라 개발에 필요한 다양한 라이브러리들의 종류와 버전, 종속성 정보들을 명시하여 필요한 라이브러리들을 설정 파일을 통해 자동으로 다운로드 해 주고, 간편하게 관리할 수 있도록 해준다.
대표적으로 Maven, Gradle 등 ..

  • 추후 관련 글을 올릴 예정입니다.

그룹: 일반적으로 작성하는 회사의 도메인명을 거꾸로 쓴다.
(juniper.local 로 지정하였다.)
아티팩트: 보통 프로젝트명을 따라 가는 경우가 많다.
JDK(Java Development Kit): 자바 개발 키트로 Java 환경에서 돌아가는 프로그램을 개발하는데 필요한 툴들을 모아놓은 소프트웨어 패키지이다.
(미리 설치된 1.8 OpenJDK 를 사용하였다.)
Java: 8버전 (*가장 최신 버전은 18)
패키지 생성 : Jar

배포 패키지
Jar(Java Archive): 각종 설정 파일들을 압축해서 만들어진 하나의 어플리케이션 혹은 라이브러리
War(Web Application Archive): Was 컨테이너 위에서 동작할 수 있도록 빌드된 형태
스프링 부트 프로젝트 생성 시 내장 Tomcat이 있기 때문에 Jar만으로 빌드 및 배포가 가능해서, 기존 톰켓 같은 컨테이너를 이용해야 했던 불편함이 줄어들었다.
다만, 필요에 따라 외부 WAS를 이용해야 할 경우 War 파일로 패키징을 하여야 한다.

설정을 마치고 '다음' 버튼을 누르면 해당 화면을 볼 수 있다.
Spring boot 프로젝트 버전 및 미리 설치할 라이브러리 들을 명시하여 시작시 바로 반영할 수 있다.
Lombok 만 선택하여 생성하였다.

Lombok
Java 라이브러리로 반복되는 getter, setter, toString 등 메서드 작성 코드를 줄여주는 코드 다이어트 라이브러리

자 이제 프로젝트 생성을 완료하였다.
화면 왼쪽의 DemoApplication 클래스 파일은 main 메서드가 위치한 베이스 클래스이다.
그리고 application.properties 파일은 이 프로젝트의 설정을 정할 수 있도록 구성되어 있다.

  • 현재는 건드릴 필요가 없으니 넘어가도록 한다.

자 위의 'juniper.local.demo2'(사용자 설정에 따라 경로는 다를 수 있음)를 우클릭한다.
새로 만들기 -> 패키지를 통해 사진처럼 controller, service 패키지를 만들도록 한다.
이번 프로젝트에서는 데이터베이스는 처리하지 않을 예정이므로 repository 패키지는 생략하였다.

서버 처리 과정의 분리
controller: 클라이언트 요청을 받고 서비스에 처리를 요청, 이후 클라이언트에게 응답
service: controller의 호출에 따라 사용자의 요구사항을 처리, DB의 정보 등 필요에 따라 repository에 요청
repository: 데이터베이스 관련 처리 담당

컨트롤러 패키지에서 'firstController' 클래스를 생성한 후
다음과 같이 작성한다.

@RestController
public class firstController {
  @GetMapping("/first")
  public Map<String, Object> firstController() {
    return null;
  }
}

어노테이션
간단하게 @를 시작으로 구성된 노란색 코드 부분이다.
어노테이션은 컴파일러에 문법 에러를 체크하며 빌드 또는 배치 시 코드를 자동으로 생성할 수 있도록 정보를 제공한다.
@RestController: @Controller와 @ResponseBody가 합쳐진 어노테이션으로 주 용도는 Json 형태로 객체 데이터를 반환하는 것이다.
@GetMapping(): API의 메서드 지정으로 GET 방식의 API를 지정하는 방식이다.

다음은 서비스의 패키지의 구성 형태이다.
service 패키지 하단에 'firstService' 인터페이스와 impl 패키지 두 가지를 생성하였고, impl 패키지 안에 'firstServiceImpl' 이라는 자바 클래스 하나를 생성하였다.

인터페이스
모든 기능을 추상화로 정의만 하고 구현은 하지 않은 상태

firstService를 인터페이스로 정의만 한 후 firstServiceImpl에서 구현할 예정이다.
우선 firstService 인터페이스 파일로 이동 후 아래와 같이 작성해보자.
처음 들어오게 되면 사진처럼

Map<String, Object> getFirstData();

는 없었을 것이다.
사진과 같이 작성한 후 firstServiceImpl로 이동해보자
우선 컨트롤러 작성할 때 @RestController 를 기억하는가?
마찬가지로 서비스에서도 빈(Bean) 객체를 등록하기 위해 @Service를 붙여준다.
추가로 'implements firstService'를 작성하게 된다면 사진과 같이 빨간 줄이 뜨는 것을 확인할 수 있다.
마우스를 가져다 대보자
firstService를 상속받았기 때문에 우리는 firstService에 정의된 메서드를 구현하여야 한다.
메서드 구현을 클릭해보자
구현해야 할 메서드를 선택하고 확인을 누르자
자 구현해야 할 메서드가 자동으로 들어온다.
우리는 getFirstData() 메서드를 재정의 하여 구현하도록 한다.

Map<String, Object> firstData = new HashMap<>();

firstData.put("label1", "check1");
firstData.put("label2", "check2");
firstData.put("label3", "check3");

return firstData;

firstData라는 맵 객체 하나를 생성하여 3개의 데이터를 put 하였다.
이후 return을 통해 firstData 객체를 반환하도록 하였다.
자 서비스는 어느 정도 구현이 되었으니 다시 컨트롤러 클래스로 돌아가 보자
구현한 firstService를 사용하기 위해 아래 코드를 작성해보자

private final firstService firstService;

위의 사진과 같이 빨간 줄이 뜨는 것을 확인할 수 있다.
사진처럼 @RequiredArgsConstructor 를 선언해주자

@RequiredArgsConstructor
Lombok의 기능으로 final이 붙거나 @NotNull 이 붙은 필드의 생성자를 자동 생성해주는 Lombok 어노테이션이다.

컨트롤러의 반환 값을 지정해준 후 프로젝트를 실행시켜 보도록 하자

firstService.getFirstData();

프로젝트의 우측 상단에 ▶ 버튼을 눌러 실행!
프로젝트가 정상적으로 가동됨을 확인할 수 있다.

  • 별도 설정이 없을 시 8080포트로 프로젝트가 활성화된다.

이제 API를 테스트를 위해 API 도구를 실행시켜 호출해보자

(GET) http://localhost:8080/first

200의 상태 값과 함께 결과를 확인할 수 있다.

profile
Java Dev

0개의 댓글