객체지향 프로그래밍 과제 165 / 200
csv 파일을 읽고 구분자(,)를 기준으로 테이블을 생성 데이터베이스 트랜잭션 구현 (ex. SELECT(ROW, COLUMN), UPDATE, DELETE, INSERT, INNERJOIN, OUTERJOIN 등)
ex) books.csv
id,title,type,author_id,editor_id,translator_id
1,Time to Grow Up!,original,11,21,
2,Your Trip,translated,15,22,32
3,Lovely Love,original,14,24,
4,Dream Your Life,original,11,24,
5,Oranges,translated,12,25,31
6,Your Happy Life,translated,15,22,33
7,Applied AI,translated,13,23,34
8,My Last Book,original,11,28,
![](https://private-user-images.githubusercontent.com/104954561/293572618-720b2bbc-7d46-48d9-bae3-5b64aff90361.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg4NDU5MzQsIm5iZiI6MTczODg0NTYzNCwicGF0aCI6Ii8xMDQ5NTQ1NjEvMjkzNTcyNjE4LTcyMGIyYmJjLTdkNDYtNDhkOS1iYWUzLTViNjRhZmY5MDM2MS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwNlQxMjQwMzRaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT00ODViNjViMjUzMjdkYzdmMDE0NGE1MTliOTBlM2M0N2MyMTViY2Q4ZjhkY2JiMGJjNjNmNzA4OGY2OWM4YmZhJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.6yRlz6iKhwkJkCKj3W5rkH2pI2B2WwVre2MjWWvfyIc)
+ rsc --- 리소스 파일
└ authors.csv
└ books.csv
└ editors.csv
└ translators.csv
+ src
+ database
└ Column.java ------------- 컬럼 단위로 데이터를 관리한느 메소드를 정의한 interface
└ ColumnImpl.java ----------- Column.java를 구현한 클래스
└ Database.java ------------- DDL 위주 명령어를 구현한 class (ex. CREATE TABLE)
└ Joinable.java ------------- JOIN 관련 메소드가 정의된 interface
└ JoinableImpl.java ---------- Joinable.java를 구현한 클래스
└ Table.java ------------------ DML 위주 명령어를 구현한 class
+ test
└ Test.java ------------------ 테스트 코드
Database.showtables() : 데이터베이스의 테이블 목록 출력
Table.show() : 테이블의 데이터 출력
Table.describe() : 테이블 메타 데이터 출력
![스크린샷 2024-01-01 16 50 26](https://private-user-images.githubusercontent.com/104954561/293574502-9f74ddec-258e-4cd3-8d9c-14d021c3040c.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg4NDU5MzQsIm5iZiI6MTczODg0NTYzNCwicGF0aCI6Ii8xMDQ5NTQ1NjEvMjkzNTc0NTAyLTlmNzRkZGVjLTI1OGUtNGNkMy04ZDljLTE0ZDAyMWMzMDQwYy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwNlQxMjQwMzRaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1hZDIyNWZlZTllNDVmMDMxYjNiY2UyMjgyM2VhYjBhNjRiYmIwMGM2MDdjNjFiYmMzZGQzNTdlM2Y2NmEyZTI3JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.ztnbEoy75htR8o9z-qlsD4zQGr_PTtfG8i33szU5jU0)
Table.head() : 테이블의 0-5번 줄(행) 데이터
Table.tail() : 테이블의 마지막 5번 줄(행) 데이터
![스크린샷 2024-01-01 16 52 01](https://private-user-images.githubusercontent.com/104954561/293574504-9493ecf6-6752-4e16-8b60-4b1e9be13bf5.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg4NDU5MzQsIm5iZiI6MTczODg0NTYzNCwicGF0aCI6Ii8xMDQ5NTQ1NjEvMjkzNTc0NTA0LTk0OTNlY2Y2LTY3NTItNGUxNi04YjYwLTRiMWU5YmUxM2JmNS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwNlQxMjQwMzRaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT03ZmQzZGRmOGZhM2QzMmNlMDU4NDZlNTUwYTI4NGI1MDE2YjQ0MzUyNjBlZjNiZWZjYTlhNTc4NWZlZGI3YTI4JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9._x9gINX0ziZGWPz3rbg4clm8gxKa1u6PNlNwWxcSzgs)
Table.selectRows(beginIndex, endIndex) : 테이블의 beginIndex부터 endIndex까지의 데이터로 구성된 테이블 반환
Table.selectRowsAt(...index) : 테이블의 index에 해당하는 데이터로만 구성된 테이블 반환
Table.selectColumns(beginIndex, endIndex) : 테이블의 beginIndex부터 endIndex까지의 컬럼으로 구성된 테이블 반환
Table.selectColumnsAt(...index) : 테이블의 index에 해당하는 컬럼으로만 구성된 테이블 반환
![스크린샷 2024-01-01 16 52 29](https://private-user-images.githubusercontent.com/104954561/293574505-aac1e0f5-cc84-481a-b9f9-6952571e8bb7.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg4NDU5MzQsIm5iZiI6MTczODg0NTYzNCwicGF0aCI6Ii8xMDQ5NTQ1NjEvMjkzNTc0NTA1LWFhYzFlMGY1LWNjODQtNDgxYS1iOWY5LTY5NTI1NzFlOGJiNy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwNlQxMjQwMzRaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1mNDNmNDUwNmQzNDEyMWZiMjMxYThiODQwYTdjN2E5MTgwMDczNzVlZjI5YTRiYjY1MTYyMDU5MTdmNTg5NWYzJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9._rRrXZzqMwxsClV1qfYZsb5bB_2v-VQ1X65KJO1H-OA)
Table.sort(byINdexOfColumn, isAscending, isNullFirst) : 테이블의 byIndexOfColumn 컬럼을 기준으로 정렬
![스크린샷 2024-01-01 16 52 44](https://private-user-images.githubusercontent.com/104954561/293574508-cd354e82-253d-43b1-a344-5b3dcfb97ac6.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg4NDU5MzQsIm5iZiI6MTczODg0NTYzNCwicGF0aCI6Ii8xMDQ5NTQ1NjEvMjkzNTc0NTA4LWNkMzU0ZTgyLTI1M2QtNDNiMS1hMzQ0LTViM2RjZmI5N2FjNi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwNlQxMjQwMzRaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1kMzk1OTg4YmQwNGNjNDNkYjdhMTdmNGM1NjVmNjdhOTI4NmU4MGIyMTdhZWZjMzk0ZTBlMWE3ODkxNzY5MjA5JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.EKgIgOzUoM1D_chVGcjsWOG3BSIBkWPlqxUx8QsrT0w)
Table.crossJoin(rightTable) : 테이블과 rightTable의 모든 데이터를 조합한 테이블 반환(rightTable이 오른쪽)
![스크린샷 2024-01-01 16 53 35](https://private-user-images.githubusercontent.com/104954561/293574509-9c421799-ec6b-48a5-90cd-6bd8f913a0a8.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg4NDU5MzQsIm5iZiI6MTczODg0NTYzNCwicGF0aCI6Ii8xMDQ5NTQ1NjEvMjkzNTc0NTA5LTljNDIxNzk5LWVjNmItNDhhNS05MGNkLTZiZDhmOTEzYTBhOC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwNlQxMjQwMzRaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0yNTIxZDhmMzRjMjFlMTQ2ZTM0MjZkZjRmYzNlM2EwNmIzOTZiYjY2MmNjOTMxOTc1ZTYwMDRjOGUyNzRjZTZjJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.WZ7uWGzS9c9RqFfy0d5Scahmlj8mg_15x_mwcklOHCk)
Table innerJoin(Table rightTable, List joinColumns): 두번째 인자 columns르 기준으로 두 테이블을 조인
![스크린샷 2024-01-01 16 53 44](https://private-user-images.githubusercontent.com/104954561/293574512-c3f416a7-1834-4cbb-a650-529ab72c9e1c.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg4NDU5MzQsIm5iZiI6MTczODg0NTYzNCwicGF0aCI6Ii8xMDQ5NTQ1NjEvMjkzNTc0NTEyLWMzZjQxNmE3LTE4MzQtNGNiYi1hNjUwLTUyOWFiNzJjOWUxYy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwNlQxMjQwMzRaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT00MDcyYjM3MmQ4NjQzMGUwMGM0NjM1MDEwYjU3NDQ1NjI3NTI3NzAzY2JiYzY5Yzc5MzVjZGYwZjVjZDQ0Zjg5JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.OkjkzvLAuW2W7r-_BdL5kvGmXCA38b9gZliCToVyvMQ)
랜던한 row, column 인덱스를 selectedRowsAt, selectedColumnsAt을 통해 선택한 후 출력을 확인하고
setValue 메소드를 통해 column의 head값을 변경
![스크린샷 2024-01-01 16 56 03](https://private-user-images.githubusercontent.com/104954561/293574513-02f1119b-e799-4933-9937-08db4d994a09.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg4NDU5MzQsIm5iZiI6MTczODg0NTYzNCwicGF0aCI6Ii8xMDQ5NTQ1NjEvMjkzNTc0NTEzLTAyZjExMTliLWU3OTktNDkzMy05OTM3LTA4ZGI0ZDk5NGEwOS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwNlQxMjQwMzRaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT05MDNmNmMwMzRhOGNjYzZhMDE3ODIwMzM1MzRkYjQ2Y2MwNDEzMjRhMjdhMjliMWJlNzU0YTc0NTk0NTI1Mjc5JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.EnQscbezm0ejUXFI9QeWjbZX6_y9T9VKpN6in6sgJeE)