JPA

Persistence Context 전략을 활용해 ID값 받기, Http상태코드 리턴

hyeonseong 2022. 10. 25. 17:21

사용방식

PC(Persistence ConText)는 요청 받은 객체를 영속화 하고 트랜잭션이 종료되는 시점에 DB에 Flush를 한다.

그리고 DB와 동기화를 진행 하는데 이것을 활용 해보면 

현재 DB(MariaDB)에서 id가 Auto INCREMENT 전략을 사용중이다. 그럼 id가 자동 생성 되는데 insert한 후에 getId를 하면 PC에 동기화 되어 있는 객체의 id를 가져 올 것이다.

<아래 그림의 순서>

1. 클라이언트가 user 요청

2. 요청된 객체가 PC에 저장됨.

3. Service에 응답해줌

4. PC에서 DB로 flush후 동기화

5. user.getId() 로 PC에 저장된 user객체의 id값 불러옴.

MyBatis를 사용할 경우 

아래 처럼 insert와 동시에 키값을 받기 위해 아래 처럼 선언을 했었다.

하이버네이트 기술의 PC를 활용하면 이제 굳이 아래 처럼 다 선언 해주지 않아도 id값을 가져올 수 있다.

<insert id="insert" useGeneratedKeys="true" keyProperty="personalId" keyColumn="personal_id">
</insert>

실습

Repository 작성

- 로그로 insert를 하기 전에 userId도 확인

  public User save(User user) {
    System.out.println("퍼시스턴스 확인 " + user.getId()); // null
    em.persist(user);
    System.out.println("퍼시스턴스 확인 " + user.getId()); // null
    return user;
  }

Service 작성

  @Transactional // 트랜젝션을 붙이지 않으면 영속화 되있는 객체가 flush가 안된다.
  public JoinRespDto save(JoinReqDto joinReqDto) {
    User userPS = userRepository.save(joinReqDto.toEntity());
    return new JoinRespDto(userPS);
  }

Controller 작성

 // 자동 import : alt+ shift+ o
  @PostMapping("/join")
  public ResponseDto<?> save(@RequestBody JoinReqDto joinReqDto) {
    JoinRespDto joinRespDto = userService.save(joinReqDto);
    return new ResponseDto<>(1, "ok", joinRespDto); // CREATED는 Insert 되었을때
                                                    // 사용하는 상태 코드 : 201로 응답된다.
  }

결과 확인

- 콘솔 확인

insert 하기 전엔 null이다. 

insert 하고난 이후엔 6이라고 id 값을 가져오는 것을 확인할 수 있다.

- Postman으로 확인

http상태 코드로 200으로 정상 작동 되었음이 확인 되고

id 6과, username이 test를 확인할 수 있다.


- 추가 응답 데이터 HTTP상태코드 리턴해주기 

많은 회사들이 HTTP상태코드를 만들어서 사용중이다. 이부분도 알고 가면 추후 도움이 될 것같다.

Dto 생성 

@AllArgsConstructor
@Getter
@Setter
public class ResponseDto<R> {
  private Integer code;
  private String msg;
  private R data;

}

Controller 수정 

ResponseEntity 를 리턴해준다.

  @PostMapping("/join")
  public ResponseEntity<?> save(@RequestBody JoinReqDto joinReqDto) {
    JoinRespDto joinRespDto = userService.save(joinReqDto);
    return new ResponseEntity<>(new ResponseDto<>(1, "ok", joinRespDto), HttpStatus.CREATED); // CREATED는 Insert 되었을때
                                                                                              // 사용하는 상태 코드 : 201로 응답된다.
  }

결과 확인