[Spring Boot] ๐Ÿ“š Paging

yihyunยท2024๋…„ 9์›” 20์ผ

Spring Boot

๋ชฉ๋ก ๋ณด๊ธฐ
21/33

Paging

๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๋‹ค ๋ณด๋ฉด 10, 20๊ฐœ ๊นŒ์ง€๋Š” ํ•œ ํ™”๋ฉด์—์„œ ํ™•์ธํ•˜๊ธฐ๊ฐ€ ํŽธํ•˜์ง€๋งŒ
๋งŒ์•ฝ 30๋งŒ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ํ•œ ํŽ˜์ด์ง€์— ๋‹ด์„ ๊ฒฝ์šฐ ํ•œ ๋ˆˆ์— ๋ณด๊ธฐ๋„ ์–ด๋ ต๊ณ , ๋„ˆ๋ฌด ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— ๋ถˆ๋Ÿฌ์™€์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์„ฑ์ด ๋–จ์–ด์ง€๊ฒŒ ๋œ๋‹ค.

์ด๋Ÿด ๋•Œ Paging์„ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ๊ฐœ์ˆ˜๋งŒํผ์˜ ํŽ˜์ด์ง€๋ฅผ ๋‚˜๋ˆ„์–ด ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค.

ํŽ˜์ด์ง•์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.


limit, offset

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊นŒ์ง€ ์ค€๋น„๋˜์—ˆ๋‹ค๋ฉด ์ด์ œ DB์—์„œ ์šฐ๋ฆฌ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•˜๋Š” ๊ฐœ์ˆ˜๋งŒํผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ ์ฟผ๋ฆฌ๋ฌธ์„ ๋จผ์ € ์‚ดํŽด๋ณด์ž

  • limit : select * from bbs limit 0, 5;
  • limit/offset : select * from bbs limit 5 offset 0;

ํŽ˜์ด์ง•์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”

  • ์ด ๋ฐ์ดํ„ฐ์˜ ์ˆ˜ SELECT COUNT(idx) AS pages FROM bbs;
  • ํ•œ ํŽ˜์ด์ง€์— ๋ณด์—ฌ์ค„ ๋ฐ์ดํ„ฐ ์ˆ˜์— ๋”ฐ๋ฅธ ์ด ํŽ˜์ด์ง€ ์ˆ˜ SELECT ceil(COUNT(idx)/20) AS pages FROM bbs;
    โ— ceil : ์˜ฌ๋ฆผํ•จ์ˆ˜

๐Ÿ”ฝ view

html

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="css/common.css" type="text/css">
	<!-- ํŽ˜์ด์ง• ์‚ฌ์šฉ์„ ์œ„ํ•œ ์„ค์ • -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css">
    <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/js/bootstrap.min.js"></script>
    <script src="js/jquery.twbsPagination.js" type="text/javascript"></script>
</head>
<body>
	<button onclick="location.href='writeForm'">๊ธ€์“ฐ๊ธฐ</button>
	<table>
		<thead>
			<tr>
				<th>๊ธ€๋ฒˆํ˜ธ</th><th>์ œ๋ชฉ</th><th>์ž‘์„ฑ์ž</th><th>์กฐํšŒ์ˆ˜</th><th>์ž‘์„ฑ์ผ</th><th>์‚ญ์ œ</th>
			</tr>
		</thead>
		<tbody id="list"></tbody>
		<!-- ํŽ˜์ด์ง•์ด ๊ทธ๋ ค์งˆ ๊ณณ -->
		<tr> 
			<th colspan="6">
              	<!-- ํŽ˜์ด์ง• ์‚ฌ์šฉ์„ ์œ„ํ•œ ์„ค์ • -->
				<div class="container">
   					<nav aria-label="Page navigation">
        				<ul class="pagination" id="pagination"></ul>
    				</nav>
				</div>
			</th>
		</tr>
	</table>
</body>
</html>

java script

