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받아 사용
-
DB연결 설정
<!-- 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>
<!-- 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>
- 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>