Hello

30. update 테스트

by 볼빵빵오춘기

DummyControllerTest - updateUser()

  • id, password 이메일 수정할 예정이다.
  • form 태그 이용해서 데이터를 받아올 때 매개변수 앞에 @RequestBody붙이지 않아도 되지만 json으로 우회해서 받아올 것이기에 @RequestBody 붙여준다.
@PutMapping("/dummy/user/{id}")
public User updateUser(@PathVariable int id,@RequestBody User requestUser){
    System.out.println("id : "+id);
    System.out.println("password : "+requestUser.getPassword());
    System.out.println("email : "+requestUser.getEmail());

    return null;
}

 

Postman으로 Test

  • @PutMapping("/dummy/user/{id}") Test한다.
  • DB에 몇 번 아이디까지 있는지 확인하고 Test 진행한다.

 

DummyControllerTest - updateUser()

@PutMapping("/dummy/user/{id}")
public User updateUser(@PathVariable int id,@RequestBody User requestUser){
    System.out.println("id : "+id);
    System.out.println("password : "+requestUser.getPassword());
    System.out.println("email : "+requestUser.getEmail());

    user.setId(id);			
            userRepository.save(requestUser);

    return null;
}

실행 결과

  • username 이 null 에러가 뜬다.
  • 우리는 password, email만 변경하기때문에 username 값을 따로 받지않았다.

 

그럼 강제적으로 username 값을 넣어주면 어떨까🤔? 

 

DummyControllerTest - updateUser() - DB에 값 넣어보기 ⇒ 회원정보 변경 실패

@PutMapping("/dummy/user/{id}")
public User updateUser(@PathVariable int id,@RequestBody User requestUser){
    System.out.println("id : "+id);
    System.out.println("password : "+requestUser.getPassword());
    System.out.println("email : "+requestUser.getEmail());

            user.userName("test");
    user.setId(id);			
            userRepository.save(requestUser);

    return null;
}

실행 결과

해당 id값의 db 행을 찾아 username과 password, email 을 변경해주기는하나 role이나 createDate 등은 null 값이 된다.

 

DummyControllerTest - updateUser() - DB에 값 넣어보기 ⇒ 회원정보 변경 성공

@PutMapping("/dummy/user/{id}")
public User updateUser(@PathVariable int id,@RequestBody User requestUser){
    System.out.println("id : "+id);
    System.out.println("password : "+requestUser.getPassword());
    System.out.println("email : "+requestUser.getEmail());

    User user = userRepository.findById(id).orElseThrow(()->{
        return new IllegalArgumentException("수정에 실패하였습니다.");
    });

    user.setPassword(requestUser.getPassword());
    user.setEmail(requestUser.getEmail());

            userRepository.save(user);

    return user;
}

 

DummyControllerTest - updateUser() - DB에 값 넣어보기 ⇒ 회원정보 변경 성공, @Transactional 사용

@Transactional // 함수 종료시에 자동 commit이 됨.
@PutMapping("/dummy/user/{id}")
public User updateUser(@PathVariable int id,@RequestBody User requestUser){
    System.out.println("id : "+id);
    System.out.println("password : "+requestUser.getPassword());
    System.out.println("email : "+requestUser.getEmail());

    User user = userRepository.findById(id).orElseThrow(()->{
        return new IllegalArgumentException("수정에 실패하였습니다.");
    });

    user.setPassword(requestUser.getPassword());
    user.setEmail(requestUser.getEmail());

//        userRepository.save(user);

    // 더티 체킹
    return user;
}

 

알 수 있는 점

  • save() 함수는 id를 전달하지 않으면 insert
  • save() 함수는 id를 전달하면 해당 id에 대한 데이터가 있으면 update
  • save() 함수는 id를 전달하면 해당 id에 대한 데이터가 없으면 insert
  • @Transactional 을 붙임으로써 save() 함수를 쓰지않았지만 변경 성공 how? 더티 체킹, 영속성 컨텍스트 

 

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기