이번엔 스크랩 기능을 구현했다.
먼저, 마이페이지에서 내 활동로그와 스크랩한 게시글을 볼 수 있도록 만들었는데
그 전에 스크랩 기능을 먼저 구현했다.
스크랩의 정보를 저장할 테이블을 생성하고 ,
게시글PR , 회원PR과 DATE를 저장한다.
create table MP_SCRAP (
SCRAPNO number not null,
MEMBER_ID varchar2(50) not null,
BNO number not null,
SCRAPDATE date default sysdate,
constraint scrap_pk PRIMARY key (SCRAPNO),
constraint scrap_fk FOREIGN key (MEMBER_ID)
references MP_MEMBER(MEMBER_ID) on delete cascade
);
컬럼 : scrapNO , member_id , bno , scarpDate
회원 ID를 FK로 선언하고 , 회원아이디가 삭제되면 같이 삭제되도록 delete cascade 제약조건을 걸어줬다.
Mapper.xml
<!-- 스크랩 기능 -->
<insert id="scrap">
insert into MP_SCRAP (SCRAPNO,MEMBER_ID , BNO)
values ((SELECT NVL(MAX(SCRAPNO), 0) + 1 FROM MP_SCRAP),#{memberId},#{bno})
</insert>
<!-- 스크랩 취소 -->
<delete id="scrapCancel">
delete from MP_SCRAP where BNO = #{bno} AND MEMBER_ID = #{memberId}
</delete>
<!-- 게시글의 스크랩 수 -->
<select id="scrapCount" resultType="int">
select count(*) from MP_SCRAP where bno = #{bno}
</select>
<!-- 중복방지 -->
<select id="scrapCheck" resultType="int">
select count(*) from MP_SCRAP where bno = #{bno} and MEMBER_ID = #{memberId}
</select>
중복방지 select문으로 테이블을 count해서 ,
0이 나오면 insert , 1이 나오면 delete하는 방식으로 중복 방지를 구현했고,
스크랩수는 따로 count되도록 설정했다.
스크랩수는 게시글 상세내용 페이지에서 보이도록 했는데 ,
게시판 카테고리에 게시글 스크랩수 컬럼을 추가해서 할 수도 있겠지만
이미 여러번 해 본 방식이고,
목록에서 따로 list로 출력할 생각이 없기 때문에 간단하게 select문을 만들어줬다.
파라미터로는
게시글 PR인 bno 와 회원PR인 member_ID가 필요하다.
Controller
//스크랩
@ResponseBody
@RequestMapping(value = "/board/scrap", method=RequestMethod.POST)
public int scrap (String Id, int bno) throws Exception{
int scrap = service.scrapCheck(Id, bno);
if (scrap == 0) {
service.scrap(Id, bno);
}else if(scrap == 1) {
service.scrapCancel(Id, bno);
}
return scrap;
}
ajax로 데이터를 받았기 때문에 @ResponseBody 를 선언해줬고,
Id와 bno를 매개변수로 받아서 ,
중복방지 쿼리에 파라미터를 주고 count한 값이
0이면 insert
1이면 ( 값이 이미 있으면 ) delete한다.
view
function scrap(){
$.ajax({
type : "POST",
url : "/board/scrap",
dataType : "json",
data : {'bno' : bno, 'Id' : memberId },
error : function(){
alert("통신 에러");
},
success : function(scrap) {
if(scrap == 0){
alert("스크랩완료");
location.reload();
}else if(scrap == 1){
alert("스크랩취소");
location.reload();
}
}
});
}
ajax로 파라미터를 보내주고, 결과값으로 int scrap 를 받는다.
게시글의 스크랩수를 얻기 위해 위에서 작성한 select 문에 bno를 파라미터로 줬다.
readView Controller ( 게시글 상세보기 컨트롤러 )
model.addAttribute("scrap", service.scrapCount(boardVO.getBno()));
스크랩수 (readView.jsp)
<td > <i class="fas fa-check-double mr-1"></i> ${scrap}</td>
스크랩 버튼 (readView.jsp)
<c:if test="${not empty login}">
<c:if test="${login.memberId != read.id}">
<button type="button" class="btn btn-success" onclick="scrap(); return false;">스크랩<i class="fas fa-check-double ml-1"></i></button>
</c:if>
</c:if>
<c:if test="${empty login}">
<button type="button" class="btn btn-success" onclick="location.href='/member/loginView'">스크랩<i class="fas fa-check-double ml-1"></i></button>
</c:if>
로그인이 안되있다면 로그인 페이지로 보내고 ,
로그인이 되어있고, 회원ID와 글작성ID가 다르면 스크랩 ajax를 호출한다. ( 글작성자는 자기 글을 스크랩 못하도록)
결과
- 스크랩 버튼과 스크랩 수
- 버튼을 눌렀을때 비로그인 시 로그인 페이지로 이동
- '2222' 계정으로 로그인해서 스크랩 버튼 보이지 않음 (글 작성자 2222)
- '1234' 회원이 올린 글의 스크랩버튼을 눌러서 스크랩 성공
- 데이터가 insert됨
- 다시 눌러서 스크랩 취소되기 전, 스크랩 수가 제대로 올라있다. 취소도 구현완료
이제 회원의 스크랩 목록을 마이페이지를 구현하는 다음 포스팅에서 만들 만들어 볼 예정이다.
'SPRING > IceWater Community' 카테고리의 다른 글
[스프링] 회원 프로필사진 수정 , 등록 (3) | 2021.10.14 |
---|---|
[스프링] 마이페이지 구현 - 회원 활동로그와 작성한 게시글,댓글,스크랩 목록 (0) | 2021.10.13 |
[스프링] 질문 채택 기능 구현 (Like 지식 IN) (0) | 2021.10.08 |
[스프링] 댓글 좋아요/싫어요 구현 - (Ajax) (3) | 2021.10.06 |
[스프링] 게시판 이전글 다음글 읽은 글 표시 (1) | 2021.10.01 |