<script>
	var showPage = 1; // ๊ธฐ๋ณธ ํŽ˜์ด์ง€

	pageCall(showPage); 

	function pageCall(page){
		$.ajax({
	    	type: 'GET',
	        url: 'list.ajax', 
	        data: {
	        	'page' : page, // ๋ช‡ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ค„๊ฑด์ง€
	        	'cnt' : 20, // ํŽ˜์ด์ง€ ๋‹น ๋ณด์—ฌ์ค„ ๊ฒŒ์‹œ๋ฌผ ์ˆ˜
	        },dataType: 'json', 
	        success: function(data) {
	        	listPrint(data.list);
	        	// ํŽ˜์ด์ง• ํ”Œ๋Ÿฌ๊ทธ์ธ ์ฒ˜๋ฆฌ
	        	$('#pagination').twbsPagination({ // twbsPagination() ํ•จ์ˆ˜ ์‹คํ–‰
	        		startPage: 1, // ํ˜„์žฌ ํŽ˜์ด์ง€ (์‹œ์ž‘ํ•  ํŽ˜์ด์ง€)
	        		totalPages: data.totalPage, // ์ตœ๋Œ€ ํŽ˜์ด์ง€ ์ˆ˜
	        		visiblePages: 5, // ๋ณด์—ฌ์ค„ ํŽ˜์ด์ง€ ์ˆ˜
	        		onPageClick: function(evt, page){
	        			console.log('evt',evt); // ํด๋ฆญ ์ด๋ฒคํŠธ์˜ ๋ชจ๋“  ๋‚ด์šฉ
	        			console.log('page',page); // ํด๋ฆญํ•œ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ
	        			pageCall(page); // ๋ช‡ ๋ฒˆ ํŽ˜์ด์ง€์ธ์ง€ ์„œ๋ฒ„์— ์ •๋ณด ์ „๋‹ฌ
	        		}
	        	}); 
	        },error: function(e){
	        	console.log(e);
	        }
	    });
	}
	
	// ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ํ•จ์ˆ˜ 
	function listPrint(list){
		var content = '';
		for (var item of list) {
			content += '<tr>';
			content += '<td>'+item.idx+'</td>';
			content += '<td>'+item.subject+'</td>';
			content += '<td>'+item.user_name+'</td>';
			content += '<td>'+item.bHit+'</td>';
			content += '<td>'+item.reg_date+'</td>';
			content += '<td><a hrdf="#">์‚ญ์ œ</a></td>';
			content += '</tr>';
		}
		$('#list').html(content);
	}
</script>
  • ์ฒ˜์Œ ์ œ๊ณต๋  ํŽ˜์ด์ง€(1)๋ฅผ ๋ณ€์ˆ˜์— ๋‹ด์•„์ค€๋‹ค (showPage)
  • html ๋ฌธ์„œ๋ฅผ ์ฝ์ž๋งˆ์ž pageCall() ํ•จ์ˆ˜ ์‹คํ–‰ (ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ๋Š” 1๋ฒˆ)
  • data ์—๋Š” โ‘  ๋ณด์—ฌ์ค„ ํŽ˜์ด์ง€ (page) โ‘ก ํŽ˜์ด์ง€ ๋‹น ๋ณด์—ฌ์ค„ ๊ฒŒ์‹œ๋ฌผ ์ˆ˜ (cnt) ๋ฅผ ์„ค์ •ํ•œ๋‹ค.
  • success ํ–ˆ์„ ๊ฒฝ์šฐ listPrint(data.list) ๋กœ DB์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•œ๋‹ค.
  • โœจ twbsPagination() ํ•จ์ˆ˜ ์‹คํ–‰ : jQuery ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•ด ํŽ˜์ด์ง€๋„ค์ด์…˜(ํŽ˜์ด์ง•)์„ ๊ตฌํ˜„ํ•˜๋Š” ํ•จ์ˆ˜๋กœ, Twitter Bootstrap์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ ํ•˜๋‚˜
    โœ” startPage : ํ˜„์žฌ ํŽ˜์ด์ง€ (์‹œ์ž‘ํ•  ํŽ˜์ด์ง€)
    โœ” totalPages : ์ตœ๋Œ€ ํŽ˜์ด์ง€ ์ˆ˜
    โœ” visiblePages : ๋ณด์—ฌ์ค„ ํŽ˜์ด์ง€ ์ˆ˜
    โœ” onPageClick : ํŽ˜์ด์ง€ ํด๋ฆญ์ด ์ผ์–ด๋‚  ๊ฒฝ์šฐ ์‹คํ–‰ํ•  ํ•จ์ˆ˜๋ฅผ ์ง€์ • (evt : ํด๋ฆญ ์ด๋ฒคํŠธ์˜ ๋ชจ๋“  ๋‚ด์šฉ / page : ํด๋ฆญํ•œ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ)
    โ†’ pageCall(page) : ํ˜„์žฌ ํŽ˜์ด์ง€ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์žˆ์œผ๋ฏ€๋กœ, ํ•ด๋‹น ์ •๋ณด๋ฅผ ์„œ๋ฒ„์— ์ „๋‹ฌํ•œ๋‹ค.

