수업 복습

게시글 삭제 프로세스 정리

_김영인 2026. 2. 10. 14:37

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