Git · 코드 기록

Spring 게시판 좋아요 기능 구현

짱코딩러 2022. 11. 12. 00:28

리뷰 게시판의 좋아요 기능을 구현해 보았다.

 

loveno Number pk
reviewno Number fk
id Varchar2 fk
loveyn Number nn, default=0

 

1. 하트 default는 빈하트

2. 현재 로그인 된 사용자가 빈하트(loveyn=0)를 누르면 채워진 하트(loveyn=1)가 되고, 채워진 하트를 누르면 빈하트가 된다.(update)

  2-1. 단, 해당 게시글의 하트를 한번도 누른적 없는 사용자는 처음 한번만 정보가 새로 insert된다

3. 게시글마다 하트의 총합을 적어준다.( reviewno마다 loveyn=1인 count(loveno) )

  3-1. 사용자가 하트를 누를때마다 총합숫자가 같이 변경되어야 함.

 

1. 하트 default는 빈하트

//유저의 하트 가져오기
		function showlove(){
			var love = {
				reviewno: reviewno,
				id: id
			};
			loveService.getList(love, 
				function(list){
					console.log(list)
					
					var str="";
					
					//좋아요를 한번이상 누른적이 있는 유저일때
					if(list){
						//빈하트나 채워진하트
						if(list.loveyn == 1){
							str += "<img class='loveBtn' data-loveyn='"+list.loveyn+"' data-loveno='"+list.loveno+"' style='width:30px; height:30px' src='/resources/image/love_full.png'>";
						}else{
							str += "<img class='loveBtn' data-loveyn='"+list.loveyn+"' data-loveno='"+list.loveno+"' style='width:30px; height:30px' src='/resources/image/love.png'>";
						}
					//누른적 없으면 빈하트
					}else{
						str += "<img class='loveBtn' style='width:30px; height:30px' src='/resources/image/love.png'>";
					}
					
					loveDiv.html(str);
					
				});//end function
		}//end loveList

 

2. 현재 로그인 된 사용자가 빈하트(loveyn=0)를 누르면 채워진 하트(loveyn=1)가 되고, 채워진 하트를 누르면 빈하트가 된다.(update)

2-1. 단, 해당 게시글의 하트를 한번도 누른적 없는 사용자는 처음 한번은 정보가 새로 insert된다

//하트 누르면
		$('.love-body').on("click", ".loveBtn", function(e){
			e.preventDefault();
			var loveyn =  $(this).data("loveyn");
			var loveno =  $(this).data("loveno");
			console.log("============"+loveyn+", "+id+", "+loveno+", "+reviewno)
		//아이디 없을 때(세션에 로그인 정보가 없을 땐 'x'로 되도록 선언해줬음)
		if(id == "x"){
			alert("로그인이 필요합니다.");
		//누른 적 있을 때(update)
		}else if(loveno){
        	//하트가 채워져있으면
			if(loveyn == 1){
				var love = {
					reviewno: reviewno,
					id : id,
					loveno: loveno,
					loveyn : loveyn
				};
				loveService.love(love, function(result){	
					showlove();
					lovecount();
				})
				
			//비었으면
			}else{
				var love = {
					reviewno: reviewno,
					id : id,
					loveno: loveno,
					loveyn : loveyn
				};
				loveService.love(love, function(result){
					showlove();
					lovecount();
				})
			}
		//처음 눌렀을 때(insert)
		}else{
				var love = {
					reviewno: reviewno,
					id : id,
					loveno: loveno,
					loveyn : loveyn
				};
				loveService.add(love, function(result){	
					showlove();
					lovecount();
				})
				loveyn=1;
		}
			
		});

 

3. 게시글마다 하트의 총합을 적어준다.

//하트총 개수 가져오기
		function lovecount(){
			
			loveService.getCount({reviewno:reviewno}, 
				function(count){
					console.log(count)
					
					var str="";
					
					str += "<span>"+count+"</span>"
					
					countDiv.html(str);
					
				});//end function
		}//end

 

 

+연결해준 js

