반응형

Thymeleaf란?

  • "타임 리프"라고 읽는다.
  • 텍스트, HTML, XML, Javascript, CSS 그리고 텍스트를 생성할 수 있는 템플릿 엔진이다.
  • 순수 HTML로 템플릿을 작성할 수 있다.
  • Spring Boot에서 사용이 권장되고 있다. (Spring Boot에서는 JSP를 추천하지 않는다.)

http://www.thymeleaf.org/documentation.html



Hello World

코드 작성

build.gradle

dependencies {
    compile 'org.springframework.boot:spring-boot-starter-web'
+   compile 'org.springframework.boot:spring-boot-starter-thymeleaf'
    compile 'org.webjars:jquery-ui:1.11.4'
}

src/main/java/sample/springboot/web/HelloController.java

package sample.springboot.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/hello")
public class HelloController {

    @RequestMapping(method=RequestMethod.GET)
    public String hello() {
        return "hello";
    }
}

src/main/resources/templates/hello.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Hello Thymeleaf</title>
  </head>
  <body>
    <h1>Hello Thymeleaf</h1>
  </body>
</html>

실행 결과

브라우저로 http://localhost:8080/hello 에 접속한다.

설명

의존관계 추가

build.gradle

dependencies {
    compile 'org.springframework.boot:spring-boot-starter-web'
+   compile 'org.springframework.boot:spring-boot-starter-thymeleaf'
    compile 'org.webjars:jquery-ui:1.11.4'
}

Thymeleaf을 사용할 수 있도록 의존관계을 추가한다.

컨트롤러의 구현

@Controller
@RequestMapping("/hello")
public class HelloController {

    @RequestMapping(method=RequestMethod.GET)
    public String hello() {
        return "hello";
    }
}
  • 템플릿을 반환하는 경우 클래스에 @RestController 대신에 @Controller 어노테이션을 부여한다.
  • 메소드의 반환 값으로 표시하는 템플릿의 경로를 지정한다.
    • 템플릿 파일은 클래스 경로에 templates 패키지 아래에 위치한다.
    • 컨트롤러 메소드가 리턴 한 문자열이 templates 패키지에서 상대 경로가 된다 (확장자는 생략 가능).



화면에 값을 포함

코드 작성

src/main/java/sample/springboot/web/Hoge.java

package sample.springboot.web;

public class Hoge {

    public int id;
    public String value;

    @Override
    public String toString() {
        return "Hoge [id=" + id + ", value=" + value + "]";
    }
}

src/main/java/sample/springboot/web/HelloController.java

package sample.springboot.web;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/hello")
public class HelloController {

    @RequestMapping(method=RequestMethod.GET)
    public String hello(Model model) {
        Hoge hoge = new Hoge();
        hoge.id = 10;
        hoge.value = "hoge";

        model.addAttribute("myData", hoge);

        return "hello";
    }
}

src/main/resources/templates/hello.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
  <head>
    <meta charset="UTF-8" />
    <title>Hello Thymeleaf</title>
  </head>
  <body>
    <dl>
      <dt>id</dt>
      <dd th:text="${myData.id}"></dd>

      <dt>value</dt>
      <dd th:text="${myData.value}"></dd>
    </dl>
  </body>
</html>

실행 결과

브라우저로 http://localhost:8080/hello 에 접속한다.

설명

  • 컨트롤러 메소드에서 Model을 인수받을 수 있도록 한다.
  • 이 Model의 addAttribute () 메소드를 사용하여 화면에 출력하고 싶은 정보를 설정한다.
  • 화면 측에서 먼저 Thymeleaf에 대한 네임 스페이스를 정의 (xmlns : th)
    • th : text 속성에 지정된 값을 텍스트로 출력한다.
    • th : text의 값은 $ {...}와 같이 EL 표현식스러워 출력 값을 지정한다.

반복 출력

코드 작성

src/main/java/sample/springboot/web/HelloController.java

package sample.springboot.web;

import java.util.Arrays;
import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/hello")
public class HelloController {

    @RequestMapping(method=RequestMethod.GET)
    public String hello(Model model) {
        List<Hoge> list = Arrays.asList(
                            new Hoge() {{
                                id = 10;
                                value = "hoge";
                            }},
                            new Hoge() {{
                                id = 20;
                                value = "fuga";
                            }},
                            new Hoge() {{
                                id = 30;
                                value = "piyo";
                            }});

        model.addAttribute("hogeList", list);

        return "hello";
    }
}

