객체지향 프로그래밍 과제 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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkzODQwNDMsIm5iZiI6MTczOTM4Mzc0MywicGF0aCI6Ii8xMDQ5NTQ1NjEvMjkzNTcyNjE4LTcyMGIyYmJjLTdkNDYtNDhkOS1iYWUzLTViNjRhZmY5MDM2MS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjEyJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxMlQxODA5MDNaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0xOWY3YWFjNWRmNDI1NTdjOTRlY2QyYjU4YzJkZjBhMzZkZGIxN2NlODNiY2E0NGY4NDMxMjNiODM4YzEzODA0JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.bwz121QKCIo6tvxU25v-9SckDVj91Fx62gws-G4ecKk)
+ 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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkzODQwNDMsIm5iZiI6MTczOTM4Mzc0MywicGF0aCI6Ii8xMDQ5NTQ1NjEvMjkzNTc0NTAyLTlmNzRkZGVjLTI1OGUtNGNkMy04ZDljLTE0ZDAyMWMzMDQwYy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjEyJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxMlQxODA5MDNaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1kMGRlNDgyNWRkYTRiZGMxZGU1N2JlMDNkMjE4MTMwZTNiYmE4NWVjMWY0Y2QwZjM5Mjg1ZTAyOTk2NWQ4NDY2JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.fZQaS-bQXp-oTJMunOGh5V7uHq6-BU83RzsOLxSB4xg)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkzODQwNDMsIm5iZiI6MTczOTM4Mzc0MywicGF0aCI6Ii8xMDQ5NTQ1NjEvMjkzNTc0NTA0LTk0OTNlY2Y2LTY3NTItNGUxNi04YjYwLTRiMWU5YmUxM2JmNS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjEyJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxMlQxODA5MDNaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT05MTAyY2VjNWFmODFhMDNhNmQyY2NjOGFkYjk3NjFkYjRjMDI0MmFhM2Q1YWQ0Njc2OWFiNWZmMGYwNDJmNWQ1JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.9z33ryFHFzyZhxzEcEzt0hmEgJDfA3DJmZeDmGpLOlI)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkzODQwNDMsIm5iZiI6MTczOTM4Mzc0MywicGF0aCI6Ii8xMDQ5NTQ1NjEvMjkzNTc0NTA1LWFhYzFlMGY1LWNjODQtNDgxYS1iOWY5LTY5NTI1NzFlOGJiNy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjEyJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxMlQxODA5MDNaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0wMWQ4YmU0ZjE1NGJlZTU3NzVkYWIwMzYyNTQ0YjZkOWM5M2EzZjM0NDcxY2UzNDUxYTg0MTA1MjgwZDU2NzU2JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.u-GOp8BoXWrWPUt4yoAbHufLYsH6hVbaOiTBm87mGVs)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkzODQwNDMsIm5iZiI6MTczOTM4Mzc0MywicGF0aCI6Ii8xMDQ5NTQ1NjEvMjkzNTc0NTA4LWNkMzU0ZTgyLTI1M2QtNDNiMS1hMzQ0LTViM2RjZmI5N2FjNi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjEyJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxMlQxODA5MDNaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT02NjJjN2M0YzVjZDc5YWM2OWMxOTQ2NWUwNzQxZmI0ZGIyOTM0ZTU0Yzg3MzNlYmYyMTQ0ZGFiYWU1MGU3YzI2JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.37B3CGOahurprjYtWdP9a_NpWy-EUYuirzui5IzN-uc)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkzODQwNDMsIm5iZiI6MTczOTM4Mzc0MywicGF0aCI6Ii8xMDQ5NTQ1NjEvMjkzNTc0NTA5LTljNDIxNzk5LWVjNmItNDhhNS05MGNkLTZiZDhmOTEzYTBhOC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjEyJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxMlQxODA5MDNaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0yYTU4NGEwOTkzYWUxNzUyZjRhYTQ2OTEwZGExZGE0OGE2ZDUxYzkzNjM2MjdmYTM1M2IxOTdkYjVhYTdhODFhJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.nHXRUhuyycN2WQkmT80i5Bql4P9kVZE0V9FB64VBTvY)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkzODQwNDMsIm5iZiI6MTczOTM4Mzc0MywicGF0aCI6Ii8xMDQ5NTQ1NjEvMjkzNTc0NTEyLWMzZjQxNmE3LTE4MzQtNGNiYi1hNjUwLTUyOWFiNzJjOWUxYy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjEyJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxMlQxODA5MDNaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT05YmFmNTcwMmRkYWE1ZmNkNjA2OTE4MDk3ZDRkZmI1OTQzMTRjNmI4MmQwNjg1YjY5YWE2ZjE2M2UwYzAwY2UyJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.gpjrbJXZc876gymbBIBT4N6IgH84_Y7vQp9YDXPeHmo)
랜던한 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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkzODQwNDMsIm5iZiI6MTczOTM4Mzc0MywicGF0aCI6Ii8xMDQ5NTQ1NjEvMjkzNTc0NTEzLTAyZjExMTliLWU3OTktNDkzMy05OTM3LTA4ZGI0ZDk5NGEwOS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjEyJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxMlQxODA5MDNaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT01ZjcxZjY2NDA0MjA2ZGYzNGI1NmEzNmZkYjEwMTNjYTMwNmQ5MjBlNWYwMDBjZmM5ODQwYjE5NDM5OWRjY2UxJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.7M66WlxhBo1uQ09vEVCCfvCfX8SB_m9opDgjWt-LEiw)