Spring(2023-04-13)

권단비·2023년 4월 13일
0

IT

목록 보기
121/139

[게시판 페이징]

[페이징]
1.DB : 페이징 쿼리(My sql(limit), oracle 11g 이하(limit 지원 안함))
	-my sql : SELECT * FROM USER orders LIMIT 10;
	-오라클에서는 limit가 지원되지 않아, rownum으로 처리 가능
	-rownum : 조회 후 순번을 매길 때 사용 | SQL이 실행된 결과에 넘버링을 해줌

2.Mybatis : 1:n 처리 = 조인처리 방법
3.restful

===============================================================================
스프링 시큐리티
[페이징 - ORACLE]
아래는 나오지 않는다. 반드시 그 이유를 알아야 한다. 이것이 핵심이다.
SELECT ROWNUM RN, BID, BNAME, BTITLE FROM MVC_BOARD WHERE ROWNUM > 10 AND ROWNUM <=20;

・먼저 오라클 쿼리의 순서를 읽어야 한다.
1. FROM/WHERE 절이 먼저 처리된다.
2. ROWNUM이 할당되고 FROM/WHERE 절에서 전달되는 각각의 출력 로우에 대해 증가(increment)된다.
3. SELECT가 적용된다.
4. GROUP BY 조건이 적용된다.
5. HAVING이 적용된다.
6. ORDER BY 조건이 적용된다.

・안되는 이유
ROWNUM은 당연히 1이 할당될 것이다.
SELECT 하기 전 아래가 먼저 실행된다.
ROWNUM = 1 > 10 → 여기서 부터 조건에 맞지 않으므로 아무것도 뿌리지 못한다.
한마디로 WHERE 절부터 실행되므로 여기에서 무효화가 되는 것이다.
이러한 이유로 SQL 작성 시 ROWNUM 조건은 반드시 1이 포함되어야 한다.
[공식]
SELECT * FROM (
     SELECT ROWNUM AS RNUM, A.* FROM (
          {검색쿼리 - 정렬이 필요할 경우 정렬조건 포함}
    ) A WHERE ROWNUM <= {범위까지}
) WHERE RNUM > {범위부터};

-----------------------------------------------------------------------

[공식 적용 : 11~ 20까지 출력]
SELECT * FROM (
     SELECT ROWNUM AS RNUM, A.* FROM (
         SELECT rownum rn, bid, bname, btitle FROM mvc_board 
    )A WHERE ROWNUM <= 20
) WHERE RNUM >10;

[계산 BoardController.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.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import edu.global.ex.BoardService;
import edu.global.ex.vo.BoardVO;
import edu.global.page.Criteria;
import edu.global.page.PageVO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j // 로그를 사용하기 위한 어노테이션 : log.info("view_list()..");
@Controller // (@Component + 의미) BoardController board = new BoardController();
@RequestMapping("/jboard/*") // jboard로 들어오는 모든 것들은 BoardController를 생성해라
@RequiredArgsConstructor
public class BoardController {

	@Autowired // (주입)객체에 주소를 줌
	private BoardService boardService; // BoardService boardService = new BoardServiceImpl();

	// http://localhost:8282/list2
	// list2?pageNum=5&amount=10">1</a>
	@GetMapping("/list2")
	public String list2(Criteria cri, Model model) { // 커맨드 객체 첫 번째로 실행 : 객체생성
		// Criteria(1,10)
		log.info("list2() ..");
		log.info("list2() Criteria " + cri);

		model.addAttribute("boards", boardService.getList(cri));

		//페이징을 위한 처리
		int total = boardService.getTotal();
		log.info("total" + total);

		model.addAttribute("pageMaker", new PageVO(cri, total));

		return "/board/list2";
	}

	@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";
	}

	@PostMapping("/modify")
	public String modify(BoardVO boardVO, Model model) {

		log.info("modify().."); // 디버그
		int rn = boardService.modify(boardVO);

		log.info("modify().. result number::" + rn);

		return "redirect:list"; // 유저로 하여금 list로 다시 치고 들어오라
	}

	@GetMapping("/delete")
	public String delete(BoardVO boardVO, Model model) {
		log.info("delete().."); // 디버그
		int rn = boardService.remove(boardVO);

		log.info("delete();..result number::" + rn);

		return "redirect:list";
	}

	@GetMapping("/write_view")
	public String write_view() {

		return "/board/write_view"; // /board/write_view.jsp로 가라는 뜻
	}

	@PostMapping("/write")
	public String write(BoardVO boardVO) {

		log.info("write().."); // 디버그
		int rn = boardService.register(boardVO);

		return "redirect:list"; // 유저로 하여금 list로 다시 치고 들어오라
	}

	@GetMapping("/reply_view") // http://localhost:8282/jboard/reply_view?bid=65
	public String reply_view(BoardVO boardVO, Model model) {

		log.info("reply_view().."); // 디버그

		model.addAttribute("reply_view", boardService.get(boardVO.getBid()));

		return "/board/reply_view"; // 유저로 하여금 list로 다시 치고 들어오라
	}

	@PostMapping("/reply") // http://localhost:8282/jboard/reply
	public String reply(BoardVO boardVO) {

		log.info("reply().."); // 디버그
		boardService.registerReply(boardVO);

		return "redirect:list"; // 유저로 하여금 list로 다시 치고 들어오라
	}
}
---------------------------------------------------------------------
[계산 Criteria.java]
package edu.global.page;
import lombok.*;