src/main/resources/templates/hello.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
  <head>
    <meta charset="UTF-8" />
    <title>Hello Thymeleaf</title>
  </head>
  <body>
    <dl th:each="hoge : ${hogeList}">
      <dt>id</dt>
      <dd th:text="${hoge.id}"></dd>

      <dt>value</dt>
      <dd th:text="${hoge.value}"></dd>
    </dl>
  </body>
</html>

설명

  • `th:each`으로 지정된 컬렉션을 반복 할 수 있다.


반응형
반응형

WebJars이란?

jQuery이나 Bootstrap 같은 클라이언트 사이트의 라이브러리를 jar로 하여, Java 라이브러리와 같은 요령으로 Maven과 Gradle에 따라 관리 할 수 있도록 한 서비스.

WebJars - Web Libraries in Jars




jQuery UI를 입력해 보기


WebJars에서 사용 가능한 라이브러리를 찾을 수 있다.

코드 작성

build.gradle

dependencies {
    compile 'org.springframework.boot:spring-boot-starter-web'
+   compile 'org.webjars:jquery-ui:1.11.4'
}

src/main/resources/static/index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>jQuery UI by WebJars</title>

    <link rel="stylesheet" href="/webjars/jquery-ui/1.11.4/jquery-ui.min.css" />

    <script src="/webjars/jquery/1.11.1/jquery.min.js"></script>
    <script src="/webjars/jquery-ui/1.11.4/jquery-ui.min.js"></script>
    <script>
    $(function() {
        $('button')
          .button()
          .on('click', function() {
              alert('Hello WebJars!!');
          });
    });
    </script>
  </head>
  <body>
    <button>Hello</button>
  </body>
</html>

실행 결과

서버를 시작하고 브라우저에서 http://localhost:8080/로 이동한다.

설명

  • WebJars에 추가한 라이브러리는 webjars/ 이하 경로를 통해 접근 할 수 있다.
  • 폴더 구성, jar 속을 보거나 WebJars에서 오른쪽에 있는 Files 링크를 클릭하면 알 수 있다.


반응형
반응형

폴더 구조

|-build.gradle
`-src/main/resources/
  |-static/
  | `-static.html
  |-public/
  | `-public.html
  |-resources/
  | `-resources.html
  `-META-INF/resources/
    `-m-resourceshtml

각 HTML 파일의 내용은 파일 이름이 적힌 일반 텍스트이다.

어플리케이션 기동

이 상태에서 Spring Boot를 시작하고 다음과 같이 사용한다.

$ curl http://localhost:8080/static.html
static.html

$ curl http://localhost:8080/public.html
public.html

$ curl http://localhost:8080/resources.html
resources.html

$ curl http://localhost:8080/m-resources.html
m-resources.html

정적 파일 접근

아래와 같이 클래스 경로의 폴더에 파일을 배치하면 정적 파일로 접근을 할 수 있다.

  • static
  • public
  • resources
  • META-INF/resources


반응형
반응형

기본으로 다음과 같이 예외가 처리된다.

  • REST 클라이언트의 경우

    • throw 된 예외의 정보와 HTTP 상태 코드를 포함한 JSON 문자열.
  • 브라우저의 경우

    • 기본 오류 페이지 (Whilelabel Error Page)



특정 예외가 발생했을 때의 상태 코드 지정하기

코드 작성

src/main/java/sample/springboot/web/MyException.java

package sample.springboot.web;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

@ResponseStatus(HttpStatus.BAD_REQUEST)
public class MyException extends RuntimeException {
    private static final long serialVersionUID = 1L;

    public MyException(String msg) {
        super(msg);
    }
}

src/main/java/sample/springboot/web/WebApiController.java

package sample.springboot.web;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class WebApiController {

    @RequestMapping(method=RequestMethod.GET)
    public void method1() {
        throw new MyException("test exception");
    }
}

실행 결과

curl으로 테스트하기

$ curl http://localhost:8080/api
{"timestamp":1430489386562,"status":400,"error":"Bad Request","exception":"sample.springboot.web.MyException","message":"test exception","path":"/api"}

설명

  • 작성한 예외 클래스를 @ResponseStatus에 어노테이션을 부여함으로써, 그 예외가 throw되었을 때의 상태 코드를 지정할 수 있다.
  • 브라우저에서 액세스하는 경우 기본 오류 페이지가 표시된다.




모든 예외 처리하기

코드 작성

src/main/java/sample/springboot/web/MyExceptionResolver.java

package sample.springboot.web;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

@Component
public class MyExceptionResolver implements HandlerExceptionResolver {

    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println(ex.getClass() + " : " + ex.getMessage());

        ModelAndView mv = new ModelAndView();
        mv.setViewName("my-error");

