목차
VBA에서 `ListObject`는 Excel 워크시트에서 테이블을 조작할 때 사용되는 객체입니다. Excel 테이블은 데이터를 구조화하고 관리하기 위한 강력한 도구이며, `ListObject`를 통해 이러한 테이블을 프로그래밍 방식으로 제어할 수 있습니다. 주요 용도는 다음과 같습니다:
1. **테이블 생성 및 삭제**: 새로운 테이블을 만들거나 기존 테이블을 삭제할 수 있습니다.
2. **데이터 추가 및 제거**: 테이블에 새로운 행이나 열을 추가하거나 기존 데이터를 제거할 수 있습니다.
3. **테이블 속성 설정**: 테이블의 이름, 스타일, 필터링 및 정렬 옵션 등을 설정할 수 있습니다.
4. **데이터 조작**: 테이블의 특정 셀이나 범위의 데이터를 읽고 쓸 수 있습니다.
5. **테이블 내 검색 및 필터링**: 특정 조건에 맞는 데이터를 검색하거나 필터링할 수 있습니다.
예를 들어, VBA에서 `ListObject`를 사용하여 테이블을 생성하고 데이터를 추가하는 코드는 다음과 같습니다:
```vba
Sub CreateAndManipulateTable()
Dim ws As Worksheet
Dim tbl As ListObject
Dim tblRange As Range
' 워크시트 참조 설정
Set ws = ThisWorkbook.Sheets("Sheet1")
' 테이블 범위 설정
Set tblRange = ws.Range("A1:C5")
' 새로운 테이블 생성
Set tbl = ws.ListObjects.Add(xlSrcRange, tblRange, , xlYes)
' 테이블 이름 설정
tbl.Name = "MyTable"
' 테이블 스타일 설정
tbl.TableStyle = "TableStyleMedium9"
' 데이터 추가 (테이블의 마지막 행에 추가)
tbl.ListRows.Add
tbl.ListRows(tbl.ListRows.Count).Range(1, 1).Value = "New Data"
End Sub
```
이 코드는 "Sheet1" 워크시트에서 A1:C5 범위를 테이블로 변환하고, 테이블 스타일과 이름을 설정한 다음, 새로운 데이터를 추가하는 예제입니다. `ListObject`는 이와 같이 테이블 관련 작업을 자동화하고 쉽게 관리할 수 있도록 도와줍니다.
↓ ADD의 사용법 ↓
ADD 사용하는법
※ expression.Add (SourceType, Source, LinkSource, XlListObjectHasHeaders, Destination, TableStyleName)
Name | Required/Optional | Data type | Description (번역) |
SourceType | Optional | XlListObjectSourceType | 쿼리에 대한 소스 유형을 나타냅니다. |
Source | Optional | Variant | - SourceType이 xlSrcRange일 때: 데이터 소스를 나타내는 Range 객체입니다. 생략하면, Source는 범위 감지 코드에 의해 반환된 범위를 기본값으로 합니다. - SourceType이 xlSrcExternal일 때: 소스에 연결하는 문자열 배열을 지정하며, 다음 요소를 포함합니다: 0 - SharePoint 사이트의 URL 1 - ListName 2 - ViewGUID - SourceType이 xlSrcQuery일 때: ODBC 또는 OLEDB 연결 문자열을 허용합니다 (이는 xlSrcExternal과도 함께 사용됩니다). - SourceType이 xlSrcModel일 때: WorkbookConnection 객체를 허용합니다 (예: TableObject 참조). |
LinkSource | Optional | Boolean | 외부 데이터 소스가 ListObject에 연결될지를 나타냅니다. SourceType이 xlSrcExternal인 경우 기본값은 True입니다. SourceType이 xlSrcRange인 경우 유효하지 않으며 생략하면 오류가 반환됩니다. |
XlListObjectHasHeaders | Optional | Variant | 가져온 데이터에 열 레이블이 포함되어 있는지 여부를 나타내는 XlYesNoGuess 상수입니다. Source에 헤더가 포함되지 않으면 Excel은 자동으로 헤더를 생성합니다. 기본값: xlGuess. |
Destination | Optional | Variant | 새로운 ListObject의 왼쪽 위 모퉁이에 대한 대상 범위를 지정하는 Range 객체입니다. Range 객체가 둘 이상의 셀을 참조하면 오류가 발생합니다. - Destination 인수는 SourceType이 xlSrcExternal로 설정된 경우 지정되어야 합니다. SourceType이 xlSrcRange로 설정된 경우 Destination 인수는 무시됩니다. - 대상 범위는 ListObjects 컬렉션이 포함된 워크시트에 있어야 합니다. 새 열은 새 목록을 맞추기 위해 Destination에 삽입됩니다. 따라서 기존 데이터는 덮어쓰이지 않습니다. |
TableStyleName | Optional | String | TableStyle의 이름입니다. 예: "TableStyleLight1". |
listobject와 listobjects의 차이점은 뭘까? 두개다 비슷한거아니야?
`ListObject`와 `ListObjects`는 VBA에서 서로 다른 목적을 가진 두 가지 객체입니다. 둘 다 Excel 테이블과 관련되어 있지만, 사용되는 맥락과 역할이 다릅니다.
### `ListObject`
- **단일 테이블**을 나타냅니다.
- 워크시트에서 특정 테이블을 조작할 때 사용됩니다.
- 테이블의 속성, 데이터, 행, 열 등을 제어할 수 있습니다.
예제:
```vba
Dim ws As Worksheet
Dim tbl As ListObject
Set ws = ThisWorkbook.Sheets("Sheet1")
Set tbl = ws.ListObjects("MyTable") ' "MyTable"이라는 이름의 테이블을 참조
' 테이블의 첫 번째 셀 값을 변경
tbl.DataBodyRange.Cells(1, 1).Value = "New Value"
```
### `ListObjects`
- **테이블의 컬렉션**을 나타냅니다.
- 하나의 워크시트에서 모든 테이블을 관리할 때 사용됩니다.
- 특정 워크시트 내에 있는 여러 테이블을 반복하거나 참조할 수 있습니다.
예제:
```vba
Dim ws As Worksheet
Dim tbls As ListObjects
Dim tbl As ListObject
Set ws = ThisWorkbook.Sheets("Sheet1")
Set tbls = ws.ListObjects ' 워크시트의 모든 테이블을 참조
' 첫 번째 테이블에 접근하여 첫 번째 셀 값을 변경
Set tbl = tbls(1)
tbl.DataBodyRange.Cells(1, 1).Value = "New Value"
' 모든 테이블 이름 출력
Dim tbl As ListObject
For Each tbl In tbls
Debug.Print tbl.Name
Next tbl
```
### 주요 차이점
- `ListObject`는 **개별 테이블**을 가리키며, 해당 테이블의 속성이나 데이터를 직접 조작하는 데 사용됩니다.
- `ListObjects`는 **여러 테이블의 집합**을 가리키며, 워크시트에 존재하는 모든 테이블에 대한 액세스를 제공하고 이를 반복(iterate)할 수 있도록 합니다.
따라서, 단일 테이블을 조작하려면 `ListObject`를 사용하고, 워크시트 내의 여러 테이블을 처리하려면 `ListObjects`를 사용합니다.
↓ 여러개의 데이터를 조작하는 경우란 뭘까? ↓
네, 여러 개의 테이블을 동시에 조작해야 하는 경우가 있을 수 있습니다. 특히 대규모 데이터 분석, 복잡한 보고서 작성, 데이터 병합 및 동기화 등의 상황에서는 여러 테이블을 동시에 다루는 것이 필요할 수 있습니다. 다음은 여러 테이블을 동시에 조작해야 하는 몇 가지 사례입니다:
### 1. 데이터 병합 및 통합
여러 워크시트나 워크북에 분산된 데이터를 하나의 테이블로 통합하는 경우입니다. 예를 들어, 월별 판매 데이터를 하나의 연간 보고서로 통합할 때 각 월별 데이터를 각각의 테이블로 관리하고 이를 하나로 병합할 수 있습니다.
### 2. 동기화 및 업데이트
서로 다른 테이블 간의 데이터 동기화가 필요한 경우입니다. 예를 들어, 재고 관리 시스템에서 물리적 창고의 재고 테이블과 온라인 주문 시스템의 재고 테이블을 동기화해야 할 수 있습니다.
### 3. 복잡한 보고서 작성
다양한 소스의 데이터를 사용하여 종합적인 보고서를 작성하는 경우입니다. 예를 들어, 부서별 성과 데이터를 각각의 테이블로 관리하고 이를 하나의 종합 보고서로 작성할 수 있습니다.
### 4. 데이터 변환 및 처리
여러 테이블에 분산된 데이터를 특정 형식으로 변환하거나 특정 처리를 해야 하는 경우입니다. 예를 들어, 각 지역별 판매 데이터를 요약하여 국가별 총 판매 데이터를 생성할 수 있습니다.
### 여러 테이블을 동시에 조작하는 VBA 예제
아래는 여러 테이블을 동시에 조작하는 간단한 VBA 코드 예제입니다. 이 예제는 여러 워크시트에 있는 테이블에서 데이터를 읽어와 하나의 요약 테이블로 병합하는 방법을 보여줍니다.
```vba
Sub MergeTables()
Dim ws As Worksheet
Dim summaryWs As Worksheet
Dim tbl As ListObject
Dim summaryTbl As ListObject
Dim dataArr As Variant
Dim lastRow As Long
Dim i As Long, j As Long
' 요약 테이블을 만들 워크시트 설정
Set summaryWs = ThisWorkbook.Sheets("Summary")
lastRow = 1
' 모든 워크시트를 순회
For Each ws In ThisWorkbook.Worksheets
' 요약 워크시트는 제외
If ws.Name <> summaryWs.Name Then
' 워크시트 내의 모든 테이블을 순회
For Each tbl In ws.ListObjects
' 테이블 데이터를 배열로 가져오기
dataArr = tbl.DataBodyRange.Value
' 요약 테이블에 데이터 추가
For i = 1 To UBound(dataArr, 1)
For j = 1 To UBound(dataArr, 2)
summaryWs.Cells(lastRow + i, j).Value = dataArr(i, j)
Next j
Next i
' 다음 추가 위치 계산
lastRow = lastRow + UBound(dataArr, 1)
Next tbl
End If
Next ws
' 요약 테이블 설정
Set summaryTbl = summaryWs.ListObjects.Add(xlSrcRange, summaryWs.Range("A1").CurrentRegion, , xlYes)
summaryTbl.Name = "SummaryTable"
summaryTbl.TableStyle = "TableStyleMedium9"
End Sub
```
### 주요 포인트
1. **모든 워크시트 순회**: `For Each ws In ThisWorkbook.Worksheets`를 사용하여 모든 워크시트를 반복합니다.
2. **모든 테이블 순회**: 각 워크시트 내의 모든 테이블을 `For Each tbl In ws.ListObjects`를 사용하여 반복합니다.
3. **데이터 읽기 및 추가**: 각 테이블의 데이터를 배열로 읽어와 요약 워크시트에 추가합니다.
4. **요약 테이블 생성**: 모든 데이터를 추가한 후 요약 테이블을 생성합니다.
이와 같은 방법을 사용하면 여러 테이블을 동시에 조작할 수 있으며, 데이터 병합, 동기화, 변환 등의 작업을 효율적으로 수행할 수 있습니다.
특정워크시트에 있는 하나의 테이블을 참조하려면?
특정 워크시트에 있는 하나의 테이블을 참조하려면 `ListObjects` 컬렉션을 사용하여 해당 테이블을 찾아야 합니다. `ListObjects` 컬렉션을 통해 특정 테이블을 참조할 수 있습니다.
### 특정 테이블을 참조하는 방법
1. **테이블 이름으로 참조**: 테이블의 이름을 알고 있는 경우, `ListObjects` 컬렉션의 이름을 사용하여 테이블을 참조할 수 있습니다.
2. **테이블 인덱스로 참조**: 워크시트에서 테이블의 인덱스를 알고 있는 경우, `ListObjects` 컬렉션의 인덱스를 사용하여 테이블을 참조할 수 있습니다.
### 예제 코드
#### 테이블 이름으로 참조
```vba
Sub ReferTableByName()
Dim ws As Worksheet
Dim tbl As ListObject
' 워크시트 참조 설정
Set ws = ThisWorkbook.Sheets("Sheet1")
' "MyTable"이라는 이름의 테이블 참조
Set tbl = ws.ListObjects("MyTable")
' 테이블의 첫 번째 셀 값을 변경
tbl.DataBodyRange.Cells(1, 1).Value = "New Value"
End Sub
```
#### 테이블 인덱스로 참조
```vba
Sub ReferTableByIndex()
Dim ws As Worksheet
Dim tbl As ListObject
' 워크시트 참조 설정
Set ws = ThisWorkbook.Sheets("Sheet1")
' 첫 번째 테이블 참조 (인덱스는 1부터 시작)
Set tbl = ws.ListObjects(1)
' 테이블의 첫 번째 셀 값을 변경
tbl.DataBodyRange.Cells(1, 1).Value = "New Value"
End Sub
```
### 참고 사항
- 테이블 이름을 사용하는 것이 더 안전합니다. 인덱스는 테이블의 추가/삭제에 따라 변할 수 있지만, 이름은 변경되지 않기 때문입니다.
- 테이블이 존재하는지 확인하는 것이 좋습니다. 테이블 이름을 잘못 입력하거나 인덱스가 범위를 벗어날 경우 오류가 발생할 수 있습니다.
#### 테이블 존재 여부 확인
```vba
Sub SafeReferTableByName()
Dim ws As Worksheet
Dim tbl As ListObject
Dim tableName As String
Dim tblExists As Boolean
Dim tblIndex As Long
tableName = "MyTable"
tblExists = False
tblIndex = 0
' 워크시트 참조 설정
Set ws = ThisWorkbook.Sheets("Sheet1")
' 테이블 존재 여부 확인
On Error Resume Next
tblIndex = ws.ListObjects(tableName).Index
On Error GoTo 0
If tblIndex > 0 Then
tblExists = True
Set tbl = ws.ListObjects(tableName)
End If
If tblExists Then
' 테이블이 존재하면 첫 번째 셀 값을 변경
tbl.DataBodyRange.Cells(1, 1).Value = "New Value"
Else
MsgBox "테이블이 존재하지 않습니다."
End If
End Sub
```
이 코드에서는 테이블이 존재하는지 확인하고, 존재하는 경우에만 테이블을 참조합니다.
하나의 워크시트에 하나의 테이블만 있다면, listobject를 쓰는게 더 나은선택아니야?
네, 하나의 워크시트에 하나의 테이블만 있다면, `ListObject`를 직접 사용하는 것이 더 간단하고 효율적일 수 있습니다. 하지만, 기본적으로 `ListObject`는 워크시트의 테이블 컬렉션인 `ListObjects`를 통해 참조됩니다.
이 경우에도 `ListObjects` 컬렉션에서 첫 번째(그리고 유일한) 테이블을 참조할 수 있습니다. 아래 예제 코드를 참고하세요:
### 예제 코드: 하나의 테이블만 있는 워크시트에서 `ListObject` 참조하기
```vba
Sub ReferSingleTable()
Dim ws As Worksheet
Dim tbl As ListObject
' 워크시트 참조 설정
Set ws = ThisWorkbook.Sheets("Sheet1")
' 워크시트에 테이블이 하나만 있는 경우, 첫 번째 테이블을 참조
If ws.ListObjects.Count > 0 Then
Set tbl = ws.ListObjects(1)
' 테이블의 첫 번째 셀 값을 변경
tbl.DataBodyRange.Cells(1, 1).Value = "New Value"
Else
MsgBox "이 워크시트에는 테이블이 없습니다."
End If
End Sub
```
### 주요 포인트
1. `ws.ListObjects.Count`를 사용하여 워크시트에 테이블이 존재하는지 확인합니다.
2. 존재하는 경우, 첫 번째(그리고 유일한) 테이블을 `ws.ListObjects(1)`로 참조합니다.
3. 테이블의 데이터를 조작합니다.
이 방법은 워크시트에 하나의 테이블만 있을 때 매우 간단하고 직관적입니다. 그러나 워크시트에 테이블이 여러 개 존재할 가능성이 있는 경우, 이름이나 특정 기준을 통해 테이블을 참조하는 것이 더 안전합니다.
테이블 인덱스를 확인하는 방법?
테이블의 인덱스를 확인하거나 사용하기 위해서는 `ListObjects` 컬렉션을 통해 테이블을 참조하고, 각 테이블의 `Index` 속성을 사용할 수 있습니다. 각 테이블의 인덱스는 해당 테이블이 워크시트에 추가된 순서에 따라 정해집니다. 다음은 VBA 코드 예제입니다.
### 모든 테이블의 인덱스를 확인하는 코드
```vba
Sub ListTableIndexes()
Dim ws As Worksheet
Dim tbl As ListObject
Dim i As Integer
' 워크시트 참조 설정
Set ws = ThisWorkbook.Sheets("Sheet1")
' 모든 테이블의 인덱스와 이름을 출력
For i = 1 To ws.ListObjects.Count
Set tbl = ws.ListObjects(i)
Debug.Print "테이블 이름: " & tbl.Name & " 인덱스: " & tbl.Index
Next i
End Sub
```
### 특정 테이블의 인덱스를 확인하는 코드
```vba
Sub GetTableIndexByName()
Dim ws As Worksheet
Dim tbl As ListObject
Dim tableName As String
Dim tableIndex As Integer
' 테이블 이름 설정
tableName = "MyTable"
' 워크시트 참조 설정
Set ws = ThisWorkbook.Sheets("Sheet1")
' 특정 테이블의 인덱스 확인
On Error Resume Next
Set tbl = ws.ListObjects(tableName)
On Error GoTo 0
If Not tbl Is Nothing Then
tableIndex = tbl.Index
MsgBox "테이블 '" & tableName & "'의 인덱스는 " & tableIndex & "입니다."
Else
MsgBox "테이블 '" & tableName & "'을(를) 찾을 수 없습니다."
End If
End Sub
```
### 주요 포인트
1. **모든 테이블의 인덱스 확인**:
- `For i = 1 To ws.ListObjects.Count` 루프를 사용하여 워크시트의 모든 테이블을 반복합니다.
- 각 테이블의 `Index` 속성을 출력하거나 사용할 수 있습니다.
2. **특정 테이블의 인덱스 확인**:
- 테이블 이름을 알고 있는 경우, `ws.ListObjects(tableName)`을 사용하여 해당 테이블을 참조합니다.
- 테이블의 `Index` 속성을 사용하여 인덱스를 확인할 수 있습니다.
이 코드들을 통해 워크시트 내의 테이블 인덱스를 쉽게 확인할 수 있습니다. 테이블 인덱스를 확인하면, 테이블을 관리하거나 조작할 때 유용하게 사용할 수 있습니다.
테이블 조작은 Listobject랑 array 어떤게 더 나을까?
Excel 테이블(`ListObject`)을 직접 조작하는 것과 테이블을 배열로 변환하여 조작하는 것 사이에는 각각 장단점이 있습니다. 어떤 방법이 더 빠르고 쉬운지는 작업의 성격과 목적에 따라 다를 수 있습니다.
### `ListObject`를 통한 직접 조작의 장점
1. **직접 Excel에 반영**: 변경 사항이 즉시 워크시트에 반영되므로, 별도의 업데이트가 필요 없습니다.
2. **테이블 기능 활용**: 필터링, 정렬, 테이블 스타일 등 테이블의 고유 기능을 유지하고 활용할 수 있습니다.
3. **읽기 쉬운 코드**: VBA에서 테이블과 관련된 작업을 수행할 때 코드가 더 직관적일 수 있습니다.
### 배열을 통한 조작의 장점
1. **속도**: 큰 데이터 집합을 조작할 때 배열은 메모리에서 동작하므로 더 빠를 수 있습니다.
2. **임시 데이터 처리**: 중간 결과나 임시 데이터를 처리할 때 편리합니다.
3. **복잡한 연산**: 복잡한 데이터 조작을 할 때 코드가 간결하고 효율적일 수 있습니다.
### 배열을 사용하여 테이블 데이터를 조작하는 방법
1. **테이블을 배열로 변환**:
- 테이블 데이터를 배열로 읽어옵니다.
2. **배열 조작**:
- 배열 내에서 필요한 모든 조작을 수행합니다.
3. **배열을 테이블로 변환**:
- 수정된 배열 데이터를 다시 테이블에 반영합니다.
### 예제 코드
테이블을 배열로 변환하여 조작한 후 다시 테이블에 반영
```vba
Sub ManipulateTableWithArray()
Dim ws As Worksheet
Dim tbl As ListObject
Dim dataArr As Variant
Dim i As Long, j As Long
' 워크시트 및 테이블 참조 설정
Set ws = ThisWorkbook.Sheets("Sheet1")
Set tbl = ws.ListObjects("MyTable")
' 테이블 데이터를 배열로 읽어오기
dataArr = tbl.DataBodyRange.Value
' 배열 내 데이터 조작 예제 (모든 값을 2배로 만들기)
For i = 1 To UBound(dataArr, 1)
For j = 1 To UBound(dataArr, 2)
dataArr(i, j) = dataArr(i, j) * 2
Next j
Next i
' 배열 데이터를 다시 테이블로 반영
tbl.DataBodyRange.Value = dataArr
End Sub
```
### 주요 포인트
- `tbl.DataBodyRange.Value`를 사용하여 테이블 데이터를 배열로 읽어옵니다.
- 배열 내에서 필요한 데이터 조작을 수행합니다.
- 조작된 배열 데이터를 다시 테이블에 반영합니다.
### 결론
- **간단한 작업**: `ListObject`를 통해 직접 테이블을 조작하는 것이 더 쉽고 직관적일 수 있습니다.
- **복잡하거나 대량의 데이터 작업**: 배열을 사용하여 조작한 후 다시 테이블에 반영하는 것이 더 효율적일 수 있습니다.
작업의 성격에 따라 두 방법 중 적절한 방법을 선택하여 사용하는 것이 좋습니다.
결론적으로 listobject는 뭐야?
결론적으로, `ListObject`는 Excel VBA에서 **Excel 테이블을 나타내고 조작하기 위한 객체**입니다. `ListObject`를 사용하면 워크시트에서 테이블 형태로 구조화된 데이터를 쉽게 관리하고 조작할 수 있습니다. 이를 통해 테이블의 속성, 데이터, 스타일 등을 프로그래밍 방식으로 제어할 수 있습니다.
### 정의
**`ListObject`는 Excel 워크시트에서 테이블을 나타내고, 해당 테이블의 데이터와 속성을 프로그래밍 방식으로 조작할 수 있게 하는 VBA 객체입니다.**
### 주요 기능
- **테이블 생성 및 삭제**: 워크시트에 새로운 테이블을 생성하거나 기존 테이블을 삭제할 수 있습니다.
- **데이터 추가 및 제거**: 테이블에 행이나 열을 추가하거나 삭제할 수 있습니다.
- **데이터 읽기 및 쓰기**: 테이블의 데이터를 읽고 쓸 수 있습니다.
- **테이블 속성 설정**: 테이블의 이름, 스타일, 필터링, 정렬 등을 설정할 수 있습니다.
- **테이블 내 검색 및 필터링**: 특정 조건에 맞는 데이터를 검색하거나 필터링할 수 있습니다.
### 예제
다음은 `ListObject`를 사용하여 테이블을 생성하고 데이터를 추가하는 예제입니다.
```vba
Sub CreateAndManipulateTable()
Dim ws As Worksheet
Dim tbl As ListObject
Dim tblRange As Range
' 워크시트 참조 설정
Set ws = ThisWorkbook.Sheets("Sheet1")
' 테이블 범위 설정
Set tblRange = ws.Range("A1:C5")
' 새로운 테이블 생성
Set tbl = ws.ListObjects.Add(xlSrcRange, tblRange, , xlYes)
' 테이블 이름 설정
tbl.Name = "MyTable"
' 테이블 스타일 설정
tbl.TableStyle = "TableStyleMedium9"
' 데이터 추가 (테이블의 마지막 행에 추가)
tbl.ListRows.Add
tbl.ListRows(tbl.ListRows.Count).Range(1, 1).Value = "New Data"
End Sub
```
이 예제는 워크시트에 테이블을 생성하고, 테이블의 속성을 설정한 후 데이터를 추가하는 과정을 보여줍니다.
### 요약
`ListObject`는 Excel에서 테이블 데이터를 쉽게 관리하고 조작할 수 있도록 해주는 매우 유용한 도구입니다. 이를 통해 프로그래밍 방식으로 테이블과 상호 작용하여, 데이터 처리 작업을 자동화하고 효율성을 높일 수 있습니다.
'교육' 카테고리의 다른 글
부의 추월차선을 읽고, 부의 추월차선 요약, 부의추월차선 (0) | 2022.09.21 |
---|---|
코코넛 오일에대한 몇가지 사실 (0) | 2022.09.18 |
PLR이란 무엇입니까?, Private Label Rights에 대해 알아보자 (0) | 2022.09.12 |
댓글