@ToString
@Getter
@Setter
public class Criteria {
	// 페이징 처리를 위해선 페이지 번호와 한페이지당 몇개의 데이터를 보여줄것인지 결정되어야만 함.
	private int pageNum; // 페이지 번호
	private int amount; // 한페이지당 몇개의 데이터를 보여줄것인가?

	public Criteria() {
		this(1, 10);// 기본값 1페이지 10개로 지정
	}

	public Criteria(int pageNum, int amount) {
		this.pageNum = pageNum;
		this.amount = amount;
	}
}
---------------------------------------------------------------------
[계산 PageVO.java]
package edu.global.page;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@ToString
@Getter
@Setter
public class PageVO {
	// 페이징 처리 할때 필요한 정보들
	private int startPage;// 화면에 보여지는 페이지 시작번호
	private int endPage;// 화면에 보여지는 끝번호
	private boolean prev, next;// 이전과 다음으로 이동 가능한 링크 표시

	private int total;// 전체 게시판 글 수
	private Criteria cri;

	public PageVO(Criteria cri, int total) {
		this.cri = cri;
		this.total = total; // 전체 데이타 수
		// ceil : 올림함수
		// Math.ceil(.95); // 1
		// Math.ceil(4); // 4
		// Math.ceil(7.004); // 8
		// Math.ceil(-0.95); // -0
		// Math.ceil(-4); // -4
		// Math.ceil(-7.004); // -7
		// endPage는 현재의 페이지 번호를 기준으로 계산함.

		// 현재 페이지가 3일 경우 : Math.ceil(3/10) * 10 = 10
		// 현재 페이지가 1일 경우 : Math.ceil(1/10) * 10 = 10
		// 현재 페이지가 10일 경우 : Math.ceil(10/10) * 10 = 10
		// 현재 페이지가 11일 경우 : Math.ceil(11/10) * 10 = 20 1.1을 올림함
		// 현재 페이지가 20일 경우 : Math.ceil(20/10) * 10 = 20
		// 현재 페이지가 21일 경우 : Math.ceil(21/10) * 10 = 30

		this.endPage = (int) (Math.ceil(cri.getPageNum() / 10.0)) * 10;
		this.startPage = this.endPage - 9;

		// Total을 통한 endPage의 재계산
		// 10개씩 보여주는 경우, 전체 데이터 수가 80개라고 가정하면 끝번호는 10이 아닌 8이 됨
		int realEnd = (int) (Math.ceil((total * 1.0) / cri.getAmount()));

		if (realEnd <= this.endPage) {
			this.endPage = realEnd;
		}

		// 시작번호가 1보다 큰경우 존재
		this.prev = this.startPage > 1; // <<
		// realEnd가 끝번호(endPage)보다 큰 경우에만 존재
		this.next = this.endPage < realEnd; // >>
	}

	// get 방식 문구를 좀 더 쉽게 만들어 주기 위한 함수
	public String makeQuery(int page) {
		UriComponents uriComponentsBuilder = UriComponentsBuilder.newInstance()
				.queryParam("pageNum", page) // pageNum =  3
				.queryParam("amount", cri.getAmount()) // pageNum=3&amount=10
				.build(); // ?pageNum=3&amount=10
		return uriComponentsBuilder.toUriString(); // ?pageNum=3&amount=10 리턴
	}
}
---------------------------------------------------------------------
[계산 BoardService.java]
package edu.global.ex;
import java.util.List;
import edu.global.ex.vo.BoardVO;
import edu.global.page.Criteria;

public interface BoardService {
	public List<BoardVO> getList(); // 리스트 메소드
	public BoardVO get(int bid); // 글보기 메소드
	public int modify(BoardVO board); // 글수정 java:modify>>sql:update
	public int remove(BoardVO board); // 글삭제
	public int register(BoardVO board); // 글작성
	public void registerReply(BoardVO board); // 댓글작성

