java, spring

[Spring Framework] Controller의 리턴 타입

isaac.kim 2021. 5. 21. 23:57
728x90
반응형

[Spring Framework] Controller의 리턴 타입

 

도움이 되셨다면 광고 한 번 클릭 부탁드립니다. 한 번의 클릭이 제게 큰 힘이 된답니다!^^

 

`

반응형

 

이번 포스팅에서는 Controller의 리턴 타입에 대해 알아보겠습니다.

 

Controller의 메서드가 사용할 수 있는 리턴 타입은 주로 다음과 같습니다.

 

- String : jsp를 이용하는 경우에는 jsp 파일의 경로와 파일이름을 나타내기 위해서 사용합니다.

- void : 호출하는 URL과 동일한 이름의 jsp를 의미합니다.

- VO, DTO 타입 : 주로 JSON 타입의 데이터를 만들어서 반환하는 용도로 사용합니다.

- ResponseEntity 타입 : response 할 때 Http 헤더 정보와 내용을 가공하는 용도로 사용합니다.

- Model, ModelAndView : Model로 데이터를 반환하거나 화면까지 같이 지정하는 경우에 사용합니다(최근엔 많이 사용하지 않음).

- HttpHeaders : 응답에 내용 없이 Http 헤더 메시지만 전달하는 용도로 사용합니다.

 

1. void 타입

 

메서드의 return 타입을 void로 지정하는 일반적인 경우에 해당 URL 정보를 그대로 jsp 파일 이름으로 사용하게 됩니다.

 

 

SampleController 클래스에 다음 내용 추가

	@GetMapping("/ex05")
	public void ex05() {
		log.info("ex05...");
	}

 

 

요청 URL : http://localhost:8080/sample/ex05

 

결과

 

위 로그를 보면 '/WEB-INF/views/sample/ex05.jsp' 파일을 View로 Forwading 하고 있으며, 해당 파일이 존재하지 않아 결과로 404 NOT_FOUND 메시지가 뜨게 됩니다. 이는 servlet-context.xml의 아래 설정과 같이 맞물려 URL 경로를 View로 처리하기 때문에 생기는 결과입니다.

servlet-context.xml의 일부

	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
	</beans:bean>

 

 

2. String 타입

 

void와 String 타입이 Controller에서 가장 많이 사용하는 리턴 타입입니다. String 타입은 상황에 따라 다른 화면을 보여줄 필요가 있을 때 유용하게 사용합니다(if ~ else와 같은 처리가 필요한 상황). 일반적으로 String 타입은 현재 프로젝트의 경우 JSP 파일의 이름을 의미합니다. 프로젝트 생성 시 기본으로 만들어진 HomeController의 코드를 보면 String을 반환 타입으로 사용하는 것을 볼 수 있습니다.

home( ) 메서드는 'home'이라는 문자열을 리턴했기 때문에 경로는 '/WEB-INF/views/home.jsp' 경로가 됩니다.

 

String 타입에는 특별한 키워드를 붙여 사용할 수도 있습니다.

 

- redirect : 리다이렉트 방식으로 처리하는 경우

- forward : 포워드 방식으로 처리하는 경우

 

 

 

3. 객체 타입

 

Controller의 메서드 리턴 타입을 VO(Value Object)나 DTO(Data Transfer Object)타입 등 복합적인 데이터가 들어간 객체 타입으로 지정할 수 있는데, 이 경우는 주로 JSON 데이터를 만들어 내는 용도로 사용합니다.

 

우선 이를 위해서는 jackson-databind 라이브러리를 pom.xml에 추가합니다.

pom.xml에 jackson-databind 라이브러리 추가

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.3</version>
</dependency>

 

SimpleController에 메서드 추가

	@GetMapping("/ex06")
	public @ResponseBody SampleDTO ex06() {
		log.info("ex06...");
		SampleDTO dto = new SampleDTO();
		dto.setAge(10);
		dto.setName("홍길동");
		return dto;
	}

 

URL 요청 : http://localhost:8080/sample/ex06

JSON Type으로 데이터 받은 것을 확인할 수 있습니다.

 

개발자 도구의 Network 탭에서 Response Headers를 보면 Content-Type을 application/json;charset=UTF-8 로 받은 것을 볼 수 있습니다.

 

만일 Jackson-databind 라이브러리가 포함되지 않았다면 다음과 같은 에러 화면을 보게 됩니다. 스프링 MVC는 리턴 타입에 맞게 데이터를 변환해 주는 역할을 지정할 수 있는데 기본적으로 JSON은 처리가 되므로 별도의 설정이 필요로 하지 않습니다. (스프링 3버전까지는 별도 Converter를 작성해야 했음)

 

4. ResponseEntity 타입

 

Web을 다루다 보면 HTTP 프로토콜의 헤더를 다루는 경우도 종종 있습니다. 스프링 MVC는 HttpServletRequest나 HttpServletResponse를 직접 핸들링하지 않아도 이런 작업이 가능하도록 작성되었기 때문에 이러한 처리를 위해 ResponseEntity를 통해서 원하는 헤더 정보나 데이터를 전달할 수 있습니다.

 

SampleController에 추가

	@GetMapping("/ex07")
	public ResponseEntity<String> ex07() {
		log.info("ex07...");
		String msg = "{\"name\": \"홍길동\"}";
		
		HttpHeaders header = new HttpHeaders();
		header.add("Content-Type", "application/json;charset=UTF-8");
		
		return new ResponseEntity<>(msg, header, HttpStatus.OK); 
	}
	

ResponseEntity는 HttpHeaders 객체를 같이 전달할 수 있고, 이를 통해서 원하는 HTTP 헤더 메시지를 가공하는 것이 가능합니다. ex07( )의 경우 브라우저에는 JSON타입이라는 헤더 메시지와 200 OK라는 상태 코드를 전송합니다.

 

브라우저 > 개발자도구 > Network > Headers > Response Headers 확인


이번 글에서는 스프링 Controller의 리턴 타입에 대해 알아보았습니다.

 

도움이 되셨다면 광고 한 번 클릭 부탁드립니다. 한 번의 클릭이 제게 큰 힘이 된답니다!^^
728x90
반응형