• Home
  • About
    • Young's Github Pages photo

      一日不作一日不食

    • About
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

Java EE 정리 45

30 Apr 2019

Reading time ~3 minutes

Java EE 정리 45 - Spring ORM(2)


Spring ORM 설정 복습

  • root-context.xml 설정
    • DB연결 설정
      • DrvierManagerDataSource
    • SqlSessionFactoryBean 설정
      • ssfb를 위해 mybatis_spring.jar를 설치했음
      • DriverManagerDataSource를 method DI
      • mybatis_config.xml을 method DI
        • 이제 mapper.xml 설정만
    • SqlSessionTemplate 설정(MyBatis Handler)
      • SqlSessionFactoryBean을 생성자 DI
    • Source Code에서 SqlSessionTemplate을 DI받아 사용
<!-- root-context.xml -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="Driver명"/>
    <property name="url" value="DB Server URL"/>
    <property name="username" value="계정명"/>
    <property name="password" value="비밀번호"/>
</bean>

<bean id="ssfb" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="configLocation" value="MyBatis 설정용 xml경로"/>
</bean>

<bean id="객체명" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg ref="ssfb"/>
</bean>


// SqlSessionTemplate을 사용하는 곳에서 DI받아 사용

@Component
public class Test {

    @Autowired
    private SqlSessionTemplate sst;
    ...

Spring ORM 사용 예

  • 어제 설정환경 이어서 작업
  • 도시락 데이터를 AJAX로 보여주는 기능을 구현할 것
<!-- test_mapper.xml -->
...
      <select id="selectAllLunch" resultType="kr.co.sist.domain.Lunch">
            SELECT lunch_code, lunch_name, 's_'||img img, price,  TO_CHAR(input_date, 'yyyy-mm-dd hh24:mi') input_date
            FROM lunch
            ORDER BY input_date DESC
      </select>
</mapper>
@Component
public class OrmDAO {
      
  @Autowired(required=false)
  private SqlSessionTemplate sst;
  
  public List<Lunch> selectAllLunch() throws SQLException {
    List<Lunch> list = null;
    list = sst.selectList("selectAllLunch");
    return list;
  }
}
@Component
public class OrmService {
      
  @Autowired(required=false)
  private OrmDAO odao;
  
  public List<Lunch> searchAllList() {
    List<Lunch> list = null;
    try {
      list = odao.selectAllLunch();
    } catch (SQLException e) {
      e.printStackTrace();
    }
    return list;
  }
}
@Controller
public class OrmController {
      
  @Autowired(required = false)
  private OrmService os;

  @RequestMapping(value="/index.do", method=RequestMethod.GET)
  public String test(Model model) {
        
    String url = "lunch/lunch_list";
    List<Lunch> list = os.searchAllList();
    model.addAttribute("lunchList", list);
    
    if (list == null) {
      url = "redirect:err/lunch_err.jsp";
    }
    
    return url;
  }
}
  • 스프링 transaction이 없어서 에러발생, 설치 후 WEB-INF/lib에 복붙
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>4.3.9.RELEASE</version>
</dependency>

01

<!-- lunch/lunch_list.jsp -->
...
<table>
  <tr>
    <th style="width:80px;">번호</th>
    <th style="width:123px;">이미지</th>
    <th style="width:250px;">도시락명</th>
    <th style="width:130px;">가격</th>
    <th style="width:180x;">입력일</th>
  </tr>
  <c:forEach var="lunch" items="${ lunchList }">
  <c:set var="i" value="${ i+1 }"></c:set>
    <tr>
      <td><c:out value="${ i }"/></td>
      <td><img  src="http://localhost:8080/spring_orm/common/lunch_0430/${ lunch.img  }"/></td>
      <td><c:out value="${ lunch.lunch_name }"/></td>
      <td><c:out value="${ lunch.price }"/></td>
      <td><c:out value="${ lunch.input_date }"/></td>
    </tr>
  </c:forEach>
  <c:if test="${ empty lunchList }">
    <tr>
      <td colspan="5" style="text-align:center">존재하는  데이터가 없습니다</td>
    </tr>
  </c:if>
</table>

02

  • AJAX를 사용해서 도시락이미지에 마우스를 올렸을 때 디테일한 정보를 보여줄 것
package kr.co.sist.domain;
public class LunchDetail {
      private String img, spec;
      // setter, getter 생성
      ...
<!-- test_mapper.xml -->
...
  <select id="selectDetailLunch" parameterType="String"  resultType="kr.co.sist.domain.LunchDetail">
    SELECT img, spec
    FROM lunch
    WHERE lunch_code=#{ lunch_code }
    ORDER BY input_date DESC
  </select>
</mapper>
// OrmDAO
...
  public LunchDetail selectDetailLunch(String lunchCode) throws  SQLException {
    LunchDetail ld = null;
    
    ld = sst.selectOne("selectDetailLunch", lunchCode);
    
    return ld;
  }
}
// OrmService
...
  public JSONObject searchDetailLunch(String lunchCode) {
    JSONObject json = null;
    try {
      LunchDetail ld = odao.selectDetailLunch(lunchCode);
      json = new JSONObject();
      json.put("img", ld.getImg());
      json.put("spec", ld.getSpec());
    } catch (SQLException e) {
      e.printStackTrace();
    }
    return json;
  }
}
```// OrmController
...
      @ResponseBody
      @RequestMapping(value="/lunch_detail.do", method=GET,  produces="text/plain;charset=UTF-8")
      public String searchDetail(String lunchCode) {
            JSONObject json = os.searchDetailLunch(lunchCode);
            return json.toJSONString();
      }
}

```html
<!-- lunch/lunch_list.jsp -->
...
<script type="text/javascript">
  $(function() {
    var img="";
    $(".detailView").mousemove(function(evt) {
      $("#detailView").css({ top:(evt.clientY+5),  left:(evt.clientX+5) });
      $("#detailView").show();
      alert($(this).children("input").val()); // hidden 태그  값 구하기(코드)
      
      $.ajax({
        url:"lunch_detail.do",
        dataType:"json",
        data:"lunch_code="+$(this).children("input").val(),
        type:"get",
        error:function(xhr) {
          alert("잠시 후에 다시 시도해주세요");
          console.log(xhr.status);
        },
        success:function(json) {
          alert(json.img+"/"+json.spec);
        }
      });
    });
    
    $(".detailView").mouseout(function() {
      img="";
      $("#detailView").hide();
    });
  }); // ready
</script>
...
<table>
  <tr>
    <th style="width:80px;">번호</th>
    <th style="width:123px;">이미지</th>
    <th style="width:250px;">도시락명</th>
    <th style="width:130px;">가격</th>
    <th style="width:180x;">입력일</th>
  </tr>
  <c:forEach var="lunch" items="${ lunchList }">
  <c:set var="i" value="${ i+1 }"></c:set>
    <tr>
      <td><c:out value="${ i }"/></td>
      <td class="detailView">
        <img  src="http://localhost:8080/spring_orm/common/lunch_0430/${ lunch.img  }"/>
        <input type="hidden" name="lunchCode" value="${  lunch.lunch_code }"/>
      </td>
      <td><c:out value="${ lunch.lunch_name }"/></td>
      <td><c:out value="${ lunch.price }"/></td>
      <td><c:out value="${ lunch.input_date }"/></td>
    </tr>
  </c:forEach>
  <c:if test="${ empty lunchList }">
    <tr>
      <td colspan="5" style="text-align:center">존재하는  데이터가 없습니다</td>
    </tr>
  </c:if>
</table>
<div id="detailView">
</div>

03



Java EESpring