Spring Boot

association(1:1관계)

머리방울 2022. 9. 21. 17:10

현재 EmpVO(사원정보), DeptVO(부서정보)를 담고 있는 VO 두개가 있다.

EmpVO(사원정보)에는 DeptVO의 PK인 deptNum(부서번호)가 FK로 걸려 있다.

empMapper에서 사원정보와 부서정보를 포함한 사원 목록을

불러오고자 쿼리를 작성할 때 두가지 방법이 있다. 

 

1. association을 이용하기 

사원을 기준으로 봤을 때 사원은 하나의 부서에 소속되어 있다.

association은 1:1 관계일 때 사용한다.

 

2. collection 이용하기

collection은 1:N 기준으로 부서 기준으로 봤을 때 사원이 

여러명 소속되어 있다.


실무에서는 외래키(FK)로 걸려 있는 테이블 기준으로 둘 중 무엇을 쓸 것인지 판단한다고 한다.

 

현재 사원정보에 deptNum(부서번호)이 FK로 걸려 있기 때문에

1:1 관계 association으로 처리하겠다.

 

1. resultMap 작성하기

<mapper namespace="empMapper">

<resultMap type="kh.study.emp.emp.vo.EmpVO" id="emp">
<id column="EMP_NUM" property="empNum"/>
<result column="EMP_NAME" property="empName"/>
<result column="POSITION" property="position"/>
<result column="EMP_AGE" property="empAge"/>
<result column="GENDER" property="gender"/>
<result column="EMP_TELL" property="empTell"/>

<association property="deptInfo" resultMap="deptMapper.dept"/>

</resultMap>

 

기본형태
<association property="" resultMap=""/>

property="" -> 내가 empVO에서 association을 무엇이라고 부를 것인지

resultMap -> resultMap의 이름을 지정한다

나는 empVO와 deptVO mapper를 각 파일로 분리하였다. 
내가 이미 deptVO로 만든 resultMap을 불러오기 위해서는 
deptMapper의 namespace이름 + . + 지정할 이름을 작성하면 된다. 
즉. resultMap="deptMapper.dept"

 

2. empVO

@Getter
@Setter
@ToString
public class EmpVO {

	private String empNum  ;
	private String empName ;
	private String position;
	private int empAge  ;
	private String empTell;
	private String gender ;
	private String deptNum ;
    
 association 객체
 private DepartmentVO deptInfo;

 

3. html 적용

 <th:block th:each="list, status :${empList}">
	    <tr>
	      <th scope="col" th:text="${status.count}"></th>
	      <td th:text="${list.empName}"></td>
	      <td th:text="${list.empTell}"></td>
	      <td th:text="${list.gender}"></td>
	      <td th:text="${list.empAge}"></td>
	      <td th:text="${list.deptInfo.getDeptName()}"></td>
	      <td th:text="${list.deptInfo.getLocal()}"></td>
	    </tr>
    </th:block>

즉,  empVO.getDeptInfo().getDeptName(); 이렇게 자료 빼낸다 .

list.deptInfo.local 이렇게 작성하면 getter가 실행된다.

 

 

 

테이블이 3개 이상일 때는 view를 사용하는 것도 적절한 방법이다.

 

 

카테고리 상품정보

 

카테고리 기준 카테고리 1 : N 상품  -> collection 사용

 

상품정보 1 : N 상품이미지  -> collection 사용