아래 코드는 스프링부트를 사용한 블로그 프로젝트에서 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 "회원 가입이 완료 되었습니다.";
    }

}

Exception 처리 Handler


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이 발생한 경우, 사용자가 알기 쉬운 메시지를 전달하도록 합니다.