@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class Rq {
.
.
.
public void initBeforeActionInterceptor() {
System.err.println("initBeforeActionInterceptor 실행");
}
}
위의 코드를 작성한 이유는 Rq 클래스를 사용할 경우 new해서 사용하지 않고 Spring이 알아서 객체 관리하도록 하기 위해 작성한 것이다.
@Component
-> Spring이 이 클래스를 자동으로 찾아서 관리해준다.
@Scope(value = "request")
-> 이 클래스가 Spring에서 관리될 때, 매번 HTTP 요청이 들어올 때마다 새롭게 생성되는데, 요청이 끝날 때 이 클래스도 같이 사라지고, 다시 요청이 들어오면 다시 새롭게 생성
proxyMode = ScopedProxyMode.TARGET_CLASS
-> 이 클래스가 프록시로 만들어질 때, 클래스의 원래 모습대로 만들어지도록 설정
프록시?
실제 객체(대상) 대신 역할을 수행하거나 중간에서 추가적인 작업을 해주는 객체
프록시를 왜 사용할까?
- 실제 객체에 직접 접근하는 것을 못하게 막고, 프록시가 대신 역할을 수행하면서 보안이나 권한 체크 수행
- 원래 객체의 일을 미리 처리하거나, 필요할 때만 원래 객체를 사용하게 하여 자원을 아낄 수 있다.
- 원래 객체가 일을 수행하기 전에, 로그를 남기거나 다른 부가 기능을 추가할 수 있다.
카페에 보면 게시글의 주제에 맞추어 목록이 나오는 것을 볼 수 있다. 이를 위하여 작성해놓은 코드 article에 boardId를 넣어주었다. (board 테이블 추가)
@RequestMapping("/user/article/list")
public String showList(HttpServletRequest req, Model model, @RequestParam(defaultValue = "1") int boardId,
@RequestParam(defaultValue = "1") int page) throws IOException {
Rq rq = (Rq) req.getAttribute("rq");
Board board = boardService.getBoardById(boardId);
int articlesCount = articleService.getArticlesCount(boardId);
int itemsInAPage = 10;
List<Article> articles = articleService.getForPrintArticles(boardId, itemsInAPage, page);
if (board == null) {
return rq.historyBackOnView("없는 게시판임");
}
model.addAttribute("articles", articles);
model.addAttribute("articlesCount", articlesCount);
model.addAttribute("board", board);
return "/user/article/list";
}
}
@RequestParam(defaultValue = "1") int boardId 코드를 작성해준 이유는 URL에 http://localhost:8081/user/article/list?boardId=2 일 경우 boardId 파라미터의 값을 메서드 인자 boardId에 매핑한다. URL에 파라미터가 포함되지 않은 경우에는 boardId는 기본값으로 지정한 1로 설정되어, 작성되지 않아도 오류가 뜨지않게 된다.
페이지네이션을 위하여 articlesCount에서 boardId에 해당하는 즉, 게시글의 주제에 맞는 게시글의 수를 가져온다.
int itemsInAPage => 한 페이지에서 보여지는 게시글 수를 10으로 설정
articleService.getForPrintArticles(boardId, itemsInAPage, page)로 현재 페이지에 보여줄 게시글 리스트를 가져온다.
public List<Article> getForPrintArticles(int boardId, int itemsInAPage, int page) {
// SELECT * FROM article WHERE boardId = 1 ORDER BY DESC LIMIT 0, 10; 1page
// SELECT * FROM article WHERE boardId = 1 ORDER BY DESC LIMIT 10, 10; 2page
int limitFrom = (page - 1) * itemsInAPage;
int limitTake = itemsInAPage;
return articleRepository.getForPrintArticles(boardId, limitFrom, limitTake);
}
limitFrom -> DB에서 페이지의 게시글 목록을 가져올 때 시작 (~부터)
limitTake -> 한페이지 당 몇 개의 게시물을 가져올지 (10개)
이를 repository에 보내어 sql 쿼리로 데이터를 조회하여 가져와 사용자에게 보여주게끔 만든다.
'Spring' 카테고리의 다른 글
SPRING(08.20) - 검색창(sql 검색), 검색 기능 구현 (0) | 2024.08.20 |
---|---|
SPRING(08.20) - 정적, 동적 페이지네이션 (0) | 2024.08.20 |
SPRING - Rq 클래스, 세션 (0) | 2024.08.18 |
SPRING - MyWebMVCConfigurer, Interceptor (0) | 2024.08.18 |
SPRING - ResultData<DT> (0) | 2024.08.18 |