๐ ์๋ก
ํ๋ก์ ํธ ์งํ ์ค
๋ฐ์ดํฐ ์์ ์ PUT, PATCH, DELETE๋ฅผ
์ด๋ ์ํฉ์์ ์ฌ์ฉํด์ผ ๋๋์ง ์ ๋ชจ๋ฅด๊ณ API๋ฅผ ๊ตฌํํ์ต๋๋ค.
๋๋ถ์ ํ๋ก ํธ์๋๋๋ค์ด ํท๊ฐ๋ฆฌ์ ๋ค๊ณ ๐๐
(์๋ํ๋ฉด ์ฐ๋ฆฐ ์ญ์ ๋ ๋ ผ๋ฆฌ์ ์ผ๋ก ์ํ๋ง ์ญ์ ๋ก ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฌผ๋ฆฌ ์ญ์ ๋ ์ผ๋ถ๋ง ๊ตฌํํ ์ํฉ์ ๋๋ค.)
๊ทธ๋์ ๋ค์ ์ ์ฒด์ ์ผ๋ก ์์ ๊ณผ ์ญ์ API๋ค์ ๊ฑด๋๋ฆฌ๊ฒ ๋์์ต๋๋ค.
์์ ํ๋ฉด์ ๊ณต๋ถํ ๋ด์ฉ์ ์๊ฐํ๊ฒ ์ต๋๋ค.
โญ PUT๊ณผ PATCH ๊ตฌ๋ถํ๊ธฐ
PUT, PATCH๋ฅผ ์์ ์ฉ๋๋ก ์ฌ์ฉํ๋ค๊ณ ๋ง ์๊ณ ์์ด์
์ฐจ์ด๋ฅผ ์ ๋ชจ๋ฅด๊ณ ํผ์ฉํด์ ๋ง ์ฐ๋ ๊ฒฝ์ฐ๊ฐ ์ข ์ข ์์ต๋๋ค.
๊ฒฐ๋ก ๋ถํฐ ๋งํ๋ฉด ๋์ ์์ฐํ ๋ค๋ฆ ๋๋ค.
๊ฐ์ชฝ์ด: PUT ์์ฒญ์ด๋ PATCH ์์ฒญ์ด๋ ๊ฒฐ๊ณผ๊ฐ ๊ฐ์๋ฐ์?????
๊ฐ์ชฝ์.
๊ทธ๊ฒ์ ๊ฒฐ๊ณผ๋ง ๊ทธ๋ ๊ฒ ๋ณด์ผ ๋ฟ
๋์ ๋์ฒด์ฌ ๊ด๊ณ๊ฐ ์๋๋๋ค.
โ PUT Method
The PUT method requests that the state of the target resource be created or replaced with the state defined by the representation enclosed in the request message payload.
- by RFC
PUT ์์ฒญ์ ์์ฒญ payload(ex. RequestBody)์ ์๋ ์์์ผ๋ก ๋์ฒดํ๋ HTTP ๋ฉ์๋์ ๋๋ค.
์ฌ๊ธฐ์ ๋์ฒดํ๋ ๋ฉ์๋๋ผ๋ ๊ฒ์ ๋์์ ์ ์ฅํ๊ธฐ๋, ๋ณ๊ฒฝํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์ฆ, PUT ๋ฉ์๋๋ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๋์ํฉ๋๋ค.
1. ์์์ด ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ -> ์๋ก์ด ์์์ ์ ์ฅํฉ๋๋ค.
2. ์์์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ -> ๊ธฐ์กด์ ์กด์ฌํ๋ ์์์ ์๋ก์ด ์์์ผ๋ก ๋์ฒดํฉ๋๋ค.
๋ฐ๋ผ์ PUT์ ์์ฒญ payload์ ์์์ ์ ์ฒด ์ํ๊ฐ ์์ด์ผ ํฉ๋๋ค.
Entity๋ฅผ ์๊ฐํด ๋ณด๋ฉด
payload์ ํ๋ ๊ฐ๋ค์ด ๋ค ์์ด์ผ ํฉ๋๋ค.
๋ง์ฝ payload์ ์ผ๋ถ ํ๋ ๊ฐ์ด ๋๋ฝ๋ ์ฑ๋ก ์์ฒญ์ด ์ค๋ฉด
๋๋ฝ๋ ํ๋ ๊ฐ๋ค์ Null๋ก ๋์ฒด๋ฉ๋๋ค.๋น์ฐํ ์ข์ง ์๊ฒ ์ฃ ?
์์๋ก ๋ค์ด๋ณด์๋ฉด
์ํ ์ํฐํฐ์ ์ํ ๋ฒํธ, ์ด๋ฆ, ๊ฐ๊ฒฉ ํ๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
์ํ ์ ๋ณด ์์ ์ ์ํ PUT ์์ฒญ ์ ์ํ ๋ฒํธ, ์์ ํ ์ด๋ฆ๋ง payload์ ๋ด์ ๋ณด๋ด๋ฉด
๊ธฐ์กด ์ํ ๋ฐ์ดํฐ์์ ์ด๋ฆ์ ์ ์์ ์ด ๋์ง๋ง ๊ฐ๊ฒฉ์ Null๋ก ๋ค์ด๊ฐ๋๋ค.
๊ธฐ์กด์ ์๋ ์ํ์ด๋ผ๋ฉด ๊ฐ๊ฒฉ์ด Null์ธ ์ฑ๋ก ์๋ก ์์ฑ์ด ๋ฉ๋๋ค.
๊ฐ์ชฝ์ด: ์๋ ๊ทธ๋ผ PUT์ ์ธ์ ์ฐ๋๋ฐ์???
์ข์ ์์๊ฐ ๋ฐ๋ก ์ข์์/์ซ์ด์ ๊ธฐ๋ฅ์ ๋๋ค.
์ํ ์ํฐํฐ์ ์ํ ๋ฒํธ, ์ํ ์ด๋ฆ, ๊ฐ๊ฒฉ
ํ์ ์ํฐํฐ์ ํ์ ๋ฒํธ, ํ์ ์ด๋ฆ
๋ฐ๋ด ์ํฐํฐ์ ๋ณตํฉํค๋ก ์ํ ๋ฒํธ, ํ์ ๋ฒํธ๋ฅผ, ๊ทธ๋ฆฌ๊ณ ์ข์์/์ซ์ด์ ์ํ๋ฅผ ํ๋๋ก ๊ฐ์ง๋ค๊ณ ๊ฐ์ ํฉ์๋ค.
๋ง์ ๋๋ ์ํ์ ์ข์์/์ซ์ด์ ํ๋ค๋ฉด
๋ฐ๋ด ์ํฐํฐ์ ํ์์ด ํด๋น ์ํ์ ์ข์์/์ซ์ด์ ํ๋ค๋ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ์ผ๊ฒ ์ง์.
๊ทธ๋ผ ์ด๋ป๊ฒ ์๋ฒ๋ก ์์ฒญํด์ผ ๋ ๊น์?
์ด๋ด๋!!!
PUT ์์ฒญ์ผ๋ก payload์ ์ํ ๋ฒํธ, ํ์ ๋ฒํธ, ์ข์์ ์ํ๋ฅผ ๋ด์ ๋ณด๋ด๋ ๊ฒ๋๋ค.
๊ทธ๋ ๋ค๋ฉด
๊ธฐ์กด์ ๋ฐ๋ด ์ํฐํฐ๊ฐ ์๋ค๋ฉด -> ์ข์์/์ซ์ด์ ์ํ๋ง ๋ณ๊ฒฝ๋๊ณ
๊ธฐ์กด์ ๋ฐ๋ด ์ํฐํฐ๊ฐ ์๋ค๋ฉด -> ์๋ก ์์ฑ๋ฉ๋๋ค.
๊ฐ์ชฝ์ด: ์ํฐํฐ๊ฐ ์๋ , ์๋ POST ์ฐ๋ฉด ๋๋ ๊ฑฐ ์๋๋๊น?????
๊ทธ๋๋ ์ ์๋ฟ์ง ์์ผ์ ๋ค๊ตฌ์.
๊ทธ๋ด ์ ์์ต๋๋ค. ์ ๋ ๋ง์ ๊ธ์ ๋ดค์ง๋ง ๊ทธ๋๋ ๋ง์ด ํท๊ฐ๋ ธ์ด์.
์ด๋ด ๋ ๋๋ฉ์ธ ๊ด์ ์ผ๋ก ์๊ฐํด ๋ณด๋ฉด ์ข์ต๋๋ค.
ํ์์ด ์ข์์๋ฅผ ๋๋ฅธ๋ค๋ฉด ํ๋ก ํธ์์ ๋ฐฑ์๋๋ก ์ด๋ค ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ๋ณด๋ด์ผ ํ ๊น์?
POST๋ ๋ณดํต ์์ฑํ ๋ ์ฌ์ฉํฉ๋๋ค.
์์ ํ ๋๋ POST๋ก ํ๋ ๊ฒ์ด ๋ง์๊น์ ํ .
๋ชฉ์ ์ ๋ง๊ฒ ์ ์ ํ Method๋ฅผ ์ฐ๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์์ฑ - POST
๊ทธ๋ผ ์์ ์ PUT or PATCH ์ผํ ๋ฐ
์ด๋ฐ ๊ฒฝ์ฐ๋ฉด ๋ฐ๋ด ์ํฐํฐ๋ ์ ์ ์ด์ธ๋ฆฝ๋๋ค.
๋ฐ๋ด ์ํฐํฐ๋ ํ์์ด ์ข์์๋ฅผ ๋๋ฅด๋ ์๊ฐ์ ์ํฐํฐ๊ฐ ์๊ณ ์๊ณ ๋ฅผ ํ๋จํด์ผ ๋ผ์.
ํ์ค์์ ๋จผ์ ์์ฑ๋๋ ์ด๋ฒคํธ๊ฐ ์๋ค๋ ๋ป์ ๋๋ค.
์ํ ์ํฐํฐ๋ ๋จผ์ ์์ฑ๋๋ ์ด๋ฒคํธ๊ฐ ์์ฃ . (์ํ๋ฑ๋ก)
ํ์ ์ํฐํฐ๋ ๋จผ์ ์์ฑ๋๋ ์ด๋ฒคํธ๊ฐ ์์ฃ . (ํ์๊ฐ์ )
๊ทธ๋ฌ๋ฏ๋ก ๋ฐ๋ด ์ํฐํฐ๋ ๋๋ฅด๋ ์๊ฐ์ PUT์ผ๋ก ๋ ๊ฐ์ง ์ํฉ์ ๋ชจ๋ ์ผ์ดํ๋ ๊ฒ์ด ์ด์ธ๋ฆฝ๋๋ค.
์ฌ์ฌ ๊ฐ์ด ์ค์ค ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋คใ ใ ์๊ฐ๋ณด๋ค ์ด๋ ค์์
โ PATCH Method
This specification defines the new HTTP/1.1 [RFC2616] method, PATCH, which is used to apply partial modifications to a resource.
- by RFC
PATCH ์์ฒญ์ ์์์ ๋ํ ๋ถ๋ถ์ ์ธ ์์ ์ ์ ์ฉํ๊ธฐ ์ํ HTTP ๋ฉ์๋์ ๋๋ค.
๊ธฐ์กด ์์์ด ๋ฐ๋์ ์์ด์ผ ํฉ๋๋ค.
์ด์ ๋ฐ๋ก ์์ ์์๋ก ์ค์ปท ๋ค์ด๋์ ๊ฒ์ ์ ๊น ์๊ธฐํ์๋ฉด.
์ํ ์ํฐํฐ์ ํ์ ์ํฐํฐ๋ ์์ฑ์ POST๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์์ฐ์ค๋ฝ์ต๋๋ค.
๊ทธ๋ฌ๋ฉด ์ฒ์ ๋ค์๋ ์์์ธ ์ํ ์์ ์ด๋ ํ์ ์์ ์ ์ด๋กํ๋์?
๋ณดํต ์ผ๋ถ๋ถ์ ์์ ํฉ๋๋ค.
์ํ ๊ฐ๊ฒฉ์ ๋ฐ๊พธ๋ ๋ฐ ๊ตณ์ด ๋ค๋ฅธ ํ๋ ๊ฐ์ ์ถ๊ฐ๋ก ๋ณด๋ด์ ์ํฐํฐ๋ฅผ ์๋ก ๋ฐ๊ฟ ํ์๊ฐ ์์๊น์.
ํ์ ์ด๋ฆ์ ๋ฐ๊พธ๋ ๋ฐ ๊ตณ์ด ๋ค๋ฅธ ํ๋ ๊ฐ์ ์ถ๊ฐ๋ก ๋ณด๋ด์ ์ํฐํฐ๋ฅผ ์๋ก ๋ฐ๊ฟ ํ์๊ฐ ์์๊น์.
๊ทธ๋์ ์ด๋ด ๋ PUT๋ณด๋จ PATCH๊ฐ ์ด์ธ๋ฆฝ๋๋ค.
๋๋จธ์ง๋ ๊ฑด๋ค์ง ์๊ณ ์ผ๋ถ๋ง ์์ ํ๋ ์ํฉ.
๐ PUT ์ฌ์ฉํ๊ธฐ
@Entity
public class ZZim {
private Long id;
private Long boardId;
private Long memberId;
private ZZimType zzimType; // y or n
...
}
๋ง์ฝ ์ฐํ๊ธฐ ์ํฐํฐ๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ์๋ค.
ํ๋์ ์ฐ id, ๊ฒ์ํ id, ํ์ id, ํ๊ทธ ํ์ ์ด ์์ต๋๋ค.
์ด๋ค ๊ฒ์ํ์ ๋ํด
๋๊ตฐ๊ฐ๊ฐ ์ฒ์์ผ๋ก ์ฐ์ ํ๋ค๋ฉด ์์ฑ์ด ๋์ด์ผ ํ๊ณ ,
์์ฑ ์ดํ์ ์ฐ์ ์ทจ์ํ๊ฑฐ๋ ๋ค์ ์ฐ์ ํ๋ค๋ฉด ์ํ๊ฐ ๋ณํด์ผ ํฉ๋๋ค.
์ด๋ PUT Method๊ฐ ์์ฑ๊ณผ ์์ ์ ํ ์ ์์ผ๋ฏ๋ก ์ด์ธ๋ฆฝ๋๋ค.
@PutMapping
public ResponseEntity<Void> update(
@RequestParam Long boardId,
@LoginUser User user,
@RequestBody ZzimRequest request
) {
zzimService.update(id, user.getId(), request);
return ResponseEntity.noContent().build();
}
...
๊ฒ์ํ id์ ํ์ id, ๊ทธ๋ฆฌ๊ณ body์์ ์ฐ ํ์ ์ ๋ฐ์ต๋๋ค.
@Transactional
public void update(Long boardId, Long userId, ZzimType zzimType) {
Zzim zzim = zzimRepository.findByBoardIdAndUserId(boardId, userId)
.map(z -> z.updateType(zzimType))
.orElse(new Zzim(zzimId, userId, zzimType));
zzimRepository.save(zzim);
}
๊ฒ์ํ id์ ํ์ id๋ก ํด๋น ์ฐ ์ํฐํฐ๊ฐ ์๋ ์ง ํ์ธ ํ
์์ผ๋ฉด body๋ก ๋ฐ์์จ ์ฐ ํ์ ์ผ๋ก ์์ ํฉ๋๋ค.
์์ผ๋ฉด ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํด ๋ฐ์์จ ๋ฐ์ดํฐ๋ค๋ก ์๋ก์ด ์ํฐํฐ๋ฅผ ์ ์ฅํฉ๋๋ค.
์ด๋ ๊ฒ PUT์ ์ ์ ํ ํ์ฉํ๋ฉด์ ๋๋ฉ์ธ ์๊ตฌ์ฌํญ์ ๋ง๋ API๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
๐ PATCH ์ฌ์ฉํ๊ธฐ
์ ํ๋ก์ ํธ์ ์ผ๋ถ๋ฅผ ์์๋ก ๋ค๊ฒ ์ต๋๋ค.

