Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- lombok
- Volatile
- spring security
- nestjs
- 일급 객체
- Google OAuth
- OAuth 2.0
- 일급 컬렉션
- middleware
- builder
- Spring
- factory
- synchronized
- Dependency Injection
- java
Archives
- Today
- Total
HJW's IT Blog
PRG Pattern 은 왜 사용할까? 본문
들어가며
HTTP Post 메서드는 기본적으로 멱등성(idempotence)이 보장되지 않는 메서드 이다. 여기서 멱등성이란 같은 요청이 여러번 반복되어 실행되더라도 결과가 변하지 않는 속성을 의미한다.
예를 들어 클라이언트가 웹 양식을 서버에 제출하고, 서버는 이에 대한 응답을 보냈다고 가정하자. 이 상태에서 클라이언트가 웹페이지를 새로고침 한다면 어떻게 될까?
바로 전과 같은 양식으로 동일한 데이터를 서버로 보낸다
위와 같은 상황이 발생하면, 동일한 개시글 업로드, 중복된 결재 등의 문제를 야기할 수 있다.
PRG Pattern 이란?
PRG
는 Post / Redirect / Get 의 약어이다. 위와 같은 상황에서 데이터 중복 문제를 방지하기 위한 디자인 패턴으로 흐름은 다음과 같다.
- 사용자가 POST 요청을 보낸다
- 서버는 데이터를 처리한 뒤 HTTP 302 redirect 응답을 보낸다
- Client 는 Get 요청으로 최종 결과 페이지를 요청하게 된다
이제 사용자가 새로고침을 하더라도, 이전 양식을 다시 보내는 것이 아닌, redirect 된 Get 요청을 다시 보내게 되는 것이다.
@PostMapping("/add")
public String addItemV3(@ModelAttribute Item item){
itemRepository.save(item);
return "basic/item";
}
위 코드는 PRG 패턴을 적용하지 않은 코드이다. 해당 경로로 POST 요청이 들어오면, item 을 model 에 담아 명시된 경로의 view 를 렌더링 하는데, 이때 새로고침을 하게 되면, 동일한 데이터로 다시 POST 요청을 하게 된다. PRG 패턴을 적용하면 다음과 같다.
@PostMapping("/add")
public String addItemV5(Item item) {
itemRepository.save(item);
return "redirect:/basic/items/" + item.getId();
}
PRG Pattern 장점
PRG Patten 을 사용함으로써 얻을 수 있는 장점은 크게 3가지 이다.
- 데이터 중복 방지
- 이미 언급했지만, 이 패턴의 핵심은 동일 데이터를 서버로 여러번 보내는 상황을 원천적으로 차단하는데에 있다. POST 후 GET 을 통한 리다이렉션으로 클라이언트가 새로고침을 하더라도 POST 가 아닌 GET 으로 재요청을 보내는 것이다. 즉, 같은 데이터를 보내는 것이 방지되는 것이다.
- 서버 안정성 향상
- PRG 패턴은 서버 입장에서도 안정성을 가져다 준다. 만약 PRG 패턴이 없는 상황에서 클라이언트가 계속하여 새로고침을 누른다면, 새로고침 한번당 서버는 불필요한 데이터를 처리해야 한다.
- 브라우저 동작과 UX 일관성
- 사용자 입장에서도, 새로고침을 하였을 때, “이 데이터를 다시 제출하시겠습니가?” 라는 문구가 나온다면 혼란스러워 진다.
'개발 개념' 카테고리의 다른 글
3 Layered vs Clean Architecture (0) | 2025.01.31 |
---|---|
Builder Pattern 에 대한 고찰 (0) | 2025.01.10 |
SOLID 와 TradeOff (0) | 2025.01.09 |
상속보단 합성을 사용하자 (0) | 2025.01.06 |
단일 책임 원칙, 얼마나 쪼개야 ‘적당함’일까? (1) | 2025.01.03 |