ninegrid2 6.172.0 → 6.173.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundle.cjs.js +9 -112
- package/dist/bundle.esm.js +9 -112
- package/dist/etc/ngFiltering.js +7 -6
- package/dist/utils/ninegrid.js +3 -3
- package/package.json +1 -1
- package/src/etc/ngFiltering.js +7 -6
- package/src/utils/ninegrid.js +3 -3
package/dist/bundle.cjs.js
CHANGED
|
@@ -10730,14 +10730,14 @@ class ninegrid {
|
|
|
10730
10730
|
if (!("shadow" in Element.prototype)) {
|
|
10731
10731
|
Object.defineProperty(Element.prototype, "shadow", {
|
|
10732
10732
|
get: function () {
|
|
10733
|
-
|
|
10733
|
+
let currentElement = this;
|
|
10734
10734
|
return {
|
|
10735
10735
|
closest: function (selector) {
|
|
10736
|
-
let currentElement = self;
|
|
10736
|
+
//let currentElement = self;
|
|
10737
10737
|
|
|
10738
10738
|
while (currentElement) {
|
|
10739
10739
|
|
|
10740
|
-
console.log(currentElement);
|
|
10740
|
+
//console.log(currentElement);
|
|
10741
10741
|
if (currentElement.matches(selector)) return currentElement;
|
|
10742
10742
|
|
|
10743
10743
|
// ✅ Shadow Root를 가지고 있는 경우 내부에서 탐색
|
|
@@ -18193,11 +18193,11 @@ class ngFilterButton extends HTMLElement
|
|
|
18193
18193
|
//console.log(panel.isHidden);
|
|
18194
18194
|
|
|
18195
18195
|
//panel.style.display = 'flex' : 'none';
|
|
18196
|
-
console.log(panel.isHidden, panel.col, this.closest('th,td').dataset.col);
|
|
18196
|
+
//console.log(panel.isHidden, panel.col, this.closest('th,td').dataset.col);
|
|
18197
18197
|
|
|
18198
18198
|
if (panel.col === this.closest('th,td').dataset.col) {
|
|
18199
|
-
panel.col = null;
|
|
18200
|
-
panel.style.display = 'none';
|
|
18199
|
+
//panel.col = null;
|
|
18200
|
+
//panel.style.display = 'none';
|
|
18201
18201
|
panel.close();
|
|
18202
18202
|
}
|
|
18203
18203
|
else {
|
|
@@ -18435,8 +18435,6 @@ class ngFilterPanel extends HTMLElement
|
|
|
18435
18435
|
|
|
18436
18436
|
open = (owner, filterButton) => {
|
|
18437
18437
|
|
|
18438
|
-
|
|
18439
|
-
|
|
18440
18438
|
var col = filterButton.closest('th,td').dataset.col;
|
|
18441
18439
|
this.col = col;
|
|
18442
18440
|
|
|
@@ -18450,113 +18448,12 @@ class ngFilterPanel extends HTMLElement
|
|
|
18450
18448
|
col : col,
|
|
18451
18449
|
};
|
|
18452
18450
|
|
|
18453
|
-
|
|
18451
|
+
this.style.display = 'flex';
|
|
18452
|
+
//$(this).show();
|
|
18454
18453
|
|
|
18455
18454
|
ninegrid.j.querySelectorAll(this).addClass("loading");
|
|
18456
18455
|
|
|
18457
|
-
|
|
18458
|
-
|
|
18459
|
-
setTimeout(() => {
|
|
18460
|
-
|
|
18461
|
-
var ds = [];
|
|
18462
|
-
var colnms = [];
|
|
18463
|
-
$(owner.template).find(`[data-col=${col}]`).each((index,el) => {
|
|
18464
|
-
if (el.dataset.bind) colnms.push(el.dataset.bind);
|
|
18465
|
-
});
|
|
18466
|
-
|
|
18467
|
-
var data = owner.data.getValidDataNF();
|
|
18468
|
-
$("ng-filter-button", owner.body).each((index,el) => {
|
|
18469
|
-
|
|
18470
|
-
if (el.closest('th,td').dataset.col == col || !el.filterData) return true;
|
|
18471
|
-
/**
|
|
18472
|
-
el.filterData.forEach(o => {
|
|
18473
|
-
var idx = owner.fields.indexOf(o.colnm);
|
|
18474
|
-
|
|
18475
|
-
if (idx >= 0) {
|
|
18476
|
-
data = data.filter(m => { return o.data.nineBinarySearch(m.v[idx] || '') >= 0; });
|
|
18477
|
-
}
|
|
18478
|
-
});
|
|
18479
|
-
*/
|
|
18480
|
-
|
|
18481
|
-
console.log(el.filterData, el.colnms, el.dataset.bind);
|
|
18482
|
-
|
|
18483
|
-
el.colnms.forEach(colnm => {
|
|
18484
|
-
var idx = owner.fields.indexOf(colnm);
|
|
18485
|
-
|
|
18486
|
-
console.log(idx);
|
|
18487
|
-
|
|
18488
|
-
if (idx >= 0) {
|
|
18489
|
-
data = data.filter(m => { return el.filterData.nineBinarySearch(m.v[idx] || '') >= 0; });
|
|
18490
|
-
}
|
|
18491
|
-
});
|
|
18492
|
-
|
|
18493
|
-
//data = data.filter(rowData => { return el.filterData.findIndex(item => (item.DATA || '') == (rowData[item.COLNM] || '') ) >= 0; });
|
|
18494
|
-
});
|
|
18495
|
-
|
|
18496
|
-
|
|
18497
|
-
colnms = [...new Set(colnms)];
|
|
18498
|
-
colnms.forEach((colnm,i) => {
|
|
18499
|
-
|
|
18500
|
-
ds.push({
|
|
18501
|
-
LVL: 1,
|
|
18502
|
-
CHK: 'N',
|
|
18503
|
-
DATA2: '<span class="group">' + $(filterButton).closest('th,td').text() + (colnms.length > 1 ? ` #${i+1} (${colnm})` : '') + '</span>',
|
|
18504
|
-
});
|
|
18505
|
-
|
|
18506
|
-
var filterData = [];
|
|
18507
|
-
if (filterButton.filterData) {
|
|
18508
|
-
var idx = filterButton.filterData.findIndex(item => item.colnm == colnm);
|
|
18509
|
-
if (idx >= 0) {
|
|
18510
|
-
filterData = filterButton.filterData[idx].data;
|
|
18511
|
-
}
|
|
18512
|
-
}
|
|
18513
|
-
|
|
18514
|
-
/**
|
|
18515
|
-
var cell = $(`[data-col=${col}][data-bind=${colnm}]`, owner.template);
|
|
18516
|
-
var expr = cell.attr("data-expr");
|
|
18517
|
-
var exprFunc = (expr) ? owner.exprFunction(expr) : null;
|
|
18518
|
-
*/
|
|
18519
|
-
|
|
18520
|
-
const cell = ninegrid.j.querySelectorAll(`[data-col="${col}"][data-bind="${colnm}"]`, owner.tmpl).elem();
|
|
18521
|
-
const expr = cell.getAttribute("data-expr");
|
|
18522
|
-
const exprFunc = (expr) ? owner.exprFunction(expr) : null;
|
|
18523
|
-
|
|
18524
|
-
var data2 = [];
|
|
18525
|
-
for (var rowData of data) {
|
|
18526
|
-
var idx = owner.fields.indexOf(colnm);
|
|
18527
|
-
|
|
18528
|
-
if (expr) {
|
|
18529
|
-
var o = owner.data.conv(rowData);
|
|
18530
|
-
data2.push({v:o[colnm],v2:exprFunc(o, rowData.__ng.rowidx, owner.data)});
|
|
18531
|
-
}
|
|
18532
|
-
else {
|
|
18533
|
-
data2.push({v:rowData.v[idx],v2:rowData.v[idx]});
|
|
18534
|
-
}
|
|
18535
|
-
}
|
|
18536
|
-
|
|
18537
|
-
[...new Set(data2.sort( (a,b) => { return (a.v2||'') > (b.v2||'') ? 1 : ((a.v2||'') < (b.v2||'') ? -1 : 0); } ).map((m) => JSON.stringify(m)))].map((m) => JSON.parse(m)).forEach(o => {
|
|
18538
|
-
ds.push({
|
|
18539
|
-
LVL : 2,
|
|
18540
|
-
DATA : o.v,
|
|
18541
|
-
DATA2 : o.v2 || ` <span class="empty">(empty)</span> ${o.v}`,
|
|
18542
|
-
COLNM : colnm,
|
|
18543
|
-
CHK : filterData.length == 0 || filterData.nineBinarySearch(o.v || '') >= 0 ? "Y" : "N",
|
|
18544
|
-
});
|
|
18545
|
-
});
|
|
18546
|
-
});
|
|
18547
|
-
|
|
18548
|
-
var grd = this.shadowRoot.querySelector("nine-grid");
|
|
18549
|
-
//grd.dataSource = ds;
|
|
18550
|
-
grd.fields.add(["DATA","DATA2","COLNM"]);
|
|
18551
|
-
|
|
18552
|
-
grd.data.set(ds);
|
|
18553
|
-
|
|
18554
|
-
$(this.shadowRoot).find("input[type=checkbox]").prop("checked", grd.data.getValidData().filter(item => { return item.LVL == 2 && item.CHK != "Y"; }).length == 0 ? true : false);
|
|
18555
|
-
|
|
18556
|
-
this.shadowRoot.querySelector("input").focus();
|
|
18557
|
-
|
|
18558
|
-
ninegrid.j.querySelectorAll(this).removeClass("loading");
|
|
18559
|
-
});
|
|
18456
|
+
return;
|
|
18560
18457
|
};
|
|
18561
18458
|
}
|
|
18562
18459
|
|
package/dist/bundle.esm.js
CHANGED
|
@@ -10728,14 +10728,14 @@ class ninegrid {
|
|
|
10728
10728
|
if (!("shadow" in Element.prototype)) {
|
|
10729
10729
|
Object.defineProperty(Element.prototype, "shadow", {
|
|
10730
10730
|
get: function () {
|
|
10731
|
-
|
|
10731
|
+
let currentElement = this;
|
|
10732
10732
|
return {
|
|
10733
10733
|
closest: function (selector) {
|
|
10734
|
-
let currentElement = self;
|
|
10734
|
+
//let currentElement = self;
|
|
10735
10735
|
|
|
10736
10736
|
while (currentElement) {
|
|
10737
10737
|
|
|
10738
|
-
console.log(currentElement);
|
|
10738
|
+
//console.log(currentElement);
|
|
10739
10739
|
if (currentElement.matches(selector)) return currentElement;
|
|
10740
10740
|
|
|
10741
10741
|
// ✅ Shadow Root를 가지고 있는 경우 내부에서 탐색
|
|
@@ -18191,11 +18191,11 @@ class ngFilterButton extends HTMLElement
|
|
|
18191
18191
|
//console.log(panel.isHidden);
|
|
18192
18192
|
|
|
18193
18193
|
//panel.style.display = 'flex' : 'none';
|
|
18194
|
-
console.log(panel.isHidden, panel.col, this.closest('th,td').dataset.col);
|
|
18194
|
+
//console.log(panel.isHidden, panel.col, this.closest('th,td').dataset.col);
|
|
18195
18195
|
|
|
18196
18196
|
if (panel.col === this.closest('th,td').dataset.col) {
|
|
18197
|
-
panel.col = null;
|
|
18198
|
-
panel.style.display = 'none';
|
|
18197
|
+
//panel.col = null;
|
|
18198
|
+
//panel.style.display = 'none';
|
|
18199
18199
|
panel.close();
|
|
18200
18200
|
}
|
|
18201
18201
|
else {
|
|
@@ -18433,8 +18433,6 @@ class ngFilterPanel extends HTMLElement
|
|
|
18433
18433
|
|
|
18434
18434
|
open = (owner, filterButton) => {
|
|
18435
18435
|
|
|
18436
|
-
|
|
18437
|
-
|
|
18438
18436
|
var col = filterButton.closest('th,td').dataset.col;
|
|
18439
18437
|
this.col = col;
|
|
18440
18438
|
|
|
@@ -18448,113 +18446,12 @@ class ngFilterPanel extends HTMLElement
|
|
|
18448
18446
|
col : col,
|
|
18449
18447
|
};
|
|
18450
18448
|
|
|
18451
|
-
|
|
18449
|
+
this.style.display = 'flex';
|
|
18450
|
+
//$(this).show();
|
|
18452
18451
|
|
|
18453
18452
|
ninegrid.j.querySelectorAll(this).addClass("loading");
|
|
18454
18453
|
|
|
18455
|
-
|
|
18456
|
-
|
|
18457
|
-
setTimeout(() => {
|
|
18458
|
-
|
|
18459
|
-
var ds = [];
|
|
18460
|
-
var colnms = [];
|
|
18461
|
-
$(owner.template).find(`[data-col=${col}]`).each((index,el) => {
|
|
18462
|
-
if (el.dataset.bind) colnms.push(el.dataset.bind);
|
|
18463
|
-
});
|
|
18464
|
-
|
|
18465
|
-
var data = owner.data.getValidDataNF();
|
|
18466
|
-
$("ng-filter-button", owner.body).each((index,el) => {
|
|
18467
|
-
|
|
18468
|
-
if (el.closest('th,td').dataset.col == col || !el.filterData) return true;
|
|
18469
|
-
/**
|
|
18470
|
-
el.filterData.forEach(o => {
|
|
18471
|
-
var idx = owner.fields.indexOf(o.colnm);
|
|
18472
|
-
|
|
18473
|
-
if (idx >= 0) {
|
|
18474
|
-
data = data.filter(m => { return o.data.nineBinarySearch(m.v[idx] || '') >= 0; });
|
|
18475
|
-
}
|
|
18476
|
-
});
|
|
18477
|
-
*/
|
|
18478
|
-
|
|
18479
|
-
console.log(el.filterData, el.colnms, el.dataset.bind);
|
|
18480
|
-
|
|
18481
|
-
el.colnms.forEach(colnm => {
|
|
18482
|
-
var idx = owner.fields.indexOf(colnm);
|
|
18483
|
-
|
|
18484
|
-
console.log(idx);
|
|
18485
|
-
|
|
18486
|
-
if (idx >= 0) {
|
|
18487
|
-
data = data.filter(m => { return el.filterData.nineBinarySearch(m.v[idx] || '') >= 0; });
|
|
18488
|
-
}
|
|
18489
|
-
});
|
|
18490
|
-
|
|
18491
|
-
//data = data.filter(rowData => { return el.filterData.findIndex(item => (item.DATA || '') == (rowData[item.COLNM] || '') ) >= 0; });
|
|
18492
|
-
});
|
|
18493
|
-
|
|
18494
|
-
|
|
18495
|
-
colnms = [...new Set(colnms)];
|
|
18496
|
-
colnms.forEach((colnm,i) => {
|
|
18497
|
-
|
|
18498
|
-
ds.push({
|
|
18499
|
-
LVL: 1,
|
|
18500
|
-
CHK: 'N',
|
|
18501
|
-
DATA2: '<span class="group">' + $(filterButton).closest('th,td').text() + (colnms.length > 1 ? ` #${i+1} (${colnm})` : '') + '</span>',
|
|
18502
|
-
});
|
|
18503
|
-
|
|
18504
|
-
var filterData = [];
|
|
18505
|
-
if (filterButton.filterData) {
|
|
18506
|
-
var idx = filterButton.filterData.findIndex(item => item.colnm == colnm);
|
|
18507
|
-
if (idx >= 0) {
|
|
18508
|
-
filterData = filterButton.filterData[idx].data;
|
|
18509
|
-
}
|
|
18510
|
-
}
|
|
18511
|
-
|
|
18512
|
-
/**
|
|
18513
|
-
var cell = $(`[data-col=${col}][data-bind=${colnm}]`, owner.template);
|
|
18514
|
-
var expr = cell.attr("data-expr");
|
|
18515
|
-
var exprFunc = (expr) ? owner.exprFunction(expr) : null;
|
|
18516
|
-
*/
|
|
18517
|
-
|
|
18518
|
-
const cell = ninegrid.j.querySelectorAll(`[data-col="${col}"][data-bind="${colnm}"]`, owner.tmpl).elem();
|
|
18519
|
-
const expr = cell.getAttribute("data-expr");
|
|
18520
|
-
const exprFunc = (expr) ? owner.exprFunction(expr) : null;
|
|
18521
|
-
|
|
18522
|
-
var data2 = [];
|
|
18523
|
-
for (var rowData of data) {
|
|
18524
|
-
var idx = owner.fields.indexOf(colnm);
|
|
18525
|
-
|
|
18526
|
-
if (expr) {
|
|
18527
|
-
var o = owner.data.conv(rowData);
|
|
18528
|
-
data2.push({v:o[colnm],v2:exprFunc(o, rowData.__ng.rowidx, owner.data)});
|
|
18529
|
-
}
|
|
18530
|
-
else {
|
|
18531
|
-
data2.push({v:rowData.v[idx],v2:rowData.v[idx]});
|
|
18532
|
-
}
|
|
18533
|
-
}
|
|
18534
|
-
|
|
18535
|
-
[...new Set(data2.sort( (a,b) => { return (a.v2||'') > (b.v2||'') ? 1 : ((a.v2||'') < (b.v2||'') ? -1 : 0); } ).map((m) => JSON.stringify(m)))].map((m) => JSON.parse(m)).forEach(o => {
|
|
18536
|
-
ds.push({
|
|
18537
|
-
LVL : 2,
|
|
18538
|
-
DATA : o.v,
|
|
18539
|
-
DATA2 : o.v2 || ` <span class="empty">(empty)</span> ${o.v}`,
|
|
18540
|
-
COLNM : colnm,
|
|
18541
|
-
CHK : filterData.length == 0 || filterData.nineBinarySearch(o.v || '') >= 0 ? "Y" : "N",
|
|
18542
|
-
});
|
|
18543
|
-
});
|
|
18544
|
-
});
|
|
18545
|
-
|
|
18546
|
-
var grd = this.shadowRoot.querySelector("nine-grid");
|
|
18547
|
-
//grd.dataSource = ds;
|
|
18548
|
-
grd.fields.add(["DATA","DATA2","COLNM"]);
|
|
18549
|
-
|
|
18550
|
-
grd.data.set(ds);
|
|
18551
|
-
|
|
18552
|
-
$(this.shadowRoot).find("input[type=checkbox]").prop("checked", grd.data.getValidData().filter(item => { return item.LVL == 2 && item.CHK != "Y"; }).length == 0 ? true : false);
|
|
18553
|
-
|
|
18554
|
-
this.shadowRoot.querySelector("input").focus();
|
|
18555
|
-
|
|
18556
|
-
ninegrid.j.querySelectorAll(this).removeClass("loading");
|
|
18557
|
-
});
|
|
18454
|
+
return;
|
|
18558
18455
|
};
|
|
18559
18456
|
}
|
|
18560
18457
|
|
package/dist/etc/ngFiltering.js
CHANGED
|
@@ -286,11 +286,11 @@ class ngFilterButton extends HTMLElement
|
|
|
286
286
|
//console.log(panel.isHidden);
|
|
287
287
|
|
|
288
288
|
//panel.style.display = 'flex' : 'none';
|
|
289
|
-
console.log(panel.isHidden, panel.col, this.closest('th,td').dataset.col);
|
|
289
|
+
//console.log(panel.isHidden, panel.col, this.closest('th,td').dataset.col);
|
|
290
290
|
|
|
291
291
|
if (panel.col === this.closest('th,td').dataset.col) {
|
|
292
|
-
panel.col = null;
|
|
293
|
-
panel.style.display = 'none';
|
|
292
|
+
//panel.col = null;
|
|
293
|
+
//panel.style.display = 'none';
|
|
294
294
|
panel.close();
|
|
295
295
|
}
|
|
296
296
|
else {
|
|
@@ -530,8 +530,6 @@ class ngFilterPanel extends HTMLElement
|
|
|
530
530
|
|
|
531
531
|
open = (owner, filterButton) => {
|
|
532
532
|
|
|
533
|
-
|
|
534
|
-
|
|
535
533
|
var col = filterButton.closest('th,td').dataset.col;
|
|
536
534
|
this.col = col;
|
|
537
535
|
|
|
@@ -548,10 +546,13 @@ class ngFilterPanel extends HTMLElement
|
|
|
548
546
|
col : col,
|
|
549
547
|
}
|
|
550
548
|
|
|
551
|
-
|
|
549
|
+
this.style.display = 'flex';
|
|
550
|
+
//$(this).show();
|
|
552
551
|
|
|
553
552
|
ninegrid.j.querySelectorAll(this).addClass("loading");
|
|
554
553
|
|
|
554
|
+
return;
|
|
555
|
+
|
|
555
556
|
$(this.shadowRoot).find("input[type=text]").val("");
|
|
556
557
|
|
|
557
558
|
setTimeout(() => {
|
package/dist/utils/ninegrid.js
CHANGED
|
@@ -24,14 +24,14 @@ export class ninegrid {
|
|
|
24
24
|
if (!("shadow" in Element.prototype)) {
|
|
25
25
|
Object.defineProperty(Element.prototype, "shadow", {
|
|
26
26
|
get: function () {
|
|
27
|
-
|
|
27
|
+
let currentElement = this;
|
|
28
28
|
return {
|
|
29
29
|
closest: function (selector) {
|
|
30
|
-
let currentElement = self;
|
|
30
|
+
//let currentElement = self;
|
|
31
31
|
|
|
32
32
|
while (currentElement) {
|
|
33
33
|
|
|
34
|
-
console.log(currentElement);
|
|
34
|
+
//console.log(currentElement);
|
|
35
35
|
if (currentElement.matches(selector)) return currentElement;
|
|
36
36
|
|
|
37
37
|
// ✅ Shadow Root를 가지고 있는 경우 내부에서 탐색
|
package/package.json
CHANGED
package/src/etc/ngFiltering.js
CHANGED
|
@@ -286,11 +286,11 @@ class ngFilterButton extends HTMLElement
|
|
|
286
286
|
//console.log(panel.isHidden);
|
|
287
287
|
|
|
288
288
|
//panel.style.display = 'flex' : 'none';
|
|
289
|
-
console.log(panel.isHidden, panel.col, this.closest('th,td').dataset.col);
|
|
289
|
+
//console.log(panel.isHidden, panel.col, this.closest('th,td').dataset.col);
|
|
290
290
|
|
|
291
291
|
if (panel.col === this.closest('th,td').dataset.col) {
|
|
292
|
-
panel.col = null;
|
|
293
|
-
panel.style.display = 'none';
|
|
292
|
+
//panel.col = null;
|
|
293
|
+
//panel.style.display = 'none';
|
|
294
294
|
panel.close();
|
|
295
295
|
}
|
|
296
296
|
else {
|
|
@@ -530,8 +530,6 @@ class ngFilterPanel extends HTMLElement
|
|
|
530
530
|
|
|
531
531
|
open = (owner, filterButton) => {
|
|
532
532
|
|
|
533
|
-
|
|
534
|
-
|
|
535
533
|
var col = filterButton.closest('th,td').dataset.col;
|
|
536
534
|
this.col = col;
|
|
537
535
|
|
|
@@ -548,10 +546,13 @@ class ngFilterPanel extends HTMLElement
|
|
|
548
546
|
col : col,
|
|
549
547
|
}
|
|
550
548
|
|
|
551
|
-
|
|
549
|
+
this.style.display = 'flex';
|
|
550
|
+
//$(this).show();
|
|
552
551
|
|
|
553
552
|
ninegrid.j.querySelectorAll(this).addClass("loading");
|
|
554
553
|
|
|
554
|
+
return;
|
|
555
|
+
|
|
555
556
|
$(this.shadowRoot).find("input[type=text]").val("");
|
|
556
557
|
|
|
557
558
|
setTimeout(() => {
|
package/src/utils/ninegrid.js
CHANGED
|
@@ -24,14 +24,14 @@ export class ninegrid {
|
|
|
24
24
|
if (!("shadow" in Element.prototype)) {
|
|
25
25
|
Object.defineProperty(Element.prototype, "shadow", {
|
|
26
26
|
get: function () {
|
|
27
|
-
|
|
27
|
+
let currentElement = this;
|
|
28
28
|
return {
|
|
29
29
|
closest: function (selector) {
|
|
30
|
-
let currentElement = self;
|
|
30
|
+
//let currentElement = self;
|
|
31
31
|
|
|
32
32
|
while (currentElement) {
|
|
33
33
|
|
|
34
|
-
console.log(currentElement);
|
|
34
|
+
//console.log(currentElement);
|
|
35
35
|
if (currentElement.matches(selector)) return currentElement;
|
|
36
36
|
|
|
37
37
|
// ✅ Shadow Root를 가지고 있는 경우 내부에서 탐색
|