🔎 @Component: 부모 | 스프링으로 하여금 IOC 컨테이너에 객체를 생성해서 넣어 놓으라는 의미
🔎 @Controller: 컨트롤러 객체
🔎 @Service: 커맨드 객체
🔎 @Repository: DAO
🔎 @Autowired: 주입 (함수를 이용하여 객체 입력) = IOC 컨테이너 안에 있는 객체를 찾아서 넣으라는 의미
📌 주입의 3가지 방식
1. 생성자 주입 - 순환 참조를 방지할 수 있기 때문에 권장!
2. Setter 함수 주입
3. 필드 주입
🔎 GenericXmlApplicationContext : 스프링
✔ EmpVO.java
<package edu.example.ex.vo; import java.util.Date; import org.springframework.stereotype.Component; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; import lombok.ToString; @Getter @Setter @AllArgsConstructor @ToString @Component public class EmpVO { // 데이터베이스 내의 데이터를 객체화 시켜 메모리에 올리는 것 private int empno; private String ename; private String job; private int mgr; private Date hiredate; // 자바 Date 클래스에서 제공되는 함수를 이용해서 활용할 수 있기때문에 Date형 활용 private int sal; private int comm; private int deptno; public EmpVO() { } // default 생성자 }
✔ EmpDAO.java
package edu.example.ex.repository; import java.util.List; import org.springframework.stereotype.Repository; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.sql.Timestamp; import java.util.ArrayList; import edu.example.ex.vo.EmpVO; import lombok.extern.slf4j.Slf4j; @Slf4j @Repository // 스프링안에 객체 생성해서 DAO를 넣어놓겠다는 의미 public class EmpDAO { private String url = "jdbc:oracle:thin:@localhost:1521:xe"; private String uid = "scott"; private String upw = "tiger"; public EmpDAO() { try { Class.forName("oracle.jdbc.driver.OracleDriver"); } catch (Exception e) { e.printStackTrace(); } } public List<EmpVO> empSelect() { List<EmpVO> emps = new ArrayList<EmpVO>(); Connection con = null; Statement stmt = null; ResultSet resultSet = null; try { String sql = "Select * from emp"; con = DriverManager.getConnection(url, uid, upw); stmt = con.createStatement(); resultSet = stmt.executeQuery(sql); while (resultSet.next()) { int empno = resultSet.getInt("empno"); String ename = resultSet.getString("ename"); String job = resultSet.getString("job"); int mgr = resultSet.getInt("mgr"); Timestamp hiredate = resultSet.getTimestamp("hiredate"); int sal = resultSet.getInt("sal"); int comm = resultSet.getInt("comm"); int deptno = resultSet.getInt("deptno"); EmpVO vo = new EmpVO(empno, ename, job, mgr, hiredate, sal, comm, deptno); emps.add(vo); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (resultSet != null) resultSet.close(); if (stmt != null) stmt.close(); if (con != null) con.close(); } catch (Exception e) { e.printStackTrace(); } } return emps; } }
✔ EmpService.java
package edu.example.ex.service; import java.util.List; import edu.example.ex.vo.EmpVO; public interface EmpService { public abstract List<EmpVO> getList(); }
✔ EmpServiceImpl.java
package edu.example.ex.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import edu.example.ex.repository.EmpDAO; import edu.example.ex.vo.EmpVO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @Slf4j @Service @RequiredArgsConstructor // +@Autowired 하면 생성자 주입 (없으면 필드 주입) public class EmpServiceImpl implements EmpService { @Autowired private final EmpDAO dao; @Autowired private EmpVO empVO; @Override public List<EmpVO> getList() { log.info("getList() .."); return dao.empSelect(); } }
✔ EmpController.java
package edu.example.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.example.ex.service.EmpService; import edu.example.ex.vo.EmpVO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @Slf4j // 로그 @Controller @RequestMapping("/emp/*") @RequiredArgsConstructor public class EmpController { @Autowired private final EmpService empService; @GetMapping("/empList") public String empList(EmpVO empVO, Model model) { log.info("empList() .."); model.addAttribute("emps", empService.getList()); return "/emp/empList"; } }
✔ empList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <table width="800" cellpadding="0" cellspacing="0" border="1"> <tr> <th>empno</th> <th>ename</th> <th>job</th> <th>mgr</th> <th>hiredate</th> <th>sal</th> <th>comm</th> <th>deptno</th> </tr> <c:forEach var="emp" items="${emps}"> <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>
- 결과
✔ EmpDAO.java
package edu.example.ex.repository; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; import org.springframework.stereotype.Repository; import edu.example.ex.vo.EmpVO; import lombok.extern.slf4j.Slf4j; @Slf4j @Repository // 스프링안에 객체 생성해서 DAO를 넣어놓겠다는 의미 public class EmpDAO { private String url = "jdbc:oracle:thin:@localhost:1521:xe"; private String uid = "scott"; private String upw = "tiger"; public EmpDAO() { try { Class.forName("oracle.jdbc.driver.OracleDriver"); } catch (Exception e) { e.printStackTrace(); } } public List<EmpVO> empSelect() { List<EmpVO> emps = new ArrayList<EmpVO>(); Connection con = null; Statement stmt = null; ResultSet resultSet = null; try { String sql = "Select * from emp"; con = DriverManager.getConnection(url, uid, upw); stmt = con.createStatement(); resultSet = stmt.executeQuery(sql); while (resultSet.next()) { int empno = resultSet.getInt("empno"); String ename = resultSet.getString("ename"); String job = resultSet.getString("job"); int mgr = resultSet.getInt("mgr"); Timestamp hiredate = resultSet.getTimestamp("hiredate"); int sal = resultSet.getInt("sal"); int comm = resultSet.getInt("comm"); int deptno = resultSet.getInt("deptno"); EmpVO vo = new EmpVO(empno, ename, job, mgr, hiredate, sal, comm, deptno); emps.add(vo); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (resultSet != null) resultSet.close(); if (stmt != null) stmt.close(); if (con != null) con.close(); } catch (Exception e) { e.printStackTrace(); } } return emps; } public EmpVO contentView(int empno){ EmpVO emp = null; Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { String query = "select * from emp where empno = ?"; connection = DriverManager.getConnection(url, uid, upw); preparedStatement = connection.prepareStatement(query); preparedStatement.setInt(1, empno); resultSet = preparedStatement.executeQuery(); while(resultSet.next()) { int eempno = resultSet.getInt("empno"); String ename = resultSet.getString("ename"); String job = resultSet.getString("job"); int mgr = resultSet.getInt("mgr"); Timestamp hiredate = resultSet.getTimestamp("hiredate"); int sal = resultSet.getInt("sal"); int comm = resultSet.getInt("comm"); int deptno = resultSet.getInt("deptno"); emp = new EmpVO(eempno, ename, job, mgr, hiredate, sal, comm, deptno); } } catch (Exception e) { e.printStackTrace(); } finally { try { if(resultSet != null) resultSet.close(); if(preparedStatement != null) preparedStatement.close(); if(connection != null) connection.close(); } catch (Exception e2) { // TODO: handle exception e2.printStackTrace(); } } return emp; } }
✔ EmpService.java
package edu.example.ex.service; import java.util.List; import edu.example.ex.vo.EmpVO; public interface EmpService { public abstract List<EmpVO> getList(); public EmpVO get(int empno); }
✔ EmpServiceImpl.java
package edu.example.ex.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import edu.example.ex.repository.EmpDAO; import edu.example.ex.vo.BoardVO; import edu.example.ex.vo.EmpVO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @Slf4j @Service @RequiredArgsConstructor // +@Autowired 하면 생성자 주입 (없으면 필드 주입) public class EmpServiceImpl implements EmpService { @Autowired private final EmpDAO dao; @Autowired private EmpVO empVO; @Override public List<EmpVO> getList() { log.info("getList() .."); return dao.empSelect(); } @Override public EmpVO get(int empno) { log.info("get(int empno) .."); return dao.contentView(empno); } }
✔ EmpController.java
package edu.example.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.example.ex.service.EmpService; import edu.example.ex.vo.BoardVO; import edu.example.ex.vo.EmpVO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @Slf4j // 로그 @Controller @RequestMapping("/emp/*") @RequiredArgsConstructor public class EmpController { @Autowired private final EmpService empService; @GetMapping("/empList") public String empList(EmpVO empVO, Model model) { log.info("empList() .."); model.addAttribute("emps", empService.getList()); return "/emp/empList"; } @GetMapping("/contentView") public String contentView(EmpVO empVO, Model model) { log.info("content_view() .."); int empno = empVO.getEmpno(); empVO = empService.get(empno); model.addAttribute("contentView", empVO); return "/emp/contentView"; } }
✔ empList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <table width="600" cellpadding="0" cellspacing="0" border="1"> <tr> <th>empno</th> <th>hiredate</th> </tr> <c:forEach var="emp" items="${emps}"> <tr> <td><a href="${pageContext.request.contextPath}/emp/contentView?empno=${emp.empno}">${emp.empno}</td> </a> <td>${emp.hiredate}</td> </tr> </c:forEach> </table> </body> </html>
✔ contentView.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <table id="list-table" width="500" cellpadding="0" cellspacing="0" border="1"> <input type="hidden" name="empno" value="${contentView.empno}"> <tr> <th> ename </th> <td> ${contentView.ename} </td> </tr> <tr> <th> job </th> <td> ${contentView.job} </td> </tr> <tr> <th> mgr </th> <td> ${contentView.mgr} </td> </tr> <tr> <th> hiredate </th> <td> ${contentView.hiredate} </td> </tr> <tr> <th> sal </th> <td> ${contentView.sal} </td> </tr> <tr> <th> comm </th> <td> ${contentView.comm} </td> </tr> <tr> <th> deptno </th> <td> ${contentView.deptno} </td> </tr> </table> </body> </html>
- 결과
✔ BoardMapper.xml
<?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="edu.example.ex.mapper.BoardMapper"> <select id="getList" resultType="edu.example.ex.vo.BoardVO"> <!-- id는 함수이름 resultType은 BoardVO --> <![CDATA[ select * from mvc_board order by bGroup desc, bStep asc ]]> </select> </mapper>
✔ BoardServiceImpl.java
package edu.example.ex.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import edu.example.ex.mapper.BoardMapper; import edu.example.ex.repository.BoardDAO; import edu.example.ex.vo.BoardVO; import edu.example.ex.vo.GradeVO; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @Slf4j @Service @RequiredArgsConstructor // +@Autowired 하면 생성자 주입 (없으면 필드 주입) public class BoardServiceImpl implements BoardService { @Autowired private final BoardMapper mapper; @Override public List<BoardVO> getList() { log.info("getList().."); return mapper.getList(); } @Override public BoardVO get(int bno) { log.info("get(int bno) .."); return null; } }
✔ BoardMapper.java
package edu.example.ex.mapper; import java.util.List; import org.apache.ibatis.annotations.Mapper; import edu.example.ex.vo.BoardVO; @Mapper // mybatis에 사용할 거라는 것을 알려주는 애너테이션 public interface BoardMapper { public List<BoardVO> getList(); }
- 결과