@ModelAttribute
ModelAttribute 는 클라이언트로부터 일반 HTTP 요청 파라미터나 multipart/form-data 형태의 파라미터를 받아 객체로 사용하고 싶을 때 이용됩니다.
@Service
Service 어노테이션은 해당 클래스가 비즈니스 로직을 담당하는 서비스 계층 구성 요소임을 알려주는 어노테이션입니다.
@Repository
DB나 파일같은 외부 I/O 작업을 처리합니다
@Autowired
스프링이 만든 빈을 자동으로 갖고옵니다
redirect란 클라이언트가 한페이지에서 다른 페이지로 이동할 수있도록 서버가 다른 페이지로 이동시키는 기능을 제공합니다.

위에 사진처럼 원하는 주소로 지정할 수 있습니다.
자바 개발자가 가장 많이 사용하는 테스팅 기반 프레임워크로 API 모듈과 테스트 실행을 위한 API가 분리되어 있습니다.
EmpVO
package edu.ict.ex.vo;
import java.sql.Date;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class EmpVO {
private int empno;
private String ename;
private String job;
private int mgr;
private Date hiredate;
private int sal;
private int comm;
private int deptno;
}
EmpDao
package edu.ict.ex.repository;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Repository;
import edu.ict.ex.vo.EmpVO;
@Repository
public class EmpDao {
public List<EmpVO> empSelect(){
List<EmpVO> vos = new ArrayList<>();
Connection connetion = null;
Statement statement = null;
ResultSet rs = null;
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String uid = "scott";
String upw = "tiger";
String sql = "select * from emp";
try{
Class.forName(driver);
connetion = DriverManager.getConnection(url, uid, upw);
statement = connetion.createStatement();
rs = statement.executeQuery(sql);
while(rs.next()){
int empno = rs.getInt("empno");
String ename = rs.getString("ename");
String job = rs.getString("job");
int mgr = rs.getInt("mgr");
Date hiredate = rs.getDate("hiredate");
int sal = rs.getInt("sal");
int comm = rs.getInt("comm");
int deptno = rs.getInt("deptno");
EmpVO vo = new EmpVO(empno,ename,job,mgr,hiredate,sal,comm,deptno);
vos.add(vo);
}
}catch(Exception e){
e.printStackTrace();
}
finally{
try{
if(rs != null)
rs.close();
if(statement != null)
statement.close();
if(connetion != null)
connetion.close();
} catch(Exception e){}
}
return vos;
}
}
EmpService
package edu.ict.ex.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import edu.ict.ex.repository.EmpDao;
import edu.ict.ex.vo.EmpVO;
@Service
public class EmpService {
@Autowired
private EmpDao dao;
public List<EmpVO>getList(){
System.out.println("getList()..");
return dao.empSelect();
}
}
EmpController
package edu.ict.ex.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import edu.ict.ex.service.EmpService;
@Controller
@RequestMapping("/emp")
public class EmpController {
@Autowired
private EmpService empService;
@GetMapping("/list")
public String list(Model model) {
System.out.println("list()..");
model.addAttribute("empList", empService.getList());
return "emp/list";
}
}
list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>emp 리스트</h1>
<table border="1">
<tr>
<td>사원번호</td>
<td>사원이름</td>
<td>직업</td>
<td>매니저</td>
<td>입사일자</td>
<td>급여</td>
<td>보너스</td>
<td>부서번호</td>
</tr>
<c:forEach var="emp" items="${empList}">
<tr>
<td>${emp.empno}</td>
<td>${emp.ename}</td>
<td>${emp.job}</td>
<td>${emp.mgr}</td>
<td>${emp.hiredate}</td>
<td>${emp.sal}</td>
<td>${emp.comm}</td>
<td>${emp.deptno}</td>
</tr>
</c:forEach>
</table>
</body>
</html>

JSP/Servlet에서 mvc2의 command역할
JSP/Servlet에서 mvc2의 Dao역할