아래 코드는 스프링부트를 사용한 블로그 프로젝트에서 CRUD 를 테스팅해보는 DummyControllerTest 클래스입니다. deleteUser(), updateUser(), list(), pageList(), detail(), join() 메서드를 구현하였으며, RestController 어노테이션을 사용하여 html 파일이 아닌 data를 리턴합니다.
@RestController // html 파일이 아닌 data 를 리턴해주는 controller
public class DummyControllerTest {
@Autowired // 의존성 주입 DI
private UserRepository userRepository;
//======================= delete test =============================//
@DeleteMapping("/dummy/user/{id}")
public String deleteUser(@PathVariable int id){
// userRepository.findById(id).orElseThrow(()->{
// throw new IllegalArgumentException("삭제에 실패 했습니다.");
// });
try{
userRepository.deleteById(id);
} catch (EmptyResultDataAccessException exception) {
return "삭제에 실패 했습니다.";
}
return "삭제 테스트 완료";
}
//======================= update test =============================//
// DataJpa의 save함수는
// id를 전달하지 않으면 insert
// id를 전달한 경우 해당 id에 대한 데이터가 있다면 update
// id를 전달한 경우 해당 id에 대한 데이터가 없다면 insert
@Transactional // 함수 종료 시 자동 commit 수행
@PutMapping("/dummy/user/{id}")
public User updateUser(@PathVariable int id,
@RequestBody User requestUser){
// @RequestBody
// json 데이터를 java Object 로 자동 변환 (MessageConverter 의 Jackson 라이브러리)
User updateUserInfo = userRepository.findById(id).orElseThrow(() -> {
throw new IllegalArgumentException("수정에 실패하였습니다.");
});
updateUserInfo.setPassword(requestUser.getPassword());
updateUserInfo.setEmail(requestUser.getEmail());
// userRepository.save(updateUserInfo);
//@Transactional 어노테이션 사용
//더티 체킹
//영속화된 데이터와 DB의 데이터를 비교하여 다르다면 commit 시 DB 데이터 변경
return updateUserInfo;
}
//======================= select test =============================//
@GetMapping("/dummy/users")
public List<User> list(){
return userRepository.findAll();
}
// <http://localhost:8000/blog/dummy/user?page=1>
// 한페이지당 2건의 데이터를 리턴 (page는 0부터 시작), key id를 기준으로 내림차순 정렬
@GetMapping("/dummy/user")
public List<User> pageList(@PageableDefault(size = 2, sort = "id", direction = Sort.Direction.DESC)
Pageable pageable){
Page<User> pagingUser = userRepository.findAll(pageable);
return pagingUser.getContent();
}
// {id} 주소로 파라매터를 전달 받을 수 있다.
// <http://localhost:8000/blog/dummy/user/3>
@GetMapping("/dummy/user/{id}")
public User detail(@PathVariable int id) throws IllegalArgumentException{
// 람다식
// return userRepository.findById(userId).orElseThrow(() -> {
// return new IllegalArgumentException("회원 정보가 존재하지 않습니다. id: " + userId);
// });
// MessageConverter 가 응답시에 User 객체를 Json 타입으로 자동변환 해준다.
return userRepository.findById(id).orElseThrow(new Supplier<IllegalArgumentException>() {
@Override
public IllegalArgumentException get() {
return new IllegalArgumentException("회원정보가 존재하지 않습니다. id: " + id);
}
});
}
//======================= insert test =============================//
@PostMapping("/dummy/join")
public String join(User user){ // key: value
System.out.println("userid: " + user.getId());
System.out.println("username: " + user.getUsername());
System.out.println("password: " + user.getPassword());
System.out.println("email: " + user.getEmail());
System.out.println("role: " + user.getRole());
System.out.println("createDate: " + user.getCreateDate());
user.setRole(RoleType.USER);
userRepository.save(user);
return "회원 가입이 완료 되었습니다.";
}
}
DummyController 코드에서는 delete, update, select, insert에 대한 예외처리가 구현되어 있지만, 예외에 대한 로그가 사용자에게 그대로 전달 됩니다. 그러므로 예외처리를 위한 Handler를 구현하여, 예외 발생시 사용자가 알기 쉬운 메시지를 제공하도록 합니다.
@ControllerAdvice
@RestController
public class GlobalExceptionHandler {
@ExceptionHandler(value = IllegalArgumentException.class)
public String handleArgumentException(IllegalArgumentException e){
return "<h1>" + e.getMessage() + "</H1>";
}
}
@ControllerAdvice 어노테이션은 Exception 처리 Handler를 구현하는 코드입니다. 해당 Handler는 IllegalArgumentException이 발생한 경우, 사용자가 알기 쉬운 메시지를 전달하도록 합니다.