[SpringBoot] 게시판 네비게이션바 구현 Mybatis 1:N 조회.

고재현·2020년 6월 12일
0

안녕하세요. 이번 게시판을 구현하는 프로젝트를 진행하게 되었습니다.
저도 배우면서 진행하는 중이라 다소 미흡한 점이 있을 수 있습니다.

**테스트 데이터들이 많으니 양해 부탁드립니다.

부족한 점이 많을 수 있으니 적당히 거를건 거르셨으면 좋겠습니다.
피드백은 빠르게 수용하고 문제점은 빠르게 고치겠습니다.
해당 글은 언제든 수정될 수 있습니다.

보통 게시판에서 '한개의 게시글에 여러개의 댓글', '한개의 게시판에 여러개의 게시글' 이 보통입니다.

제가 구현한 내비게이션 바에선 한개의 강의에 여러개의 게시판그룹,
또 여러개의 게시판 그룹 중 한개의 그룹안에 여러개의 게시판이 나열되있습니다.

평소처럼 조인해서 가져오니 '한 개' 의 값이 중복되는게 너무 거슬리는 것이였습니다.

중복되는게 보이시나요 ? 이걸 어떻게 처리하지.. 하다가
Mybatis 1:N. 즉 ResultMap Collection 대해 찾아보게 되었습니다.
말주변이 없어서 따로 셋팅에 대해 언급하지 않고 코드로 설명하겠습니다.

ERD는 이렇습니다.

DTO를 3개 만들어줍니다.
게시판 그룹 리스트, 게시판 그룹, 게시판

@Getter @Setter @ToString
public class BoardGroupList {
	public BoardGroupList() {}
	private String lectureCode;
	private String lectureName;
	private List<BoardGroup> boardGroup;
}
@Getter @Setter @ToString
public class BoardGroup {
	private int boardGroupNo;
	private String boardGroupName;
	private int boardGroupOrder;
	private List<Board> board;
}
@Getter @Setter @ToString
public class Board {
	private int boardNo;
	private String boardName;
	private String boardIntro;
	private int boardOrder;
}
중요한 것은 BoardGroupList 안에 List<BoardGroup> , 
           BoardGroup안에 <Board> 인 형태를 기억하는 것입니다.

이렇게 BoardGroupList객체를 만들고 DAO에서 List로 받아올 것입니다.

List<BoardGroupList> getNavbar(String userId);

MyBatis

  • ResultMap
	<resultMap type="boardGroup" id="boardGroup_resultMap">
		<id property="boardGroupNo" column="BOARD_GROUP_NO"/>
		<result property="boardGroupName" column="BOARD_GROUP_NAME"/>
		<result property="boardGroupOrder" column="BOARD_GROUP_ORDER"/>
		<collection property="board" ofType="board" column="boardGroupNo=BOARD_GROUP_NO" 
					javaType="List" select ="getBoardList"/>
	</resultMap>
	
	<resultMap type="boardGroupList" id="boardGroupList_resultMap">
		<id property="lectureCode" column="LECTURE_CODE"/>
		<result property="lectureName" column="LECTURE_NAME"/>
		<collection property="boardGroup" ofType="boardGroup" column="lectureCode=LECTURE_CODE"
					javaType="List" select = "getBoardGroupList"/>
	</resultMap>	
  • Query
	<select id="getNavbar" resultMap="boardGroupList_resultMap">
		SELECT lecture_code,lecture_name FROM lecture WHERE user_id = #{userId}
	</select>	
		
	<select id="getBoardGroupList" resultMap="boardGroup_resultMap">
	 	SELECT * FROM BOARD_GROUP WHERE lecture_code IN ( #{lectureCode} ) ORDER BY board_group_order
	</select>
	
	<select id="getBoardList" resultType="board">
		SELECT * FROM board WHERE board_GROUP_NO = #{boardGroupNo}
	</select>

설명 :

<collection property="boardGroup" ofType="boardGroup" column="lectureCode=LECTURE_CODE"
					javaType="List" select = "getBoardGroupList"/>

property : 변수명
ofType : return type
column : parameter (2개 이상일땐 column="{prop1=COLUMN1, prop2=COLUMN2}"
javaType : return collection Type
select : 조회할 쿼리문

BoardGroupList Class랑 BoardGroupList resultMap이랑 비슷해 보이지 않나요 ?
List<>에 해당하는 부분을 Mybatis에서는 Collection으로 지정합니다.

즉 select = getNavbar가 실행될 때 resultMap에 매핑시킬 때 
<collection select="getBoardGroupList">이 실행되고  한개의 결과값에 여러개의 row가
매핑되는 것입니다.  list형태로

어려운것은 아니지만 모르면 다가가기 힘든 방법입니다.
사실 1:N으로 조회는것과 JOIN을 하는것 중 어느것이 더 cost비용이 높은지 모르겠습니다.
하지만 List로 깔끔하게 정리해서 결과값으로 돌려주면 좀더 쉽게 가공하지 않을까 ? 하는 생각에 하는방식을 바꿔보았습니다.

글 읽어주셔서 감사합니다.

profile
JAVA 기반 풀스택 개발자를 희망하는 한 남자입니다 !

6개의 댓글