서버가 클라이언트에게 “너 이 주소로 다시 요청해”
라고 응답 결과로 알려주는 것을 의미한다.
클라이언트에게 응답 후 클라이언트 측에서 응답한 내용으로 재요청을 보내기 때문에 두 번의 HTTP 트랜잭션이 발생한다. 또한 서버측에서는 최초의 요청에서 받은 내용을 리다이렉트된 요청과 공유할 수 없는 문제가 있다.
url
요청을 한다.HTTP 상태 코드 302
와 Location
헤더에 redirect url
을 넣어 보낸다.HTTP 상태 코드 302
는 리다이렉션을 나타내는 상태 코드이다.Location
은 HTTP
통신 헤더 항목 중 하나로 리다이렉트 됐을때의 주소를 나타낸다.HTTP 상태 코드 302
를 확인하고 Location
헤더의 url
로 서버에 다시 응답한다.클라이언트가 url
요청을 했을 때 서버내에서 다른 url
요청으로 이동하여 그에 맞는 결과를 응답하는 것
클라이언트는 forward
된 url
의 정보를 알 수 없고, 응답은 두번째 url
에 대한 응답 한 번만 동작한다.
클라이언트는 다른 url
로 forward
된 것을 모르므로, 주소창의 url
또한 변경되지 않는다.
url
요청을 한다.url
로 forward
처리 한다.url
에 대한 호출이 되고 서버에서 클라이언트에게 해당 url
에 대한 응답을 한다.폼 입력 시 입력한 데이터가 유효한 값인지 확인해줘야 한다.
종류 | 역할 |
---|---|
@Size | 문자 길이를 제한한다. |
@NotNull | Null을 허용하지 않는다. |
@NotEmpty | Null 또는 빈 문자열("")을 허용하지 않는다. |
@Past | 과거 날짜만 가능 |
@Future | 미래 날짜만 가능 |
@FutureOrPresent | 미래 또는 오늘날짜만 가능 |
@Max | 최대값 |
@Min | 최소값 |
@Pattern | 정규식으로 검증 |
Form
객체를 새로 만들었다.Form
객체의 인자들에 대해 Validation
어노테이션을 붙여서 적용한다.
@Getter
@Setter
public class QuestionForm {
@NotEmpty(message = "제목은 필수사항입니다.")
@Size(max = 200)
private String subject;
@NotEmpty(message = "내용은 필수사항입니다.")
private String content;
}
@Valid
를 통해 해당 객체에 대한 유효성 검사가 진행된다.@NotEmpty
, @Size
등으로 설정한 검증 기능이 동작한다.BindingResult
객체에 해당 검증을 통한 결과(에러)가 담기게 된다. @PostMapping("/create")
public String questionCreate(@Valid QuestionForm questionForm, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return "question_form";
}
questionService.create(questionForm.getSubject(), questionForm.getContent());
return "redirect:/question/list";
}
목록을 조회하면 현재 페이지에 모든 게시글이 다 출력되므로 페이징 처리를 통해 이 문제를 해결할 필요가 있다.
findAll
Pageable
객체를 입력받아 Page<Question>
객체를 리턴한다.
public interface QuestionRepository extends JpaRepository<Question, Long> {
Question findBySubject(String subject);
Question findBySubjectAndContent(String subject, String content);
List<Question> findBySubjectLike(String subject);
Page<Question> findAll(Pageable pageable);
}
PageRequest.of
page
는 조회할 페이지의 번호이고, 10
은 한페이지에 보여줄 게시물의 개수이다. public Page<Question> getList(int page) {
Pageable pageable = PageRequest.of(page, 10);
return questionRepository.findAll(pageable);
}
0
Page<Question>
객체를 반환받는다.view
에 model
로 전달 @GetMapping("/list")
public String list(Model model, @RequestParam(value = "page", defaultValue = "0") int page) {
Page<Question> paging = questionService.getList(page);
model.addAttribute("paging", paging);
return "/question/question_list";
}