Spring

Spring MVC 출력

영카이브 2024. 3. 5. 05:51

문자열 출력방법(4가지)

  1. TilesViewResolver를 이용한 문서 출력
  2. ResourceViewResolver를 이용한 문서 출력 (1~2 는 앞서 다뤄본 방식)
  3. 서블릿 객체를 얻어서 문자열 출력
  4. @ResponseBody 설정을 통한 문자열 출력

프론트 컨트롤러는 클라이언트로부터 들어오는 모든 요청을 받아서 처리하는 중앙 집중형 컨트롤러이다. 클라이언트의 요청이 들어오면 프론트 컨트롤러가 그 요청을 받아 적절한 핸들러(컨트롤러)에게 전달하고, 핸들러가 요청을 처리한 후에는 프론트 컨트롤러에게 결과를 반환한다.

 

서블릿 객체를 얻어서 문자열 출력하기

프론트 컨트롤러는 클라이언트로부터 들어온 요청을 받아서 적절한 컨트롤러 메서드에 전달한다. 이 때, 컨트롤러 메서드의 파라미터로 HttpServletResponse 객체를 전달한다. 이렇게 전달된 HttpServletResponse 객체를 사용하여 문자열을 출력하고, 그 결과를 클라이언트에게 반환한다. 

 

@Controller
@RequestMapping("/")
public class HomeController{
	
	@RequestMapping("index")
	public void index(HttpServletResponse response) {
		PrintWriter out;
		try {
			out = response.getWriter();
			out.println("Hello Index");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 

 

@ResponseBody 설정을 통한 문자열 출력하기

프론트 컨트롤러는 클라이언트로부터 들어온 요청을 받아서 적절한 컨트롤러 메서드에 전달한다. 컨트롤러 메서드가 @ResponseBody 어노테이션이 설정되어 있다면, 프론트 컨트롤러는 해당 메서드가 반환한 값을 HTTP 응답의 본문으로 사용한다. 이를 통해 별도의 HttpServletResponse 객체를 사용하지 않고도 클라이언트에게 문자열을 출력할 수 있다.

따라서 프론트 컨트롤러는 클라이언트의 요청을 받아서 적절한 컨트롤러 메서드에 전달하고, 컨트롤러 메서드가 처리한 결과를 HTTP 응답으로 반환하는 중간자 역할을 수행한다.

 

@Controller
@RequestMapping("/")
public class HomeController{
	
	@RequestMapping("index")
	@ResponseBody
	public String index(HttpServletResponse response) {
		 return "Hello Index"; 
	}
}

 

 

RestController란?

@RestController는 스프링 프레임워크에서 제공하는 어노테이션으로, 해당 컨트롤러 클래스의 모든 핸들러 메서드가 HTTP 응답의 본문을 직접 작성하도록 지정한다.이는 주로 RESTful 웹 서비스를 개발할 때 사용된다.

일반적으로 @Controller 어노테이션을 사용한 컨트롤러 클래스의 메서드는 뷰를 반환하거나 데이터를 모델에 담아서 뷰로 전달하는 형태로 동작한다. 하지만 @RestController를 사용한 컨트롤러 클래스는 뷰를 반환하는 대신, 메서드가 반환하는 객체나 데이터를 HTTP 응답의 본문으로 직접 전송한다. 이를 통해 JSON이나 XML 형식의 데이터를 클라이언트에게 제공할 수 있습니다.

@RestController를 사용하면 @ResponseBody 어노테이션을 일일히 메서드마다 설정할 필요가 없어지며, 간단하게 RESTful 웹 서비스를 개발할 수 있습니다. 또한 @RestController는 @Controller와 @ResponseBody 어노테이션을 합친 것으로 볼 수 있다.

 

 

한글 출력

servlet-context.xml <mvc:annotation-driven> 에 추가

    <mvc:annotation-driven>
    	<!-- @ResponseBody로 String처리할 때 한글 처리 -->
    	<mvc:message-converters>
    		<bean class="org.springframework.http.converter.StringHttpMessageConverter">
    			<property name="supportedMediaTypes">
    				<list>
    					<value>text/html;charset=UTF-8</value>
    				</list>
    			</property>
    		</bean>
    	</mvc:message-converters>
    </mvc:annotation-driven>
@RestController("apiNoticeController")
@RequestMapping("/api/notice/")
public class NoticeController {
	
	@RequestMapping("list")
	public String list() {
		return "한글 list"; 
	}
}

 

 

JSON 출력

문자열은 객체가 아닌 단순한 데이터 형식이기 때문에 반환이 가능하다. 따라서 클라이언트에게 문자열을 반환하는 것은 매우 일반적이며, 이를 통해 클라이언트는 서버에서 전달된 텍스트 데이터를 사용할 수 있다.

반면에 객체를 반환하는 것은 서버의 메모리에 있는 자바 객체를 그대로 클라이언트로 전송하는 것이 아니라, 해당 객체를 적절한 데이터 형식(JSON, XML 등)으로 변환한 후에 클라이언트에게 전송하는 과정을 거쳐야 한다. 따라서 "객체를 반환한다"는 표현은 클라이언트에게 데이터를 전송한다는 의미에서 사용된다.

 

일반적으로 Spring Framework의 @RestController 애노테이션이 적용된 컨트롤러에서는 자동으로 객체를 적절한 데이터 형식(JSON, XML 등)으로 변환하여 클라이언트에게 전송한다.

 

@RestController("apiNoticeController")
@RequestMapping("/api/notice/")
public class NoticeController {
	
	@Autowired
	private NoticeService service;
	
	@RequestMapping("list")
	public List<Notice> list() throws ClassNotFoundException, SQLException {
		List<Notice> list = service.getList(1, "title", "");
		return list; 
	}
}
 
 

 

 

 

참고 자료 출처 : (57~60)

https://www.youtube.com/watch?v=Zdf6LGtkjD4&list=PLq8wAnVUcTFUHYMzoV2RoFoY2HDTKru3T&index=57