[Spring] JSON 변환

2020. 8. 7. 02:52Spring/Spring

1. JSON 변환

1) JSON

데이터베이스에 저장하기 위해 BoardVO 객체를 사용해왔다. BoardVO 객체에 저장된 데이터를 JSON 데이터로 변환하여 BoardVO 객체가 가진 변수와 값이 Key-Value 형태로 표현이 된다. 여러개의 데이터일 경우에는 배열로 처리가 된다.

{
    "seq":1,
    "title":"가입인사",
    "writer":"관리자",
    "content":"잘 부탁드립니다.",
    "regDate":2020-07-27,
    "cnt":0
}
[	
	{
        "seq":1,
        "title":"가입인사",
        "writer":"관리자",
        "content":"잘 부탁드립니다.",
        "regDate":2020-07-27,
        "cnt":0
    },
    {
        "seq":2,
        "title":"임시제목",
        "writer":"홍길동",
        "content":"임시 내용...",
        "regDate":2020-07-27,
        "cnt":0
    }
]

2) 라이브러리 추가

JSON 데이터로 변환하기 위해서는 jackson2 라이브러리를 추가해야한다.

pom.xml

pom.xml

3) HttpMessageConvertor 등록

브라우저에서 서블릿이나 JSP 파일 요청 시, 서버는 클라이언트가 요청한 서블릿이나 JSP를 찾아서 실행한다. 그리고 결과를 HTTP 프로토콜 바디에 저장하여 결과를 전송한다. 이 응답을 HTML이 아닌 JSON이나 xml로 변환하여 저장하기 위해 HttpMessageConvertor를 통해 변환한다. 이 변환기를 이용하면 자바 객체를 다양한 타입으로 변환하여 HTTP 응답 바디에 설정할 수 있다.

 

HttpMessageConvertor 변환기를 구현한 클래스 중, 자바 객체를 JSON으로 변환할 때는 MappingJackson2HttpMessageConvertor를 사용한다. xml 변환을 위해 설정 파일에 등록한다.

/src/main/webapp/WEB-INF/config/
presentation-layer.xml

presentation-layer.xml

4) 링크 추가 및 Controller 수정

사용자가 JSON 형태로 글 목록을 요청할 수 있도록 index.jsp 파일에 링크를 추가하고 글 목록 변환을 처리할 수 있는 메서드를 추가한다.

 

요청을 처리할 메서드는 글 목록을 검색하여 반환하는 getBoardList() 메서드와 동일하지만, 자바 객체를 @ResponseBody 어노테이션을 이용하여 HTTP 프로토콜의 몸체로 변환한다. 스프링 컨테이너는 <mvc:annotation-driven>의 설정 파일을 통해 변환기 객체를 생성하고, @ResponseBody 어노테이션이 적용된 메서드 결과는 JSON으로 변환되어 HTTP 응답 바디에 설정된다.

/src/main/webapp/WEB-INF/
index.jsp

index.jsp

/src/main/java/
BoardController.java

BoardController.java

5) 출력 정보 제한

BoardVO 클래스에서 Getter 메서드에 @JsonIgnore 어노테이션을 이용하여 특정 정보만 출력할 수 있도록 한다. (업로드 정보, 검색 조건, 검색 키워드)

/src/main/java/
BoardVO.java

BoardVO.java

6) 문제 해결

실행할 때, ReqeustMappingHandlerAdapter 에러가 나오는 경우가 있다. 이럴 경우, databind-annotation-core 3개의 의존성 버전이 달라서 문제가 생기기 때문에 최신버전으로 지정 시 해결이 가능하다.

 

또 다른 한가지는, 익스플로어에서 JSON 결과를 보여줄 수 없기 때문에 크롬 브라우저를 이용하여 결과를 확인할 수 있다.

pom.xml

pom.xml

 

 

 

2. xml 변환

1) JAXB 2

JAXB 2 API는 자바 6 이후 버전에 기본으로 포함되어 있기때문에 라이브러리 추가는 필요 없다.

2) BoardVO 수정

@XmlAccessorType는 BoardVO 객체를 xml로 변환할 수 있다는 의미이며, XmlAccessType.FIELD로 변수는 자동으로 자식 엘리먼트로 표현한다는 의미이다. @XmlAttribute는 seq 속성으로 표현하는 의미이고, xml 변환 제한은 @XmlTransient 어노테이션으로 설정한다.

 

java.sql.Date 클래스에는 기본 생성자가 없다. 그리고 특정 자바 객체를 xml로 변환하기 위해서는 기본 생성자가 필요하다. 그렇기 때문에 java.util.Date로 변경한다.

/src/main/java/
BoardVO.java

BoardVO.java

3) BoardListVO 추가

xml 문서는 반드시 단 하나의 루트 엘리먼트가 있어야 한다. BoardVO는 하나의 게시글 정보를 저장하려고 사용하는 객체이다. 게시글 목록을 xml로 나타내야하기 때문에 BoardVO 객체를 여러개 포함하면서 루트 엘리먼트로 사용할 BoardListVO 클래스를 추가한다.

 

@XmlRootElement는 루트 엘리먼트로 설정한다는 의미이며, @XmlElement의 경우 엘리먼트의 이름을 설정한다.

/src/main/java/
BoardListVO.java

BoardListVO.java

4) Controller 수정

/src/main/java/
BoardController.java

BoardController.java

5) 날짜 형태

기존 결과와 다르게 날짜 정보가 다르게 출력이 되는걸 확인할 수 있다. 이는 java.util.Date 클래스로 변경했기 때문에 다르게 출력이 된다. 일반적인 날짜 형태로 변경하기 위해서는 JSTL 포맷 태그를 이용하면 된다.

/src/main/webapp/WEB-INF/
getBoardList.jsp

getBoardList.jsp

구현 화면

구현 화면


[참고] yuien.tistory.com/entry/spring-jackson-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-500%EC%97%90%EB%9F%AC

[참고] 스프링 퀵 스타트

728x90

'Spring > Spring' 카테고리의 다른 글

[Spring] Mybatis 프레임워크 (2)  (0) 2020.08.11
[Spring] Mybatis 프레임워크 (1)  (0) 2020.08.08
[Spring] 다국어 설정 (2)  (0) 2020.08.06
[Spring] 다국어 설정 (1)  (0) 2020.08.05