블로그 만들기-(4)

Claudia Hong·2021년 12월 2일
0

Project

목록 보기
22/26

1. 업데이트

json 데이터로 날림 >> Java 오브젝트로 받음
MessageConverter의 Jackson 라이브러리가 변환해서 받아준다.

Sys.out.println()을 이용해 Put으로 보낸 내용을 requestUser에 잘 받아온 걸 확인할 수 있다.

이제 이걸 데이터베이스에 저장해 줘야 함.

requestUser에 id를 저장하게 한 후, userRepository로 save()하게 한다. >> 에러남! (이유: null값이 들어가면 안되는 것들이 null로 들어가서) >> update에서는 save()를 쓰지 않는다.

save() 함수를 사용해서 업데이트 해주기 위해서는, 오브젝트 User에서 해당 아이디의 유저를 찾은 다음에 (orElseThrow()에 람다식으로 해서 못 찾았을 경우의 예외처리도 해줌) 그 user 오브젝트에 requestUser에 받아온 변경된 데이터를 set으로 넣어준다. >> 추천하는 방법은 아님

  • save 함수는 id를 전달하지 않으면 insert를 해줌
  • save 함수는 id를 전달하면 해당 id에 대한 데이터가 있을 경우, update를 해줌
  • save 함수는 id를 전달하면 해당 id에 대한 데이터가 없을 경우, insert를 해줌

@Transactional을 하면 save 함수를 쓰지 않아도 업데이트가 가능하다.
트랜잭션이 끝날 때(함수가 종료될 때) 자동 commit이 된다.

  • 더티체킹

2. 영속성 컨텍스트 & 더티체킹

1) USER 객체를 save() 하면 JPA 영속성컨텍스트 안 1차캐시에 객체가 쌓이게 된다. (User 객체가 만들어짐)

2) 만들어진 User 객체가 실제 DB의 User테이블에 레코드가 하나 생기면서 들어가게 됨

3) 1차 캐시에 User라는 객체가 생겨있는 상태 >> "영속화 되었다."

4) 영속화된 객체를 DataBase에 밀어넣는 것 >> "flush 플러쉬"라고 한다. (창고가 가득차면 더 큰 창고로 적재물을 옮겨서 비우는 것처럼 = 버퍼를 비운다.)
다만, 여기서는 1차캐시를 비우진 않는다. 1차 캐시의 데이터가 날라가지 않고 남아 있음.

5) 남은 1차캐시의 데이터 사용 예:
SELECT(4)를 하게 되었을 때, 영속화 되었는지를 먼저 확인, 영속화 되어 있으면 굳이 DB가서 SELECT 해서 들고 오지 않는다. >> DB에 접근하지 않아도 되니깐 부하가 덜하다.

6) UPDATE(2) 를 하면 User 오브젝트 값을 변경, 변경된 값으로 변경을 하고자 save를 하면 >> 영속화되어 있는 User객체와 값을 비교 후 변경된 값을 영속성컨텍스트에서 update 시킨다. 변경된 영속화된 user 객체를 flush를 해서 데이터베이스에 밀어넣음.

7) @Transactional 을 하면, DB의 트랜잭션이 시작이 되고 Controller의 메소드가 종료될 때 해당 트랜잭션이 종료가 된다.(return 할 때) >> 이때 자동 commit이 된다.

8) commit을 하면, 메소드에서 변경된 user 오브젝트와 1차캐시의 영속화된 오브젝트를 비교해서 변경된 것을 인식, Controller 종료시 DB에 밀어넣으면서 update문을 수행.

9) 영속화 시키고 값을 변경하면 변경감지 >> DB에 수정을 날림 >> "더티체킹" 한다. (더러운 조각들을 체크해서 날림)

※ DB의 더티체킹(트랜잭션(커밋)을 해야 하는 것들을 모아두었다가 한번에 커밋하는 것)

3. DELETE

이렇게만 하면 위험하므로 try catch로 묶어서 예외(해당 유저의 데이터가 없는데 삭제를 요청했을 경우)를 처리해준다.

예외처리를 할 때는 에러가 났을 때의 코드를 확인하면 어떤 익셉션을 써야하는지 알 수 있다.

확인하고 하나하나 걸어주기 귀찮으면 최고 부모인 Exception e 로 해줘도 된다. (권장하지 않음/어떤 익셉션인지 확인이 안되기 때문에)

+) 삭제된 유저의 id를 주소창에 넣었을 때 에러창이 뜨는 것 익셉션 처리

@ControllerAdvice : 어디서든 익셉션이 발생하면 이쪽으로 오게 한다.
value=IllegalArgumentException.class 해당 익셉션이 발생하면 익셉션에 대한 에러를 이 함수에 전달해줌.

value값에 Exception으로 해주면 모든 익셉션처리가 가능하다.

0개의 댓글

관련 채용 정보