origoni's Blog from Millky

origoni의 스프링 블로그 입니다.

[블로그개발_16 - 작성중] RSS 뷰 추가 (Repository, Exception, messages.properties)

작성 중 입니다.
테스트는 여기서 부탁드립니다. :  http://blog.millky.com




블로그개발 시리즈 - 다른글 : http://millky.com/@origoni/folder/30/post/list

라이브 데모 : http://blog.millky.com/post/list

자바 웹 개발 시작하기 : http://www.slideshare.net/origoni/presentations




이번시간은 새로운 뷰를 추가해보도록 하겠다.

지금은 컨트롤러에 거의 모든(?) 기능이 만들어져 있다.

컨트롤러 하나만 가지고 정말 간단하게 블로그를 만든다는것은 좋은 일이지만. 우리가 하는 프로그래밍이 어디 그렇게 간단하기만 했는가.


예외는 항상 나오게 마련이고.

새로운 API도 항상 필요하기 마련이다.

블로그에.. API를 추가한다는것이.. 아직은 목적도 없이 너무 오버 하는것 같아서.

블로그라면 꼭 필요한 RSS뷰를 만들어 보려 한다.


RSS를 만들기 위해서는 여러가지 방법이 있을 수 있겠지만. (자바에서는 대표적으로 ROME가 있다.)

우리는 간단하게.. 하는 중이니까. 계속 공부해오던 JSP를 사용해 보겠다.



그럼 시작해본다.


우선 이전에 만들어 놓은 Post컨트롤러에서 글 리스트 보는 부분을 보자.