๊ธฐ์ ์ผ๋ถ๋ถ์ ์์ ํ๊ธฐ ์ํด
ํ๋ก ํธ์์๋ PATCH๋ก ์ผ๋ถ๋ถ๋ง payload์ ๋ด์ ๋ณด๋ด๊ฒ ๋๊ณ
๋ฐฑ์๋์์ ๋ณด๋ธ RequestBody๋ฅผ DTO๋ก ๋ฐ์ต๋๋ค.


Service์์ id๊ฐ์ผ๋ก ํด๋น ์ํฐํฐ๋ฅผ ์ฐพ๊ณ
DTO๋ฅผ ์ํฐํฐ์ ๋ค์ ์ ๋ฌํด ์ํฐํฐ ์์์ ๋ณ๊ฒฝ์ ํฉ๋๋ค.
์์ผ๋ฉด ์๋ก ์ํฐํฐ๋ฅผ ์์ฑํ๋ ๊ทธ๋ฐ ๊ณผ์ ์ด ํ์ํ์ง ์๊ณ
์ด๋ฌํ ์ํฉ์ ์ค๋ก์ง ์์ ๋ง ํ๊ธฐ ๋๋ฌธ์ PATCH๊ฐ ์ ์ ํฉ๋๋ค.
๐ ๊ฒฐ๋ก
์ ๊ฐ ๋งํ ๊ฒ๋ค์
์ ๋ 100% ์ ๋ต์ ์๋๋๋ค.
์๋ํ๋ฉด PUT, PATCH๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ HTTP ๋ฉ์๋ ์ญ์
ํน์ ํ๋์ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๊ฐ์ ํ ์ ์์ด์.
ํ์ง๋ง ํ์ค์ด๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ ํต์ ์
ํผ๋์ด ์ค์ง ์๋๋ก ์ ์๋ฅผ ์์งํ๊ณ ์งํฌ ํ์๊ฐ ์์ต๋๋ค.
๋ฉฑ๋ฑ์ฑ ์๊ธฐ๋ฅผ ํ์ง ์๋ ์ด์ ๋
์ ๊ฐ ์์ง ์ด๋ ต๊ธฐ๋ ํ๊ณ ์์ด ๋ง์์ ์๋ ์๋ฃ๋ก ๋์ฒดํ๊ฒ ์ต๋๋ค.
๋ค๋ฅธ ๋ ํผ๋ฐ์ค๋ค๋ ๊ผญ ์ฐธ๊ณ ํ์๊ณ ๋น๊ตํด์ ์ ๋ณด๋ฅผ ๋ฐ์๋ค์ด๊ธธ ๋ฐ๋๋๋ค.
๐ Reference