๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Backend/mybatis

[mybatis]resultMap ํ•˜์œ„ ์—˜๋ฆฌ๋จผํŠธ -collection ์—˜๋ฆฌ๋จผํŠธ

by sukii 2024. 3. 10.
๋ฐ˜์‘ํ˜•

๐Ÿ”ธcollection : 1:N ๊ด€๊ณ„์˜ ํ…Œ์ด๋ธ” ์กฐ์ธ์—์„œ ๊ฒ€์ƒ‰ํ–‰์˜ ์ปฌ๋Ÿผ๊ฐ’์œผ๋กœ List ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ resultMap ์—˜๋ฆฌ๋จผํŠธ์˜ type ์†์„ฑ๊ฐ’์œผ๋กœ ์„ค์ •๋œ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด ํ•„๋“œ์— ์ €์žฅํ•˜๋Š” ์—˜๋ฆฌ๋จผํŠธ
=> ํ•˜์œ„ ์—˜๋ฆฌ๋จผํŠธ๋กœ id ์—˜๋ฆฌ๋จผํŠธ ๋˜๋Š” result ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒ€์ƒ‰ํ–‰์˜ ์ปฌ๋Ÿผ๊ฐ’์„ List ๊ฐ์ฒด ์š”์†Œ(Java ๊ฐ์ฒด)์˜ ํ•„๋“œ์— ์ €์žฅ๋˜๋„๋ก ์„ค์ •
โ–ช๏ธ property ์†์„ฑ : collection ์—˜๋ฆฌ๋จผํŠธ๋กœ ์ƒ์„ฑ๋œ List ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋  ํด๋ž˜์Šค์˜ ํ•„๋“œ๋ช…์„ ์†์„ฑ๊ฐ’์œผ๋กœ ์„ค์ •
โ–ช๏ธ ofType ์†์„ฑ : List ๊ฐ์ฒด์— ์ €์žฅ๋œ ์š”์†Œ(Java ๊ฐ์ฒด)์˜ ์ž๋ฃŒํ˜•์„ ์†์„ฑ๊ฐ’์œผ๋กœ ์„ค์ •
=> Java ์ž๋ฃŒํ˜• ๋Œ€์‹  typeAlias ์—˜๋ฆฌ๋จผํŠธ๋กœ ์„ค์ •ํ•œ ๋ณ„์นญ(AliasName) ์‚ฌ์šฉ ๊ฐ€๋Šฅ

 

๐Ÿ‘ฉ‍๐Ÿ’ป์‹ค์Šต ์˜ˆ์ œ

๊ฒŒ์‹œ๊ธ€ ํ•œ ๊ฐœ ๋‹น 0๊ฐœ ์ด์ƒ์˜ ๋Œ“๊ธ€์ด ์žˆ์Œ. ์ด๋Ÿด ๋•Œ ๋Œ“๊ธ€์€ ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋‹ˆ List ๊ฐ์ฒด๋กœ ํ•„๋“œ์— ์ €์žฅํ•ด์•ผํ•จ.

์ด ๋•Œ ๊ฒ€์ƒ‰ํ–‰๋“ค์„ List ๊ฐ์ฒด๋กœ ํ•„๋“œ์— ๊ฐ’์„ ์ €์žฅํ•˜๋ ค๋ฉด collection ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ํ•„์š”ํ•จ.

(์ฐธ๊ณ ๋กœ ๊ฒŒ์‹œ๊ธ€์€ ๊ทธ๋ƒฅ ๊ฐ์ฒด๋กœ ๊ฐ’์„ ์ €์žฅํ•˜๋ฉด ๋˜๋‹ˆ๊นŒ association ์‚ฌ์šฉํ•จ.

 

โฌ‡๏ธ๋งคํผ ํŒŒ์ผ์„ ์‚ดํŽด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Œ.

๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ๋Š”!!!!

โญ ๋ฌธ์ œ์ : resultMap ์—˜๋ฆฌ๋จผํŠธ์˜ ์ฒซ๋ฒˆ์งธ ํ•˜์œ„ ์—˜๋ฆฌ๋จผํŠธ๋กœ association ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ ๊ฒ€์ƒ‰ํ–‰์œผ๋กœ Java ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์ œ๊ณตํ•˜์ง€๋งŒ ๋‹ค์ˆ˜์˜ ํ–‰์ด ๊ฒ€์ƒ‰๋˜๋ฉด TooManyResultsException ๋ฐœ์ƒ

โญํ•ด๊ฒฐ๋ฒ• : ๋‹ค์ˆ˜์˜ ํ–‰์ด ๊ฒ€์ƒ‰๋˜๋Š” ๊ฒฝ์šฐ resultMap ์—˜๋ฆฌ๋จผํŠธ์˜ ์ฒซ๋ฒˆ์งธ ํ•˜์œ„ ์—˜๋ฆฌ๋จผํŠธ๋กœ association ์—˜๋ฆฌ๋จผํŠธ์™ธ์— ๋‹ค๋ฅธ ์—˜๋ฆฌ๋จผํŠธ(constructor, id, result)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑ

	<resultMap type="MyCommentReply" id="myCommentReplyResultMap">
		<!-- ์ด id ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด TooManyResultsException ๋ฐœ์ƒ -->
		<id column="comment_no" property="commentNo"/>
	
		<association property="comment" javaType="MyComment1">
			<id column="comment_no" property="commentNo"/>
			<result column="comment_id" property="commentId"/>
			<result column="comment_content" property="commentContent"/>
			<result column="comment_date" property="commentDate"/>
		</association>
		
		<collection property="replyList" ofType="MyReply">
			<id column="reply_no" property="replyNo"/>
			<result column="reply_id" property="replyId"/>
			<result column="reply_content" property="replyContent"/>
			<result column="reply_date" property="replyDate"/>
			<result column="reply_comment_no" property="replyCommentNo"/>
		</collection>
	</resultMap>
	
	<!-- ๊ฒŒ์‹œ๊ธ€๋ฒˆํ˜ธ๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ MYCOMMENT ํ…Œ์ด๋ธ”์— ์ €์žฅ๋œ ํ–‰๊ณผ MYREPLY ํ…Œ์ด๋ธ”์— ์ €์žฅ๋œ ํ–‰์„
	1:N ๊ด€๊ณ„๋กœ ๊ฒฐํ•ฉ๋˜๋„๋ก ๊ฒ€์ƒ‰ํ•˜์—ฌ Java ๊ฐ์ฒด(MyCommentReply ๊ฐ์ฒด)๋กœ ์ œ๊ณตํ•˜๋Š” ์—˜๋ฆฌ๋จผํŠธ -->
	<select id="selectCommentReply" parameterType="int" resultMap="myCommentReplyResultMap">
		select comment_no, comment_id, comment_content, comment_date, reply_no, reply_id
			, reply_content, reply_date, reply_comment_no from mycomment left join myreply on 
			comment_no=reply_comment_no where comment_no=#{commentNo} order by reply_no desc
	</select>

 

 

๋ฐ˜์‘ํ˜•