@Controller
@RequestMapping("/post")
public class PostController {
...
@RequestMapping("/list")
public String list(Model model,
@RequestParam(value = "category", required = false, defaultValue = "0") int categoryId,
@PageableDefault(sort = { "id" }, direction = Direction.DESC, size = 5) Pageable pageable) {
Page<Post> postPage;
if (categoryId > 0) {
postPage = postDao.findByCategoryId(categoryId, pageable);
} else {
postPage = postDao.findAll(pageable);
}
model.addAttribute("categoryId", categoryId);
model.addAttribute("postPage", postPage);
return "post/list";
}
...


간단하다면. 간단해 보이지만... (사실 정말 간단하네 ㅠ) 복잡하다고 생각해보자.

컨트롤러에 분기문이 있다니!! ? ㅠㅠ


만약 RSS 뷰나 REST API용 컨트롤러를 만들어야 한다면..

모든 컨트롤러에 해당 분기문이 들어가야 한다.


그래서 레파지토리로 이렇게 빼 보았다.

@Repository
public class PostRepository {
@Autowired
private PostDao postDao;
public Page<Post> getPostList(Pageable pageable, int categoryId) {
Page<Post> postPage;
if (categoryId > 0) {
postPage = postDao.findByCategoryId(categoryId, pageable);
} else {
postPage = postDao.findAll(pageable);
}
return postPage;
}
...


그리고 나니 컨트롤러가 아래와 같이 간단해졌다.

@Controller
@RequestMapping("/post")
public class PostController {
...
@RequestMapping("/list")
public String list(Model model,
@RequestParam(value = "category", required = false, defaultValue = "0") int categoryId,
@PageableDefault(sort = { "id" }, direction = Direction.DESC, size = 5) Pageable pageable) {
model.addAttribute("categoryId", categoryId);
model.addAttribute("postPage", postRepository.getPostList(pageable, categoryId));
return "post/list";
}
...


요렇게 정리가 되고나니..

RSS 컨트롤러가 


@Controller
@RequestMapping("/rss")
public class RssController {
@Autowired
private PostRepository postRepository;
@RequestMapping("/post/list")
public String list(Model model,
@PageableDefault(sort = { "id" }, direction = Direction.DESC, size = 10) Pageable pageable) {
model.addAttribute("postList", postRepository.getPostList(pageable, 0).getContent());
return "post/rss";
}
}


이렇게 되었다.

http://blog.millky.com/rss/post/list




RSS뷰는

http://www.rssboard.org/rss-specification


<?xml version="1.0" encoding="UTF-8"?>
<%@ page contentType="text/xml;charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<rss version="2.0">
    <channel>
        <title><![CDATA[Spring blog]]></title>
        <link>http://blog.millky.com/post/list</link>
        <description><![CDATA[아카이브, 블로그, 커뮤니티 서비스]]></description>
        <language>ko-kr</language>
        <generator>https://github.com/origoni/Spring-Blog</generator>
        <c:forEach var="post" items="${postList}">
            <item>
                <title><![CDATA[<c:out value="${post.title}" escapeXml="true" />]]></title>
                <link>http://blog.millky.com/post/${post.id}</link>
                <description>
                    <c:if test="${post.subtitle!=''}"><![CDATA[<c:out value="${post.subtitle}" escapeXml="true" />]]></c:if>
                    <![CDATA[${post.content}]]>
                </description>
                <category><![CDATA[<c:out value="${post.category.name}" escapeXml="true" />]]></category>
                <author><![CDATA[<c:out value="${post.name}" escapeXml="true" />]]></author>
                <guid>http://blog.millky.com/post/${post.id}</guid>
                <pubDate><fmt:formatDate value="${post.regDate}" pattern="EE, dd MMM yyyy HH:mm:ss Z"/></pubDate>
            </item>
        </c:forEach>
    </channel>
</rss>






PostRepository 에 Exception을 사용.


GlobalExceptionHandler

package com.millky.blog.presentation.support;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import com.millky.blog.domain.model.exception.IllegalUserException;
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler({ IllegalArgumentException.class })
void handleIllegalArgumentException(HttpServletResponse response) throws IOException {
log.debug("IllegalArgumentException");
response.sendError(HttpStatus.BAD_REQUEST.value());
}
@ExceptionHandler({ IllegalUserException.class })
void handleIllegalUserException(HttpServletResponse response) throws IOException {
log.debug("IllegalUserException");
response.sendError(HttpStatus.FORBIDDEN.value());
}
}







글쓰기 뷰 모바일에서 사용할 수 있도록 조금 수정


이전 에러가... 맘에 안들어서



http://websystique.com/springmvc/spring-4-mvc-form-validation-with-hibernate-validation-resource-handling-using-annotations/


{ValidationAnnotationClass}.{modelObject}.{fieldName}

이런 패턴으로 사용 가능하다.


Min.post.categoryId=필수


이렇게 변경함.



다국어 지원도 가능 함.. 다음시간에..



오늘 작업한 코드는 https://github.com/origoni/Spring-Blog/tree/v0.0.16 여기를 참고 부탁드린다.


라이브 데모 : http://blog.millky.com/post/list

변경사항은 : https://github.com/origoni/Spring-Blog/commit/

깃헙 : https://github.com/origoni/Spring-Blog

프로젝트 다운받아 시작하는 방법은(for Windows User)? http://millky.com/@origoni/post/1145

블로그개발 시리즈 - 다른글 : http://millky.com/@origoni/folder/30/post/list

역순 정렬도 있어요.. : http://millky.com/@origoni/folder/30/post/list?sort=regDate,asc







이번시간. 약간 억지가 포함되어 RSS뷰를 만들어 보았다.

글을 쓰다 보니 어려운점이 난이도 문제인것 같다.

이제 와서야 레파지토리를 분리하고. 다음시간에서야 서비스를 사용 할 예정이다.


블로그 개발 강좌를 쭈윽 보면. 완전 초보분을 대상으로 하는것도 아니고...

그렇다고 고급인 분을 대상하로 하는것은 더더욱 아니다.


뭔가 기초도 활용도 애매한 그 글쓰기 방식으로 어디까지 가야 할 지 잘 모르겠다.


에라다 ㅠ



고민 ㅠㅠ



back to top