[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 요청을 해석해서 처리하고 응답하는 클래스라고 할 수 있다.
# 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에서는 Service를 호출해서 사용한다. @Autowired 어노테이션으로 의존관계를 설정한다.
Service에서는 클래스에 @Service 어노테이션을 사용하고, Repository를 호출해 사용한다. @Autowired 어노테이션을 사용해 의존관계를 설정한다.
DAO/Repository는 Data를 다루거나, Database 혹은 외부의 데이터를 갖고 오는 영속 계층이다. @Repository 어노테이션을 클래스에 등록하여 사용하고, Service 계층에서 호출되어 사용된다.
정리
- Layered Architecture 는 인접한 레이어 간의 통신만 허용하고 반드시 레이어를 거쳐서 통신하는 구조를 가진다.
- @Controller, @Service, @Repository 어노테이션을 포함하는 클래스는 모두 컴포넌트로 등록되어 스프링 컨테이너에 의해 관리되어 진다.
- @Autowired 어노테이션은 DI 기능으로 자동으로 의존관계를 맺어준다.
'Spring MVC로 RESTful API 서비스 구현'이라는 주제로 구현의 흐름에 대해 알아보았습니다. 도움이 되었다면 좋아요 꾹! 광고 꾹! 해주시면 큰 힘이 됩니다! 좋은 하루 보내세요.^^
'java, spring' 카테고리의 다른 글
[SpringBoot] MariaDB 연결하기 (0) | 2022.03.10 |
---|---|
[Spring Boot] REST API, CRUD 설계 (0) | 2022.03.05 |
[Spring Boot] 스프링 특징 & 스프링 부트 간단한 소개 (0) | 2022.03.03 |
[Spring Boot] 프로젝트 및 Controller 생성 (0) | 2022.02.25 |
JAVA 시작하기, 자바 개발 도구 설치하기(feat. JDK 설치) (0) | 2022.01.22 |