본문 바로가기
프레임워크/스프링

[Spring Boot] MariaDB, maven을 활용한 게시판 만들기 (1)

by Yikanghee 2022. 3. 15.

JPA에 공부를 하기에 앞서 MariaDB와 maven을 활용한 레거시한 버전으로 게시판을 만들어 볼것이다

DB는 위와 같이 세팅 해주었다. 

로컬호스트로 MariaDB를 연결해주면 쉽게 연결할 수 있다

나는 VMware에 ubuntu를 설치하고 그 위에 mariaDB를 연동했다

MAPPER는 데이터베이스(오라클, MySQL, MariaDB)로부터 전달받은 결과 값을 자바 객체로 변환시키는데

자동 변환을 위해서는 반드시 DTO를 사용해야 한다

DTO는 Data Transfer Object로 사용하지 않아도 되지만 코드 효율을 높여준다

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- JAVA와 연결할 Mapper 파일 설정 -->
<mapper namespace="kopo.poly.persistance.mapper.INoticeMapper">

	<!-- 게시판 리스트 쿼리 -->
	<select id="getNoticeList" resultType="NoticeDTO">
		SELECT N.NOTICE_SEQ, N.TITLE, N.NOTICE_YN, N.READ_CNT, U.USER_NAME, N.USER_ID,
			   DATE_FORMAT(N.REG_DT, '%Y-%m-%d') AS REG_DT
	      FROM NOTICE N, USER_INFO U
	     WHERE N.USER_ID = U.USER_ID
	 	 ORDER BY N.NOTICE_YN, N.REG_DT DESC
	</select>
	
	<!-- 게시판 등록 쿼리 -->
	<insert id="InsertNoticeInfo" parameterType="NoticeDTO">
		INSERT INTO NOTICE
			(
				NOTICE_SEQ, TITLE, NOTICE_YN, CONTENTS, USER_ID, READ_CNT, 
		      	REG_ID, REG_DT, CHG_ID, CHG_DT
			)
		VALUES(
			(SELECT NULLIF (MAX(A.NOTICE_SEQ),0)+1 FROM NOTICE A),
			#{title}, #{notice_yn}, #{contents}, #{user_id}, 0, #{user_id}, SYSDATE(), #{user_id}, SYSDATE()
		)
	</insert>
	
	<!-- 게시판 상세보기 쿼리 -->
	<select id="getNoticeInfo" resultType="NoticeDTO">
		SELECT N.NOTICE_SEQ, N.TITLE, N.NOTICE_YN, N.READ_CNT, U.USER_NAME, N.USER_ID,
			   CONTENTS, DATE_FORMAT(N.REG_DT, '%Y-%m-%d') AS REG_DT
	      FROM NOTICE N, USER_INFO U
	     WHERE N.USER_ID = U.USER_ID 
	       AND N.NOTICE_SEQ = #{notice_seq}
	</select>
	

	
	<!-- 조회수 증가 쿼리 -->
	<update id="updateNoticeReadCnt" parameterType="NoticeDTO">
		UPDATE NOTICE SET
			READ_CNT = READ_CNT + 1
		WHERE
			NOTICE_SEQ = #{notice_seq}		
	</update>

	<!-- 게시판 수정 쿼리 -->
	<update id="updateNoticeInfo" parameterType="NoticeDTO">
		UPDATE NOTICE SET
			TITLE = #{title},
			NOTICE_YN = #{notice_yn},
			CONTENTS = #{contents},
			CHG_ID = #{user_id},
			CHG_DT = SYSDATE()
		WHERE
			NOTICE_SEQ = #{notice_seq}	
			
	</update>

	<!-- 게시판 삭제 쿼리 -->
	<delete id="deleteNoticeInfo" parameterType="NoticeDTO">
		DELETE FROM NOTICE
		WHERE NOTICE_SEQ = #{notice_seq}	
			
	</delete>
			
</mapper>

다음은 MAPPER 쿼리 XML이다

JPA와 달리 JOIN과 같은 문장 사용이 가능하다

위에 있는 쿼리문과 연결해주는 인터페이스이다.

@Mapper를 사용하면 간단히 연결해준다

URL요청으로부터 온 정보를 Controller에서 DTO로 저장하고 저장된 DTO를 Service에서 사용할 수 있으며,

데이터베이스에 사용되는 SQL의 인자값으로 사용 가능하다

특히 DTO를 사용하면 Select문 실행 결과에 대해 자동으로 자바 객체로 생성할 때 상당히 편리하다

이때 자동으로 자바 객체로 변환하기 위해서 DTO 변수 이름은 테이블의 컬럼명과 동일하게 하는 것이 좋다

 

추가로 @Getter, @Setter 어노테이션 사용으로 바이트코드로 컴파일될 때, Getter, Setter를 자동으로 생성함

 

Select 쿼리의 결과가 한줄만 나요면 결과 타입을 일반 객체로 정의하고

Select 쿼리의 결과가 두줄 이상 나오면 결과타입을 List<DTO>로 선언한다

 

List<NoticeDTO> getNoticeList() throws Exception 을 예로 설명하자면 

List<NoticeDTO> 는 SQL 실행결과에 대한 변수를 Service에 전달하는 역할이고

getNoticeList 는 Mapper 인터페이스의 함수 명은 Mapper XML과 연결되는 키 역할,

() -> 안에 매개변수가 있다면 변수 역할을한다

 

여기까지 DB -> MAPPER -> DTO 까지 완성했다

댓글