daramG 2022. 5. 7. 17:32

 

실행결과 :

 

 

 

save를 통한 업데이트

 

 

실행결과 :

 

createDate와 role이 NULL로 나온다.

 

원래 save는 insert할 때 사용하는 것이다.

만약 save를 할 때 id값을 넘겨주면 만약 그 id가 데이터베이스에 있다면 그것을 업데이트한다.

그런데 문제는 위 코드에서 password와 email, username만 있기 때문에

다른 값들이 NULL로 변해버리는 문제가 발생한다.

따라서 업데이트 할 때는 save를 거의 사용하지 않는다.

 

 

 

만약 save를 통해 업데이트하고 싶다면 코드를 다음과 같이 작성하면 된다.

여기서의 user는 NULL이 없기 때문이다.

 

id==2의 유저를 업데이트 해보겠다.

 

실행결과 :

 

 

save 함수는 id를 전달하지 않으면 insert를 하고,

id를 전달하면 해당 id에 대한 데이터가 있으면 update를 하고,

id를 전달하면 해당 id에 대한 데이터가 없으면 insert를 한다.

 

 

@Transactional를 통한 업데이트

 

우선 save를 주석처리한다.

 

그리고 @Transactional 어노테이션을 추가한다.

 

@Transactional 어노테이션이란?

데이터베이스를 다룰 때 트랜잭션을 적용하면 데이터 추가, 갱신, 삭제 등으로 이루어진 작업을 처리하던 중
오류가 발생했을 때 모든 작업들을 원상태로 되돌릴 수 있다. 
모든 작업들이 성공해야만 최종적으로 데이터베이스에 반영하도록 한다.

 

DummyControllerTest.java

 

실행결과 :

 

변경전
변경후

save를 호출하지 않았는데 변경이 이루어졌다.

 

이렇게 @Transactional 어노테이션을 사용하면, save를 호출하지 않더라도 값을 변경하면

데이터가 update된다. 이를 더티체킹이라고 한다.

 

 

 

 

 

참고자료 : https://youtu.be/oijoJtiGPhI