[개발]/Spring WEB

Spring Controller (HTTP Method) 구현해보기

John-Co 2022. 11. 10. 15:44

이전 글에서 Controller 의 역할은 사용자 요청에 따라 어떤 처리를 할지 결정을하고, 그 요청을 서비스 로직에 따라 처리 후 View 객체에게 전달하여 Client 에게 응답해주는 기능을 합니다. 서버의 각 기능 별로 URI Mapping 을 통해 Client 로 부터 요청을 받게되고 해당 요청을 처리하기위한 서비스와 연결해주는 중간자 역할이라고 생각하시면 됩니다.

 

그렇다면 Client 는 WEB Server 로 어떤 요청들을 보낼 수 있을지 알아보겠습니다. 다음 그림을 통해서 HTTP 를 통해서 어떠한 요청을 받을 수 있는지 표로 정리해보았습니다.

HTTP Method 의 종류

위 표에대해서 간단하게 의미를 살펴보고 가겠습니다.

 

🔎 Body

HTTP 의 여러 Method 중에 대표적으로 PUT 또는 POST 기능에서는 데이터 덩어리 (Json, xml, image, mp3 등) 을 실어 보낼 수 있는데 이때 데이터 덩어리를 실을 수 있는 공간이 Body 영역을 의미합니다.

 

🔎 멱등성

멱등성의 사전적 의미는 어떤 대상에 수백, 수 천번의 연산을 적용해도 동일한 효과가 나오는 특징 또는 성질이라는 의미를 뜻합니다. 몇 가지 예시를 통해서 멱등성의 의미를 조금 더 확장시켜보도록 하겠습니다.

 

"DELETE" 의 멱등성

DELETE 메소드는 리소스를 삭제하는 역할입니다. 처음 요청하면 해당 리소스가 삭제되고, 두번, 세번 같은 요청을 반복해도 그 리소스는 삭제된 상태가 그대로 유지됩니다.

 

"PUT" 의 멱등성

PUT 의 기능은 리소스를 생성하거나, 이미 존재한다면 데이터를 덮어쓰는 역할을 합니다. PUT 요청을 받으면 해당 리소스가 없는경우 생성이 일어나고, 그 이후부터 수신되는 요청에 대해서는 리소스 값의 변경만 이루어질 뿐 리소스가 사라지거나 계속 생기지 않습니다.

 

반대로, 멱등성이 없는 POST 의 경우를 예시로 들어보겠습니다.

POST 의 경우는 그 기능 자체로 어떤 자원을 생성하는 역할을 하는 Method 입니다. 해서 요청을 한 번, 두 번 세번 받을 때 마다 새로운 리소스를 생성하게되므로, 해당 요청에 따라 시스템 리소스에 지속적으로 영향을 주기때문에 멱등성이 없다고 해석됩니다.

 

이제 저 표의 의미는 어느정도 확인이 되었다고 생각하면서, 오늘 구현해볼 예제는 "PUT", "POST", "GET" Method 를 구현해보려고합니다. 가장 많이 사용되는 Method 이기도 하기때문에 해당 메소드를 선택하게 되었습니다.


1. 프로젝트 생성

프로젝트 생성

IntelliJ 환경으로 JAVA 11 을 기준으로 하며, 종속성에서는 "Spring Web" 과 "Lombok" 을 선택하였습니다.

Lombok 을 처음 접하게되시는 분들은 다음 링크를 통해서 Lombok 의 사용법을 익혀보도록 하겠습니다.

 

Spring 롬복(Lombok) 사용해보기

Lombok 이란 JAVA 의 라이브러리로 반복되는 메소드들을 Annotation 하나로 자동으로 생성해주는 기능입니다. 보통 DTO 를 생성시에 Getter, Setter, toString(), 생성자 등 공통적으로 생성해주는 Method 들이

johnconomics.tistory.com

추가로, DTO 클래스내의 멤버변수 값을 검증하는 기능 입니다. 예를 들면, 핸드폰 번호를 입력받는 경우 핸드폰 번호가 정해진 양식에 맞추어 잘 입력되었는지를 자동으로 검증해주는 기능입니다. 다음 링크를 통해서 Validation 사용법에 대해서 간단하게 알아보도록 하겠습니다.

 

Spring Validation (유효성 검증) 사용해보기

Spring 에서 Vaildation 이란, 데이터의 유효성 검증을 뜻합니다. WEB 개발을 하면서 Client 와 주고받을때 사용할 DTO 클래스를 많이 사용하게 되는데, Client 로 부터 DTO 객체를 활용해서 요청을 받는 경

johnconomics.tistory.com


2. DTO 클래스 생성

PUT 또는 POST 요청 데이터 내 Body 영역에 담길 클래스를 생성합니다.

🔗 위치 : "com.example.controller.dto"

💻 line : 11~13

Lombok 을 활용해서 "Getter, Setter, Constructor, toString" 등의 메소드를 자동으로 생성하는 Annotation 입니다.

💻 line : 15, 17, 19, 21

