SPRING/IceWater Community

[스프링] 게시글 조회수와 트랜잭션 구현

간펴니 2021. 8. 25. 19:36
728x90

오라클 사용중입니다.

ALTER TABLE MP_BOARD ADD(HIT NUMBER DEFAULT 0);
COMMIT;

조회수 칼럼 HIT 를 게시판 테이블에 추가


 

public class BoardVO {
	private int bno;
	private String title;
	private String content;
	private String writer;
	private Date regdate;
	private int hit;

게시판VO에 hit를 추가하고 getter&setter를 생성

 


 

 

<!-- 트랜젝션 START -->
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-tx</artifactId>
		    <version>3.1.1.RELEASE</version>
		</dependency>
		<!-- 트랜젝션 END -->

트랜잭션을 사용하기위해 트랜잭션관련 라이브러리를 가져올 코드를 pom.xml에 추가

 

스프링 트랜잭션 라이브러리를 사용하기위해

 

root-context의 Namespace로 가서 tx에 체크 후 저장해준다.

 

////// Namespace가 없다면 Source 상단에

 

xmlns:tx="http://www.springframework.org/schema/tx"

xsi:schemaLocation="http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"

 

추가

///////////////////

 

<tx:annotation-driven transaction-manager="transactionManager" />

을 beans안에 넣어준다.

 


<select id="listPage" resultType="kr.co.vo.BoardVO" parameterType="kr.co.vo.SearchCriteria">
		SELECT  BNO, 
		        TITLE, 
		        CONTENT,
		        WRITER, 
		        REGDATE,
		        HIT,
		        
		 FROM ( 
		        SELECT BNO, 
		               TITLE, 
		               CONTENT, 
		               WRITER, 
		               REGDATE,
		               HIT ,
		             
		               ROW_NUMBER() OVER(ORDER BY BNO DESC) AS RNUM
		         FROM MP_BOARD
		         WHERE 1=1 
		         	<include refid="search"></include>
		                       ) MP
		WHERE RNUM BETWEEN #{rowStart} AND #{rowEnd}
		ORDER BY BNO DESC
	</select>

원래의 게시글목록 조회 쿼리Mapper에

조회수컬럼 HIT를 추가해준다

 

 

<update id="boardHit" parameterType="int">
	UPDATE MP_BOARD SET
	HIT = HIT+1
	WHERE BNO = #{bno}
	</update>

그 후 한번 게시글을 읽을때마다 조회수에 +1을 해줄 update쿼리를 추가한다.

 


DAO
	public void boardHit(int bno) throws Exception;
    
 
 DAOImpl
	@Override
	public void boardHit(int bno) throws Exception {
		// TODO Auto-generated method stub
		sqlSession.update("boardMapper.boardHit", bno);
	}

DAO와 DAOImpl 에 조회수증가 쿼리가 실행될때 bno의 값 {bno} (게시글PR)을 파라미터로 받아서 사용할 수 있게 해준다.

 


ServiceImpl

	// 게시물 조회
	@Transactional(isolation = Isolation.READ_COMMITTED)
	@Override
	public BoardVO read(int bno) throws Exception {
			dao.boardHit(bno);
		return dao.read(bno);
	}

그 후 ServiceImpl에서 dao에 조회수증가 쿼리를 게시글 내용보기 서비스에 넣어준다.

 

과정은

게시글 목록(listPage)에서 조회수를 볼 수 있는데, 목록에 게시글 제목을 클릭하면 내용보기(read)로 넘어간다.

이때 조회수 증가 쿼리를 같이 실행시키면서 조회수에 1이 증가되는 방식이다.

bno값으로 게시글을 구분해서 게시글마다 조회수가 각각 0부터 +1씩 들어가게 된다.

 

@Transactional은 아까 설정한 트랜잭션 어노테이션인데, 스프링에선 라이브러리 추가 후 저렇게 간단하게 사용할 수 있다.

트랜잭션에 관한 글은 매우 많으니 생략하도록 하고, 트랜잭션을 사용하지 않으면 게시글을 읽지못한 상황(오류발생 등..)에서 조회수가 증가하지 않게 된다.

 

 

 

 

 

728x90