        return mv;
    }
}

src/main/resources/templates/my-error.html

<h1>My Error Page</h1>

src/main/java/sample/springboot/web/WebApiController.java

package sample.springboot.web;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class WebApiController {

    @RequestMapping(method=RequestMethod.GET)
    public void method1() {
        throw new MyException("test exception");
    }

    @RequestMapping(value="/null", method=RequestMethod.GET)
    public void method2() {
        throw new NullPointerException("test exception");
    }
}

실행 결과

curl으로 테스트하기

$ curl http://localhost:8080/api
{"timestamp":1430490625809,"status":400,"error":"Bad Request","exception":"sample.springboot.web.MyException","message":"test exception","path":"/api"}

$ curl http://localhost:8080/api/null
<h1>My Error Page</h1>

서버 콘솔 출력

class java.lang.NullPointerException : test exception

설명

  • HandlerExceptionResolver을 구현한 클래스를 생성하고, @Component로 컨테이너에 등록한다.
  • 그러면 컨트롤러에서 예외가 발생하면 등록된 클래스의 resolveException () 메소드가 호출된다.
  • 그러나 @ResponseStatus로 주석 된 클래스가 발생 된 경우는 불리지 않는다.
  • resolveException () 메소드는 ModelAndView를 반환 하도록 되어 있기 때문에 어떤 페이지를 표시 할 수 있다.



Web API 액세스의 경우 json으로 반환하기

컨트롤러 단위로 예외 처리를 정의하기

코드 작성

src/main/java/sample/springboot/web/WebApiController.java

package sample.springboot.web;

import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class WebApiController {

    @RequestMapping(method=RequestMethod.GET)
    public void method1() {
        throw new MyException("test exception");
    }

    @RequestMapping(value="/null", method=RequestMethod.GET)
    public void method2() {
        throw new NullPointerException("test exception");
    }

    @ExceptionHandler(NullPointerException.class)
    public String handling(NullPointerException e) {
        return "{\"message\":\"" + e.getMessage() + "\"}";
    }
}

실행 결과

curl으로 테스트하기

$ curl http://localhost:8080/api/null
{"message":"test exception"}

설명

  • @ExceptionHandler 어노테이션을 메소드에 정의하면, 해당 컨트롤러 내에서만 유효한 예외 핸들링이 가능하다.
  • @ExceptionHandler의 value는 처리하고자 하는 예외(Exception) Class 객체를 건네 준다.



반응형
반응형

URL 매핑

코드 작성

src/main/java/sample/springboot/web/HelloController.java

package sample.springboot.web;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/hello")
public class HelloController {

    @RequestMapping(method=RequestMethod.GET)
    public String getMethod() {
        return "get";
    }

    @RequestMapping(method=RequestMethod.POST)
    public String postMethod1() {
        return "post";
    }

    @RequestMapping(value="/hey", method=RequestMethod.POST)
    public String postMethod2() {
        return "hey post";
    }
}

실행 결과

curl로 테스트한다.

$ curl http://localhost:8080/hello
get

$ curl http://localhost:8080/hello -X POST
post

$ curl http://localhost:8080/hello/hey -X POST
hey post

설명

  • @RequestMapping 메서드 (클래스)와 경로를 매핑한다.
  • value 속성에 경로를 지정한다.
  • method 속성에 HTTP 메소드를 지정한다.



경로 변수(@PathVariable)값 얻기

코드 작성

src/main/java/sample/springboot/web/HelloController.java

package sample.springboot.web;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/hello")
public class HelloController {

    @RequestMapping(value="/{id}/{name}", method=RequestMethod.GET)
    public void getMethod(@PathVariable int id, @PathVariable String name) {
        System.out.println("id=" + id + ", name=" + name);
    }
}

실행 결과

curl으로 테스트하기

$ curl http://localhost:8080/hello/100/hoge

서버 콘솔 출력

id=100, name=hoge

설명

  • 경로의 정의에 중괄호 ({})로 묶은 매개 변수를 정의한다.
  • 메소드의 매개 변수로 같은 이름의 인수를 정의한다.
  • @PathVariable 어노테이션이 부여한다.



쿼리 파라미터(@RequestParam)값 얻기

코드 작성

src/main/java/sample/springboot/web/HelloController.java

package sample.springboot.web;

import java.util.Map;

import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/hello")
public class HelloController {

    @RequestMapping(method=RequestMethod.GET)
    public void getMethod(
            @RequestParam String id,
            @RequestParam Map<String, String> queryParameters,
            @RequestParam MultiValueMap<String, String> multiMap) {

        System.out.println("id=" + id);
        System.out.println(queryParameters);
        System.out.println(multiMap);
    }
}

