
데이터를 전송 할 때 Post, Get, Put, Delete
데이터를 받을 때도 Post, Get, Put, Delete
무엇을 할지 목적을 가지고 있는 방식으로 전송하기 때문에 관리가 편하고 속도도 빠름
(bean Class 생략)
package com.myapp.mobile.ui.controller;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import javax.validation.Valid;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.myapp.mobile.model.request.UpdateUserRequest;
import com.myapp.mobile.model.request.UserRequest;
import com.myapp.mobile.model.response.UserRest;
@RestController
@RequestMapping("/users") //localhost:8070/users
public class UserController {
	
	Map<String, UserRest> users;
	
	// 효율적으로 DB를 사용하기 위해 Page 숫자와 page 당 가져올 Data 수를 정한다.
	@GetMapping
	public String getUserList(@RequestParam(value = "page", defaultValue = "1") int page,  // defaultValue -> Parameter를 입력하지 않아도 기본값 설정
								@RequestParam(value = "limit", defaultValue = "50") int limit,
								@RequestParam(value = "sort", defaultValue = "desc", required = false) String sort) {  // required = false -> 값이 없어도 됨
		
		return "Return User List Page : " + page + " 페이지당 유저 수 : " + limit + " 정렬방법 : " + sort;
	}
	@GetMapping(path = "/{userId}", produces = {MediaType.APPLICATION_JSON_VALUE,
												MediaType.APPLICATION_XML_VALUE}) // produces는 Return 데이터 타입을 정해줌
	public ResponseEntity<UserRest> getUser(@PathVariable("userId") String id) { // 기본적으로 String 타입이지만 원하는 타입으로 지정 시 자동으로 변환
		
//		// Java 객체 User를 Return
//		UserRest returnUser = new UserRest();
//		
//		returnUser.setName("홍 길동");
//		returnUser.setEmail("hong@naver.com");
//		returnUser.setUserId(id);
		// id로 찾아서 User가 있으면 OK, 없으면 No_CONTENT로 Return
		if (users.containsKey(id)) {
			// 객체로 Return 할 시 RestController에서는 JSON 타입으로 Return
			return new ResponseEntity<UserRest>(users.get(id), HttpStatus.OK);
		} else {
			return new ResponseEntity<UserRest>(users.get(id), HttpStatus.NO_CONTENT);
		}
		
	}
	
	@GetMapping("/bad")
	public ResponseEntity<String> badRequest() {
		return new ResponseEntity<String>("잘못된 요청", HttpStatus.BAD_REQUEST);
	}
	
	@PostMapping
	public ResponseEntity<UserRest> getCreateUser(@Valid @RequestBody UserRequest user) { // Date를 입력할 때는 Body에 담아야함
		UserRest returnUser = new UserRest();
		
		returnUser.setName(user.getName());
		returnUser.setEmail(user.getEmail());
		String userId = UUID.randomUUID().toString(); // 랜덤으로 Unique한 아이디 값을 정해줌
		returnUser.setUserId(userId);
		
		if (users == null) users = new HashMap<>(); // 싱글턴 -> 선언된 Map<문자열, UserRest>가 없으면 새로 생성
		
		users.put(userId, returnUser);	// (userId, UserRest) 객체 쌍으로 입력
		
		return new ResponseEntity<UserRest>(returnUser, HttpStatus.CREATED);
	}
	// Update 시 id 입력하고 body에 Update할 Name을 JSON으로 입력한다.
	@PutMapping("/{userId}")
	public UserRest getUpdateUser(@PathVariable("userId") String id, 
								@Valid @RequestBody UpdateUserRequest user) {
		UserRest savedUser = users.get(id);
		savedUser.setName(user.getName()); // 이름 수정됨
		return savedUser;
	}
	@DeleteMapping("/{userId}")
	public ResponseEntity<Void> getDeleteUser(@PathVariable("userId") String id) {
		users.remove(id);
		return new ResponseEntity<Void>(HttpStatus.NO_CONTENT);
	}
}