[Spring] Controller 리턴타입 정리 (View Resolver, View Template, Return type)

Julie Mingu·2023년 7월 6일
0
post-thumbnail

JSP에서 Spring Framework로 넘어오고 공부하면서 헷갈렸던 것이 바로

메서드의 리턴타입이었다. 🤯🤯💨

오늘은 각 메서드의 리턴타입을 보면서 WAS의 흐름을 정리한다.

간단한 회원등록 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가 제공하는 친절한 기능이다.

요청한 주소값과 똑같은 🚩파일명🚩으로 view를 구현한다.


📝 내가 직접 그린 WAS흐름도의 일부... (M1패드 놔두고 종이에 항상 그려요..) 📝

반환을 받은 Front Controller 는 이 반환을 View Resolver 라는 인터페이스에 전달한다.
View Resolver가 하는 업무는 Controller가 반환해준 값을 매핑하여 View 객체를 만드는 것이다.
즉 View를 구현할 파일과 값을 연결한다는 뜻이다.
Controller는 값만 띡- 하고 보낼 뿐이지 페이지를 보내지는 않기 때문이다.
Controller는 분배의 역할만을 하고, 실제 View 객체를 생성하지는 않으며
View의 이름만을 결정하는 것이다.
컨트롤러가 보내는 값은 기본 설정상 WEB-INF/Views 폴더에 넣어놓은 파일 중에서 동일한 파일명을 매핑하게 된다.

이렇게 View Resolver가 파일을 매칭해주면,

그 매칭값은 View Template을 통해 HTTP로 변환되어 WebServer로 전달된다.

브라우저에 응답하게 되는 것이다.


📌 많이 쓰이는 Controller 리턴타입 💥

아래 내용은 Spring 명세를 참고하였다.
https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/return-types.html

1. String

@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의 이름을 지정해준다.
예제에서는 리다이렉션으로 처리하였다.


2. Void

가장 간단하지만 호불호가 많이 갈리는 방법이 아닐까 싶다.
바로 요청된 주소 그대로 파일명을 찾아가는 방식이다.

@Controller
public class MemberController {

	@Autowired
	MemberDAO dao; 

	@RequestMapping("insert")
	public void insert(MemberDTO dto) {
		int result = dao.insert(dto);
		System.out.println(result); 
	}

그냥 간단하게 바로 페이지를 반환하고, 개발자 입장에서는 결과를 콘솔에 확인하면 된다.


📌 void와 String 일때, 반환값에 따른 url 변화를 보자면,

1번 : void

@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 파일이 나온다.

2번 : String + return 조합

@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 파일이 나온다.

3번 : String + redirect 조합

@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






그럼 오늘도 즐거운 코딩되시길!👋👋

profile
(੭˙ ˘ ˙)੭🌱 자란다, 잘한다!

0개의 댓글