[TIL] Day29 - Redirect, DB insert with JSP

JIONY·2022년 9월 4일
0
post-thumbnail

ㅋㅋㅋ 태그에 입력하는 게 점점 늘어나네 ㅋㅋ 회원가입 페이지를 만들었따..! JSP 파일에 입력한 게 브라우저에 뜨고 거기서 입력한 게 테이블에 들어가다니 신기해서 기절함 ㄴㅇㄱ


Redirect

필요한 상황 예시

POST 방식으로 데이터를 전송한 페이지에서 새로고침을 하면 500 코드가 반환되며 에러가 발생함. (같은 데이터를 다시 제출했기 때문) 500 에러는 생기지 않도록 해야 하며, 발생하더라도 메시지(DB 내부 정보)가 노출되지 않도록 해야 함

[해결책1] post에서 새로고침 금지

  • 유저의 행동을 블로킹하는 건 최소화해야 함(금융거래 등 보안과 주의가 필요한 일부 경우 제외)

[해결책2] 새로고침해도 문제가 없도록 구조를 개선 ✅

  • POST는 데이터를 처리하는 페이지
  • POST 작업이 끝나면 그 페이지에 머물지 않도록 새 페이지를 추가해 Redirect 처리
    - POST 메소드의 return에 redirect 경로를 추가

Redirect 구현

포켓몬스터를 등록하는 예제에서 redirect 처리를 하면 아래와 같음

//Controller.java
@GetMapping("/insert")
public String insert() {
	return "pocketmon/insert";
}
	
@PostMapping("/insert")
public String insert(@ModelAttribute PocketMonsterDto dto) {
	//DB insert
	pocketMonsterDao.insert(dto);
	
	//insert_success 매핑으로 redirect(강제이동) 처리
	return "redirect:insert_success";
}
	
@RequestMapping("/insert_success")
public String insertSuccess() {
	return "pocketmon/insertResult";
}

브라우저에서 개발자 도구를 통해 HTTP 상태 코드를 확인해보면 아래와 같음

  • insert 페이지가 redirect(302) 처리되어 insert_success로 이동, 요청이 성공적으로 수행(200)됨
  • insert_success 페이지에서 새로고침을 해보면, 이전 페이지(insert)가 리스트에서 사라짐
    • 데이터 등록 과정이 다시 일어나지 않음을 알 수 있음


HTTP status code

  • 웹에서 4xx, 5xx 코드가 반환되는 것은 정상적인 상황이 아니기 때문에 사이트 관리자가 즉시 알아야 함

상태 코드 종류

  • 1xx(정보) : 요청을 받았으며 프로세스를 계속 진행합니다.
  • 2xx(성공) : 요청을 성공적으로 받았으며 인식했고 수용하였습니다.
  • 3xx(리다이렉션) : 요청 완료를 위해 추가 작업 조치가 필요합니다.
  • 4xx(클라이언트 오류) : 요청의 문법이 잘못되었거나 요청을 처리할 수 없습니다.
  • 5xx(서버 오류) : 서버가 명백히 유효한 요청에 대한 충족을 실패했습니다.

Redirect vs. Forward

고객을 클라이언트, 상담원을 서버, URL을 통해서 서버의 자원에 접근한다고 생각하고 각 방식을 아래 상황에 비유할 수 있음

//Redirect
1. 고객이 고객센터로 상담원에게 100번으로 전화를 건다.
2. 상담원: 고객님 해당 문의 사항은 200번으로 다시 문의해주세요.
3. 고객은 다시 200번으로 문의해 일을 처리한다.
//Forward
1. 고객이 고객센터로 상담원에게 100번으로 전화를 건다.
2. 상담원은 해당 문의사항에 대해 전문적인 지식을 갖춘 다른 상담원에게 문의해 답을 얻는다.
3. 상담원이 고객에게 답을 전달해 문의사항을 처리한다.

Redirect

  • /insert로 URL 요청을 했다면 응답으로 받은 경로인 /insert_success.jsp로 요청을 다시 보냄. 따라서 새로운 request, response가 생성되고, URL에 변화가 생김
  • DB에 변화를 주는 작업 (회원가입, 게시판 글쓰기 등)의 경우에 적합

Forward

  • /insert로 URL 요청을 했다면 서버 내부적으로 Controller가 View에게 작업을 넘기고 View가 JSP 파일을 렌더링하여 결과 페이지를 클라이언트에게 넘김. 클라이언트는 이 과정을 알 수 없음.따라서 URL 요청이 바뀌지 않음
  • 시스템에 변화가 생기지 않는 작업 (단순 조회, 검색)의 경우에 적합


등록 페이지 구현

Spring Boot에서 데이터 등록하는 페이지를 구현하는 과정을 정리함. DAO와 DTO가 먼저 준비되면 Controller, JSP파일 생성, 메인 페이지에서 각 페이지로의 연결 등의 작업은 순서가 크게 중요하지 않음.

  1. repository package > Dao, DaoImpl 추가
  2. entity package > Dto 추가
  3. controller package > Controller 추가
    1. 빈 등록
    2. 공용 주소 등록
  4. insert.jsp
    1. 데이터 입력 페이지 작성
    2. form 전송 경로/방식 추가
      1. action 속성을 추가하지 않으면 현재 주소가 유지되는데, 적는 것을 권장함(안정성 향상)
  5. insertSuccess.jsp
    1. 등록 완료 페이지 작성
    2. Controller
      1. @GetMapping → return /insert[POST]
      2. @PostMapping → return redirect:insert_success
      3. @GetMapping → return /insertSuccess
        1. Redirect 요청 페이지는 매핑 방식이 크게 상관없으므로 RequestMapping도 사용 가능
  6. home.jsp
    1. 메뉴별 등록 페이지로 이동하는 메뉴 생성(텍스트 링크)



0개의 댓글