Spring 4.3.X
- Java 8 기능을 완전히 지원하기 시작하였다.
- Java 6, Java 7 의 고유 기능들에 대해서도 각각 지원한다.
- Starter Pack의 등장으로 초기 설정이 보다 용이해졌다.
- Groovy 를 통한 Bean 설정이 가능하다.
- Core Container 들의 기능 지원이 확대되었다.
- 예를 들어, Spring Data Repository 를 사용하고 있다면 간단한 구현으로 주입할 수 있다. (@Autowired Repository<Customer> customerRepository)
- meta-annotation 지원과 함께 custom-annotation 을 만들 수 있다.
- Bean 관리가 더 용이해졌다.
- @Order 어노테이션을 통해 배열과 리스트 형태의 Bean을 정렬 할 수 있다.
- @Lazy 어노테이션을 통해 Lazy Injection이 가능하다.
- @RestController 등 Web 개발 도구의 지원이 강화되었다.
- WebSocket이나 STOMP 등의 프로토콜을 지원하여 양방향 통신이 가능하다.
- 테스트 환경이 개선되어 Framework 레벨에서 테스트 유틸리티를 지원한다.
(ex. AopTestUtils, ReflectionTestUtils(개선)) - 2020년 12월 31일부로 개발 및 지원이 종료될 예정이다.
Reference
jsp [아이디, 이름, 이메일] 값 가져와서 출력하기
Controller
package com.xxx.controller;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.caleb.service.MemberService;
@Controller
public class MemberController {
@Autowired
private MemberService memberService;
@RequestMapping(value = "/memberList.do")
public String MemberView(@RequestParam MultiValueMap<String, Object> param, ModelMap model, HttpServletRequest request) throws Exception {
Map<String, Object> data = param.toSingleValueMap();
//직원 ID, 이름, 목록 조회
List<Map<String, Object>> memberList = memberService.getMemberList(data);
model.addAttribute("memberList", memberList);
return "member/memberList.page";
}
}
Service
package com.xxx.service;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.xxx.dao.MCompanyDao;
import com.xxx.dao.MemberDAO;
@Service
public class MemberService {
@Autowired
private MemberDAO dao;
public List<Map<String, Object>> getMemberList(Map<String, Object> param) throws Exception {
return dao.getMemberList(param);
}
}
DAO
package com.xxx.dao;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Repository;
import com.xxx.common.DatabaseAccess;
@Repository
public class MemberDAO extends DatabaseAccess {
private String namespace = "com.xxx.mappers.mobile.member";
//이름 아이디 이메일 조회
public List<Map<String, Object>> getMemberList(Map<String, Object> param) throws Exception {
return selectList(namespace + ".getMemberList", param);
}
}
공통 SQLSession
제네릭의 쓰임 - 메소드
public <U> void printInfo(U info){
System.out.println(info);
}
※ 제네릭 지정 <> 안에 클래스 문자 지정은 자유. 본래 <U extends Object> 의 생략형이라고 생각하면 된다.
※ 제네릭 메소드의 파라미터는 U 가 아니더라도 U[] 형의 데이터형도 정의 가능하다.
[출처] Java : 제네릭, <E>|작성자 거셩
@RequestParam
@ReqeustParam은 해당 Request에 대한 Parameter들을 자동으로 Binding한다.
1개의 HTTP Request Parameter를 받기 위해서 주로 사용하며 @RequestParam은 필수 여부가 true이기 때문에 기본적으로 반드시 해당 Parameter가 전송되어야 한다.
해당 Parameter가 전송되지 않으면 400 Error 발생
그래서 required의 값을 false로 설정해 필수 여부를 조절할 수 있고, 해당 Parameter를 사용하지 않고 요청을 보낼 경우에 default로 받을 값을 defaultValue 옵션을 통해 설정할 수도 있다.
주의사항으로는 단일 값만 Binding가능하여 만약 List형태로 복수의 Paramter를 Request하면 첫번째 Data 값만 Binding된다.
아래와 같은 형태로 많이 사용된다.
@ReqeustParam MultiValueMap<String,Object> params
MultiValueMap
MultiValueMap은 Spring에서 제공하는 Data Collection으로 List형태의 값들을 Value로 Binding할 수 있는 특징을 지닌다.
하나의 Parameter에 여러 Data를 전송받아야 할 때 주로 사용한다.
Reference
mybatis
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxx.mappers.mobile.member">
<select id="getMemberList" resultType="map">
SELECT ID,
NAME,
EMAIL
FROM MEMBER;
</select>
</mapper>
아이디, 이름. 이메일 목록 jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
<script type="text/javascript" src="js/mbl/caleb/jquery.twbsPagination.js"></script>
<title>Insert title here</title>
</head>
<style type="text/css">
table {
width: 100%;
border: 1px solid #444444;
}
th, td {
border: 1px solid #444444;
}
</style>
<script>
</script>
<div class="top">
<h4 class="ht">아이디, 이름, 이메일 리스트</h4>
</div>
<table summary="목록">
<caption>
</caption>
<thead>
<tr>
<th>아이디</th>
<th>이름</th>
<th>이메일</th>
</tr>
</thead>
<tbody>
<c:forEach var="result" items="${memberList}" varStatus="status">
<tr>
<td><c:out value="${result.ID }"/></td>
<td><c:out value="${result.NAME }"/></td>
<td><c:out value="${result.EMAIL }"/></td>
</tr>
</c:forEach>
</tbody>
</table>
</html>