๐Ÿ”ฝ controller

@GetMapping(value="/list.ajax")
@ResponseBody
public Map<String, Object> list(String page, String cnt) {
		
		int page_ = Integer.parseInt(page);
		int cnt_ = Integer.parseInt(cnt);
				
		return service.list(page_, cnt_);
	}
  • view์—์„œ ajax๋กœ ๋ณด๋‚ด๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„๊ณผ ๋ฐ›์•„์ฃผ๋Š” ์ด๋ฆ„์€ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค!
  • ํŽ˜์ด์ง€ ์ •๋ณด๊ฐ€ String๋กœ ๋‹ด๊ฒจ์˜ค๊ธฐ ๋•Œ๋ฌธ์— int๋กœ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค.

๐Ÿ”ฝ service

public Map<String, Object> list(int page, int cnt) {
		
	int limit = cnt; // ํŽ˜์ด์ง€ ๋‹น ๋ณด์—ฌ์ค„ ๊ฒŒ์‹œ๋ฌผ ์ˆ˜ 
	int offset = (page-1) * cnt; // ๋ช‡ ๋ฒˆ ๊ฒŒ์‹œ๋ฌผ ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•  ๊ฒƒ์ธ์ง€ ์ง€์ •
		
	int totalPages = dto.allCount(cnt);
		
	Map<String, Object> result = new HashMap<String, Object>();
	result.put("totalPage", totalPages); // ์ด ํŽ˜์ด์ง€ ์ˆ˜
    
	// ๋‚˜์ค‘์— ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ๊นŒ ๋งŒ๋“ค์–ด์ค€๋‹ค. (ํ˜„์žฌ ํ•„์š” x)
	result.put("currPage", page); // ํ˜„์žฌ ํŽ˜์ด์ง€
	result.put("list", dto.list(limit, offset));
    
	return result;
}

20๊ฐœ ์”ฉ ๊ฒŒ์‹œ๋ฌผ์„ ๋ณด์—ฌ์ค„ ๊ฒฝ์šฐ ์ฟผ๋ฆฌ๋ฌธ์€ select * from bbs limit 20 offset 0; ์ด ๋˜๊ณ  2 ํŽ˜์ด์ง€๋กœ ๋„˜์–ด๊ฐˆ ๊ฒฝ์šฐ select * from bbs limit 20 offset 20; ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.
โ–ผ
๊ทธ๋ ‡๋‹ค๋ฉด ๋ณด์—ฌ์ค„ ํŽ˜์ด์ง€ ์ˆ˜๋Š” ๊ณ„์† ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋˜๊ณ  ์‹œ์ž‘๋˜๋Š” ๋ฒˆํ˜ธ๋Š” 20 ์”ฉ ์ฆ๊ฐ€ํ•œ๋‹ค.
โ–ผ
์ธ๋ฑ์Šค๋Š” 0 ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ํŽ˜์ด์ง€์ˆ˜ (page = 1) ์—์„œ -1 ์„ ํ•ด์ฃผ๊ณ  ๋ณด์—ฌ์ค„ ํŽ˜์ด์ง€ ์ˆ˜ (cnt = 20) ์„ ๊ณฑํ•ด์ฃผ๋Š” ๊ฒƒ์œผ๋กœ limit ์™€ offset ์„ ์ง€์ •ํ•ด์ค€๋‹ค.

  • ๋ณด์—ฌ์ค„ ๊ฒŒ์‹œ๋ฌผ ์ˆ˜์™€ ์‹œ์ž‘๋  ๊ฒŒ์‹œ๊ธ€ ๋ฒˆํ˜ธ๋ฅผ ๊ณ„์‚ฐํ•ด ๋ณ€์ˆ˜์— ๋‹ด์•„์ค€๋‹ค.
  • .allCount() ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด ๊ฒฐ๊ณผ๊ฐ’์„ ๋ณ€์ˆ˜์— ๋‹ด์•„์ค€๋‹ค. (์ด ํŽ˜์ด์ง€ ์ˆ˜ / 20 ์˜ ๊ฒฐ๊ณผ๊ฐ’์ด ๋“ค์–ด๊ฐ„๋‹ค.)
  • ๋ฐ›์•„์˜จ ๊ฒฐ๊ณผ๋ฅผ totalPage ๋ผ๋Š” key๋กœ ๋ณด๋‚ด์ค€๋‹ค.