Validation 즉, 유효성 검증을 하기위한 Annotation 입니다. DTO 객체로 전달되어지는 값이 유효한 값인지를 확인합니다.


3. ApiController 생성

REST Controller 를 생성하고 오늘 구현하기로 한 "GET, PUT, POST" Method 를 차례대로 구현해보도록 하겠습니다.

먼저 "GET" Method 를 구현해보도록 하겠습니다.

 

🔗 위치 : "com.example.springioc"

ApiController Class 코드

💻 line : 14

Lombok 라이브러리 내에 포함되어 있는 Annotation 으로 Logging 을 "System.out.println" 대신에 "log." 기능을 이용할 수 있도록 설정합니다. "log." 기능을 이용하면 조금 더 편리하게 Logging 을 남길 수 있습니다. (line 20~21 과 같이 코딩)

💻 line : 15~16

해당 클래스를 Rest Controller 로 등록하고, URI 는 "/api" 로 설정했습니다.

💻 line : 18

HTTP GET 메소드를 URI "/get/{name}" 에 맵핑되도록 설정했습니다. "{name}" 의 의미는 PathVariable 이라는 의미를 가지는데, Client 가 URI 마지막에 임의로 Parameter 를 넣을 수 있도록합니다.

💻 line : 19

Client 가 임의로 넣은 "{name}" 값을 매개변수로 받아오도록합니다.

💻 line : 20~23

단순히 PathVariable 을 받아와 출력하고, 그대로 Retrun 하도록 합니다.


이어서 "ApiController" 클래스 내에 "PUT" Method 를 구현해보겠습니다.

ApiController Class 코드

💻 line : 26

HTTP PUT 메소드를 URI "/put" 에 맵핑되도록 설정합니다.

💻 line : 27

"@RequestBody" 는 Client 요청 데이터 내의 Body 영역을 받아올 전달변수를 설정합니다. 요청 Body 에 담긴 데이터를 "user" 변수로 접근할 수 있습니다.

💻 line : 28~29

PUT 메소드 또한 단순히 전달받은 데이터를 출력하고, 그대로 Return 하도록 합니다.


이어서 "ApliController" 클래스 내에 "POST" Method 를 구현해보겠습니다.

ApiController Class 코드

💻 line : 34

HTTP POST 메소드를 URI "/post" 에 맵핑합니다.

💻 line : 35

"@RequestBody" 를 사용하여 요청 데이터의 body 데이터를 받아옵니다.

"@Valid" 를 사용하여, 데이터가 수신될 때 유효성을 검증하도록 합니다.

"BindingResult" 변수로 Validation 검증 결과를 받아옵니다.

💻 line : 36~45

Validation 검증 결과 오류 사항이 있는경우, 그 오류 메세지를 담아 Return 합니다.

💻 line : 46~49

Validation 검증에 이상이 없으면, 전달받은 값을 출력하고 Return 합니다.

 

모든 코딩작업이 완료되면 아래와 같은 프로젝트 구조를 볼 수 있습니다.

 

프로젝트 디렉토리화면


4. JSON 데이터 만들기

앞서 만든 "User" DTO 클래스를 기반으로 JSON 데이터 구조를 만들어보겠습니다.

"name, age, phoneNumber, email" 값을 받아올 수 있도록 값을 채워줍니다. Validation 이 잘 동작하는지도 함께 보기위해 2종류의 케이스로 샘플 데이터를 만들었습니다.

 

이제 "GET", "PUT", "POST" 를 각각 테스트해보도록 하겠습니다. Test 하기위해서 "Talend API Tool" 을 사용했습니다.

 

"GET" 테스트 결과

정상적으로 "200" Status Code 를 전달받고, PathVariable 로 보낸 "john" 을 Body 영역으로 잘 받은것을 볼 수 있습니다.

다음은 프로그램에서 출력된 로그 메세지 내용입니다.

 

💻 출력

GET Method =======
User : john


"PUT" 테스트 결과

아까 작성한 2종류의 JSON 데이터를 넣어서 테스트를 해봤습니다. 결과는 작성한 JSON 데이터가 그대로 반환되는 것을 볼 수 있습니다. Validation 을 설정하지 않았기때문에 문제없이 동작합니다. 이제 프로그램에서는 어떤 로그가 찍혀있는지 확인해보겠습니다.

 

💻 출력

Put Method =======
User : User(name=john, age=20, phoneNumber=010-1234-5678, email=john@gmail.com)
Put Method =======
User : User(name=, age=100, phoneNumber=0101234-5678, email=john@gmail.com)


"POST" 테스트 결과

PUT에서 테스트한 방법과 동일하게 JSON 데이터 2종류로 각각 테스트해보았습니다. 왼쪽은 정상적인 데이터를 넣었을 경우이기때문에 문제없이 전달한 데이터 그대로 반환된 것을 확인할 수 있습니다. 반면에, 오른쪽은 Validation 결과 오류가 나도록 보냈으며 결과는 잘못된 데이터에 대한 메세지를 반환받은 것을 볼 수 있습니다.

반응형