Spring 04 (23.04.11)

Jane·2023년 4월 11일
0

IT 수업 정리

목록 보기
102/124

1. 정리

  • IoC Container : 객체 관리를 위한 컨테이너
  • pom.xml에 객체 생성을 위한 설계도를 넣어놨다. (dependency)
  • @Component : 스프링으로 하여금 IoC Container에 객체 생성을 해서 넣기
  • 의존성 주입을 통해 각 계층이나 서비스의 의존성을 맞춘다.
    • 생성자 주입 : 한번 주입하면 변하지 않기 때문에 현업에서 추천함, 순환 참조 방지
    • setter 함수 주입 : 내용이 바뀔 수 있는 객체에 주입 (잘 안 씀)
    • 필드 주입 : @Autowired 이용 (IoC Container에 있는 객체를 찾아서 넣기)

(Ctrl + Shift + Alt + L : Quick Search)

2. Grade 실습

2-1. GradeVO 테스트

GradeVO.java

package edu.global.ex.vo;

import org.springframework.stereotype.Component;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Component /* IoC Container에 객체 생성 */
@Getter
@Setter
@AllArgsConstructor
@ToString
public class GradeVO {
	private int kor;
	private int eng;
	private int math;

	public GradeVO() { /* No Arguments Constructor */
		this.kor = 85;
		this.eng = 92;
		this.math = 78;
	}
}

BoardController.java (GradeVO 부분 수정 및 추가)

package edu.global.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.global.ex.service.BoardService;
import edu.global.ex.vo.GradeVO;
import lombok.extern.slf4j.Slf4j;

@Slf4j // Annotation for [log.info()]
@Controller
@RequestMapping("/jboard/*")
public class BoardController {

	@Autowired
	private BoardService boardService;
	
	@Autowired
	private GradeVO gradeVO;

	@GetMapping("/list")
	public String view_list(Model model) {
		log.info("view_list()...");
		
		System.out.println(gradeVO);
		model.addAttribute("boards", boardService.getList());
		return "/board/list";
	}

}
  • localhost:8282/jboard/list 접속하면

    [Console]
    GradeVO(kor=85, eng=92, math=78)


BoardServiceImple.java (테스트 코드 추가)

package edu.global.ex.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import edu.global.ex.repository.BoardDAO;
import edu.global.ex.vo.BoardVO;
import edu.global.ex.vo.GradeVO;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
@AllArgsConstructor
@NoArgsConstructor
public class BoardServiceImpl implements BoardService {

	@Autowired
	private BoardDAO dao;
	
	@Autowired
	private GradeVO gradeVO;
	
	@Override
	public List<BoardVO> getList() {
		log.info("getList()..");
		System.out.println("Service : " + gradeVO);
		return dao.boardSelect();
	}
	
}

Service 내용도 추가되었으면
[Console]
Service : GradeVO(kor=85, eng=92, math=78)

2-2. 의존성 주입

  • 생성자 주입
  • Setter 함수 주입

BoardServiceImpl.java (코드 수정)

	//@Autowired
	private GradeVO gradeVO;
	
	/* Constructor Injection */
	public BoardServiceImpl(GradeVO gradeVO) {
		this.gradeVO = gradeVO;
	}
    
    /* Setter Injection */
	@Autowired
	public void setGradeVO(GradeVO gradeVO) {
		this.gradeVO = gradeVO;
	}

  • 생성자 주입을 권장하는 이유 : 순환 참조 방지

2-3. @RequiredArgsConstructor

BoardServiceImpl.java

package edu.global.ex.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import edu.global.ex.repository.BoardDAO;
import edu.global.ex.vo.BoardVO;
import edu.global.ex.vo.GradeVO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
@RequiredArgsConstructor
public class BoardServiceImpl implements BoardService {

	@Autowired
	private BoardDAO dao;

	@Autowired
	private GradeVO gradeVO;

	@Override
	public List<BoardVO> getList() {
		log.info("getList()..");
		System.out.println("Service : " + gradeVO);
		return dao.boardSelect();
	}

}
  • BoardController에서도 @RequiredArgsConstructor 추가하기

3. Spring MVC Board (이어서)

BoardController.java (content_view 함수 추가)

package edu.global.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.global.ex.service.BoardService;
import edu.global.ex.vo.BoardVO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j // Annotation for [log.info()]
@Controller
@RequestMapping("/jboard/*")
@RequiredArgsConstructor
public class BoardController {

	@Autowired
	private BoardService boardService;

	@GetMapping("/list")
	public String view_list(Model model) {
		log.info("view_list()...");

		model.addAttribute("boards", boardService.getList());
		return "/board/list";
	}

