단위 data source / vo
통합 시스템(부하) 인수 테스트
SPRING
페이징 처리 조건
1. ui처리를 위한 설계-변수 7개.(startPage, endPage, prev, next, total, cri, pageNum)
2. DB 쿼리 처리(my sql-처리가 상당히 간단.limit로 처리하면됨,오라클 11g이하, 12이상)
--sql 처리 순서
--1. FROM/WHERE 절이 먼저 처리됩니다.
--2. ROWNUM이 할당되고 FROM/WHERE 절에서 전달되는 각각의 출력 로우에 대해 증가(increment) 됩니다.
--3. SELECT가 적용됩니다.
--4. GROUP BY 조건이 적용됩니다.
--5. HAVING이 적용됩니다.
--6. ORDER BY 조건이 적용됩니다
[Board]게시글 목록 조회
http://localhost:8089/board/list BoardController.java - /board/list -> getList 실행 1) 게시글을 10개만 조회 2) 화면에 페이지 번호, 이전, 다음 버튼 출력을 위해 PageDTO를 사용하여 계산 // 전체 게시글..
imnkj.tistory.com
(쿼리문참조)
sinpk.tistory.com/entry/%EC%98%A4%EB%9D%BC%ED%81%B4-%ED%8E%98%EC%9D%B4%EC%A7%95-%EC%BF%BC%EB%A6%AC
오라클 페이징 쿼리
1. 페이지 수를 계산하여 셀렉트 SELECT * FROM (SELECT T0.*, FLOOR((ROWNUM - 1) / 한 페이지에 보여지는 row수 + 1) PAGE FROM ( -- 쿼리를 할 실제..
sinpk.tistory.com
↑다른블로그인데 참고하기
board_5 에 페이징 추가하기
조회수는 구현이 안됨 페이징만 볼것
[BoardController.java]
package edu.bit.board.controller;
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 edu.bit.board.page.Criteria;
import edu.bit.board.page.PageVO;
import edu.bit.board.service.BoardService;
import edu.bit.board.vo.BoardVO;
import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j;
@Log4j // 롬복이
@AllArgsConstructor // 롬복이
@Controller
public class BoardController {
// 5버전으로 오면서 @Autowired 를 안넣어줘도 알아서 객체생성됨
private BoardService boardService;
@GetMapping("/list")
// @PostMapping("/list")
// @RequestMapping아니고 GetMapping으로 버전바뀌면서 씀
public void list(Model model) {// 만약 void면 list.jsp(함수명)를 리턴시킨다.
// String으로 주면 걍 return list;
log.info("list()");
model.addAttribute("list", boardService.getList());
// BoardService에서 getlist()에 자동으로 담아진다.
System.out.println("사이즈" + boardService.getList().size());
}
@GetMapping("/write_view")
// @PostMapping("/write_view")
public String write_view(Model model) {
log.info("write_view()");
model.addAttribute("list", boardService.getList());
return "write_view";
}
// post로 넘어오니까
// @PostMapping("/write")
@GetMapping("/write")
public String write(BoardVO boardVO, Model model) throws Exception {
log.info("write()");
boardService.writeBoard(boardVO);
return "redirect:list";
}
@GetMapping("/content_view")
// @PostMapping("/content_view")
public String content_view(BoardVO boardVO, Model model) throws Exception {
log.info("content_view()");
model.addAttribute("content_view", boardService.getBoard(boardVO.getbId()));
// 아이디만 들어가면 돼서
return "content_view";
}
@GetMapping("/delete")
// @PostMapping("/delete")
public String delete(BoardVO boardVO, Model model) throws Exception {
log.info("delete()");
boardService.deleteBoard(boardVO);
return "redirect:list";
}
@GetMapping("/modify")
public String modify(BoardVO boardVO, Model model) throws Exception {
boardService.modifyBoard(boardVO);
return "redirect:list";
}
// 작성글 답변 페이지
@GetMapping("/reply_view")
public String reply_view(BoardVO boardVO, Model model) throws Exception {
log.info("reply_view()");
model.addAttribute("reply_view", boardService.getReply(boardVO.getbId()));
return "/reply_view";
}
// 작성글 답변
@PostMapping("/reply")
public String reply(BoardVO boardVO, Model model) throws Exception {
log.info("reply()");
boardService.replyBoard(boardVO);
return "redirect:list";
}
// 페이징
@GetMapping("/list2")
public void list2(Criteria cri, Model model) {
log.info("list() 호출");
log.info(cri);
model.addAttribute("list2", boardService.getList(cri));
int total = boardService.getTotalCount(cri);
log.info("total" + total);
model.addAttribute("pageMaker", new PageVO(cri, total));
// cri, total(전체 데이터 개수), new PageDTO(cri, total)->paging관련 파라미터 계산됨->list.jsp
}
}
[Criteria.java]
package edu.bit.board.page;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@ToString
@Getter
@Setter // 롬보기로 get set tostring 만들기
public class Criteria {
// 페이징 처리를 위해선 페이지 번호와
// 한페이지당 몇개의 데이터를 보여줄것이지 결정되어야함.
private int pageNum;// 페이지 번호
private int amount;// 한페이당 몇개의 데이터를 보여줄것인가?
public Criteria() {
this(1, 5);// 기본값 1페이지 10개로 지정; - this는 생성자를 호출
}
public Criteria(int pageNum, int amount) {
this.pageNum = pageNum;
this.amount = amount;
}
}
[PageVO.java]
package edu.bit.board.page;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@ToString
@Setter
@Getter
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;// 1번페이지에 10개 뿌리기
this.total = total;// 전체 몇개가 있는지 알아야 세팅이 됨
// 예:현재 페이지가 13이면 13/10 = 1.3 올림 → 2 끝페이지는 2*10=20
this.endPage = (int) (Math.ceil(cri.getPageNum() / 5.0)) * 5;
// 10.0개를 따로 변수지정해서 넣어도 상관없긴하지만 10개이상인 경우는 거의 없기 때문에 그냥 다이렉트로 넣는다.
// startPage는 1, endPage는 10이 나오기위한 공식
this.startPage = this.endPage - 4;
// 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;// prev는 startPage가 1이라도 있게되면 존재
// realEnd가 끝번호(endPage)보다 큰 경우에만 존재
this.next = this.endPage < realEnd;
}
// 쿼리 만듦
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.bit.board.service;
import java.util.List;
import edu.bit.board.page.Criteria;
import edu.bit.board.vo.BoardVO;
public interface BoardService {
public List<BoardVO> getList();
public void writeBoard(BoardVO boardVO);
// controller에서 write를 create한것-이제 자손이 구현할차례
// -BoardServiceImpl에서!
public BoardVO getBoard(int getbId);
public void deleteBoard(BoardVO boardVO);
public void modifyBoard(BoardVO boardVO);
// 답변글 작성 이동
public BoardVO getReply(int getbId);
// 답변글 작성
public void replyBoard(BoardVO boardVO);
//페이징처리
public List<BoardVO> getList(Criteria cri);
public int getTotalCount(Criteria cri);
}
[BoardServiceImpl.java]
package edu.bit.board.service;
import java.util.List;
import org.springframework.stereotype.Service;
import edu.bit.board.mapper.BoardMapper;
import edu.bit.board.page.Criteria;
import edu.bit.board.vo.BoardVO;
import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j;
@Log4j
@Service
@AllArgsConstructor
public class BoardServiceImpl implements BoardService {
private BoardMapper mapper;
// 전처럼 위에 @안써도 자동으로 객체 생성해서 들어감
@Override
public List<BoardVO> getList() {
log.info("getList.......");
log.info("getList...." + mapper.getList().size());
System.out.println("getList...." + mapper.getList().size());
return mapper.getList();
}
@Override
public void writeBoard(BoardVO boardVO) {
mapper.insert(boardVO);
}
@Override
public BoardVO getBoard(int bId) {
log.info("getBoard.......");
return mapper.read(bId);
}
@Override
public void deleteBoard(BoardVO boardVO) {
log.info("getDelete.......");
mapper.delete(boardVO);
}
@Override
public void modifyBoard(BoardVO boardVO) {
log.info("getmodify.......");
mapper.modify(boardVO);
}
// 답글 페이지
@Override
public BoardVO getReply(int bId) {
log.info("getBoard()");
return mapper.reply_view(bId);
}
// 답글 수행
@Override
public void replyBoard(BoardVO boardVO) {
mapper.reply(boardVO);
mapper.replyShape(boardVO);
log.info("replyBoard()");
}
// 페이징
@Override
public List<BoardVO> getList(Criteria cri) {
return mapper.getPaging(cri);
}
@Override
public int getTotalCount(Criteria cri) {
return mapper.getTotalCnt(cri);
}
}
[BoardVO.java]
package edu.bit.board.vo;
import java.sql.Date;
public class BoardVO {
private int bId;
private String bName;
private String bTitle;
private String bContent;
private Date bDate;
private int bHit;
private int bGroup;
private int bStep;
private int bIndent;
public BoardVO() {
}
public BoardVO(int bId, String bName, String bTitle, String bContent, Date bDate, int bHit, int bGroup,
int bStep, int bIndent) {
this.bId = bId;
this.bName = bName;
this.bTitle = bTitle;
this.bContent = bContent;
this.bDate = bDate;
this.bHit = bHit;
this.bGroup = bGroup;
this.bStep = bStep;
this.bIndent = bIndent;
}
public int getbId() {
return bId;
}
public void setbId(int bId) {
this.bId = bId;
}
public String getbName() {
return bName;
}
public void setbName(String bName) {
this.bName = bName;
}
public String getbTitle() {
return bTitle;
}
public void setbTitle(String bTitle) {
this.bTitle = bTitle;
}
public String getbContent() {
return bContent;
}
public void setbContent(String bContent) {
this.bContent = bContent;
}
public Date getbDate() {
return bDate;
}
public void setbDate(Date bDate) {
this.bDate = bDate;
}
public int getbHit() {
return bHit;
}
public void setbHit(int bHit) {
this.bHit = bHit;
}
public int getbGroup() {
return bGroup;
}
public void setbGroup(int bGroup) {
this.bGroup = bGroup;
}
public int getbStep() {
return bStep;
}
public void setbStep(int bStep) {
this.bStep = bStep;
}
public int getbIndent() {
return bIndent;
}
public void setbIndent(int bIndent) {
this.bIndent = bIndent;
}
}
[BoardMapper.java]
package edu.bit.board.mapper;
import java.util.List;
import edu.bit.board.page.Criteria;
import edu.bit.board.vo.BoardVO;
public interface BoardMapper {
public List<BoardVO> getList();
public void insert(BoardVO boardVO);
// BoardServiceImpl에서 create - 이제 자손이 구현 - xml이 구현한다.
public BoardVO read(int bno);
public void delete(BoardVO boardVO);
public void modify(BoardVO boardVO);
// 답변글 작성페이지 이동
public BoardVO reply_view(int bId);
// 답변글 작성하기
public void reply(BoardVO boardVO);
// 답변글 형태 업데이트하기
public void replyShape(BoardVO boardVO);
// 조회수 증가
public void upHit(int bId);
// 페이징처리
public List<BoardVO> getPaging(Criteria cri);
// 전체 게시글 갯수
public int getTotalCnt(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.bit.board.mapper.BoardMapper">
<!-- ↑인터페이스 -->
<!--↓인터페이스 BoardMapper의 자식이 구현해야하는데 id=""로 구현 id명 꼭 맞춰줄것 -->
<select id="getList" resultType="edu.bit.board.vo.BoardVO">
<![CDATA[
select * from mvc_board order by bGroup desc, bStep asc
]]>
</select>
<!-- insert로 넣었으니까 insert로. 근데 select를 넣어도 실행되긴함 -->
<!-- insert는 result가 없다. -->
<!--변수로 넘어오게 되는것엔 #{변수명} 으로 써주기 -->
<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)
]]>
<!--★★★rownum as rnum 을 안해주면 따로 생성이 안되고 rownum이 한번에 다 온다★★★-->
</insert>
<select id="read" resultType="edu.bit.board.vo.BoardVO">
<![CDATA[
select * from mvc_board where bId = #{bId}
]]>
</select>
<delete id="delete">
<![CDATA[
delete from mvc_board where bId = #{bId}
]]>
</delete>
<update id="modify">
<![CDATA[
update mvc_board set bName = #{bName}, bTitle = #{bTitle}, bContent = #{bContent} where bId = #{bId}
]]>
</update>
<!-- 답변글 작성 이동 -->
<select id="reply_view" resultType="edu.bit.board.vo.BoardVO">
<![CDATA[
select * from mvc_board where bId = #{bId}
]]>
</select>
<!-- 답변글 쓰기 -->
<insert id="reply">
<![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>
<!-- 답변글 형태 업데이트 -->
<update id="replyShape">
<![CDATA[
update mvc_board set bStep = bStep + 1 where bGroup = #{bGroup} and bStep > #{bStep}]]>
</update>
<!-- 조회수 증가 -->
<update id="upHit">
<![CDATA[
update mvc_board set bHit = bHit+1 where bId = #{bId}
]]>
</update>
<!-- 쿼리문 -->
<select id="getPaging"
resultType="edu.bit.board.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>
<select id="getTotalCnt" resultType="int">
select count(*) from mvc_board
</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 PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; 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 items="${list2}" var="dto">
<tr>
<td>${dto.bId}</td>
<td>${dto.bName}</td>
<td><c:forEach begin="1" end="${dto.bIndent}">[re]</c:forEach>
<a href="content_view?bId=${dto.bId}">${dto.bTitle}</a></td>
<td>${dto.bDate}</td>
<td>${dto.bHit}</td>
</tr>
</c:forEach>
<tr>
<td colspan="5"><a href="write_view">글작성</a></td>
</tr>
</table>
<!-- 페이징처리 코드 -->
<c:if test="${pageMaker.prev}">
<a href="list2${pageMaker.makeQuery(pageMaker.startPage - 1) }">pre</a>
</c:if>
<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) }">next</a>
</c:if>
<br>
<!--
<button type="submit">글쓰기</button> -->
</body>
</html>
<a href="list2${pageMaker.makeQuery(idx)}">${idx}</a> 이 부분은 이렇게 나온다. 똑같은 함수인데 그저 forEach문 돌린것.
<a href="list2?pageNum=$(indx)&amount=10>${idx}</a> 랑 똑같다
↓구현화면
po9357.github.io/spring/2019-05-28-Board_Paging/
참고
[Spring] 스프링 게시판 만들기 - 페이징(Paging) 처리하기
글 목록을 보여줄 때 더 깔끔하고 편리하게 보여주기 위한 페이징 처리에 대해 알아본다
po9357.github.io
============================================================================
DB
[1장]데이터베이스
ddl : 컬럼명 바꾸는것 . drop colunm
dml : update delete이런거
dcl : revoke commit
↑투플, 레코드, 행 이런 용어 외워두기
db설계 3요소는 반드시 외우기(개논물)
개념적설계 논리적설계 물리적설계
[2장]데이터 모델링
개념적 설계
: ER
TDD 켄트백 책읽기
오늘의문제
1.emp list 페이징을 구현하시오.
↓구현결과
[EmpController.java]
@GetMapping("/list2")
public void list2(Criteria cri, Model model) {
log.info("list() 호출");
log.info(cri);
model.addAttribute("list2", empService.getList(cri));
int total = empService.getTotalCount(cri);
log.info("total" + total);
model.addAttribute("pageMaker", new PageVO(cri, total));
// cri, total(전체 데이터 개수), new PageDTO(cri, total)->paging관련 파라미터 계산됨->list.jsp
}
[EmpServie.java]
public List<EmpVO> getList(Criteria cri);
public int getTotalCount(Criteria cri);
[EmpserviceImpl.java]
@Override
public List<EmpVO> getList(Criteria cri) {
return mapper.getPaging(cri);
}
@Override
public int getTotalCount(Criteria cri) {
return mapper.getTotalCnt(cri);
}
[EmpMapper.java]
public List<EmpVO> getPaging(Criteria cri);
public int getTotalCnt(Criteria cri);
[PageVO.java]
package edu.bit.board.page;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@ToString
@Setter
@Getter
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;
this.endPage = (int) (Math.ceil(cri.getPageNum() / 5.0)) * 5;
this.startPage = this.endPage - 4;
int realEnd = (int) (Math.ceil(total * 1.0) / cri.getAmount());
if (realEnd <= this.endPage) {
this.endPage = realEnd;
}
this.prev = this.startPage > 1;
this.next = this.endPage < realEnd;
}
public String makeQuery(int page) {
UriComponents uriComponentsBuider = UriComponentsBuilder.newInstance().queryParam("pageNum", page)
.queryParam("amount", cri.getAmount()).build();
return uriComponentsBuider.toUriString();
}
}
[Criteria.java]
package edu.bit.board.page;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@ToString
@Setter
@Getter
public class Criteria {
private int pageNum;
private int amount;
public Criteria() {
this(1,5);
}
public Criteria(int pageNum, int amount) {
this.pageNum = pageNum;
this.amount = amount;
}
}
[EmpMapper.xml]
<select id="getPaging" resultType="edu.bit.board.vo.EmpVO">
<![CDATA[
select * from (SELECT ROWNUM AS rnum, A.* FROM (
select * from emp02) A where rownum <= #{pageNum} * #{amount}
)where rnum > (#{pageNum}-1) * #{amount}
]]>
</select>
<select id="getTotalCnt" resultType="int">
<![CDATA[
select count(*) from emp02
]]>
</select>
[list2.jsp]-부트스트랩 코드는 생략
<div class="card-body">
<div class="table-responsive">
<table class="table table-bordered" id="dataTable" width="100%"
cellspacing="0">
<thead>
<tr>
<td>사원번호</td>
<td>사원이름</td>
<td>사원직급</td>
<td>매니저</td>
<td>입사일</td>
<td>급여</td>
<td>커미션</td>
<td>부서</td>
</tr>
<tbody>
<c:forEach items="${list2}" var="dto">
<tr>
<td>${dto.empno}</td>
<td>${dto.ename}</td>
<td>${dto.job}</td>
<td>${dto.mgr}</td>
<td>${dto.hiredate}</td>
<td>${dto.sal}</td>
<td>${dto.comm}</td>
<td>${dto.deptno}</td>
</tr>
</c:forEach>
</tbody>
</table>
<!-- 페이징 -->
<ul class="pagination">
<li class="dataTables_paginate paging_simple_numbers"><c:if
test="${pageMaker.prev}">
<a href="list2${pageMaker.makeQuery(pageMaker.startPage - 1) }">prev</a>
</c:if>
<li class="paginate_button page-item active"><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></li>
<li class="paginate_button page-item next disabled"><c:if
test="${pageMaker.next && pageMaker.endPage > 0}">
<a href="list2${pageMaker.makeQuery(pageMaker.endPage +1) }">next
</a>
</c:if></li>
</ul>
<br>
<div class="card-header py-3 text-center"
style="margin-top: 5px">
<h6 class="m-0 font-weight-bold text-primary">
<a href="write_view">사원정보입력</a>
</h6>
</div>
<style>/* 페이징 가운데 정렬 */
ul.pagination {
display: table;
margin-left: auto;
margin-right: auto;
}
</style>
2.오라클 11g 이하에서의 페이징 처리 방법(DB sql관련)은 ?
ROWNUM을 이용해서 페이징 처리를한다.
--sql 처리 순서
--1. FROM/WHERE 절이 먼저 처리됩니다.
--2. ROWNUM이 할당되고 FROM/WHERE 절에서 전달되는 각각의 출력 로우에 대해 증가(increment) 됩니다.
--3. SELECT가 적용됩니다.
--4. GROUP BY 조건이 적용됩니다.
--5. HAVING이 적용됩니다.
--6. ORDER BY 조건이 적용됩니다
3.rownum 에 대하여 설명하시오.
쿼리문에 순번을 매겨서 순번대로 출력하게 하는 함수 - 예를들어 order by로 먼저 정렬 후 rownum으로 순번을 매겨준다.
SELECT *
FROM (SELECT *
FROM t1
ORDER BY c1) --이렇게 먼저 from절 바로 뒤에 묶어 준다.
WHERE ROWNUM >= 1
AND ROWNUM <= 5;
ㄴ
'코딩 > 수업 정리' 카테고리의 다른 글
21.02.03 [051] Wed (0) | 2021.02.03 |
---|---|
21.02.02 [050] Tue (0) | 2021.02.02 |
21.01.29 [048] Fri (0) | 2021.01.29 |
21.01.28 [047] Thu (0) | 2021.01.28 |
21.01.27 [046] Wed (0) | 2021.01.27 |
댓글