본문 바로가기
자바과정/REST

REST API 실습(Spring MVC) - 2

by Parkej 2021. 9. 13.
더보기

본 글은 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)를 해야한다. 잘모르는 사람은 따로 공부하길 바란다 (양해 바랍니다)

- 아래는 스프링 주입 방법 중 하나이다. 

DI 방법 1

 

- private ResttestService service; 위에 @Autowired를 명시해주고 ResttestController 생성자를 지워도 된다.

- 그리고 인접한 계층끼리 메서드 호출 등의 통신을 해줘야하는데 @AutoWired 어노테이션이 그 역할을 해준다.

이걸 해주면 각각 인접한 계층끼리 의존관계를 스프링컨테이너에서 자동으로 만들어주고, 가비지 컬렉팅같은 것도 알아서 해준다.

 

DI 방법 2

 

- 분리한 로직으로부터 정보를 얻어오기 위해 생성한 컨트롤러 메소드이다 

GetMapping("logictest") 입니다.

** 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

댓글