java, spring

[Spring Boot] Spring MVC로 RESTful API 서비스 구현

isaac.kim 2022. 3. 4. 21:29
728x90
반응형

[Spring Boot] Spring MVC로 RESTful API 서비스 구현

 

이전 글 / 참고할만한 글

2022.03.03 - [Java & Framework/Spring Boot] - [Spring Boot] 스프링 특징 & 스프링 부트 간단한 소개

2022.03.04 - [Computer Science] - REST, RESTful

 

 

스프링은 Layered Architectrue 구조에 기반한 개발을 지향한다.

MVC(Model, View, Controller)로 분리하는 것도 계층 구조로 구성하는 것이라 여길 수 있다.

 

스프링에서 가장 먼저 요청을 받아 처리하는 부분을 스프링 MVC라고 할 수 있다.

 

# Spring-Web MVC에서의 RESTful 지원

 

다음 코드를 보자.

 

@Controller,

@RequestMapping(value="url", method=POST/GET/DELETE/PUT),

@ResponseBody 어노테이션들이 사용되고 있다.

먼저 @Controller 어노테이션은 해당 클래스를 컴포넌트로 만들어준다. 컴포넌트는 스프링 컨테이너 위에 로딩되는 객체이며, 스프링 컨테이너 내에서 관리된다. 또 스프링 MVC에서 C, 서버로의 요청을 받아들이는 역할인 Controller가 된다. 서버에서 Controller는 요청을 맞는 역할이라고 볼 수 있다.

 

클래스 안에는 메서드(index())가 하나 작성되어 있다. 메서드 위에는 @RequestMapping(value="/", method = RequestMethod.GET) 어노테이션이 설정되어 있는 것을 볼 수 있다. 메서드의 이름은 크게 상관이 없고, value="" 에 담긴 URL과 맵핑된다고 보면 된다. 이게 무슨 말이냐면, 스프링 MVC가 해당 URL로 접근하면 맵핑된 메서드를 호출한다고 보면 된다. 그리고 method 방식을 함께 인수로 받고 있는데, 인수로 받는 값에 따라 처리를 달리할 수 있게 된다. 위 코드를 해석하면 GET 방식의 url "/" 요청이 오면 IndexController 클래스의 맵핑된 index() 함수가 호출된다.

 

@ResponseBody 어노테이션은 메서드가 return 하는 값을 별도의 가공 없이 응답 메시지의 Body에 그대로 담아 응답한다. 응답 Content-Type은 text/html로 해석한다.

 

Controller 클래스는 HTTP 요청을 해석해서 처리하고 응답하는 클래스라고 할 수 있다.

Request / Response

# Spring Boot에서의 RESTful 지원

스프링 4.3 이후에 나타난 새로운 맵핑 방식 지원

 

@RestController와 @X-Mapping 사용

@RestController는 기존의 @Controller와 @ResponseBody 어노테이션을 함께 사용한 것과 같다.

@GetMapping은 @RequestMapping(value="/", method=RequestMethod.GET)어노테이션을 사용한 것과 같다.

 

@RestController는 RESTful API에 최적화된 Controller이다. 대부분의 REST API에서 Data를 응답할 땐 JSON형태로 처리를 한다. 위처럼 단순 문자열을 return 할 때는 일반 문자열로 처리를 하지만, return을 Java Object로 할 경우 JSON 형태와 동일하기 때문에 자동으로 타입 변환을 하여 처리하게 된다. 결과적으로 JSON으로 변환된 Data를 확인할 수 있다.

 

 

 

# Layered Architectrue - 특징

RESTful API의 규약 중 하나는 Layered Architectrue로 구성하는 것이다.

 

계층화 아키텍처

- 효율적인 개발과 유지보수를 위해 계층화하여 개발

- 대부분의 중/대규모 어플리케이션에서 적용

- 각 레이어는 독립된 R&R을 가짐

- 스프링은 어플리케이션 레벨에서도 Layered Architectrue를 사용한다.

 

 

프레젠테이션 영역 (Controller)

- 사용자와 상호작용을 담당

- 사용자의 요청을 분석(해석)/응답

 

비즈니스 영역 (Service)

- 기능을 수행

- 트랜잭션 수행

 

데이터 영역 (Dao, Repository)

- 데이터의 저장과 조회를 담당

- 주로 데이터베이스와 연동하여 작업

 

 

 

사례 : 전자정부 프레임워크

 

 

# 컴포넌트 자동등록

스프링에서 컴포넌트는 스프링 컨테이너 위에 로딩되는 객체

 

어노테이션(Annotation) 사용

@Component와 하위 어노테이션 사용

@Autowired

- Component 간의 의존관계는 Autowired라는 Annotation으로 적용

- 자동으로 의존 관계를 설정하고 관리해주는 어노테이션으로 볼 수 있음.

- 인접한 Layer와의 의존관계를 형성한다.

 

 

 


예제 코드

JSON으로 응답하는 코드로 수정

http://localhost:8081/ 요청(Request)과 응답 결과(JSON Data) 확인하기

Content-Type 이 application/json인 것을 확인할 수 있다.

 

Layered architecture를 사용하는 형태로 Spring 구조를 수정해보자.

Controller -> Service -> Dao 계층 구조로 통신하도록 구성하기 위해 클래스를 생성한다.

Controller

Controller에서는 Service를 호출해서 사용한다. @Autowired 어노테이션으로 의존관계를 설정한다.

Service

Service에서는 클래스에 @Service 어노테이션을 사용하고, Repository를 호출해 사용한다. @Autowired 어노테이션을 사용해 의존관계를 설정한다.

DAO/Repository

DAO/Repository는 Data를 다루거나, Database 혹은 외부의 데이터를 갖고 오는 영속 계층이다. @Repository 어노테이션을 클래스에 등록하여 사용하고, Service 계층에서 호출되어 사용된다.

 

 

 

정리

- Layered Architecture 는 인접한 레이어 간의 통신만 허용하고 반드시 레이어를 거쳐서 통신하는 구조를 가진다.

- @Controller, @Service, @Repository 어노테이션을 포함하는 클래스는 모두 컴포넌트로 등록되어 스프링 컨테이너에 의해 관리되어 진다.

- @Autowired 어노테이션은 DI 기능으로 자동으로 의존관계를 맺어준다.


'Spring MVC로 RESTful API 서비스 구현'이라는 주제로 구현의 흐름에 대해 알아보았습니다. 도움이 되었다면 좋아요 꾹! 광고 꾹! 해주시면 큰 힘이 됩니다! 좋은 하루 보내세요.^^

 

728x90
반응형