[Spring Boot] 데이터베이스 Update 하는 법

[Spring Boot] 데이터베이스 Update 하는 법

데이터베이스 Update하기

웹 브라우저에서 회원 수정을 하는 경우를 생각하며,

@PutMapping을 이용해서 주소를 만들어줬다. 이때 적은 주소는 @GetMapping의 주소와 동일한데, 스프링부트에서는 알아서 Get, Put을 구별해준다.

첫 번째 방법 (Save함수 사용)

주소에서 id를 받아온다. 이 id는 데이터베이스에 저장 된 id값을 불러오기 위함이다.

그리고 @ReqeustBody를 이용하여 Json 데이터를 요청하여, 이를 JavaObject로 변환한다.

SpringBoot에서는 MessageConverter가 Jackson 라이브러리를 사용하여 자동적으로 변환해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// email, password
@PutMapping("/dummy/user/{id}")
public User upadteUser(@PathVariable int id, @RequestBody User requestUser) { // Json 데이터를 요청 => Java Object(MessageConverter의 Jackson라이브러리로 변환해서 받음

User user = userRepository.findById(id).orElseThrow(() -> {
return new IllegalArgumentException("수정에 실패하였습니다.");
});
user.setPassword(requestUser.getPassword());
user.setEmail(requestUser.getEmail());
// save함수는 id를 전달하지 않으면 insert를 해주고,
// save함수는 id를 전달하면 해당 id에 대한 데이터가 있으면 update를 해주고
// save함수는 id를 전달하면 해당 id에 대한 데이터가 없으면 insert를 한다.

userRepository.save(user);
return null;
}

Select 때와 마찬가지로, 잘못 된 (없는) id값을 받았을 때를 방지하기 위해 IllegalArgumentException을 throw 할 수 있도록 한다.

정상적인 user객체에 수정하고자 했던 데이터(password와 email)을 set으로 수정해준다.

그리고 save함수를 이용하여 update해준다.


Save 함수, save 함수를 사용할 때

id를 전달하지 않으면 insert를 해주고,

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

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


두 번째 방법

@Transactional라는 annotaion을 사용해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// email, password
@Transactional
@PutMapping("/dummy/user/{id}")
public User upadteUser(@PathVariable int id, @RequestBody User requestUser) { // Json 데이터를 요청 => Java Object(MessageConverter의 Jackson라이브러리로) 변환해서 받음

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

// 더티체킹
return user;
}

첫 번째 방법과 크게 다른 것은 없지만, @Transactional을 이용하면, Save함수를 사용하지 않아도 된다.

이를 Dirty Checking (더티체킹) 이라고 한다.

updateUser라는 함수가 실행될 때, Transaction이 실행되고, return이 될때 Transaction이 자동으로 종료되며, 자동 commit이 된다.


영속성 컨텍스트와 더티체킹에 대해서 공부해보자!

영속성 컨텍스트

[Spring Boot] 데이터베이스 Update 하는 법

https://devch.co.kr/2021/07/18/SPRINGBOOT-DB-Update-21-07-18/

Author

Chaehyeon Lee

Posted on

2021-07-18

Updated on

2021-07-28

Licensed under

댓글