본문 바로가기
spring boot

Spring boot @handleMethodArgumentNotValid / delete/@Transactional

by improve 2024. 3. 12.

 

●GlobalExceptionHandeler

@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
                                                              HttpHeaders headers,
                                                              HttpStatusCode status,
                                                              WebRequest request)
{

    System.out.println("유효성 실패 "+ex.getMessage());
    System.out.println("유효성 실패 "+ex.getBindingResult());

    ErrorResponse errorResponse = ErrorResponse.builder()
            .errorCode(HttpStatus.BAD_REQUEST.toString())
            .errorMessage(ex.getBindingResult().toString())
            .wdate(LocalDateTime.now())
            .build();
    return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorResponse);

}

 

이메일 길이를 지정해 줘서 그 길이보다 작거나 크면 이 오류문이 나타난다.

 

//    @ExceptionHandler(BadException.class)
//    public final ResponseEntity<ErrorResponse> handleException(BadException e){
//        ErrorCode errorCode = e.getErrorCode();
//
//        ErrorResponse errorResponse = ErrorResponse.builder()
//                .errorCode(e.getErrorCode().getErrorCode())
//                .errorMessage(e.getErrorCode().getMessage())
//                .wdate(LocalDateTime.now())
//                .build();
//        return ResponseEntity.status(e.getErrorCode().getHttpStatus()).body(errorResponse);
//    }

 

@handleMethodArgumentNotValid 이방식이랑 똑같다 .

 

●UserController

@DeleteMapping("users/{id}")
public ResponseEntity<User> deleteUser(@PathVariable Long id){
    User dbuser = userService.delete(id);
    return ResponseEntity.status(HttpStatus.ACCEPTED).body(dbuser);
}

 

●UserService

 public User delete(Long id) {
        Optional<User> dbUser = userRepository.findById(id);
        if (dbUser.isEmpty()){
            throw new UserException(ErrorCode.NOTDELETE);
        }

//        userRepository.deleteById(id);

        userRepository.delete(dbUser.get());
        //해당되는 아이디가 있으먄 삭제
        // 없으면 삭제할 이유가 없다.
        return dbUser.get();
    }

dbUser.가 없으면 오류문을 출력한다.

 

 

 

package 형식은 이렇게 되어 있습니다.

 

 

●aa.html

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>title</title>
    <script>
        function doSelect(){
            fetch("http://localhost:8081/users")
                .then(res => {
                return res.json();
                }
            )
            .then(data => {
                console.log(data);
                }
            )
        }

        function doDelete(){
            const a = []; // 배열선언
            a.push(10);
            a.push(20);
            console.log(a)
            const b = { a:"aa", b:"bb",c:function(){alert('함수'); } }; // 객체 선언
            console.log(b)
            const url = "http://localhost:8081/users/1";

            fetch(url, {
                method:"delete",
                headers:{ 'Content-Type':'application/json'}
                        }
                )
                .then(res => {
                return res.text();
                }
            )
            .then(data => {
                console.log(data);
                }
            )
        }

    </script>
</head>
<body>
    <h1>aa.html</h1>
    <button onclick="doSelect()">조회</button>
    <button onclick="doDelete()">삭제</button>
</body>
</html>

 

우선 인텔리제이의 8081 포트를 실행 해준다.

그리고 8081/users를 불러온다 조회 버튼을 누를 시

삭제를 누를 시 8081/users의 id = 1 번째가 삭제가 된다.

 

 

 

●UserController

@Transactional(readOnly = true) // 영구속성에 의해서 setter 메서드 사용시 db에 update 실행됨...
@GetMapping("users/tran")
public String userstran(){
    User dbUser = userRepository.findById(1L).orElseThrow();
    dbUser.setUsername("김길동"); //업데이트 구문 실행
    dbUser.setEmail("aa@naver.com");
    return "tran";
}

 

@Transactional 을 사용하면 put 을 사용하지 않아도 업데이트가 가능하다 

여기서  readOnly = true 을 사용하면 읽기만 가능하다. (사용하지 않으면 set을 남발하면 복잡해진다.)

 

이렇게 하면(readOnly = true) 사용하지 않고 하면 

 

id 가 1번인 이름과 이메일이 김길동과 aa@naver.com 으로 바뀌면서 저장이 된다.