객체지향 프로그래밍 과제 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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg4MzcyNTYsIm5iZiI6MTczODgzNjk1NiwicGF0aCI6Ii8xMDQ5NTQ1NjEvMjkzNTcyNjE4LTcyMGIyYmJjLTdkNDYtNDhkOS1iYWUzLTViNjRhZmY5MDM2MS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwNlQxMDE1NTZaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1iMDM1MWEwNTYyYTVlYWE2ZTU0MGY0ZmQwOGM1MmNhNDYzNDFhZmQyZDhlMzJjMTFlMTIxZTFlMjBjMTEyNDUwJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.Vht4sMc20oPWGxGIkSkLsIKUV0eH3E1TbNlN7PQ9Jyk)
+ 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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg4MzcyNTYsIm5iZiI6MTczODgzNjk1NiwicGF0aCI6Ii8xMDQ5NTQ1NjEvMjkzNTc0NTAyLTlmNzRkZGVjLTI1OGUtNGNkMy04ZDljLTE0ZDAyMWMzMDQwYy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwNlQxMDE1NTZaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT01YWJiZGQwOGYxM2U1ZGQyMDM2MzNlZDRkMTA2NDc2ZjgwNDRlNDg3MDMwODQ5NTVkOWFiNzBjMzY3YzcwZDFkJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.yBcvxlXrbB9sw3lH2dWoFk4o_JwERAM1P_t2ZwX6SJ0)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg4MzcyNTYsIm5iZiI6MTczODgzNjk1NiwicGF0aCI6Ii8xMDQ5NTQ1NjEvMjkzNTc0NTA0LTk0OTNlY2Y2LTY3NTItNGUxNi04YjYwLTRiMWU5YmUxM2JmNS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwNlQxMDE1NTZaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT04NmY4Nzk3YWMyODRmZTk4ZDgzNmUzYTBhODA3ZTQ5NzBlZjZhZGU5NzY4MzJlNGYyODlmNzhmMWU3MTJkYTg2JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.afUBP-VUsDmlfKTyYFODMxSJnY62PzvilY8wM_ynUvM)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg4MzcyNTYsIm5iZiI6MTczODgzNjk1NiwicGF0aCI6Ii8xMDQ5NTQ1NjEvMjkzNTc0NTA1LWFhYzFlMGY1LWNjODQtNDgxYS1iOWY5LTY5NTI1NzFlOGJiNy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwNlQxMDE1NTZaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT05ZWEzOGJmMWJkZTViYTlhMWVjMmY3NzMwZDZmZGU3YTdlNTViMjI3YzM4MTUwNGJmZWU2ZjAyNzc1ZTZjMTQxJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.JdmzoddGO2JgIDyM6uJ3uO-7HvUeaCzuOCgWGhHVudA)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg4MzcyNTYsIm5iZiI6MTczODgzNjk1NiwicGF0aCI6Ii8xMDQ5NTQ1NjEvMjkzNTc0NTA4LWNkMzU0ZTgyLTI1M2QtNDNiMS1hMzQ0LTViM2RjZmI5N2FjNi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwNlQxMDE1NTZaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1kNTFkYTMzODRmNjZhNmRiNmQwZWY5ZGRjZGQ4NGQ4ZWE4YWU4N2QwNmYzNmJjMTdhZWM0N2UyNDFiMTAyMzE0JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.VmSS3PfbI0g45hzdk_A0eATNcklrxC24evlBWi9bvT8)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg4MzcyNTYsIm5iZiI6MTczODgzNjk1NiwicGF0aCI6Ii8xMDQ5NTQ1NjEvMjkzNTc0NTA5LTljNDIxNzk5LWVjNmItNDhhNS05MGNkLTZiZDhmOTEzYTBhOC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwNlQxMDE1NTZaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0wNTBmMDhjNzc4MGMxMTg2NjA3OWY3Mzk0YjZkMDg5YmQwNDAxZGFlMWZhOGVmMDQ4NTM0YTc5NTJjMjU2YTVkJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.WG5Oxa-DC9Jsi5Tyuav-M5bEnnQy4HTV5ipSed9m5_8)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg4MzcyNTYsIm5iZiI6MTczODgzNjk1NiwicGF0aCI6Ii8xMDQ5NTQ1NjEvMjkzNTc0NTEyLWMzZjQxNmE3LTE4MzQtNGNiYi1hNjUwLTUyOWFiNzJjOWUxYy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwNlQxMDE1NTZaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0wOTg0YmI1OWQ2ZTM5YjlkMGM5NzMwN2Q1OTAyMGZlNjhlMTAyYTZjYTVhZTUwNzk2NTI4YTJkZjQwYTVmZjBhJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.jwKWh33JD035Wnr_yIR_ig1syrYXAP3f6c08nI1UOY8)
랜던한 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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg4MzcyNTYsIm5iZiI6MTczODgzNjk1NiwicGF0aCI6Ii8xMDQ5NTQ1NjEvMjkzNTc0NTEzLTAyZjExMTliLWU3OTktNDkzMy05OTM3LTA4ZGI0ZDk5NGEwOS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwNlQxMDE1NTZaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1iYTJlNjc2MDE5MjQzYmY2YWNmMTU3NTY0ZGQ3Mjk1MzFkZjliOWY0NWZiNzhjZmJkZmNlNGUyMzA4ZGIxNjJiJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.M0ZBvlvD56DAa3tteyfKOp1XIDUKn6cwizVOD9po0WM)