안녕하세요. 이번 게시판을 구현하는 프로젝트를 진행하게 되었습니다.
저도 배우면서 진행하는 중이라 다소 미흡한 점이 있을 수 있습니다.
부족한 점이 많을 수 있으니 적당히 거를건 거르셨으면 좋겠습니다.
피드백은 빠르게 수용하고 문제점은 빠르게 고치겠습니다.
해당 글은 언제든 수정될 수 있습니다.
보통 게시판에서 '한개의 게시글에 여러개의 댓글', '한개의 게시판에 여러개의 게시글' 이 보통입니다.
제가 구현한 내비게이션 바에선 한개의 강의에 여러개의 게시판그룹,
또 여러개의 게시판 그룹 중 한개의 그룹안에 여러개의 게시판이 나열되있습니다.
중복되는게 보이시나요 ? 이걸 어떻게 처리하지.. 하다가
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 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>
<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로 깔끔하게 정리해서 결과값으로 돌려주면 좀더 쉽게 가공하지 않을까 ? 하는 생각에 하는방식을 바꿔보았습니다.
글 읽어주셔서 감사합니다.