	//페이징
	public abstract int getTotal();
	public abstract List<BoardVO> getList(Criteria criteria); // 리스트 메소드 오버로딩
}
---------------------------------------------------------------------
[계산 BoardServiceImpl.java]
package edu.global.ex;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import edu.global.ex.mapper.BoardMapper;
import edu.global.ex.repository.BoardDAO;
import edu.global.ex.vo.*;
import edu.global.page.Criteria;
import lombok.*;
import lombok.extern.slf4j.Slf4j;

@Slf4j // 로그를 사용하기 위한 어노테이션 : log.info("view_list()..");
@Service
@RequiredArgsConstructor // Autowired에 생성자 주입해 줌
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 bid) {
		log.info("get(int bid)..");
		return mapper.read(bid);
	}

	@Override
	public int modify(BoardVO board) {
		log.info("modify()..");
		return mapper.update(board);
	}

	@Override
	public int remove(BoardVO board) {
		log.info("delete()..");
		return mapper.delete(board);
	}

	@Override
	public int register(BoardVO board) {
		log.info("register()..");
		return mapper.insert(board);
	}

	@Transactional // 일련의 작업단위(CRUD중 2개 이상의 조합으로 들어가면 기재)
	@Override
	public void registerReply(BoardVO board) {
		log.info("registerReply()..");

		mapper.updateShape(board); // 답글의 위치를 먼저 잡아준 후
		mapper.insertReply(board); // 답글을 등록한다.
	}

	@Override
	public int getTotal() {
		log.info("getTotal()..");
		return mapper.getTotalCount();
	}

	@Override
	public List<BoardVO> getList(Criteria criteria) {
		log.info("getList(Criteria criteria)");
		return mapper.getListWithPaging(criteria);
	}
}
---------------------------------------------------------------------
[계산 BoardMapper.java]
package edu.global.ex.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import edu.global.ex.vo.BoardVO;
import edu.global.page.Criteria;

@Mapper // MyBatis 연결을 알려주는 것
public interface BoardMapper { // interface를 BoardMapper.xml에서 구현한다. >> Mybatis
	public List<BoardVO> getList();
	public BoardVO read(int bid); // 파라미터는 url로 넘어오는 bid값을 의미
	public int update(BoardVO board); // 글수정
	public int delete(BoardVO board); // 글삭제
	public int insert(BoardVO board); // 글작성

	//답글관리
	public void updateShape(BoardVO board); // 답글위치
	public void insertReply(BoardVO board); // 답글등록

