07/21
2015
[블로그개발_16 - 작성중] RSS 뷰 추가 (Repository, Exception, messages.properties)
작성 중 입니다.
테스트는 여기서 부탁드립니다. :
http://blog.millky.com
블로그개발 시리즈 - 다른글 : http://millky.com/@origoni/folder/30/post/list
- [블로그개발_01] STS로 Spring Boot 웹 프로젝트 시작하기
- [블로그개발_02] Spring Boot 와 Spring Data (JPA) 를 이용한 간단한 DB 입출력
- [블로그개발_03] STS에서 GitHub에 있는 메이븐 프로젝트 받아서 시작해보기. (+ gradle to maven)
- [블로그개발_04] 스프링 부트(Spring Boot)의 세가지 뷰 (JSP, Velocity, Thymeleaf)
- [블로그개발_05] STS에서 GitHub에 있는 메이븐 프로젝트 받아서 시작해보기. (for Windows User)
- [블로그개발_06] webjars를 이용한 bootstrap, jquery 적용해보기 (Spring Boot)
- [블로그개발_07] Blog theme 적용해보기 (+bower, +webjars)
- [블로그개발_08] 블로그 글 저장 및 표시 해보기 (Spring Boot + Spring Data JPA + H2)
- [블로그개발_09] WYSIWYG 에디터 붙이기
- [블로그개발_10] 글에 부제목 추가 (Post Entity 모델링 +lombok, @Valid)
- [블로그개발_11] 글 수정, 삭제... (+Date 부분 변경)
- [블로그개발_12] 소셜 로그인 붙이기 (spring-social-facebook)
- [블로그개발_13] 글 목록 페이징 및 정렬 (SpringData Pageable, Page)
- [블로그개발_14] 스프링 WebMvc 설정 (Interceptor, ArgumentResolver)
- [블로그개발_15] 카테고리 추가 (@ManyToOne, stream())
라이브 데모 : 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());
}
}
글쓰기 뷰 모바일에서 사용할 수 있도록 조금 수정
이전 에러가... 맘에 안들어서
{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뷰를 만들어 보았다.
글을 쓰다 보니 어려운점이 난이도 문제인것 같다.
이제 와서야 레파지토리를 분리하고. 다음시간에서야 서비스를 사용 할 예정이다.
블로그 개발 강좌를 쭈윽 보면. 완전 초보분을 대상으로 하는것도 아니고...
그렇다고 고급인 분을 대상하로 하는것은 더더욱 아니다.
뭔가 기초도 활용도 애매한 그 글쓰기 방식으로 어디까지 가야 할 지 잘 모르겠다.
에라다 ㅠ
고민 ㅠㅠ