	@GetMapping("/content_view")
	public String content_view(BoardVO boardVO, Model model) {
		log.info("content_view()...");
		
		int bid = boardVO.getBid();
		
		boardVO = boardService.get(bid);

		model.addAttribute("content_view", boardVO);
		return "/board/content_view";
	}

}

BoardService.java

package edu.global.ex.service;

import java.util.List;

import edu.global.ex.vo.BoardVO;

public interface BoardService {
	public abstract List<BoardVO> getList();
	public BoardVO get(int bno);
}

BoardDAO.java (contentView 함수 추가)

	public BoardVO contentView(int bid) {
		BoardVO board = null;

		Connection connection = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;

		try {
			String query = "select * from mvc_board where bid = ?";

			connection = DriverManager.getConnection(url, uid, upw);
			preparedStatement = connection.prepareStatement(query);

			preparedStatement.setInt(1, Integer.valueOf(bid));
			resultSet = preparedStatement.executeQuery();

			while (resultSet.next()) {

				int id = resultSet.getInt("bid");

				String bname = resultSet.getString("bname");
				String btitle = resultSet.getString("btitle");
				String bcontent = resultSet.getString("bcontent");

				Timestamp bdate = resultSet.getTimestamp("bdate");

				int bhit = resultSet.getInt("bhit");
				int bgroup = resultSet.getInt("bgroup");
				int bstep = resultSet.getInt("bstep");
				int bindent = resultSet.getInt("bindent");

				board = new BoardVO(id, bname, btitle, bcontent, bdate, bhit, bgroup, bstep, bindent);
			}

		} 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 board;
	}

BoardServiceImpl.java (함수 추가)

	@Override
	public BoardVO get(int bno) {
		log.info("get()..");
		return dao.contentView(bno);
	}

content_view.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>
<script type="text/javascript">
	$(document)
			.ready(
					function() {
						$('#a-delete')
								.click(
										function(event) {
											//prevendDefault()는 href로 연결해 주지 않고 단순히 click에 대한 처리를 하도록 해준다.
											event.preventDefault();
											console.log("ajax 호출전");

											$
													.ajax({
														type : "DELETE",
														url : "${pageContext.request.contextPath}/restful/board/"
																+ "${content_view.bid}",
														data : {
															"bid" : "${content_view.bid}"
														},
														success : function(
																result) {
															console.log(result);
															if (result == "SUCCESS") {
																//getList();

															}

														},
														error : function(e) {
															console.log(e);
														}
													})

										});
					});
</script>
</head>
<body>
	<form action="modify" method="post">
		<table id="list-table" width="500" cellpadding="0" cellspacing="0"
			border="1">

			<input type="hidden" name="bid" value="${content_view.bid}">
			<tr>
				<td>번호</td>
				<td>${content_view.bid}</td>
			</tr>
			<tr>
				<td>히트</td>
				<td>${content_view.bhit}</td>
			</tr>
			<tr>
				<td>이름</td>
				<td><input type="text" name="bname"
					value="${content_view.bname}"></td>
			</tr>
			<tr>
				<td>제목</td>
				<td><input type="text" name="btitle"
					value="${content_view.btitle}"></td>
			</tr>
			<tr>
				<td>내용</td>
				<td><textarea rows="10" name="bcontent">${content_view.bcontent}</textarea></td>
			</tr>
			<tr>
				<td colspan="2"><input type="submit" value="수정">
					&nbsp;&nbsp; <a href="list">목록보기</a> &nbsp;&nbsp; <a id="a-delete">삭제</a>
					&nbsp;&nbsp; <a href="reply_view?bid=${content_view.bid}">답변</a></td>
			</tr>

		</table>
	</form>
</body>
</html>

4. Emp Board로 사원 출력하기

4-1. 리스트 보기

EmpVO.java

package edu.global.ex.vo;

import java.util.Date;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

/*이름       널?       유형           
-------- -------- ------------ 
EMPNO    NOT NULL NUMBER(4)    
ENAME             VARCHAR2(10) 
JOB               VARCHAR2(9)  
MGR               NUMBER(4)    
HIREDATE          DATE         
SAL               NUMBER(7,2)  
COMM              NUMBER(7,2)  
DEPTNO            NUMBER(2)    */

@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.java

package edu.global.ex.repository;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.stereotype.Repository;

import edu.global.ex.vo.EmpVO;

@Repository
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> boards = 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()) {
				/*
				 * private int empno; private String ename; private String job; private int mgr;
				 * private Date hiredate; private int sal; private int comm; private int deptno;
				 */

				int empno = resultSet.getInt("empno");
				String ename = resultSet.getString("ename");
				String job = resultSet.getString("job");
				int mgr = resultSet.getInt("mgr");
				Date hiredate = resultSet.getDate("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);
				boards.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 boards;
	}

}

EmpService.java

