간펴니
간편 자바프로그래밍
간펴니
전체 방문자
오늘
어제
  • 전체보기 (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. 24. 20:39
728x90

전 글의, 웹소켓을 이용한 실시간 푸시알림과 같이 구현한 기능이다.

 

웹소켓의 값을 이용해 db에 저장되게 하기엔 지금 프로젝트를 마무리 할 시간에 너무 촉박하고,

 

아직은 웹소켓 사용에 익숙해지지 않았기 때문에 , ajax를 이용해서 구현했다.

 


뷰

var memberId = ${login.memberId};

//알람목록
function alramList(){
	console.log("alramList")
	var memberId = "${login.memberId}";
	 $.ajax({
	        url : '/board/alramList',
	        type : 'get',
	        data : {'memberId' : memberId },
	        dataType : "json", 
	        success : function(data){
	         	var a='';
	         	 $.each(data, function(key, value){ 
	         		var categori = value.categori ;
	         		a += '<div>';
					a += '<div class="small text-gray-500">'+value.alramDate+'</div>';
					if(categori == "reply"){
					a += '<span class="font-weight-bold"><a href="#"  onclick="alramClick('+value.bgno+','+value.bno+',\''+value.fromId+'\');">'+value.toId+'님이 '+value.title+' 에 댓글을 달았습니다</a></span>';
					}else if(categori == "questionCheck"){
					a += '<span class="font-weight-bold"><a href="#" onclick="alramClick('+value.bgno+','+value.bno+',\''+value.fromId+'\');">'+value.toId+'님이 '+value.title+' 에 답변을 채택했습니다</a></span>';

					}
					a += '</div><hr/>';	
					
	         		 
	         		 
	         	 });
	         	 
	         	 $("#alramList").html(a);
	         	 
	        }
	        
	    
	    });
	 }
//목록끝

//목록클릭
function alramClick(bgno,bno,formId){
	console.log("alramClick")
	 $.ajax({
	        url : '/board/alramClick',
	        type : 'post',
	        data : {'memberId' : formId , 'bno':bno},
	        dataType : "json", 
	        success : function(){
	        
	        }
	        
	    
	    });
	location.href="/board/readView?bno="+bno+"&bgno="+bgno;
	
}



//알람
function alramCount(){
	console.log("alram")
	var memberId = "${login.memberId}";
	 $.ajax({
	        url : '/board/alramCount',
	        type : 'get',
	        data : {'memberId' : memberId },
	        dataType : "json", 
	        success : function(alram){
	         	console.log(alram);
	         	console.log("알람성공");
	       $('#alramCount').text(alram);
	        }
	    
	    });
}
//

 

알림목록은 작성한 게시글에 댓글이 달렸을때와 채택이 되었을때만 알림목록에 추가되도록 했다.

 

좋아요,스크랩 시에는 푸시알림이 오지만, 굳이 그 기록이 알림목록에 보일 필요는 없을 것 같아서 제외했다.

 

댓글작성, 채택 시에 알람테이블에 insert되고 , 클릭시엔 delete되도록 구현했는데,

 

게시글번호를 기준으로 delete해서 , 

 

같은 게시글에서 온 알람은 하나의 알람을 클릭해서 해당 게시물로 이동할때 모두 없어지도록 구현했다.

 

select문의 Count로 알람이 온 수를 구해왔다.

 


Mapper.xml

<!-- 알람기능 -->

<insert id="insertAlram">
insert into MP_ALRAM (NO,TOID , FROMID , BNO , TITLE , CATEGORI ,BGNO) 
values ((SELECT NVL(MAX(NO), 0) + 1 FROM MP_ALRAM),#{toid},#{fromid},#{bno},#{title},#{categori},#{bgno})
</insert>


<select id="alramCount" resultType="int">
select count(*) from MP_ALRAM where FROMID = #{memberId}
</select>

<select id="alramList" resultType="kr.co.vo.AlramVO">
<![CDATA[
select * from (select * from MP_ALRAM where FROMID = #{memberId} ) where rowNUM <=6 order by ALRAMDATE DESC
]]>
</select>

<delete id="alramClick">
delete from MP_ALRAM where FROMID = #{memberId} AND bno = #{bno}
</delete>

 

 


Controller

 

		//알람
				@ResponseBody
				@RequestMapping(value = "/board/insertAlram", method=RequestMethod.POST)
				public int insertAlram (String toId , String fromId , String bno , String title , String categori,String bgno) throws Exception{
					logger.info("알람insert"+categori+"//"+fromId+toId+bno+categori+title);
					int alram = 1;
					
					service.insertAlram(toId, fromId, bno, title, categori,bgno);
					
					return alram;
				}
		
		//알람수
				@ResponseBody
				@RequestMapping(value = "/board/alramCount", method=RequestMethod.GET)
				public int alramCount (String memberId) throws Exception{
					
					int alram = service.alramCount(memberId);
					
					return alram;
				}	
				
				
				//알람목록
				@ResponseBody
				@RequestMapping(value = "/board/alramList", method=RequestMethod.GET)
				public List<AlramVO> alramList(String memberId) throws Exception{
										
					return service.alramList(memberId);
				}	
				
				
				//알람클릭
				@ResponseBody
				@RequestMapping(value = "/board/alramClick", method=RequestMethod.POST)
				public String alramClick(String memberId, int bno) throws Exception{
					logger.info("알람클릭");
					service.alramClick(memberId, bno);
					
					return null;
				}

뷰

//댓글 등록
function commentInsert(insertData){
	console.debug("reply.socket",socket)
		
    $.ajax({
        url : '/reply/writeReply',
        type : 'post',
        data : insertData,
        processData: false, contentType: false,

        enctype : 'multipart/form-data', 
        success : function(data){
         
                commentList(); //댓글 작성 후 댓글 목록 reload
                $('[name=content]').val('');
           		$('.myEditor').summernote('reset');
                
           		//소켓
           		if(readWriter != writer){
           		if(socket){
        			let socketMsg = "reply,"+writer+","+readWriter+","+bno+","+readTitle+","+bgno;
        			console.log(socketMsg);
        			socket.send(socketMsg);
           		}
        	}
        }
    
    });
	
	//알람
	if(readWriter != writer){
	 $.ajax({
	        url : '/board/insertAlram',
	        type : 'post',
	        data : {'toId': writer , 'fromId': readWriter , 'bno':bno,'title':readTitle, 'categori': "reply",'bgno':bgno },
	        dataType : "json", 
	        success : function(alram){
	         		alret("알람입력성공");
	              if(alram == 1){
	            	  alert("알람입력성공")
	              }else{
	            	  alert("알람입력실패")
	              }
	        }
	    
	    });
	}
	//알람끝
	
	
	
}
 //댓글등록끝

댓글 등록시, 알람테이블에 insert 되도록 해줬다.

 

**

알람테이블 컬럼은

no (PR) , TOID , FROMID , BNO , TITLE , CATEGORI , BGNO 이다.

 


결과

 

012
3장 슬라이드

1. 알림 수

 

2. 알림목록

 

3. 하나의 알림목록 클릭 후, 같은 게시글의 목록은 모두 없어짐

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

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

[스프링] 커뮤니티 관리자 페이지  (0) 2021.10.24
[스프링] 소셜로그인 구현 - 네이버  (0) 2021.10.24
[스프링] 커뮤니티 실시간 푸시알림 - 웹소켓  (2) 2021.10.24
[스프링] 메인페이지,인기글 구현 (블라인드 참고)  (0) 2021.10.17
[스프링] 회원 프로필사진 수정 , 등록  (3) 2021.10.14
    'SPRING/IceWater Community' 카테고리의 다른 글
    • [스프링] 커뮤니티 관리자 페이지
    • [스프링] 소셜로그인 구현 - 네이버
    • [스프링] 커뮤니티 실시간 푸시알림 - 웹소켓
    • [스프링] 메인페이지,인기글 구현 (블라인드 참고)
    간펴니
    간펴니
    개발공부 기록하는 곳

    티스토리툴바