[Spring Boot 게시판] 20일차

김정현·2022년 10월 24일
0

SPRINGBOOT게시판

목록 보기
19/36

1. reactionPoint() 테이블 생성 (좋아요,싫어요 기능 추가하기 위해)

    # reactionPoint(추천) 테이블 생성
    CREATE TABLE reactionPoint (
        id INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
        regDate DATETIME NOT NULL,
        updateDate DATETIME NOT NULL,
        memberId INT(10) UNSIGNED NOT NULL,
        relTypeCode CHAR(50) NOT NULL COMMENT '관련 데이터 타입 코드',
        relId INT(10) UNSIGNED NOT NULL COMMENT '관련 데이터  번호',
        `point` SMALLINT(2) NOT NULL
    );

    # reactionPoint 테스트 데이터
    # 1번 회원이 1번 article 에 싫어요
    INSERT INTO reactionPoint
    SET regDate = NOW(),
    updateDate = NOW(),
    memberId = 1,
    relTypeCode = 'article',
    relId = 1,
    `point` = -1;

    # 1번 회원이 2번 article 에 좋아요
    INSERT INTO reactionPoint
    SET regDate = NOW(),
    updateDate = NOW(),
    memberId = 1,
    relTypeCode = 'article',
    relId = 2,
    `point` = 1;
  • reactionPoint 추천(좋아요,싫어요) 관련 테이블 생성
  • 게시물에 좋아요,싫어요 컬럼을 추가하지 않고 테이블로 생성 하는 이유 : 다른 곳에서 비슷한 기능을 추가하고 싶을때마다 해당 테이블의 컬럼을 추가해야 하기 때문에 reactionPoint테이블을 만들어 관련 데이터 타입과, 관련 데이터 번호만으로 관리하기 위함
  • memberId를 남기는 이유는 게시물에 좋아요,싫어요를 한번만 하기위해

2. list 시간 출력 함수 만들어서 활용

	<td>${article.forPrintType1RegDate}</td>
  • article.getForPrintType1RegDate() 메소드를 활용
  • EL 식을 이용하여 메서드들을 호출할 때는 이름 제일 앞의 "get"을 떼고, 그 다음의 첫 문자를 소문자로 고친 이름을 사용

3. getArticle(게시물 가져오는) 쿼리에, reactionPoint 관련 내용까지 같이 가져올수 있또록 처리(서브쿼리)

1) article vo에 sum,good,badReactionPoint 추가

	private int extra__sumReactionPoint;
	private int extra__goodReactionPoint;
	private int extra__badReactionPoint;
  • extra__sumReactionPoint : 좋아요, 싫어요 합을 의미하는 필드

  • extra__goodReactionPoint : 좋아요 만 합을 의미하는 필드

  • extra__badReactionPoint : 싫어요 만 합을 의미하는 필드

2) getArticle 쿼리문

		SELECT A.*, IFNULL(SUM(RP.point),0) AS extra__sumReactionPoint,
		IFNULL(SUM(IF(Rp.point &gt; 0,Rp.point,0)),0) AS extra__goodReactionPoint,
		IFNULL(SUM(IF(Rp.point &lt; 0,Rp.point,0)),0) AS extra__badReactionPoint
		FROM		
		(SELECT A.* , M.nickname AS extra__writer 
		FROM article AS A
		INNER JOIN `member` AS M
		ON A.memberId = M.id
		WHERE A.id = #{id} ) AS A
		LEFT JOIN reactionPoint AS RP
		ON RP.relTypeCode = 'article'
		AND A.id = RP.relId
		GROUP BY A.id	
  • 서브 쿼리를 활용하여 reactionPoint(추천) 관련 데이터를 가져옴

  • 서브쿼리의 테이블( 회원닉네임정보를 얻기위해 게시물 테이블에 회원테이블 조인한 테이블) 에

  • reactionPoint테이블을 LEFT조인 한 쿼리문

  • 이때 조건은 게시물 아이디 = reactionPoint에 relId (게시물 정보로 게시물의 id를 저장)

  • GROUP BY A.id : 게시물의 아이디로 그룹화 (집계함수를 사용하기위해)

  • LEFT 조인 한결과, reactionPoint테이블에 조인조건에 해당하는 데이터가 없으면 null값으로 나타내기 때문에 IFNULL 사용

  • IFNULL(SUM(RP.point),0) : 전체 합 (좋아요(1), 싫어요(-1)의 합)으로 종합 추천수를 나타냄

  • IFNULL(SUM(IF(Rp.point &gt; 0,Rp.point,0)),0) : 좋아요만을 합산한것을 나타냄

  • IFNULL(SUM(IF(Rp.point &lt; 0,Rp.point,0)) : 싫어요만을 합산한것을 나타냄

  • &lt;,&gt; : mybatis에서 부등호 (<,>) 사용 하기위해 부등호를 직접 쓰면 오류

- 서브쿼리 정리 자료 -

0개의 댓글