package edu.global.ex.service;

import java.util.List;

import edu.global.ex.vo.EmpVO;

public interface EmpService {
	public abstract List<EmpVO> getList();
}

EmpServiceImpl.java

package edu.global.ex.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import edu.global.ex.repository.EmpDAO;

import edu.global.ex.vo.EmpVO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
@RequiredArgsConstructor
public class EmpServiceImpl implements EmpService {

	@Autowired
	private final EmpDAO dao;
    // @RequiredArgsConstructor + final 선언으로 생성자 주입

	@Override
	public List<EmpVO> getList() {
		log.info("getList()..");
		return dao.empSelect();
	}

}

EmpController.java

package edu.global.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.global.ex.service.EmpService;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/emp/*")
@RequiredArgsConstructor
public class EmpController {

	@Autowired
	private EmpService empService;

	@GetMapping("/list")
	public String view_list(Model model) {
		log.info("view_list()...");

		model.addAttribute("emps", empService.getList());
		return "/emp/emp_list";
	}

}

emp_list.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="500" 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>
  • localhost:8282/emp/list 접속해서 확인

4-2. a 링크를 누르면 상세 내용 보기

EmpService.java

package edu.global.ex.service;

import java.util.List;

import edu.global.ex.vo.EmpVO;

public interface EmpService {
	public abstract List<EmpVO> getList();
	public EmpVO get(int bno);
}

EmpServiceImpl.java


	@Override
	public EmpVO get(int bno) {
		// TODO Auto-generated method stub
		return dao.empView(bno);
	}

EmpDAO.java

public EmpVO empView(int bno) {
		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, Integer.valueOf(bno));
			resultSet = preparedStatement.executeQuery();

			while (resultSet.next()) {
				int empno = resultSet.getInt("empno");
				String ename = resultSet.getString("ename");
				String job = resultSet.getString("job");
				int mgr = resultSet.getInt("mgr");
				Date hiredate = resultSet.getDate("hiredate");
				int sal = resultSet.getInt("sal");
				int comm = resultSet.getInt("comm");
				int deptno = resultSet.getInt("deptno");
				

				emp = new EmpVO(empno, 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) {
				e2.printStackTrace();
			}
		}

		return emp;
	}

EmpController.java

@GetMapping("/emp_view")
	public String emp_view(EmpVO empVO, Model model) {
		log.info("emp_view()...");

		int empno = empVO.getEmpno();

		empVO = empService.get(empno);

		model.addAttribute("emp_view", empVO);

		return "/emp/emp_view";
	}

emp_list.jsp (empno 부분에 a 링크 걸기)

<%@ 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="500" 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><a href="${pageContext.request.contextPath}/emp/emp_view?empno=${emp.empno}">${emp.empno}</a></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>

emp_view.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="500" cellpadding="0" cellspacing="0" border="1">
		<tr>
			<th>EMPNO</th>
			<td>${emp_view.empno}</td>
		</tr>
		<tr>
			<th>ENAME</th>
			<td>${emp_view.ename}</td>
		</tr>
		<tr>
			<th>JOB</th>
			<td>${emp_view.job}</td>
		</tr>
		<tr>
			<th>MGR</th>
			<td>${emp_view.mgr}</td>
		</tr>
		<tr>
			<th>HIREDATE</th>
			<td>${emp_view.hiredate}</td>
		</tr>
		<tr>
			<th>SAL</th>
			<td>${emp_view.sal}</td>
		</tr>
		<tr>
			<th>COMM</th>
			<td>${emp_view.comm}</td>
		</tr>
		<tr>
			<th>DEPTNO</th>
			<td>${emp_view.deptno}</td>
		</tr>
	</table>
</body>
</html>

5. Spring Security (MyBatis 사용하기)

  • DAO를 대신하여 MyBatis, JPA 등을 사용한다.


BoardMapper.java

package edu.global.ex.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import edu.global.ex.vo.BoardVO;

@Mapper
public interface BoardMapper {
	public List<BoardVO> getList();
}
  • src/main/resource > mapper 폴더 만들고 안에 BoardMapper.xml 만들기

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.global.ex.mapper.BoardMapper">
	<select id="getList" resultType="edu.global.ex.vo.BoardVO">
  	  <![CDATA[
      select * from mvc_board order by bgroup desc, bstep asc
   ]]>
	</select>
</mapper>

BoardServiceImpl.java
(get 부분은 나중에 구현)

package edu.global.ex.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import edu.global.ex.mapper.BoardMapper;
import edu.global.ex.vo.BoardVO;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
public class BoardServiceImpl implements BoardService {

	@Autowired
	private 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;
	}

}
profile
velog, GitHub, Notion 등에 작업물을 정리하고 있습니다.

0개의 댓글