var loveService = (function(){
		
	//정보
	function getList(love, callback, error){
		
		//원하는 해당자료의 json데이터를 얻기위하여 호출
		$.getJSON("/loves/"+love.reviewno+"/"+love.id,		
			function(data){										
				if(callback){
					callback(data);
				}
			}).fail(function(xhr, status, err){					
				if(error){
					error();
				}
			});
	}
	
	//하트 총 개수
	function getCount(param, callback, error){
		var reviewno = param.reviewno;
		
		//원하는 해당자료의 json데이터를 얻기위하여 호출
		$.getJSON("/loves/love_count/"+reviewno,		
				function(data){								
			if(callback){	//값이 오면
				callback(data);	
			}
		}).fail(function(xhr, status, err){					
			if(error){
				error();
			}
		});
	}
	
	//첫 좋아요
	function add(love, callback, error) {
		
		$.ajax({
			type : 'post',	//전송 방식
			url : '/loves/new',	//전송 페이지(action)
			data : JSON.stringify(love),	//넘길 파라미터(전송할 데이터)//reply를 JSON 문자열로 변환
			contentType : "application/json; charset=utf-8", //보내는 데이터의 타입
			success : function(result, status, xhr) {	//전송 성공시 실행할 코드
				if (callback) {	//만약에 콜백함수가 값을 주면
					callback(result);	//실행해
				}
			},
			error : function(xhr, status, er) {		//실패시 실행할 코드
				if (error) {
					error(er);
				}
			}
		})
	}
	
	
	//좋아요
	function love(love, callback, error){
		$.ajax({
			type : 'patch',
			url : '/loves/'+ love.reviewno +'/'+love.id+'/'+love.loveno+"/"+love.loveyn,
			data : JSON.stringify(love),
			contentType : "application/json; charest=utf-8",
			success : function(result, status, xhr){
				if(callback){
					callback(result);
				}
			},
			error : function(xhr, status, er){
				if(error){
					error(er);
				}
			}
		});
	}
	
	return {
		getList : getList,
		getCount : getCount,
		add : add,
		love : love
	};
})();

 

+Controller

@RequestMapping("/loves/")
@RestController
@Log4j
@AllArgsConstructor
public class LoveController {

	private LoveService service;

	// 정보
	@GetMapping(value = "/{reviewno}/{id}", produces = { MediaType.APPLICATION_XML_VALUE,
			MediaType.APPLICATION_JSON_VALUE })
	public ResponseEntity<LoveVO> getList(@PathVariable("id") String id, @PathVariable("reviewno") Long reviewno) {
		log.info("get List reviewno: " + reviewno);
		log.info("id:" + id);
		
		return new ResponseEntity<>(service.getList(id, reviewno), HttpStatus.OK);
	}

	// 하트 총 개수 
		@GetMapping(value = "love_count/{reviewno}", produces = { MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE })
		public ResponseEntity<Integer> get(@PathVariable("reviewno") Long reviewno) {
			log.info("get : " + reviewno);
			return new ResponseEntity<>(service.loveCount(reviewno), HttpStatus.OK);
		}
	
	// 첫좋아요
	@PostMapping(value = "/new", consumes = "application/json", produces = { MediaType.TEXT_PLAIN_VALUE })
	// JSON데이터를 ReplyVO타입으로 변환하도록 함(JSON->자바객체)
	public ResponseEntity<String> create(@RequestBody LoveVO vo) {
		log.info("LoveVO: " + vo);

		// insert성공 했으면 성공 뿌려주고, 아니면 에러 뿌려줘
		return service.loveSet(vo) == 1 ? new ResponseEntity<>("success", HttpStatus.OK)
				: new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
	}

	// 좋아요
	@RequestMapping(method = {RequestMethod.PATCH }, 
			value = "/{reviewno}/{id}/{loveno}/{loveyn}", consumes = "application/json", produces = {
					MediaType.TEXT_PLAIN_VALUE })
	// 실제 데이터는 JSON포맷이므로 변환하여 처리
	public ResponseEntity<String> loveUp(@PathVariable("loveno") Long loveno, @PathVariable("loveyn") Long loveyn) {
		log.info("loveno: " + loveno);
		log.info("loveyn : " + loveyn);

		if (loveyn == 0) {
			log.info("UP: " + loveyn);
			return service.loveUp(loveno) == 1 ? new ResponseEntity<>("success", HttpStatus.OK)
					: new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
		} else {
			log.info("DOWN: " + loveyn);
			return service.loveDown(loveno) == 1 ? new ResponseEntity<>("success", HttpStatus.OK)
					: new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
		}
	}