๐Ÿ”ฝ dto / mapper

DTO

int allCount(int cnt);

mapper

<select id="allCount">
	SELECT CEIL(COUNT(idx)/#{param1}) AS pages FROM bbs
</select>
  • ์ „์ฒด ๋ฐ์ดํ„ฐ ์ˆ˜๋ฅผ count ํ•ด์„œ ๋ณด์—ฌ์ค„ ํŽ˜์ด์ง€ ์ˆ˜๋กœ ๋‚˜๋ˆ„๊ณ  ์†Œ์ˆ˜๋ฅผ ๋Œ€๋น„ํ•ด ceil ํ•จ์ˆ˜๋กœ ๊ฐ’์„ ์ •์ˆ˜๋กœ ์˜ฌ๋ ค์ค€๋‹ค.

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ“š Paging (์ง€์ •ํ•œ ์ˆซ์ž๋งŒํผ ๋ฐ์ดํ„ฐ ๋ณด์—ฌ์ฃผ๊ธฐ)

๊ฒŒ์‹œํŒ์„ ๋ณด๋‹ค๋ณด๋ฉด 5, 10, 15, 20 ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ์ค€์œผ๋กœ ๊ฒŒ์‹œ๊ธ€์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
์œ„์—์„œ ๋งŒ๋“  paging์€ ๋ณด์—ฌ์ค„ ํŽ˜์ด์ง€๊ฐ€ 20 ์œผ๋กœ๋งŒ ๊ณ ์ •๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋™์ ์œผ๋กœ ์›€์ง์ผ ์ˆ˜ ์—†๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์ˆซ์ž๋งŒํผ ๊ฒŒ์‹œ๊ธ€์„ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž!

๐Ÿ”ฝ view

<body>
	<button onclick="location.href='writeForm'">๊ธ€์“ฐ๊ธฐ</button>
	&nbsp;&nbsp;&nbsp;&nbsp;
	<select id="pagePerNum" >
		<option value="5">5</option>
		<option value="10">10</option>
		<option value="15">15</option>
		<option value="20" selected>20</option>
	</select>
	๊ฐœ ์”ฉ ๋ณด๊ธฐ
	<table>
		<thead>
			<tr>
				<th>๊ธ€๋ฒˆํ˜ธ</th>
				<th>์ œ๋ชฉ</th>
				<th>์ž‘์„ฑ์ž</th>
				<th>์กฐํšŒ์ˆ˜</th>
				<th>์ž‘์„ฑ์ผ</th>
				<th>์‚ญ์ œ</th>
			</tr>
		</thead>
		<tbody id="list">
	
		</tbody>
		<tr>
			<th colspan="6">
				<div class="container">
		    		<nav aria-label="Page navigation">
		        		<ul class="pagination" id="pagination"></ul>
		    		</nav>
				</div>
			</th>
		</tr>
	</table>
</body>
<script>
	var show = 1;
	
	pageCall(show);

	$('#pagePerNum').change(function(){
		$('#pagination').twbsPagination('destroy');
		pageCall(show);
	});



	function pageCall(page) {
		$.ajax({
			type:'GET',
			url:'list.ajax',
			data:{
				'page':page,
				'cnt': $('#pagePerNum').val(),
			},
			datatype:'JSON',
			success:function(data){
				console.log(data);
				drawList(data.list)
				
				$('#pagination').twbsPagination({ // ํŽ˜์ด์ง• ๊ฐ์ฒด ๋งŒ๋“ค๊ธฐ
					startPage:1, 
            		totalPages:data.totalPages, 
            		visiblePages:5,
            		onPageClick:function(evt,page){
            			console.log('evt',evt); 
            			console.log('page',page); 
            			pageCall(page);
            		}
				});
			},
			error:function(e){
				console.log(e);
			}
		});
	}
	function drawList(list) {
		var content ='';
		list.forEach(function(view,idx){ 
			content +='<tr>';
			content +='<td>'+view.idx+'</td>';
			content +='<td><a href="detail.go?idx='+view.idx+'">'+view.subject+'</a></td>';
			content +='<td>'+view.user_name+'</td>';
			content +='<td>'+view.bHit+'</td>';
			content +='<td>'+view.reg_date+'</td>';
			content +='<td><a href="del?idx='+view.idx+'">์‚ญ์ œ</a></td>';
			content +='</tr>';
		});
		$('#list').html(content);
	}


</script>
  • ์„œ๋ฒ„์—์„œ DB์— ์žˆ๋Š” ์ฟผ๋ฆฌ์— ์ด ๋ฐ์ดํ„ฐ ์ˆ˜ / ๋ณด์—ฌ์ค„ ๋ฐ์ดํ„ฐ ์ˆ˜ ๋ฅผ ํ•ด์„œ ์ด ํŽ˜์ด์ง€ ์ˆ˜๋ฅผ ๋ฐ›์•„์™€ ๋„ฃ์–ด์ค€๋‹ค.

  • select ์— change ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด destroy ๋ฅผ ํ•ด์ค€๋‹ค.
    โ–ถ ๊ธฐ์กด์— ์žˆ๋˜ ํŽ˜์ด์ง•์„ ํŒŒ๊ดดํ•œ๋‹ค.

  • ๋ณด์—ฌ์ค„ ํŽ˜์ด์ง€๋Š” select ์—์„œ ๋ฐ›์•„์˜จ ๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค.

  • ํ˜„์žฌ๋Š” ๋ณด์—ฌ์ค„ ํŽ˜์ด์ง€๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ๊ฐ•์ œ๋กœ 1๋ฒˆ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋Š”๋ฐ, ๋งŒ์•ฝ ๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ตœ๋Œ€ ํŽ˜์ด์ง€ ์ˆ˜๋ฅผ page ์— ์ฃผ๋ฉด ๋œ๋‹ค.

๐Ÿ”ฝ controller

@RequestMapping("/list.ajax")
@ResponseBody
public Map<String, Object> list(String page,String cnt){
		
	int page_ = Integer.parseInt(page);
	int cnt_ = Integer.parseInt(cnt);
	
	return ser.list(page_, cnt_);
}

๐Ÿ”ฝ service

public Map<String, Object> list(int page, int cnt) {
		
	int limit = cnt;
	int offset = (page-1) * cnt;
	int totalpage = dao.count(cnt);
		
	Map<String, Object> result = new HashMap<String, Object>();
	result.put("totalPages", totalpage);
	result.put("currPage", page);
	result.put("list",dao.list(limit,offset));
		
	return result;
}

๐Ÿ”ฝ dao

List<BoardDTO> list(int limit, int offset);

๐Ÿ”ฝ mapper

<select id="list" resultType="kr.co.gudi.dto.BoardDTO">
	SELECT idx,subject,user_name,bHit,reg_date FROM bbs
  		ORDER BY idx DESC LIMIT #{param1} OFFSET #{param2}
</select>

<select id="count" resultType="int">
	SELECT CEIL(COUNT(idx)/#{param1}) AS pages FROM bbs
</select>
  • limit ์™€ offset ์— ๋ณด๋‚ด์ค€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋„ฃ์–ด ๋ณด์—ฌ์ค„ ํŽ˜์ด์ง€๋ฅผ ์ •ํ•ด์ค€๋‹ค.
  • count ๋กœ ์ด ์ˆ˜์—์„œ ๋ณด์—ฌ์ค„ ํŽ˜์ด์ง€ ์ˆ˜๋ฅผ ๋‚˜๋ˆ  ์ด ํŽ˜์ด์ง€๋ฅผ ๊ตฌํ•ด์ค€๋‹ค.

์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์‚ฌ์šฉ์ž์— ์„ ํƒ์— ๋”ฐ๋ผ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐ์ดํ„ฐ ์ˆ˜๊ฐ€ ๊ฒฐ์ •๋˜๋Š” ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค!

profile
๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ณด์ž

0๊ฐœ์˜ ๋Œ“๊ธ€