본문 바로가기
Back-End/Spring

MyBatis로 DB 칼럼 과 Java Property mapping 방법( XML, Annotation)

by 어렵다어려웡 2021. 3. 22.

Spring은 Spring Boot의 JPA처럼 서버구동시 hibernate가 자동으로 연관관계매핑을 시켜주지 않는다.

Spring Boot 또한 JPA를 주입하지 않으면 자동으로 테이블이 매핑되지 않고 자동으로 생성되지도 않는다.

 

실무에서도 쓰이는 코드의 형식을 알려주는 주제로 만들어진 강의영상을 보았다.

해당 영상은 Boot의 MyBatis를 활용하여 XML방식이 아닌 SQL Mapper를 Annotation 방식으로 만들었는데.

 

Spring에서도 다른코드지만 같은데이터를 가져다 줄 수 있는 코드가 있을거같아서 직접 구현을 해보았다.

 

// Boot ( Annotation 방식 )
@Data
public class Company {
	// 3개의 프로퍼티를 갖는 클래스 생성
	private int id;
	private String name;
	private String address;
	private List<Employee> employeeList;
}

// Spring (XML 방식)
@Data
public class CompanyVO {
	// 3개의 프로퍼티를 갖는 클래스 생성
	private int id;
	private String name;
	private String address;
	private List<EmployeeVO> employeeList;
}

 

보는 것 처럼 DB의 칼럼명칭과 Java 에서 만든 class의 변수명이 일치하지 않는다.

그래서 SQL Mapper인 MyBatis를 사용해서 SQL 문법을 만들 떄 직접 매핑을 시켜주는 코드가 필요해 진다.

 

주석 친 부분은 마지막 구현 코드로 우선 주석처리 해놓았습니다.

간단하게 설명면 select로 설정된 메서드의 파라미터로 "id"값을 넣고 해당 결과데이터를 employeeList에 매핑시킵니다즉, 특정 회사에 속한 직원 목록의 데이터가 employeeList에 저장됩니다. ( subQuery )주석 친 코드는 many 와 같은 역할을 합니다.

	// Boot ( Annotation )
		@Select("select * from company")
		@Results(id="CompanyMap", value={
		@Result(property = "name", column = "company_name"),
		@Result(property = "address", column = "company_address"),
		@Result(property = "employeeList", column = "id", 
		many = @Many(select = "com.example.demo.mapper.EmployeeMapper.getByCompanyId"))
	}) 
	List<Company> getAll();
    
    
  	// Spring (XML)
  	<resultMap type="com.awse.domain.CompanyVO" id="companyMap">
		<id property="id" column="id" />
		<result property="id" column="id" />
		<result property="name" column="company_name" />
		<result property="address" column="company_address" />
		//<collection property="employeeList" column="id" select="com.awse.mapper.EmployeeMapper.getByCompanyId" />
	</resultMap>

	<select id="getList" resultMap="companyMap" resultType="com.awse.domain.CompanyVO">
		select * from company 
	</select>

 

XML을 이용했을 때는 해당 Mapper.xml 파일에서 <resultMap> 태그를 통해 칼럼과 property를 매핑시켜줘야합니다.

 

<id> - PK칼럼

<result> - 그외 칼럼 ( Collection 객체 제외 )

<collection> - Collection 객체로 만들어진 property에 사용

 

Annotation을 이용한 방식으로 SQL을 작성할 떄는 @Results를 선언해서 사용합니다.

@Results의 id 과 value 속성의 값을 넣어 주면 @Results의 전체 코드를 사용하지 않고 재사용해서 사용할수 있다

 

매핑이 필요한 SQL 메서드위에 "@ResultMap("companyMap") " 를 선언해주면 된다.

선언하면 해당 메서드를 불러올 때 company 테이블의 칼럼과 property가 서로 매핑되어서

정확한 데이터를 가져오게 됩니다.

	@Select("select * from company where id = #{id}")
	@ResultMap("CompanyMap")
	Company getById(@Param("id") int id);