간펴니
간편 자바프로그래밍
간펴니
전체 방문자
오늘
어제
  • 전체보기 (185)
    • 알고리즘 (2)
    • JAVA (69)
      • 이펙티브 자바 (47)
      • JAVA 병렬프로그래밍 (5)
      • 자바 (17)
    • SPRING (60)
      • Spring (12)
      • IceWater Community (37)
      • Homme Shop (10)
      • 토비의 스프링 (1)
    • SPRING BOOT (4)
      • WhiteRecord (7)
    • 오류 (9)
    • DB (10)
      • ORACLE (5)
      • MYSQL (1)
      • MYBATIS (4)
      • JPA (0)
      • 대용량 데이터 베이스 (0)
      • SQL (0)
    • FRONT (8)
      • JSP (2)
      • JavaScript (2)
      • Jquery (3)
      • Thymeleaf (1)
    • AWS (6)
    • JNI (10)
    • 회고 (0)
    • MQ (0)
    • Radis (0)
    • Git (0)
    • Docker (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 블로그 컨셉 변경

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
간펴니

간편 자바프로그래밍

[스프링]게시판 스크랩기능 구현
SPRING/IceWater Community

[스프링]게시판 스크랩기능 구현

2021. 10. 11. 23:59
728x90

이번엔 스크랩 기능을 구현했다.

먼저, 마이페이지에서 내 활동로그와 스크랩한 게시글을 볼 수 있도록 만들었는데

그 전에 스크랩 기능을 먼저 구현했다.


 

스크랩의 정보를 저장할 테이블을 생성하고 ,  

 

게시글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를 호출한다. ( 글작성자는 자기 글을 스크랩 못하도록)

 


결과

 

012345
슬라이드쇼 6장

  1. 스크랩 버튼과 스크랩 수
  2. 버튼을 눌렀을때 비로그인 시 로그인 페이지로 이동
  3. '2222' 계정으로 로그인해서 스크랩 버튼 보이지 않음 (글 작성자 2222)
  4. '1234' 회원이 올린 글의 스크랩버튼을 눌러서 스크랩 성공 
  5. 데이터가 insert됨
  6. 다시 눌러서 스크랩 취소되기 전, 스크랩 수가 제대로 올라있다. 취소도 구현완료

 

 


이제 회원의 스크랩 목록을 마이페이지를 구현하는 다음 포스팅에서 만들 만들어 볼 예정이다.

728x90
저작자표시 (새창열림)

'SPRING > IceWater Community' 카테고리의 다른 글

[스프링] 회원 프로필사진 수정 , 등록  (3) 2021.10.14
[스프링] 마이페이지 구현 - 회원 활동로그와 작성한 게시글,댓글,스크랩 목록  (0) 2021.10.13
[스프링] 질문 채택 기능 구현 (Like 지식 IN)  (0) 2021.10.08
[스프링] 댓글 좋아요/싫어요 구현 - (Ajax)  (4) 2021.10.06
[스프링] 게시판 이전글 다음글 읽은 글 표시  (1) 2021.10.01
    'SPRING/IceWater Community' 카테고리의 다른 글
    • [스프링] 회원 프로필사진 수정 , 등록
    • [스프링] 마이페이지 구현 - 회원 활동로그와 작성한 게시글,댓글,스크랩 목록
    • [스프링] 질문 채택 기능 구현 (Like 지식 IN)
    • [스프링] 댓글 좋아요/싫어요 구현 - (Ajax)
    간펴니
    간펴니
    개발공부 기록하는 곳

    티스토리툴바