1.RestApiController 생성
package kr.ac.hansung.cse.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
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.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.util.UriComponentsBuilder;
import kr.ac.hansung.cse.model.User;
import kr.ac.hansung.cse.service.UserService;
@RestController // @Controller + @ResponseBody
@RequestMapping("/api")
public class RestApiController {
@Autowired // service 이용을 위한 의존성 주입
UserService userService;
// 모든 사용자 조회
// --- Retrieve All Users
// @RequestMapping(value ="/users", method=RequestMethod.GET)
@GetMapping(value = "/users") // http://localhost:8080/helloRest/api/users
public ResponseEntity<List<User>> listAllUsers() { // status, headers, body
List<User> users = userService.findAllUsers();
if (users.isEmpty()) {
return new ResponseEntity<>(HttpStatus.NO_CONTENT); // status
}
return new ResponseEntity<List<User>>(users, HttpStatus.OK); // status, body(json)
}
// 한명의 사용자 조회
// --- Retrieve Single User
// @RequestMapping(value ="/users/{id}", method=RequestMethod.GET)
@GetMapping(value = "/users/{id}")
public ResponseEntity<User> getUser(@PathVariable("id") long id) {
User user = userService.findById(id);
if (user == null) {
// to do list: custom exception
throw new UserNotFoundException(id);
}
return new ResponseEntity<User>(user, HttpStatus.OK);
}
// 한 사용자 생성
// --- Create a USer
// @RequestMapping(value ="/users", method=RequestMethod.POST) //request
// body(json)
@PostMapping(value = "/users")
public ResponseEntity<Void> createUser(@RequestBody User user, UriComponentsBuilder ucBuilder) {
if (userService.doesUserExist(user)) {
// to do list: exception
throw new UserDuplicatedException(user.getName());
}
userService.saveUser(user);
HttpHeaders headers = new HttpHeaders();
headers.setLocation(ucBuilder.path("/api/users/{id}").buildAndExpand(user.getId()).toUri());
return new ResponseEntity<>(headers, HttpStatus.CREATED); // status, headers
}
// 유저 업데이트
// --- Upate a User
// @RequestMapping(value ="/users/{id}", method=RequestMethod.PUT)
@PostMapping(value = "/users/{id}")
public ResponseEntity<User> updateUser(@PathVariable("id") long id, @RequestBody User user) {
User currentUser = userService.findById(id);
if (currentUser == null) {
// to do list: exception
throw new UserNotFoundException(id);
}
currentUser.setName(user.getName());
currentUser.setAge(user.getAge());
currentUser.setSalary(user.getSalary());
userService.updateUser(currentUser);
return new ResponseEntity<User>(currentUser, HttpStatus.OK);
}
// 유저 삭제
// --- Delete a User
// @RequestMapping(value ="/users/{id}", method=RequestMethod.DELETE)
@DeleteMapping(value = "/users/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable("id") long id) {
User user = userService.findById(id);
if (user == null) {
// to do list: exception
throw new UserNotFoundException(id);
}
userService.deleteUserById(id);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
// 모든 유저 삭제
// --- Delete All Users
// @RequestMapping(value ="/users", method=RequestMethod.DELETE)
@DeleteMapping(value = "/users")
public ResponseEntity<Void> deleteAllUsers() {
userService.deleteAllUsers();
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
}
-postman 다운로드 ->postman
-postman이 client 역할
-Example : Get ) http://localhost:8080/helloRest/api/users으로 전체 유저 조회
1.exception 패키지 생성
2.UserNotFoundException.java class 생성 - superclass: RuntimeException
package kr.ac.hansung.cse.exception;
public class UserNotFoundException extends RuntimeException {
private static final long serialVersionUID = 2006875985431069011L;
private long userId;
public UserNotFoundException(long userId) {
super();
this.userId = userId;
}
public long getUserId() {
return userId;
}
}
3.UserDuplicateException.java class 생성
package kr.ac.hansung.cse.exception;
public class UserDuplicatedException extends RuntimeException {
private static final long serialVersionUID = -3312437843437623808L;
private String username;
public UserDuplicatedException(String username) {
super();
this.username = username;
}
public String getUsername() {
return username;
}
}
4. RestApiController에 Exception Handler 코드 추가
// Exception Handler
@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity<ErrorResponse> handleUserNotFoundException(HttpServletRequest req, UserNotFoundException ex) {
String requestURL = req.getRequestURL().toString();
ErrorResponse errorResponse = new ErrorResponse();
errorResponse.setRequestURL(requestURL);
errorResponse.setErrorCode("user.notfound.exception");
errorResponse.setErrorMsg("User with id " + ex.getUserId() + " not found");
return new ResponseEntity<ErrorResponse>(errorResponse, HttpStatus.NOT_FOUND); //body에 넘겨주기
}
@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity<ErrorResponse> handleUserDuplicatedException(HttpServletRequest req,
UserDuplicatedException ex) {
String requestURL = req.getRequestURL().toString();
ErrorResponse errorResponse = new ErrorResponse();
errorResponse.setRequestURL(requestURL);
errorResponse.setErrorCode("user.duplicated.exception");
errorResponse.setErrorMsg("Unable to create. A user with name " + ex.getUsername() + " already exist");
return new ResponseEntity<ErrorResponse>(errorResponse, HttpStatus.CONFLICT);
}
-ErrorResponse.java 생성
package kr.ac.hansung.cse.exception;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor //생성자 만들 시 아래의 필드들 모두 갖도록 하기 위함
public class ErrorResponse {
private String errorCode;
private String errorMsg;
private String requestURL;
}
위와 같이 특정 Controller 안에 handler 생성 시 해당 controller 의 error만 처리함
따라서 controller 패키지 안에 GlobalExceptionController.java 클래스를 생성하여 Handler 코드 넣음
<GlobalExceptionController.java>
package kr.ac.hansung.cse.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import kr.ac.hansung.cse.exception.ErrorResponse;
import kr.ac.hansung.cse.exception.UserDuplicatedException;
import kr.ac.hansung.cse.exception.UserNotFoundException;
@ControllerAdvice
public class GlobalExceptionController {
// Exception Handler
@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity<ErrorResponse> handleUserNotFoundException(HttpServletRequest req, UserNotFoundException ex) {
String requestURL = req.getRequestURL().toString();
ErrorResponse errorResponse = new ErrorResponse();
errorResponse.setRequestURL(requestURL);
errorResponse.setErrorCode("user.notfound.exception");
errorResponse.setErrorMsg("User with id " + ex.getUserId() + " not found");
return new ResponseEntity<ErrorResponse>(errorResponse, HttpStatus.NOT_FOUND); //body에 넘겨주기
}
@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity<ErrorResponse> handleUserDuplicatedException(HttpServletRequest req,
UserDuplicatedException ex) {
String requestURL = req.getRequestURL().toString();
ErrorResponse errorResponse = new ErrorResponse();
errorResponse.setRequestURL(requestURL);
errorResponse.setErrorCode("user.duplicated.exception");
errorResponse.setErrorMsg("Unable to create. A user with name " + ex.getUsername() + " already exist");
return new ResponseEntity<ErrorResponse>(errorResponse, HttpStatus.CONFLICT);
}
}