Mybatis, 1:N의 객체 Select

어떤 객체 안에 또 다른 객체의 List같은게 포함되어 있는 경우, 1차원적으로 생각하면 각기 따로 쿼리를 작성해서 나중에 서비스레이어든 어디서든 합치는 방법을 생각해 볼 수 있다.
하지만 그건 바보짓.
이런 상황을 대비해서 Mybatis에서는 resultMap 태그를 지원하고 그 안에서 결과로 받아올 덩어리를 지정해 주면 알아서 객체에 매핑이 되게해준다.

아래와 같은 객체가 있다.

public class ItemMain {

 private long id;
 private long user_id;
 private String story;
 private Timestamp reg_time;
 private Timestamp mod_time;
 
 private List itemImages;
 
 public long getId() {
  return id;
 }
 public void setId(long id) {
  this.id = id;
 }
 public long getUser_id() {
  return user_id;
 }
 public void setUser_id(long user_id) {
  this.user_id = user_id;
 }
 public String getStory() {
  return story;
 }
 public void setStory(String story) {
  this.story = story;
 }
 public Timestamp getReg_time() {
  return reg_time;
 }
 public void setReg_time(Timestamp reg_time) {
  this.reg_time = reg_time;
 }
 public Timestamp getMod_time() {
  return mod_time;
 }
 public void setMod_time(Timestamp mod_time) {
  this.mod_time = mod_time;
 }
 public List getItemImages() {
  return itemImages;
 }
 public void setItemImages(List itemImages) {
  this.itemImages = itemImages;
 }
}

public class ItemImage {

 private long id;
 private long item_id;
 private String standard_url;
 private String standard_w;
 private String standard_h;
 private Timestamp reg_time;
 
 public ItemImage() {
  super();
 }
 public ItemImage(long item_id, String standard_w, String standard_h,
   String thumbnail_w, String thumbnail_h) {
  super();
  this.item_id = item_id;
  this.standard_w = standard_w;
  this.standard_h = standard_h;
  this.thumbnail_w = thumbnail_w;
  this.thumbnail_h = thumbnail_h;
 }
 public long getId() {
  return id;
 }
 public long getItem_id() {
  return item_id;
 }
 public void setItem_id(long item_id) {
  this.item_id = item_id;
 }
 public String getStandard_url() {
  return standard_url;
 }
 public void setStandard_url(String standard_url) {
  this.standard_url = standard_url;
 }
 public String getStandard_w() {
  return standard_w;
 }
 public void setStandard_w(String standard_w) {
  this.standard_w = standard_w;
 }
 public String getStandard_h() {
  return standard_h;
 }
 public void setStandard_h(String standard_h) {
  this.standard_h = standard_h;
 }
 public Timestamp getReg_time() {
  return reg_time;
 }
 public void setReg_time(Timestamp reg_time) {
  this.reg_time = reg_time;
 }
}

보면 알 수 있듯이 ItemImage는 ItemMain에 속해있는 관계이다. ItemMain:ItemImage = 1:n 의 관계가 성립한다.
쿼리로는 아래와 같이 가져올 수가 있다.

  SELECT 
      M.id AS id,
      M.user_id AS user_id,
      M.story AS story,
      M.reg_time AS reg_time,
      M.mod_time AS mod_time,
      I.id AS image_id,
      I.item_id AS item_id,
      I.standard_url AS standard_url,
      I.standard_w AS standard_w,
      I.standard_h AS standard_h,
      I.reg_time AS image_reg_time
  FROM item_main M
   LEFT OUTER JOIN item_image I on M.id = I.item_id
  WHERE 
   M.id = 60

가져온 결과를 매핑하기 위하여 resultMap을 mapper xml에 만들어 준다. type은 다른 configuration 파일이 이미 설정이 되어 있다.

 
  
  
  
  
  
  
   
   
   
   
   
   
  
 

실제 DAO쪽 코드에서는 평소와 같이 가져오면 된다. 그럼 알아서 매핑을 해준다.
하나 주의할 점은 resultMap에서 itemImage를 생성하는 생성자를 만들어 주거나 ItemImage 클래스에 생성자를 위와 같이 만들어줘야 한다. 그래서 resultMap에서 객체를 초기화할 때 에러가 발생하지 않음.

어쨌든 이런 식으로 가져온 객체를 실제 사용하기 위한 json으로 변환하면 아래와 같다.

{
    "data": {
        "id": 60,
        "mod_time": 1383814968000,
        "reg_time": 1383814968000,
        "story": "Supreme wool 5 panels!!",
        "user_id": 1,
        "itemImages": [
            {
                "id": 10,
                "item_id": 60,
                "reg_time": 1383814968000,
                "standard_h": "640",
                "standard_url": "https://s3-us-west-2.amazonaws.com/dottegiitem/7b4bcf41-4007-4be7-a4b3-dbd7c9e839e4_IMG_5258.JPG",
                "standard_w": "640"
            },
            {
                "id": 11,
                "item_id": 60,
                "reg_time": 1383814968000,
                "standard_h": "640",
                "standard_url": "https://s3-us-west-2.amazonaws.com/dottegiitem/45f4e482-5fa7-45f5-958c-451b25de0c47_IMG_5252.JPG",
                "standard_w": "640"
            },
            {
                "id": 12,
                "item_id": 60,
                "reg_time": 1383814968000,
                "standard_h": "640",
                "standard_url": "https://s3-us-west-2.amazonaws.com/dottegiitem/3ba71d3c-dbea-4bd4-90c5-f0c04ca3ed43_IMG_5220.JPG",
                "standard_w": "640"
            }
        ]
    },
    "meta": {
        "code": 200,
        "text": "Success"
    }
}

댓글 없음:

댓글 쓰기