본 글은 https://devkingdom.tistory.com/108 블로그의 글을 참고하여 작성하였습니다.
- 설명과 이미지 몇개의 출처는 명시해놓은 블로그입니다.
- 코드 실습 내용은 제가 직접한 코드로 첨부합니다.
개발환경
- OS : Windows 10
- IDE : Eclipse 2021.03
- WAS : Tomcat 9.0
- JAVA : JDK 11
- Framework : 스프링 프레임워크 (스프링 부트 X)
- 프로젝트 설정 : Spring Lagacy Project -> Spring MVC Project
- Spring Version : 4.3.3.RELEASE (pom.xml에서 변경)
이번 포스팅은 Controller와 Service가 분리된 코드의 실습이다.
REST ful 실습하기
// ResttesrController
// json 테스트
@GetMapping("/json")
public Map<String, String> jsonTest(){
Map<String, String> res = new HashMap<>();
res.put("test", "hello");
return res;
}
- 기존 ResttestController에 위의 코드를 추가하고 실행시켜보자
- @RestController는 기본적으로 데이터를 json으로 응답을 한다. 위 코드는 Map 형식으로 리턴해주는 로직이다.
- 실행하고 매핑된 url로 접근하자
스프링 부트에서는 기본적으로 json 처리를 잘 해주는 jackson 라이브러리가 내장되어 있다고 한다.
그리고 스프링 프레임워크 4.3.x에는 @RestController로 인한 웹 개발 도구의 지원이 강화되었다고 한다.
@RestController의 기본 데이터 반환 형식이 json이니 따로 설정을 해주지 않아도 json 형식의 데이터가 유연하게 출력되는것 같다.
- 그리고 우리가 적은 코드는 조금 잘못된 흐름이다. 무슨 말이냐...
- 기본적으로 Controller는 단순히 요청을 받는 URL 매핑 기능이랑 최종 응답을 보내주는 역할만을 해야하는데 요청 자체를 처리하고 있다. 이것을 비즈니스 로직을 구현하는 Service로 옮겨야 한다.
- Service, Dao 패키지와 클래스를 생성해주자 .
*** 꼭 어노테이션으로 명시를 해주어야 한다. 그래야 스프링 컨테이너가 빈으로 등록할 수 있다.
@Service
- 생성 후 아래 코드를 넣어주자
@Service
public class ResttestService {
public Map<String, String> getTest(){
Map<String, String> res = new HashMap<>();
res.put("test", "hello");
return res;
}
}
@Repository
ResttestController 추가 부분
// 전체코드
package com.test.study.controller;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.test.study.service.ResttestService;
@RestController
@RequestMapping("api") // localhost:0000/api 로 매핑된다.
public class ResttestController {
// Log 확인용
private final Logger log = LoggerFactory.getLogger(ResttestController.class);
// 의존성 주입 DI
private ResttestService service;
public ResttestController(ResttestService service) {
this.service = service;
}
@GetMapping("test")
public String test(HttpServletRequest request) {
// HttpServletRequest는 url과 uri를 확인하기 위한 파라미터 안써도 된다.
log.info("URL TEST : '{}'",request.getRequestURL());
log.info("URI TEST : '{}'",request.getRequestURI()); // 컨트롤러로 들어오는 매핑된 URI 로그
log.info("JAVA CLASS PATH : '" + this.getClass().getName()+"'"); // 해당 클래스 경로가 어디인지 출력
return "root url call";
}
// json 테스트
@GetMapping("/json")
public Map<String, String> jsonTest(){
Map<String, String> res = new HashMap<>();
res.put("test", "hello");
return res;
}
// 로직분리한 url
@GetMapping("/logictest")
public Map<String,String> testMethod(){
Map<String, String> res = service.getTest();
return res;
}
}
- Service의 로직을 사용해야하기 때문에 스프링 의존성 주입 (DI)를 해야한다. 잘모르는 사람은 따로 공부하길 바란다 (양해 바랍니다)
- 아래는 스프링 주입 방법 중 하나이다.
- private ResttestService service; 위에 @Autowired를 명시해주고 ResttestController 생성자를 지워도 된다.
- 그리고 인접한 계층끼리 메서드 호출 등의 통신을 해줘야하는데 @AutoWired 어노테이션이 그 역할을 해준다.
이걸 해주면 각각 인접한 계층끼리 의존관계를 스프링컨테이너에서 자동으로 만들어주고, 가비지 컬렉팅같은 것도 알아서 해준다.
- 분리한 로직으로부터 정보를 얻어오기 위해 생성한 컨트롤러 메소드이다
** url -> controller -> service 이런식으로 거치게 된다.
- 이렇게 한 후 실행하면
나오는 것을 확인할 수 있다.
짚고 넘어가야할 것들
스프링은에서 Component라는 용어는 매우 중요하다.
우리가 방금 사용했던 @Controller, @Service, @Repository 그 외 이것들은 프레젠테이션 영역, 서비스 영역, 데이터 영역에 대한 어노테이션들인데 바로 @Component의 하위 어노테이션들이다.
진짜 중요한 개념이니 스프링 개발자가 되고 싶은 사람은 꼭 알아두도록 하자.
좋은 글 : https://galid1.tistory.com/494
'자바과정 > REST' 카테고리의 다른 글
REST API CRUD 따라하기(Spring) (0) | 2021.09.17 |
---|---|
REST API 실습(Spring MVC) - 1 (0) | 2021.09.13 |
REST API (0) | 2021.09.10 |
댓글