MY-SQL

 

 

-- 좋아요 테이블
CREATE TABLE `TBL_LIKE` (
  `NTT_ID` decimal(20,0) NOT NULL COMMENT '게시물ID',
  `BBS_ID` char(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '게시판ID',  
  `WRTER_ID` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '작성자ID',  
  PRIMARY KEY (`NTT_ID`,`BBS_ID`,`WRTER_ID`),
  UNIQUE KEY `COMTNCOMMENT_PK` (`NTT_ID`,`BBS_ID`,`WRTER_ID`), 
  KEY `TBL_LIKE_i01` (`NTT_ID`,`BBS_ID`),
  CONSTRAINT `TBL_LIKE_FK1` FOREIGN KEY (`NTT_ID`, `BBS_ID`) REFERENCES `lettnbbs` (`NTT_ID`, `BBS_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='좋아요';


 

 

프로시저

DELIMITER $$
DROP PROCEDURE IF EXISTS likeAction$$
CREATE PROCEDURE likeAction(nttId INT, bbsId char(20), wrterId varchar(20) )
begin
	DECLARE cnt int;
	SET cnt=(select COUNT(*) cnt from tbl_like where NTT_ID=nttId and BBS_ID=bbsId and WRTER_ID=wrterId ); #변수 설정	
    
    if cnt > 0 THEN		  
		delete from tbl_like  where NTT_ID=nttId and BBS_ID=bbsId and WRTER_ID=wrterId	; 	
 	ELSE 
		INSERT INTO tbl_like (NTT_ID, BBS_ID, WRTER_ID) VALUES(nttId, bbsId, wrterId) ;	
	END IF;

END$$
DELIMITER $$ 

 

 

 

저장 프로시저 실행 예

CALL likeAction(38,'BBSMSTR_000000000031', 'USRCNFRM_00000000000') ;



 

 

DB 접속시  ?allowMultiQueries=true 파라미터 추가

 

mybatis

 <select id="likeAction" parameterType="egovframework.com.cop.like.service.LikeVo"  resultType="int">        
            CALL likeAction(#{nttId},  #{bbsId} , #{wrterId})    ;
            
            SELECT COUNT(*) cnt from tbl_like WHERE NTT_ID=#{nttId} AND BBS_ID=#{bbsId} AND WRTER_ID=#{wrterId} ;            
    </select>  

 

 

Controller

import javax.annotation.Resource;

import org.egovframe.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;

import egovframework.com.cmm.LoginVO;
import egovframework.com.cop.like.service.LikeService;
import egovframework.com.cop.like.service.LikeVo;

@Controller
public class PortalLikeController {

	
    @Resource(name="LikeService")
    protected LikeService likeService;
	  
    
    
    /**
     * 좋아요 조회후 없으면 등록 존재하면 삭제
     * 
     * @param commentVO
     * @param comment
     * @param bindingResult
     * @param model
     * @return
     * @throws Exception
     */
    @PostMapping("/portal/like/likeAction.do")
    @ResponseBody
    public ResponseEntity<?> likeAction(@RequestBody LikeVo likeVo) throws Exception {
    	
    	LoginVO user = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
				
		if (isAuthenticated) {
			likeVo.setBbsId("BBSMSTR_000000000031");
			likeVo.setWrterId(user.getUniqId());
		    int result= likeService.likeAction(likeVo);
		    return ResponseEntity.status(HttpStatus.OK).body(result);	
		}
				
		return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("error");						
    }
    
    
    
	
}

 

 

js

let like={
	
	init:function(){
		$(".like-icon ").on("click", function (e) {
              like.likeAction(this);
 		 });
	},
	
	
	likeAction:function(e){
		//console.log(e);
	
		nttId =$(e).attr("data-nttId");
		const param={
			'nttId':nttId
		}

		$.ajax({
				url:'/portal/like/likeAction.do',
				type:'post',
				contentType:'application/json;charset=UTF-8',
				data:JSON.stringify(param),
				success:function(res){
						
					console.log(res);
					$(e).removeClass("like-active");
				
					if(res=="1"){
						$(e).addClass("like-active");						
			            tInfo("좋아요!","");
					}else{
						tWarning("좋아요 취소!");
			            $(e).removeClass("like-active");
					}
	
					
				},
				error:function(res){
					console.log("error");
					console.log(res);	
				}
						
			});
	}
		
}


like.init();

 

 

 

 

 

 

 

 

 

 

2. 저장 프로시저 생성 / 호출

???? 저장 프로시저 생성

예) 고객 테이블에서 고객이름순으로 조회한 정보를 저장 프로시저로 생성

DELIMITER $$ 
CREATE PROCEDURE GetCustomers() 
BEGIN 
	SELECT customerName, city, state, postalCode, country 
    FROM customers 
    ORDER BY customerName; 
END $$ 
DELIMITER ;

???? DELIMITER 는 왜 사용할까?

저장 프로시저 내부에 사용하는 SQL문은 일반 SQL문이기때문에 세미콜론(;)으로 문장을 끝맺어야 한다.

이 때, 저장 프로시저 작성이 완료되지 않았음에도 SQL문이 실행되는 위험을 막기 위해 구분자(;)를 다른 구분자로 바꿔주어야하는데 이 때 사용하는 명령어가 DELIMITER 이다.

따라서 저장 프로시저 생성 전에 구분자(DELIMITER)를 $$ 으로 바꿔주고 프로시저 작성이 끝났을 때 END $$ 로 저장 프로시저의 끝을 알려준다. 마지막으로 구분자를 원래대로 되돌리기 위해 구분자(DELIMITER)를 세미콜론(;)으로 바꿔준다.

 

???? 저장 프로시저 호출

CALL GetCustomers();

이처럼, 저장 프로시저를 활용하면 쿼리문을 일일히 작성하지 않아도 함수처럼 사용하여 손쉽게 쿼리문과 동일한 결과를 조회 할 수 있다.

 

저장 프로시저를 호출하면, MySQL 은 데이터베이스 카달로그에서 프로시저이름을 찾아 명령코드(SQL문)를 컴파일하고 메모리 공간(cache)에 저장하고, 프로시저를 실행시킨다.

그리고 같은 세션에서 동일한 저장 프로시저를 한번 더 호출하면, MySQL은 컴파일과정을 다시 거치지 않고 기존의 저장 프로시저를 캐시(cache)에서 불러온다.

 

저장 프로시저는 위 예시처럼 단순 select문으로 작성할 수도 있지만, 매개변수(파라미터)에 개별 value값을 넣어 원하는 결과를 조회할 수도 있다.

 

또한, IF, CASE 그리고 LOOP 같은 제어 흐름 문장을 사용하여 보다 향상된 SQL 코드문 작성도 가능하며 프로시저 내에서 다른 저장프로시저를 호출하여 사용할 수도 있다.

 

3. 활용

???? 저장 프로시저 생성

예) 답변 테이블에서 원본글인지 답변글인지를 판별하고, 답변여부에 따라 삭제여부 UPDATE 혹은 DELETE 처리

DELIMITER $$ 
DROP PROCEDURE IF EXISTS deleteReboard $$ #같은 이름이 있다면 지우기
CREATE PROCEDURE deleteReboard #저장 프로시저 생성 
( 
	#변수 선언 
    m_no INT, 
    m_step INT, 
    m_groupNo INT 
) 
BEGIN #SQL 프로그래밍 부분 시작 
DECLARE cnt INT; #답변 변수 설정 
SET cnt=0; #변수 초기화 
/*답변이 달린 원본 글인 경우에는 삭제하지 말고 delFlag를 Y 로 update하자*/ 
IF m_step=0 THEN /*원본글인 경우*/ 
  /*답변이 달렸는지 확인*/ 
  SELECT COUNT(*) INTO cnt FROM reboard WHERE groupno=m_groupNo; 
  IF cnt >1 THEN /*답변이 달린 경우*/ 
    UPDATE reboard SET delflag='Y' WHERE NO=m_no; 
  ELSE /*답변이 안 달린 경우*/ 
      DELETE FROM reboard WHERE NO=m_no; 
  END IF; 
ELSE /*답변글인 경우*/ 
	DELETE FROM reboard WHERE NO=m_no; 
END IF; 
END$$ 
DELIMITER ;

???? 저장 프로시저 호출

  • 변수는 반드시 프로시저에서 선언한 순서대로 입력해야한다.
  • m_no, m_step, m_groupNo 순서
CALL deleteReboard(4, 0, 4);

 

4. 저장 프로시저 내용 확인

SHOW CREATE PROCEDURE 저장_프로시저_이름;

5. 저장 프로시저 삭제

DROP PROCEDURE 저장_프로시저_이름;

 

 

 

 

 

 

 

 

 

 

 

참고 :

recoveryman.tistory.com/186

www.mysqltutorial.org/introduction-to-sql-stored-procedures.aspx

 

 

 

 

 

 

about author

PHRASE

Level 1  라이트

댓글 ( 4)

댓글 남기기

작성