JSP에서 Spring Framework로 넘어오고 공부하면서 헷갈렸던 것이 바로
간단한 회원등록 insert 흐름을 보자.
DB에서 insert 하게 되면 그 값은 0 또는 1, int값으로 온다. 그렇기 때문에
DAO 메서드의 반환값이 int가 되는 것이다.
여기서 return 값을 받은 컨트롤러는
int result = dao.insert(dto);
이렇게 반환값을 요청하고 있는 것을 확인할 수 있으며
Controller 의 Return 반환값은 Web Server, 즉 View로의 반환이다.
엄밀히 말하면, Front Controller에게 보내는 신호이다.
바로 View에서 Http로 변환할 수 있는 주소값이다. 즉, 파일명이라고 봐도 좋다.
자, 그럼 여기서 의문이 들 것이다.
void
는 뭔가요?void, null 로도 쓰이는 이 리턴값, 리턴이 없다는 것인가?
아니다. Spring Framework가 제공하는 친절한 기능이다.
📝 내가 직접 그린 WAS흐름도의 일부... (M1패드 놔두고 종이에 항상 그려요..) 📝
반환을 받은 Front Controller 는 이 반환을 View Resolver
라는 인터페이스에 전달한다.
View Resolver가 하는 업무는 Controller가 반환해준 값을 매핑하여 View 객체를 만드는 것이다.
즉 View를 구현할 파일과 값을 연결한다는 뜻이다.
Controller는 값만 띡- 하고 보낼 뿐이지 페이지를 보내지는 않기 때문이다.
Controller는 분배의 역할만을 하고, 실제 View 객체를 생성하지는 않으며
View의 이름만을 결정하는 것이다.
컨트롤러가 보내는 값은 기본 설정상 WEB-INF/Views 폴더에 넣어놓은 파일 중에서 동일한 파일명을 매핑하게 된다.
이렇게 View Resolver가 파일을 매칭해주면,
브라우저에 응답하게 되는 것이다.
아래 내용은 Spring 명세를 참고하였다.
https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/return-types.html
@Controller
public class BbsController {
@RequestMapping("/bbs_insert")
public String insert(BbsDTO bag, BbsDAO dao, Model model) {
int result = dao.insert(bag);
if(result !=1) {
return "exception";
}
model.addAttribute("dto", bag);
return "redirect:bbs_list";
}
return 값으로 View의 이름을 지정해준다.
예제에서는 리다이렉션으로 처리하였다.
가장 간단하지만 호불호가 많이 갈리는 방법이 아닐까 싶다.
바로 요청된 주소 그대로 파일명을 찾아가는 방식이다.
@Controller
public class MemberController {
@Autowired
MemberDAO dao;
@RequestMapping("insert")
public void insert(MemberDTO dto) {
int result = dao.insert(dto);
System.out.println(result);
}
그냥 간단하게 바로 페이지를 반환하고, 개발자 입장에서는 결과를 콘솔에 확인하면 된다.
@RequestMapping("book_insert")
public void insert(BookDTO dto)
http://localhost:8888/mvc004/book.jsp
http://localhost:8888/mvc004/book_insert.jsp
http://localhost:8888/mvc004/book_insert?name=java+master88&url=www.daum.com&img=book1.jpg
=> views의 book_insert
파일이 나온다.
@RequestMapping("book_insert") public String insert(BookDTO dto) { int result = dao.insert(dto); return "book_test"; }
http://localhost:8888/mvc004/book.jsp
http://localhost:8888/mvc004/book_insert.jsp
http://localhost:8888/mvc004/book_insert?name=java+master14&url=www.daum.com&img=book1.jpg
=> views의 book_test
파일이 나온다.
@RequestMapping("book_insert") public String insert(BookDTO dto) { dao.insert(dto); return "redirect:book_list"; }
http://localhost:8888/mvc004/book.jsp
http://localhost:8888/mvc004/book_insert.jsp
http://localhost:8888/mvc004/book_list
=> 기본적으로 스프링에서는 InternalResourceViewResolver라는 뷰 리졸버를 제공하기 때문에
=> views 아래에 있는 book_list로 리다이렉트됨. (주소가 바뀐다는 뜻이다.)
@ResponseBody : 여태껏 주소값을 반환했다면, 이 반환타입으로 직접 본문을 작성할 수 있다.
@RequestMapping("book_insert")
@ResponseBody
public String insert(BookDTO dto) {
dao.insert(dto);
return "ResponseBody 테스트";
}
그외에도 아주 많은 리턴타입이 존재하니, 꼭 명세를 확인하면서 테스트해보시길 바란다!
https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/return-types.html
그럼 오늘도 즐거운 코딩되시길!👋👋