스프링으로 게시판 만들어 보기 ( 마이바티스 1 : N 관계 처리)

2019. 8. 9. 23:07카테고리 없음

마이 바티스로 1:N 관계의 테이블 처리

1 : N 관계의 테이블을 조회하는 방법으로 2개지 방법을 사용하고 있습니다.

 

첫 번째 방법은 RDBMS에 있는 outer JOIN을 사용하는 방법입니다. ( 자주 사용하는 방법 )

게시글을 조회하면서 해당 게시글에 포함되어 있는 파일들을 조회한다고 가정하면

<select id="selectBoard" resultMap="boardInfo">
	select b.*,(select member_id from springmember m where b.member_no = m.member_no) member_id,f.* from (select * from springboard where board_no = #{boardNo}) b , springboardfile f where b.board_no = f.board_no(+)
</select>
<resultMap type="BoardWithReplyDTO" id="boardInfo">
	<association property="board" javaType="BoardVO" autoMapping="true"/>
	<collection property="files" javaType="FileVO" autoMapping="true"/>
</resultMap>

와 같은 방식으로 작성하면 됩니다.

association은 1에 해당하고

collection은 N에 해당합니다.

( 만약 해당 게시글 번호에 파일목록이 하나도 없다면 아무 결과도 출력되지 않기 때문에 inner join이 아닌 아우터 조인을 사용합니다. )

 

두 번째 방법

최근에 알게 된 기능입니다. 이미 작업한 결과가 있을 때 새로운 기능을 추가하거나 변경할 때 유용할 거 같습니다.

저 같은 경우는 게시판 작업이 끝난 후 남는 시간을 활용해서 파일 업로드 기능을 추가했습니다.

그래서 기존에 게시글을 조회했던 마이 바티스 select문이 이미 있었기 때문에

해당 코드를 건들지 않고 게시글을 조회하면서 해당 게시글의 파일목록도 같이 조회할 수 있도록 할 때 유용하게 사용했습니다.

<select id="selectBoard" resultMap="boardInfo">
	select b.*,(select member_id from springmember m where b.member_no = m.member_no) member_id from springboard b where board_no = #{boardNo}
</select>
	
<resultMap type="BoardWithReplyDTO" id="boardInfo">
	<association property="board" javaType="BoardVO" autoMapping="true"/>
	<collection property="files" column="board_No" javaType="ArrayList" ofType="FileVO"  select="selectFiles"/>
</resultMap>
	
<select id="selectFiles" resultType="FileVO">
	select * from springboardfile where board_no = #{boardNo}
</select>

기존에 게시글을 조회했던 selectBoard라는 select문이 이미 있었던 상황에서 파일 첨부 기능을 추가하면서

게시글을 조회할 때 파일목록도 같이 조회해야 했습니다.

collection에 있는 select기능을 사용해서 먼저 selectBoard를 호출한 후 resultMap에 담을 때 방금 조회한 컬럼을 사용해서 selectFiles라는 쿼리문을 새로 호출할 수 있습니다.

 

private List<FileVO> files; 라는 변수에 담는 과정입니다.

 

마무리

게시판 프로젝트 최종 깃허브 주소

https://github.com/zara9006/springboardproject