본문으로 바로가기

목차

    0. 환경

    • windows10
    • openjdk version "1.8.0_242"
    • STS4 TooL (이클립스) 
    • Postman (API Test Tool)

    1. 세팅

    • API Json 응답을 위해 Jackson 라이브러리를 Maven에 추가해줍니다.
      • jackson-core, jackson-databind
    • Jackson은 JSON 데이터 구조를 처리해주는 라이브러리
    • Jackson을 추가해주지 않으면 API 응답 시 다음과 같은 에러가 발생합니다.
      • No converter found for return value of type
    <!-- jackson -->
    <dependency>
    	<groupId>com.fasterxml.jackson.core</groupId>
    	<artifactId>jackson-core</artifactId>
    	<version>2.9.8</version>
    </dependency>
    
    <dependency>
    	<groupId>com.fasterxml.jackson.core</groupId>
    	<artifactId>jackson-databind</artifactId>
    	<version>2.9.8</version>
    </dependency>

     


    2. 컨트롤러 어노테이션

    @Controller

    • Spring MVC의 컨트롤러인 @Controller는 주로 View를 반환하기 위해 사용합니다.
    • Data를 반환해야 하는 경우엔 @ResponseBody 어노테이션을 활용해주어야 합니다. 
    @Controller
    public class HomeController {
    	
    	//view return
    	@RequestMapping(value = "/", method = {RequestMethod.GET, RequestMethod.POST})
    	public String home() {
        
    		return "home";
    	}
    	
    	//Json Data Return @ResponseBody
    	@ResponseBody
    	@GetMapping("/testApi1")
    	public HashMap<String, Object> testApi1() {
    
    		HashMap<String, Object> rtnMap = new HashMap<String, Object>();
    		rtnMap.put("test1", "value1");
    
    		return rtnMap;
    	}
    	
    }

    @RestController

    • Spring MVC의 컨트롤러인 @RestController의 주로 Json 형태로 객체 Data를 반환하기 위해 사용합니다.
    • @RestController는 Spring MVC Controlle에 @ResponseBody가 추가된 것이라고 보면 됩니다.
    • @RestController 또한 ModelAndView를 이용해 View를 반환할 수 있습니다.
    @RestController 
    public class ApiController {
    
    	//Json Data Return
    	@GetMapping("/testApi2")
    	public HashMap<String, Object> testApi2() {
    
    		HashMap<String, Object> rtnMap = new HashMap<String, Object>();
    		rtnMap.put("test2", "value2");
    
    		return rtnMap;
    	}
        
    	//view return ModelAndView  
    	@RequestMapping(value = "/", method = {RequestMethod.GET, RequestMethod.POST})
    	public ModelAndView home() {
    
    		ModelAndView mav = new ModelAndView();
    		mav.setViewName("home");
    		mav.addObject("menuNum", "1");
    		
    		return mav;
    	}
    }

     


    3. Http Method 어노테이션

    @GetMapping

    • 클라이언트가 서버의 리소스를 요청할 때 사용합니다.
    • 캐시가 가능합니다.
    • 브라우저 히스토리에 남습니다.
    • 요청 데이터 길이 제한이 있습니다.
    • GET 요청은 중요한 정보를 다루면 안 됩니다.
    • CRUD(Read)

    @PostMapping

    • 클라이언트가 서버의 리소스를 수정하거나 새로 만들 때 사용합니다.
    • 캐시 되지 않습니다.
    • 브라우저 히스토리에 남지 않는다.
    • 요청 데이터 길이에 제한이 없다.
    • 전송할 데이터를 HTTP 메시지 body 부분에 담아서 서버로 보냅니다.
    • CRUD(Create)

    @PutMapping

    • URI에 해당하는 데이터를 새로 만들거나 수정할 때 사용합니다.
    • CRUD(전체 Update)

    @PatchMapping

    • PUT과 유사하게 요청된 자원을 수정(UPDATE)할 때 사용합니다. 
    • CRUD(부분 Update)

    @DeleteMapping

    • URI에 해당하는 리소스를 삭제할 때 사용한다.
    • CRUD(Delete)

    @RequestMapping

    • 하나의 컨트롤러 메서드에 여러 HTTP Method를 지정할 때 사용할 수 있습니다.
    @RequestMapping(value = "/", method = {RequestMethod.GET, RequestMethod.POST})
    
    RequestMethod.GET
    RequestMethod.POST
    RequestMethod.DELETE
    RequestMethod.HEAD
    RequestMethod.OPTIONS
    RequestMethod.PATCH
    RequestMethod.PUT
    RequestMethod.TRACE

     


    4. 예제

    • 편의상 Data를 반환하는 메소드와 View를 반환하는 메소드를 같이 작성했습니다. 
    • Data를 반환하는 RestController와 View를 반환하는 Controller를 분리하여 작성하는 것이 좋습니다.
    • 작성 후 Postman툴을 이용하여 테스트합니다.

    @Controller

    @Controller
    public class HomeController {
    
    	//View return
    	@RequestMapping(value = "/", method = {RequestMethod.GET, RequestMethod.POST})
    	public String home() {
    		
    		return "home";
    	}
    
    	//String return(Content-Type: text/plain)
    	@ResponseBody
    	@GetMapping("/testApi1")
    	public String testApi1() {
    
    		return "String Type";
    	}
    
    	//Object Json return 1(HashMap)
    	@ResponseBody    
    	@PostMapping("/testApi2")
    	public HashMap<String, Object> testApi2() {
    
    		HashMap<String, Object> rtnMap = new HashMap<String, Object>();
    		rtnMap.put("test1", "value1");
    
    		return rtnMap;
    	}
    
    	//Object Json return 2(User VO)
    	@ResponseBody
    	@PostMapping("/testApi3")
    	public User testApi3() {
    
    		User user = new User();
    		user.setName("veneas");
    
    		return user;
    	}
    	
    	//User VO
    	static class User {
    		private String name;
    
    		public String getName() {
    			return name;
    		}
    
    		public void setName(String name) {
    			this.name = name;
    		}
    	}
    	
    }

    @RestController

    @RestController 
    public class ApiController {
    
    	//String return(Content-Type: text/plain)
    	@GetMapping("/testApi1")
    	public String testApi1() {
    
    		return "veneas";
    	}
    	
    	//Object Json return 1(HashMap)
    	@PostMapping("/testApi2")
    	public HashMap<String, Object> testApi2() {
    
    		HashMap<String, Object> rtnMap = new HashMap<String, Object>();
    		rtnMap.put("test2", "value2");
    
    		return rtnMap;
    	}
    
    	//Object Json return 2(User VO)
    	@PostMapping("/testApi3")
    	public User testApi3() {
    
    		User user = new User();
    		user.setName("veneas");
    		
    		return user;
    	}
    	
    	//User VO
    	static class User {
    		private String name;
    
    		public String getName() {
    			return name;
    		}
    
    		public void setName(String name) {
    			this.name = name;
    		}
    	}
    
    	//View return
    	@RequestMapping(value = "/", method = {RequestMethod.GET, RequestMethod.POST})
    	public ModelAndView home() {
    
    		ModelAndView mav = new ModelAndView();
    		mav.setViewName("home");
    		mav.addObject("testData", "1");
    		
    		return mav;
    	}
    }