	   //paging 관련
	 public abstract int getTotalCount();   
	 public abstract List<BoardVO> getListWithPaging(Criteria cri);
}
---------------------------------------------------------------------
[계산 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">
	<!-- BoardMapper.java의 interface를 구현하겠다. -->
	<select id="getList" resultType="edu.global.ex.vo.BoardVO">
		<!-- BoardMapper.java의 getList함수를 끌고 온다. -->
		<!-- BoardMapper.java의 List<BoardVO>를 끌고 온다.(DAO를 만들지 않아도 됨) -->
		<!-- resultType : BoardService.java의 타입(int등)을 지정함 -->

     <![CDATA[select * from mvc_board order by bGroup desc, bStep asc]]>
		<!-- CDATA를 사용하지 않으면 sql구문을 xml구문으로 인식하여 에러남 -->
	</select>
	<select id="read" resultType="edu.global.ex.vo.BoardVO"
		parameterType="edu.global.ex.vo.BoardVO">
	<![CDATA[select * from mvc_board where bid = #{bid}]]>
		<!-- #{bid} : BoardVO get(BoardVO vo) 안에 있는 필드 이름 사용 가능 -->
	</select>
	<update id="update">
	<![CDATA[update mvc_board set bname=#{bname}, btitle=#{btitle}, bcontent=#{bcontent} 
             where bid =#{bid}]]>
		<!-- #{bid} : BoardService.java의 int modify(BoardVO vo) 안에 있는 필드 이름 사용 
			가능 -->
	</update>
	<delete id="delete">
	<![CDATA[delete mvc_board where bid= #{bid}]]>
	</delete>
	<insert id="insert">
	<![CDATA[ insert into mvc_board (bid, bname, btitle, bcontent, bhit, bgroup, bstep, bindent) 
            values (mvc_board_seq.nextval, #{bname}, #{btitle}, #{bcontent}, 0, mvc_board_seq.currval, 0, 0)]]>
	</insert>

	<!--댓글을 하나씩 미뤄서 정렬을 해줘야 하기 때문에 세로 정렬을 bstep에 +1로 한칸씩 미뤄내줘야한다. -->
	<update id="updateShape">
      <![CDATA[
          update mvc_board set bstep = bstep + 1 where bgroup =#{bgroup} and bstep > #{bstep}
      ]]>
	</update>

	<insert id="insertReply">
   <![CDATA[
      insert into mvc_board (bid, bname, btitle, bcontent, bgroup, bstep, bindent) 
      values (mvc_board_seq.nextval, #{bname}, #{btitle},#{bcontent}, 
                #{bgroup}, #{bstep}+1, #{bindent}+1)
   ]]>
	</insert>

	<!-- 페이징 관련 -->
	<select id="getTotalCount" resultType="int">
	<![CDATA[select count(*) from mvc_board]]>
	</select>

	<select id="getListWithPaging" resultType="edu.global.ex.vo.BoardVO">
      <![CDATA[
        SELECT * FROM (
              SELECT ROWNUM AS RNUM, A.* FROM (
                       SELECT
                             *
                         FROM
                             mvc_board 
                         order by bGroup desc, bStep asc   
             ) A WHERE ROWNUM <= #{pageNum} * #{amount}
         ) WHERE RNUM > (#{pageNum}-1) * #{amount}
      ]]>
	</select>
</mapper>
---------------------------------------------------------------------
[계산 list2.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>
			<td>번호</td>
			<td>이름</td>
			<td>제목</td>
			<td>날짜</td>
			<td>히트</td>
		</tr>
		<c:forEach var="board" items="${boards}">
			<tr>
				<td>${board.bid}</td>
				<td>${board.bname}</td>
				<td><c:forEach begin="1" end="${board.bindent}">-</c:forEach> <a href="${pageContext.request.contextPath}/jboard/content_view?bid=${board.bid}">${board.btitle}</a></td>
				<td>${board.bdate}</td>
				<td>${board.bhit}</td>
			</tr>
		</c:forEach>
		<tr>
			<td colspan="5"><a href="write_view">글작성</a></td>
		</tr>
	</table>

	<!-- 페이지 작업 -->
	<c:if test="${pageMaker.prev}">
		<!-- http://localhost:8282/jboard/list2?pageNum=11&amount=10 -->
		<a href="list2${pageMaker.makeQuery(pageMaker.startPage - 1) }">«</a>
	</c:if>

	<!-- star부터 end페이지까지 링크를 걸어주는 함수(11페이지~20페이지) -->
	<!-- http://localhost:8282/jboard/list2?pageNum=17&amount=10 -->
	<c:forEach begin="${pageMaker.startPage }" end="${pageMaker.endPage }"
		var="idx">
		<c:out value="${pageMaker.cri.pageNum == idx?'':''}" />
		<a href="list2${pageMaker.makeQuery(idx)}">${idx}</a>
	</c:forEach>

	<c:if test="${pageMaker.next && pageMaker.endPage > 0}">
		<a href="list2${pageMaker.makeQuery(pageMaker.endPage +1) }"> » </a>
	</c:if>
	<br>
</body>
</html>
[결과값]


[조인]

[1:N 처리하는 2가지 방법]
  - 마이바티스에서 1:N으로 처리 = resultMap
  - VO를 한번에 정의하는 방법

[application.properties 추가]
mybatis.type-aliases-package=edu.global.ex
[계산 application.properties]
#server port number
server.port = 8282

#datasource (oracle)
#spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
#spring.datasource.url=jdbc:oracle:thin:@localhost:1521/xe
spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:oracle:thin:@localhost:1521/xe
spring.datasource.username=scott
spring.datasource.password=tiger

#MyBatis
#xml location
mybatis.mapper-locations=classpath:mappers/**/*.xml
mybatis.type-aliases-package=edu.global.ex

#### jsp 
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
---------------------------------------------------------------------
[계산 DeptMapper.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">
<!-- DeptMapper.java로 연결 -->
<mapper namespace="edu.global.ex.mapper.DeptMapper">
	<select id="getEmpDeptOneVOList" resultType="EmpDeptVO">
		select * from emp,dept where emp.deptno = dept.deptno
	</select>
</mapper>
---------------------------------------------------------------------
[계산 DeptMapper.java]
package edu.global.ex.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import edu.global.ex.vo.EmpDeptVO;

@Mapper // MyBatis 연결을 알려주는 것
public interface DeptMapper { // interface를 DeptMapper.xml에서 구현한다. >> Mybatis
	public List<EmpDeptVO> getEmpDeptOneVOList();
}
---------------------------------------------------------------------
[계산 EmpDeptVO.java]
package edu.global.ex.vo;
import java.sql.Timestamp;
import java.util.Date;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString // [EmpDeptVO(empno=7369, ename=SMITH, job=CLERK, mgr=7902, hiredate=1980-12-17
		  // 00:00:00.0, sal=800, comm=0, deptno=20, dname=RESEARCH, loc=DALLAS)]

public class EmpDeptVO {
	private int empno; // NOT NULL NUMBER(4)
	private String ename; // VARCHAR2(10)
	private String job;// VARCHAR2(9)
	private int mgr;// NUMBER(4)
	private Timestamp hiredate;// DATE
	private int sal;// NUMBER(7,2)
	private int comm;// NUMBER(7,2)
	private int deptno;// NUMBER(2)

	private String dname; // 부서이름
	private String loc; // 지역
}
---------------------------------------------------------------------
[계산 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.BoardService;
import edu.global.ex.EmpService;
import edu.global.ex.vo.PageVO;
import edu.global.page.Criteria;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j // 로그를 사용하기 위한 어노테이션 : log.info("view_list()..");
@Controller // (@Component + 의미) BoardController board = new BoardController();
@RequestMapping("/emp/*") // jboard로 들어오는 모든 것들은 BoardController를 생성해라
@RequiredArgsConstructor
public class EmpController {

	@Autowired // (주입)객체에 주소를 줌
	private EmpService empService; // BoardService boardService = new BoardServiceImpl();

	// http://localhost:8282/list2
	// list2?pageNum=5&amount=10">1</a>
	@GetMapping("/list2")
	public String list2(Criteria cri, Model model) { // 커맨드 객체 첫 번째로 실행 : 객체생성
		// Criteria(1,10)
		log.info("list2() ..");
		log.info("list2() Criteria " + cri);
		model.addAttribute("emps", empService.getList(cri));

		// 페이징을 위한 처리
		int total = empService.getTotal();
		log.info("total" + total);
		model.addAttribute("pageMaker", new PageVO(cri, total));
		return "/emp/list2";
	}

	@GetMapping("/dept1")
	public String dept1() { // 커맨드 객체 첫 번째로 실행 : 객체생성
		log.info("dept1() ..");
		System.out.println(empService.getEmpDeptOneVOList());
		return "/emp/emp_list2";
	}
}
---------------------------------------------------------------------
[계산 EmpService.java]
package edu.global.ex;
import java.util.List;
import edu.global.ex.vo.EmpDeptVO;
import edu.global.ex.vo.EmpVO;
import edu.global.page.Criteria;

public interface EmpService {
	public List<EmpVO> getList(); // 리스트 메소드
	public EmpVO get(int empno); // 글보기 메소드

	// 페이징
	public abstract int getTotal();
	public abstract List<EmpVO> getList(Criteria criteria); // 리스트 메소드 오버로딩

	//1:N 처리
	public List<EmpDeptVO> getEmpDeptOneVOList();
}
---------------------------------------------------------------------
[계산 EmpServiceImpl.java]
package edu.global.ex;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import edu.global.ex.mapper.DeptMapper;
import edu.global.ex.mapper.EmpMapper;
import edu.global.ex.vo.EmpDeptVO;
import edu.global.ex.vo.EmpVO;
import edu.global.page.Criteria;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j // 로그를 사용하기 위한 어노테이션 : log.info("view_list()..");
@Service
@RequiredArgsConstructor // Autowired에 생성자 주입해 줌
public class EmpServiceImpl implements EmpService {
	@Autowired
	private EmpMapper mapper;

	@Autowired
	private final DeptMapper deptMapper;

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

	@Override
	public EmpVO get(int empno) {
		log.info("get(int empno)..");
		return mapper.read(empno);
	}

	@Override
	public int getTotal() {
		log.info("getTotal()..");
		return mapper.getTotalCount();
	}

	@Override
	public List<EmpVO> getList(Criteria criteria) {
		log.info("getList(Criteria criteria)");
		return mapper.getListWithPaging(criteria);
	}

	@Override
	public List<EmpDeptVO> getEmpDeptOneVOList() {
		return deptMapper.getEmpDeptOneVOList();
	}
}
---------------------------------------------------------------------
[계산 DeptVO.java]
package edu.global.ex.vo;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class DeptVO { 
	private String deptno; // 부서번호
	private String dname; // 부서이름
	private String loc; // 지역

	List<EmpVO> empList; // DeptVO(1) : EmpVO(N)
}
[결과값]


0개의 댓글