sitelink1 | |
---|---|
sitelink2 | |
sitelink3 | |
extra_vars6 |
http://blog.empas.com/ahnyounghoe/13222052
아티클링크와 회원사이에 별점을 부여하는 관계는 M:N 입니다. 별점이란 추천 하나당 부여하는 포인트를 의미합니다.
당연히 한명의 회원은 하나의 링크당은 하나지만, 여러 개의 아티클링크에 별점을 부여할 수 있죠.
반대로 하나의 링크에 대해서도 여러 회원의 별점을 부여할 수 있죠.
<!-- SELECT Statements -->
<select id="selectDefaultList" resultMap="article">
select ID, LANG, TITLE, LINK, REGI_DATE, DESC, USERINFO_REF
from T_ARTICLELINK
order by ID DESC
</select>

아티클링크와 회원사이에 별점을 부여하는 관계는 M:N 입니다. 별점이란 추천 하나당 부여하는 포인트를 의미합니다.
당연히 한명의 회원은 하나의 링크당은 하나지만, 여러 개의 아티클링크에 별점을 부여할 수 있죠.
반대로 하나의 링크에 대해서도 여러 회원의 별점을 부여할 수 있죠.
객체로써는 상호 메시지 콜이 가능하게(Navigable)하면 컬렉션(Collection) 형태의 멤버로 참조하게 되어 문제가 없죠. 그러나, 관계형 DB의 경우는 단방향성을 지니기 때문에 이를 해소하는 테이블을 만들어야 합니다.
대략 위와 같은 테이블이죠. T_ARTICLELINK 테이블의 ID 컬럼을 FK_ART라는 이름으로 참조(제약)하고 그 값을 ARTICLELINK_REF 컬럼에 저장하고, T_USERINFO 테이블의 ID 컬럼을 FK_USER라는 이름으로 참조하고, 그 값을 USERINFO_REF 컬럼에 저장하는 것이죠.

이와 같은 화면 요구가 있을 때 별점으로 부과된 항목을 얻는 방법은 몇 가지가 있습니다. 우선 iBatis가 컬렉션 형태의 속성값을 Select문 호출로 설정해주는 기능을 제공하는데 이를 이용한 사례를 보죠.
<resultMap id="article" class="articleLink">
<result property="id" column="ID" />
<result property="language" column="LANG" />
<result property="title" column="TITLE" />
<result property="link" column="LINK" />
<result property="regiDate" column="REGI_DATE" />
<result property="description" column="DESC" />
<result property="submitter.id" column="USERINFO_REF" />
<result property="starmarker" select="selectStarmarker" column="id" />
</resultMap>
<result property="id" column="ID" />
<result property="language" column="LANG" />
<result property="title" column="TITLE" />
<result property="link" column="LINK" />
<result property="regiDate" column="REGI_DATE" />
<result property="description" column="DESC" />
<result property="submitter.id" column="USERINFO_REF" />
<result property="starmarker" select="selectStarmarker" column="id" />
</resultMap>
<!-- SELECT Statements -->
<select id="selectDefaultList" resultMap="article">
select ID, LANG, TITLE, LINK, REGI_DATE, DESC, USERINFO_REF
from T_ARTICLELINK
order by ID DESC
</select>
<select id="selectStarmarker" resultClass="userinfo">
select USERINFO_REF from T_ART_USER
where ARTICLELINK_REF = #article_id#
</select>
select USERINFO_REF from T_ART_USER
where ARTICLELINK_REF = #article_id#
</select>
ArticleLink 객체의 starmarker 란 속성이 List 형태라면 하나의 값을 설정할 수가 없습니다. 그래서, 추가적인 select 문 호출을 위해 select 속성 값으로 selectStarmarker를 설정합니다. 그리고, 조건문에 제공할 매개변수를 column 값으로 제공하는 것이죠.
이렇게 설정한 후 setStarmarker 메소드가 호출될 때 그 사이즈 정보를 보관하도록 객체를 수정해보죠.
이제 jsp 페이지를 수정하면 위 그림과 같은 출력이 가능합니다.
<c:forEach items="${articleList}" var="articleLink">
<tr><td rowspan="4">별점: ${articleLink.stars}</td>
<td>
<a href="${articleLink.link}" target="blank">
${articleLink.title}</a></td></tr>
<tr><td><a href="viewUserCtrb.do?user=${articleLink.submitter.id}" target="blank">
${articleLink.submitter.id}</a>
(<fmt:formatDate value="${articleLink.regiDate}" type="date" pattern="yyyy/MM/dd" />)</td></tr>
<tr><td>${articleLink.description}</td></tr>
<tr><td>의견 수/카테고리</td></tr>
</c:forEach>
</table>
<tr><td rowspan="4">별점: ${articleLink.stars}</td>
<td>
<a href="${articleLink.link}" target="blank">
${articleLink.title}</a></td></tr>
<tr><td><a href="viewUserCtrb.do?user=${articleLink.submitter.id}" target="blank">
${articleLink.submitter.id}</a>
(<fmt:formatDate value="${articleLink.regiDate}" type="date" pattern="yyyy/MM/dd" />)</td></tr>
<tr><td>${articleLink.description}</td></tr>
<tr><td>의견 수/카테고리</td></tr>
</c:forEach>
</table>