[스프링부트 나만의 블로그 만들기] 04. 초기 테스트 (update 테스트)

이경민·2022년 9월 16일
0

spring

목록 보기
16/20
post-thumbnail

사용자 정보 수정하기

해당 id값을 가진 사용자의 이메일과 비밀번호 수정하기

  • @PutMapping 사용: put 방식 사용
  • @Transactional 사용: db에 내용 반영

1-1. password & email 입력 받는 코드

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

위 코드는 db에 변동 내용을 반영하지는 않고 Postman에 Body (raw)에 json 타입으로 내용 입력 시 spring boot에서 내용을 전달 받아 출력한다.

1-2. postman과 spring boot 출력


2-1. DB에 데이터 insert하는 코드

@Transactional   // save를 하지 않아도 update가 된다.
@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("수정에 실패하였습니다");
    });
    
    // 변경 시키기
    // 더티 체킹: @Transaction이 변경을 감지한다
    user.setPassword(requestUser.getPassword());
    user.setEmail(requestUser.getEmail());
    return user;
}

Transactional 어노테이션을 사용해서 변경 내용을 db에 반영한다.
결과적으로 userRepository.save(requestUser); 코드를 사용할 필요가 없어진다.

2-2. Transactional 어노테이션

  • 함수 종료 시에 자동 update 된다.
  • 더티 체킹: 영속화된 내용의 변경을 감지하여 변경을 반영한다

2-3. postman에서 변경 내용 확인

위에 put 내용을 동일하게 적으면 아래 get을 통해 변경된 내용을 확인 가능하다.


영속성 Context

  • 정의: 영속성 컨텐스트란 엔티티를 영구 저장하는 환경을 의미.
  • 역할: 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할.

엔티티 매니저를 통해 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.

flush

정의: 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 것을 의미한다.

  • buffer를 비운다 (= object를 db에 밀어 넣는다)
  • flush 이후에 1차 캐시 안에 있는 내용이 날라가지는 않는다.
  • 트랜잭션에 commit이 발생할 때
  • EntityManager의 flush 메소드를 호출했을 때
  • JPQL 쿼리가 실행될 때

flush가 발생하면 쓰기 지연 저장소에 저장된 SQL (INSERT / UPDATE / DELETE)이 DB로 전송.

0개의 댓글