실행 결과

curl으로 테스트하기

$ curl "http://localhost:8080/hello?id=100&name=hoge&name=fuga"

서버 콘솔 출력

id=100
{id=100, name=hoge}
{id=[100], name=[hoge, fuga]}

설명

  • 메소드의 인수에 @RequestParam 어노테이션를 부여하면 쿼리 매개 변수를 얻을 수 있다.
  • 인수의 형태가 Map이라면 쿼리 파라미터 정보를 Map 형태로 얻을 수 있다.
  • 하나의 매개 변수에 여러 값이 설정되어있는 경우, Spring에서 제공하는 MultiValueMap로 받을 수 있다.



요청 헤더(@RequestHeader)값 얻기

코드 작성

src/main/java/sample/springboot/web/HelloController.java

package sample.springboot.web;

import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/hello")
public class HelloController {

    @RequestMapping(method=RequestMethod.GET)
    public void getMethod(@RequestHeader("Test-Header") String value) {
        System.out.println("Test-Header=" + value);
    }
}

실행 결과

curl으로 테스트하기

$ curl -H "Test-Header: hoge" http://localhost:8080/hello

서버 콘솔 출력

Test-Header=hoge

설명

  • @RequestHeader로 헤더 정보를 얻을 수 있다.



요청 바디(@RequestBody)값 얻기

코드 작성

src/main/java/sample/springboot/web/HelloController.java

import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/hello")
public class HelloController {

    @RequestMapping(method=RequestMethod.POST)
    public void getMethod(@RequestBody String body) {
        System.out.println("body=" + body);
    }
}

실행 결과

curl으로 테스트하기

$ curl http://localhost:8080/hello -X POST -d "Request Body"

서버 콘솔 출력

body=Request Body

설명

  • @RequestBody에서 요청 바디를 얻을 수있다.



응답 상태 코드(@ResponseStatus)값 지정하기

코드 작성

src/main/java/sample/springboot/web/HelloController.java

package sample.springboot.web;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/hello")
public class HelloController {

    @RequestMapping(method=RequestMethod.GET)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public void getMethod() {
    }
}

실행 결과

curl으로 테스트하기

$ curl http://localhost:8080/hello -v
( 생략 )

< HTTP/1.1 400 Bad Request
* Server Apache-Coyote/1.1 is not blacklisted
< Server: Apache-Coyote/1.1
< Content-Length: 0
< Date: Wed, 29 Apr 2015 11:50:08 GMT
< Connection: close

( 생략 )

설명

  • 메소드를 @ResponseStatus에 어노테이션을 부여하고 value에 상태 코드를 지정하면, 그 응답의 상태 코드를 지정할 수 있다.
  • 아무것도 지정하지 않으면 200 OK가 반환된다.



여러가지 응답의 반환 방법

Spring MVC의 컨트롤러 메소드에서 사용할 수 있는 반환 값에 어떤 것이 있는지, 어떤 방법이 있는지 대해 설명한다.

@Controller와 @RestController의 차이

먼저 @Controller와 @RestController의 차이를 설명한다.

Spring MVC에서 컨트롤러 클래스에 어노테이션으로 @Controller 또는 @RestController을 붙인다.

@Controller는 주로 Web 페이지의 컨트롤러에서 사용한다.
Web 페이지용 컨트롤러는 JSP나 템플릿 엔진 View로 전환 응답의 HTML을 생성하기 때문에 기본적으로 메소드의 반환 값은 View 전환 대상을 지정하는 데 사용한다.

@RestController는 Json이나 XML 등을 반환 WebAPI 용 컨트롤러로 사용한다.
이것은 View로 전환하지 않기 때문에 메소드의 반환 값은 응답(response)의 내용(content)이 된다.

@Controller

반환 값을 String으로 한다.

View 이동 페이지를 지정하는 가장 간단한 방법이다.

@RequestMapping("/method1")
public String method1() {
    return "/index.html";
}

반환 값을 ModelAndView으로 한다.

ModevAndView를 사용하면 View로 전달하려는 정보를 함께 반환할 수 있다.

@RequestMapping("/method2")
public ModelAndView method2() {
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject(new User("kimkc"));
    modelAndView.setViewName("/index.html");
    return modelAndView;
}

포워드

반환 값으로 지정하여 이동처로 "forward:"를 붙이면 다른 컨트롤러 메소드로 이동한다.

@RequestMapping("/forward1")
public String forward1() {
    return "forward:method1";
}

리다이렉트

