1) Rq 객체
@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class Rq {
@Getter
private boolean isLogined;
@Getter
~~~ 생략 ~~~~
public Rq(HttpServletRequest req, HttpServletResponse resp, MemberService memberService) {
~~~ 생략 ~~~~
this.loginedMemberId = loginedMemberId;
this.loginedMember = loginedMember;
this.req.setAttribute("rq", this);
}
BeforeActionInterceptor
인터셉터에서 new연산자
를 통해 Rq객체를 생성하여
request.setAttribute("rq", rq) 하여 Rq객체를 사용 하였다.의존성 주입
이 가능하다.this.req.setAttribute("rq", this)
Rq객체 자신을 HttpServletRequest객체
에 setAttribute를 하여 사용2) Rq객체 주입
@Component
public class NeedLoginInterceptor implements HandlerInterceptor {
@Autowired
private Rq rq;
@Controller
public class UsrArticleController {
@Autowired
private Rq rq;
3) Rq객체 빈등록시 문제 발생에 대한 해결
만약 usr/article/write
요청이 오면
NeedLoginInterceptor(인터셉터)에서 rq객체
를 주입받는다.
이때 생성과 함께 주입
이 되고 Rq객체는 생성시 Rq객체 자신을HttpServletRequest객체에 setAttribute
한다.
그리고 컨트롤러로 연결이되고 컨트롤러에서도 rq객체를 주입
받는데 이때 rq객체는 빈으로 등록되면 싱글톤패턴
이므로
두 레퍼런스가 하나의 동일한 인스턴스
를 사용한다.
usr/article/write.jsp파일로 이동 HttpServletRequest객체에 setAttribute
했기때문에 jsp
에서 rq객체를 사용가능
하지만 usr/home/main
요청이 오면
NeedLoginInterceptor(인터셉터)에서 rq객체
를 주입받고 HttpServletRequest객체에 setAttribute
한다.
NeedLoginInterceptor(인터셉터)
는 아래코드에서 추가한 uri패턴에서만 인터셉터가 적용되는데
registry.addInterceptor(needLoginInterceptor).addPathPatterns("/usr/article/write")
.addPathPatterns("/usr/article/doWrite").addPathPatterns("/usr/article/modify")
.addPathPatterns("/usr/article/doModify").addPathPatterns("/usr/article/doDelete");}
rq객체는 usr/home/main
로 요청시 NeedLoginInterceptor
가 적용되지않아 rq객체는 생성되지않는다.
rq객체가 생성되지 않는다면 jsp
에서 rq객체를 사용할수 없다.
이를 해결하기 위해 아래코드에서 BeforeActionInterceptor
( .addPathPatterns("/**")
)에서 rq객체를 주입받고 있다.
@Component
public class BeforeActionInterceptor implements HandlerInterceptor {
@Autowired
private Rq rq;
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {
rq.initOnBeforeActionInterceptor();
return HandlerInterceptor.super.preHandle(req, resp, handler);
}
하지만 @Autowired를 했음에도 rq객체가 사용되지 않는다면
어플리케이션 실행시 rq객체는 주입받지 않는것
으로 보인다.
rq.initOnBeforeActionInterceptor()메소드를 실행함으로써 rq객체를 주입받는것으로 보인다.
1) write.jsp
<tr>
<td>게시판 선택</td>
<td>
<select required name="boardId" class="select select-bordered">
<option disabled>게시판을 선택해주세요</option>
<option value="1">공지사항</option>
<option value="2">자유게시판</option>
</select>
</td>
</tr>
<tr>
<td>제목</td>
<td><input required="required" type="text" ~~생략~~ /></td>
</tr>
select 태그
를 사용하여 게시판선택 (boardId)input태그
에 required 속성
을 붙여주면 해당 반드시 입력
해야한다.disabled 속성
붙여주면 해당 옵션을 선택할수 없다.(비활성화)2) 게시글 작성 쿼리문 수정
<insert id="writeArticle">
INSERT INTO article
SET regDate = NOW(),
updateDate =
NOW(),
memberId = #{loginedMemberId},
title = #{title},
`body`= #{body},
boardId = #{boardId}
</insert>
1) ArticleController showList메소드
@RequestMapping("/usr/article/list")
public String showList(Model model, @RequestParam(defaultValue = "1") int boardId,
@RequestParam(defaultValue = "1") int page) {
Board board = boardService.getBoardById(boardId);
if (board == null) {
return rq.jsHistoryBackOnView("존재하지 않는 게시판 입니다.");
}
int itemsInApage = 10;
List<Article> articles = articleService.getForPrintArticles(rq.getLoginedMemberId(), boardId, page, itemsInApage);
게시물의 수
2) ArticleService
public List<Article> getForPrintArticles(int actorId, int boardId, int page, int itemsInApage) {
int limitStart = (page -1) * itemsInApage;
int limitTake = itemsInApage;
List<Article> articles = articleRepository.getForPrintArticles(boardId, limitStart, limitTake);
for (Article article : articles) {
updateForPrintData(actorId, article);
}
return articles;
}
LIMIT
)을 작성하기위한 변수LIMIT
)을 작성하기위한 변수3) ArticleRepository.xml
<select id="getForPrintArticles" resultType="Article">
SELECT A.* , M.nickname AS extra__writer
FROM article AS A
INNER JOIN `member` AS M
ON A.memberId = M.id
WHERE 1
<if test="boardId != 0">
AND boardId = #{boardId}
</if>
ORDER BY A.id DESC
<if test="limitTake != -1">
LIMIT #{limitStart}, #{limitTake}
</if>
</select>
limitStart,limitTake
를 통해 쿼리문을 작성하여 가져올 게시물을 선택http요청 파라미터를 메서드의 파라미터로 전달받을 때 사용
적용된 파라미터가 String이 아닐 경우 자동으로 타입변환
@RequestParam 어노테이션이 적용된 파라미터는 기본적으로 필수 파라미터
required 속성 값 이용)
필수 파라미터에대한 요청 파라미터가 없을 경우 에러 발생
defaultValue
속성을 이용하여 파라미터가 없을 경우 기본값
을 설정