Web Framework) helloRestAPI -Controller/Exception 실습2/3

Jay Kim·2022년 1월 17일
0

Web Framework

목록 보기
6/10

<1>

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);
	}

}

<2> test

-postman 다운로드 ->postman

-postman이 client 역할
-Example : Get ) http://localhost:8080/helloRest/api/users으로 전체 유저 조회


<3> Exception

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);
		}
}

0개의 댓글

관련 채용 정보