리다이렉트하려면 "redirect:"를 붙인다.

@RequestMapping("/redirect1")
public String redirect1() {
    return "redirect:method1";
}

외부 URL을 지정하는 경우도 있다.

@RequestMapping("/redirect2")
public String redirect2() {
    return "redirect:https://www.google.co.jp/";
}

컨트롤러에서 직접 텍스트 콘텐츠를 반환한다.

메소드에 @ResponseBody를 붙이면 반환 값으로 직접 응답 내용을 반환할 수있다.

    @RequestMapping("/text1")
    @ResponseBody
    public String text1() {
        return "text content";
    }

HttpServletResponse에서 텍스트 콘텐츠를 반환한다.

반환 값을 void로하고 HttpServletResponse를 인자로 받도록하면 직접 응답을 쓸 수도 있다.

@RequestMapping("/text2")
public void text2(HttpServletResponse res) throws IOException {
    res.getWriter().write("text content");
}

@RestController

반환 값으로 텍스트 콘텐츠를 반환한다.

@RestController을 붙인 컨트롤러 메소드에서는 @ResponseBody를 사용하지 않고도 반환 값이 응답 내용이 된다.

@RequestMapping("/text1")
public String text1() {
        return "text content";
}

HttpServletResponse에서 텍스트 콘텐츠를 반환한다.

@Controller의 경우와 마찬가지로 HttpServletResponse에서 직접 콘텐츠를 쓸 수 있다.

@RequestMapping("/text2")
public void text2(HttpServletResponse res) throws IOException {
    res.getWriter().write("text content");
}

콘텐츠 형식을 지정한다.

콘텐츠 형식을 @RequestMapping의 produces으로 지정한다.

@RequestMapping(value = "/xml1", produces = "application/xml")
public String xml1() {
    return "<a><b>content</b></a>";
}

org.springframework.http.MediaType 클래스에 콘텐츠 형식의 상수가 정의되어 있으므로 이것을 사용하면 좋다.

@RequestMapping(value = "/xml2", produces = MediaType.APPLICATION_XML_VALUE)
public String xml2() {
    return "<a><b>content</b></a>";
}

HTTP 상태 및 응답 헤더를 지정한다.

HTTP 상태 및 콘텐츠 형식 이외의 응답 헤더를 지정하고 싶을 때는 반환 값을 ResponseEntity한다.

@RequestMapping("/responseEntity")
public ResponseEntity<String> responseEntity() {
    HttpHeaders headers = new HttpHeaders();
    headers.add("header1", "heaer1-value");
    HttpStatus status = HttpStatus.NOT_FOUND;
    return new ResponseEntity<String>("text content", headers, status);
}

JSON을 반환한다.

메소드의 반환 값을 임의의 클래스로하면, SpringMVC가 Jackson을 사용하여 json로 변경하여 반환해준다.

@RequestMapping("/json")
public List<User> json() {
    return Arrays.asList(new User("kim", "kc"), new User("kim", "sj"));
}
[
    {
        "lastName": "kim",
        "firstName": "kc"
    },
    {
        "lastName": "kim",
        "firstName": "sj"
    }
]

파일 다운로드

흔히 볼 샘플에서는 HttpServletResponse 직접 쓰는 경우가 많을 거다.

@RequestMapping("/file1")
public void file1(HttpServletResponse res) throws IOException {
    File file = new File("pom.xml");
    res.setContentLength((int) file.length());
    res.setContentType(MediaType.APPLICATION_XML_VALUE);
    FileCopyUtils.copy(new FileInputStream(file), res.getOutputStream());
}

반환 값을 org.springframework.core.io.Resource 인터페이스하면 더 쉽게 구현할 수 있다.

@RequestMapping(value = "/file2", produces = MediaType.APPLICATION_XML_VALUE  public Resource file2() {
    return new FileSystemResource("pom.xml");
}

반환 값이 Resource이면 Content-Length는 자동으로 설정 해준다.

org.springframework.core.io.Resource의 구현 클래스에서 자주 사용할 것 같은 것을 아래와 같다.

  • FileSystemResource
  • ClassPathResource
  • ServletContextResource
  • ByteArrayResource
  • InputStreamResource

그 밖에

이외에도 그 밖에도 방법은 여러가지 있을 수 있다. 더 자세하게 알고 싶다면 Spring Framework 문서 등을 참조하기 바란다.




반응형
  1. 소멸하고싶다 2019.02.26 17:38

    감사합니다. 사랑합니다.

  2. 노력충 2020.01.20 21:19 신고

    감사합니다. 많은 도움이 됐습니다.

+ Recent posts