1. 브라우저 vs 뷰: 헷갈리기 쉬운 개념 정리
🌐 브라우저 (Browser)
- 크롬, 엣지, 사파리 같은 클라이언트 프로그램
- 사용자 컴퓨터에서 실행
- 서버에 요청 → HTML 받음 → 화면에 렌더링
[사용자] ←→ [브라우저(Chrome)] ←→ [서버(Tomcat)]
📄 뷰 (View = JSP)
- 서버에 있는 템플릿 파일 (main.jsp, board.jsp 등)
- 서버에서 실행되어 HTML을 생성
- 브라우저는 JSP를 직접 보지 못함 (생성된 HTML만 받음)
[main.jsp] → (서버에서 실행) → [HTML 생성] → [브라우저로 전송] → [화면에 표시]
비유하자면?
- 브라우저 = 식당 손님 (주문하고 요리를 받아 먹음)
- 뷰 (JSP) = 주방의 레시피 (손님은 레시피를 못 보고 완성된 요리만 받음)
2. redirect vs forward: 핵심 차이 3가지
비교표
| 구분 | redirect | forward |
| 요청 횟수 | 2번 (브라우저 거쳐서 재요청) | 1번 (서버 내부 이동) |
| URL 변경 | 변경됨 | 그대로 |
| 용도 | PRG 패턴, 다른 컨트롤러 호출 | 단순 뷰 이동 |
3. 실제 코드로 보는 동작 흐름
redirect 예시: 게시글 삭제
java
// BoardController.java
@GetMapping("/delete")
public String delete(BoardDTO dto) {
boardService.deleteBoard(dto);
return "redirect:main"; // 리다이렉트!
}
// MemberController.java
@GetMapping("/main")
public String mainPage(Model model) {
model.addAttribute("datas", boardService.getBoardList(null));
return "main"; // main.jsp로 포워드
}
```
**실행 흐름:**
```
1. 브라우저 → /delete 요청
2. BoardController.delete() 실행 (DB 삭제)
3. 서버 → 브라우저에 "302 Redirect" 응답
4. 브라우저 → /main 재요청 (자동)
5. MemberController.mainPage() 실행
6. main.jsp → HTML 생성
7. 브라우저에 HTML 전송 → 화면 표시
```
**주소창 변화:**
```
localhost:8088/delete → localhost:8088/main (변경됨!)
forward 예시: 단순 뷰 이동
java
@GetMapping("/board")
public String boardPage(Model model) {
model.addAttribute("data", boardService.getBoard(dto));
return "board"; // 포워드!
}
```
**실행 흐름:**
```
1. 브라우저 → /board 요청
2. BoardController.boardPage() 실행
3. board.jsp → HTML 생성 (서버 내부)
4. 브라우저에 HTML 전송 → 화면 표시
```
**주소창 변화:**
```
localhost:8088/board (그대로 유지)
4. 언제 뭘 써야 할까?
redirect를 써야 하는 경우
POST-Redirect-GET 패턴 (PRG)
java
@PostMapping("/write")
public String write(BoardDTO dto) {
boardService.insertBoard(dto);
return "redirect:main"; // 새로고침 중복 등록 방지
}
이유:
- 등록 / 수정 / 삭제 후 return "main"하면?
- → 새로고침 시 같은 POST 요청 재전송 → 중복 등록 발생!
- redirect로 GET 요청으로 바꾸면 안전
다른 컨트롤러로 이동
java
return "redirect:main"; // MemberController로
return "redirect:/order"; // OrderController로
forward를 써야 하는 경우
단순 조회 후 뷰 표시
java
@GetMapping("/board")
public String boardPage(Model model) {
model.addAttribute("data", boardService.getBoard(dto));
return "board"; // 그냥 조회만 하니까 forward
}
에러 페이지 이동
java
return "error/404"; // URL 유지하면서 에러 표시
5. 자주 하는 실수
잘못된 예시
java
@PostMapping("/delete")
public String delete(BoardDTO dto) {
boardService.deleteBoard(dto);
return "main"; // forward → 새로고침 시 재삭제!
}
올바른 예시
java
@PostMapping("/delete")
public String delete(BoardDTO dto) {
boardService.deleteBoard(dto);
return "redirect:main"; // PRG 패턴!
}
6. 정리 한 방 요약
redirect: 브라우저야, 다시 요청해! (URL 바뀜, 2번 요청)
forward: 서버 내부에서 바로 이동 (URL 유지, 1번 요청)
실무 팁:
- 등록 / 수정 / 삭제 → redirect (PRG 패턴)
- 조회 / 검색 → forward (그냥 return "viewName")
- 다른 컨트롤러 이동 → redirect
redirect 흐름 다시 정리
1. 사용자가 브라우저에서 "삭제" 버튼 클릭
↓
2. 브라우저 → 서버로 /delete 요청
↓
3. BoardController.delete() 실행
↓
4. "redirect:main" 반환
↓
5. 서버 → 브라우저에게 "302 리다이렉트" 응답
↓
6. 브라우저가 자동으로 /main 요청
↓
7. MemberController.mainPage() 실행
↓
8. main.jsp가 HTML로 변환
↓
9. 서버 → 브라우저에게 HTML 전송
↓
10. 브라우저가 HTML을 화면에 렌더링
브라우저 = 요청하고 화면 보여주는 프로그램 (크롬)
뷰 = 서버에서 HTML 만드는 템플릿 파일
'수업 복습' 카테고리의 다른 글
| Python 실습 과제 정리 (0) | 2026.03.11 |
|---|---|
| Python 기초 복습 (0) | 2026.03.11 |
| BoardDAO를 MyBatis로 리팩토링 실습 과제 (0) | 2026.02.09 |
| JDBC DAO에서 MyBatis로 리팩토링 (0) | 2026.02.09 |
| JDBCTemplate + RowMapper (0) | 2026.01.28 |