<@RestController와 한글 출력>


문서를 만드는 것보다 데이터를 만들어서 제공해주는 것(api제공)이 주된 사용법인 컨트롤러 어노테이션이다. (한글 출력이 문제가 되기 때문에 설정이 필요하다)

Controller가 문서를 기반으로 하는 반환값을 가진다면
RestController는 Restful한 형태의 결과물을 반환하는 클레스

@RestController를 사용하면 맵핑을 한 서비스 메소드가 마치 @ResponseBody를 붙인 것과 같은 형태(문자열)를 return 하게 된다


<Springframework dispatcher bean conflict 문제>
컨트롤러 어노테이션을 쓸 때 spring IoC에서 묵시적으로 일어나는 일
@Controller    ...scan
NoticeController noticeController = new NoticeController
<bean id="noticeController " class="...NoticeController">

주로 동일한 이름의 class가 있을 때 일어난다
막아주려면 식별자를 부여해줘야 한다


@RestController("apiNoticeController")
@RequestMapping("/api/notice/")
public class NoticeController {

  @RequestMapping("list")
  public String list() {
    return "notice list";
  }
}

(결과) >> notice list

apiNoticeController 식별자 부여

하지만 return 문자열을 "공지사항 list" 등의 한글로 하면 

(결과) >> ???? list

이런 식으로 나오기 때문에 converter를 사용해 reponse를 가로채 인코딩을 변경해줘야 한다


@RestController 한글 깨짐 문제 해결 코드

 

[servlet.context.xml]

1
2
3
4
5
6
7
8
9
10
11
12
13
 
<mvc:annotation-driven>
    <mvc:message-converters> <!-- @ResponseBody로 String 처리할때 한글처리 -->
        <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>
 
cs




<JSON 출력하기>

JSON (JavaScript Object Notation)은 경량의 DATA-교환 형식이다
본래 자바스크립트가 사용하는 객체 표기법이었는데 현재는 자바스크립트를 넘어서 모든 곳에서 사용 중

[
    {key1: val1, key2: val2, key3: val3}
    {key1: val1, key2: val2, key3: val3}
    {key1: val1, key2: val2, key3: val3}
    {key1: val1, key2: val2, key3: val3}
    {key1: val1, key2: val2, key3: val3}
                                                                  ]

이렇게 생김

서버 쪽 메모리에 올라가있는 객체를 클라이언트로 반환한다는 건 말도안되는 일이므로
XML, CSV, JSON 같은 표현 형식으로 데이터를 변경해서 @RestController를 통해 보내줌

클라이언트는 자바스크립트를 사용하므로 데이터를 보내줄 때는 JSON이 가장 좋은 방법이다
DB 같은 경우 자체적인 경량화를 위해 다른 객체 표기법을 사용하기도 한다 (ex. mongoDB BSON)

그렇다고 JSON 형식으로 만들어주기 위해 Collection을 일일히 꺼내서 for문 돌려가며 formatting 하는 건
매우 귀찮은 일이므로 라이브러리를 쓰자

 

jackson-databind 라이브러리 추가

 

[POM.xml]

1
2
3
4
5
6
7
 
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.2</version>
</dependency>
 
cs

 



List<Notice> 객체 그대로 클라이언트로 던지기

[NoticeController.java]
@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;
  }
}

List<Notice> 객체를 그대로 반환하고 있다
본래라면 말도 안되는 일이지만

 


이렇게 잘 보내짐
브라우저에 저렇게 보기좋게 정렬되는건 크롬 확장프로그램 JSONView 를 설치해서 그렇다
jackson-databind 라이브러리 설치안하면 converter java.utilArrayList 어쩌구는 보낼 수 없어욧 에러가 뜨니 설치 필수


Notice 한개만 보내기
@RequestMapping("list")
public Notice list() throws ClassNotFoundException, SQLException {
List<Notice> list = service.getList(1, "title", "");
return list.get(0);
}

 


잘보내짐

이제 객체 그대로 마구 던져도 알아서 JSON으로 잘 바뀌어서 클라이언트로 보내진다


+ Recent posts