- 프로젝트 파일 -
🐈 00. 개발절차 / 주제선정
제일 먼저, 주제를 선정하기 위한 고민을 했다. 이 때 나름대로 세웠던 기준이 있었다.
첫 프로젝트이기도 하고 포트폴리오에 들어갈지도 모르니 신중히 정하고 싶었다.
1. 흔하지 않은 것
- 흔한 게 나쁘다는 것은 아니다. 흔한 주제라는 말은 그만큼 실무에서 많이 사용된다는 의미일테니까.
하지만 포폴로 사용될 가능성을 염두에 둔다면 다른 사람과 차별점을 두고 싶었다.
2. 내가 좋아하는 것
- 도중에 어려움을 겪더라도 처음과 비슷한 크기의 애정을 갖고 프로젝트를 진행하고 싶은 욕심이 컸는데,
그걸 한번에 해결해주는 기준이라고 생각했다!
3. 정말로 사용가능할 것 ★★★
- 사실상 기준에서 제일 중요한 요소이다. 이게 충족이 되지 않는다면 위 두 개의 기준은 쓸모가 없어진다.
아무리 작은 프로젝트라도 활용가능한 프로젝트를 만들고 싶었다.
후보가 두 개정도로 확정이 되었는데,
1. marvel 영화 DB
2. 보유한 게임 DB
이렇게 였다. 마블 영화 DB의 경우 3번 기준의 요소가 조금 약했고, 게임DB의 경우 양이 많아 데이터베이스의 장점을 활용하기에 안성맞춤이라는 생각이 들어서 게임DB를 이용한 프로그램을 제작하기로 결정했다.

🐈 01. 요구 분석
이 단계에서는 구현하고 싶은 기능과 배치를 생각해보았다.
[ 구현하고 싶은 기능 ]
1. JTable을 이용한 데이터베이스 출력
2. 원하는 조건의 데이터베이스 조회 - 새 창
3. 데이터베이스 추가 - 새창
4.. 선택한 데이터베이스 수정
5. 선택한 데이터베이스 삭제
[ 화면 레이아웃 ]
위, 아래로 패널을 나누어 위 패널 가운데에 데이터베이스 출력화면이 있고 아래 패널 양 쪽에 버튼을 위치시켜
게임기 같은 느낌을 주는 레이아웃으로 구성하고 싶다. 기본 수업 시간 때는 둥근 JButton에 대한 건 배우지 못했는데, 검색해보니 테두리를 둥글게 하거나 아예 이미지를 버튼으로 대체시키는 방법도 있어 가능 할 것 같다.

🐈 02. 설계
- DB 구조 설계
데이터 등록의 편의성과 수업시간에 배운 Join의 활용을 위해
플랫폼/가격대/평점/플레이여부를 게임테이블에는 숫자로 간단히 표기하고 다중조인을 이용하여
출력 화면에는 해당하는 숫자의 레코드를 출력하도록 한다. 그림으로 표현하면 아래와 같다.

[ sql table & column ]
* game table
no primary key, title not null, platform, price, genre, grade, play
* platform 테이블
no primary key, platform
* price 테이블
no primary key, price
* grade 테이블
no primary key, grade
* play 테이블
no primary key, play
- 자바 클래스 구조 설계
위의 DB구조를 참고하여, 자바 클래스 구성도 아래처럼 미리 생각해둔다.
* JoinMain
* JoinDao
* JoinBean
* InsertData
* UpdateData
* SelectData
🐈 03. 구현
- DB구현
* sql문
drop sequence gmseq ;
create sequence gmseq
increment by 1
start with 1
minvalue 1
nocache;
drop table game purge ;
create table game(
no number,
title varchar2(100) not null,
platform number,
price number,
genre number,
grade number,
play number
);
drop table platform purge ;
create table platform(
no number primary key,
platform varchar2(20)
);
drop table price purge ;
create table price(
no number primary key,
price varchar2(20)
);
drop table genre purge ;
create table genre(
no number primary key,
genre varchar2(20)
);
drop table grade purge ;
create table grade(
no number primary key,
grade varchar2(20)
);
drop table play purge ;
create table play(
no number primary key,
play varchar2(20)
);
--플랫폼 인서트
insert into platform values(1,'Steam');
insert into platform values(2,'EA Games');
insert into platform values(3,'PS5');
insert into platform values(4,'Nintedo Switch');
insert into platform values(5,'Epik Games');
--가격대 인서트
insert into platform values(1,'0 ~ 5,000');
insert into platform values(2,'5,000 ~ 10,000');
insert into platform values(3,'10,000 ~ 30,000');
insert into platform values(4,'30,000 ~ 50,000');
insert into platform values(5,'50,000 ~ 70,000');
insert into platform values(6,'70,000 ~');
--장르 인서트
insert into genre values(1,'액션');
insert into genre values(2,'퍼즐');
insert into genre values(3,'좀비');
insert into genre values(4,'슈팅');
insert into genre values(5,'FPS');
insert into genre values(6,'힐링');
insert into genre values(7,'로그라이크');
insert into genre values(8,'리듬');
insert into genre values(9,'생존');
insert into genre values(10,'판타지');
insert into genre values(11,'공포');
--평점 인서트
insert into platform values(1,'★');
insert into platform values(2,'★★');
insert into platform values(3,'★★★');
insert into platform values(4,'★★★★');
insert into platform values(5,'★★★★★');
--플레이여부 인서트
insert into platform values(1,'O');
insert into platform values(1,'X');
--게임 인서트
insert into game
values(gmseq.nextval,'세븐 데이즈 투 다이(7 Days to Die)',1, 3, 3, 4, 1);
-- 외 총 136가지 게임 등록
--다중조인을 활용한 게임 조회(null 제외됨)
--오라클 문법
select a.no, a.title, b.platform, c.price, d.genre, e.grade, f.play
from game a, platform b, price c, genre d, grade e, play f
where a.platform=b.no
and a.price=c.no
and a.genre=d.no
and a.grade=e.no
and a.play=f.no
order by a.no;
--ANSI 문법
select a.no, a.title, b.platform, c.price, d.genre, e.grade, f.play
from game a join platform b on a.platform=b.no
join price c on a.price=c.no
join genre d on a.genre=d.no
join grade e on a.grade=e.no
join play f on a.play=f.no
order by a.no;
--플랫폼이 스팀인 목록
select a.no, a.title, b.platform, c.price, d.genre, e.grade, f.play
from game a join platform b on a.platform=b.no
join price c on a.price=c.no
join genre d on a.genre=d.no
join grade e on a.grade=e.no
join play f on a.play=f.no
where b.platform='Steam'
order by a.no;
--가격대가 0 ~ 5,000인 목록
select a.no, a.title, b.platform, c.price, d.genre, e.grade, f.play
from game a join platform b on a.platform=b.no
join price c on a.price=c.no
join genre d on a.genre=d.no
join grade e on a.grade=e.no
join play f on a.play=f.no
where c.price='0 ~ 5,000'
order by a.no;
--장르가 공포인 게임목록
select a.no, a.title, b.platform, c.price, d.genre, e.grade, f.play
from game a join platform b on a.platform=b.no
join price c on a.price=c.no
join genre d on a.genre=d.no
join grade e on a.grade=e.no
join play f on a.play=f.no
where d.genre='공포'
order by a.no;
--평점이 별 다섯 개인 게임목록
select a.no, a.title, b.platform, c.price, d.genre, e.grade, f.play
from game a join platform b on a.platform=b.no
join price c on a.price=c.no
join genre d on a.genre=d.no
join grade e on a.grade=e.no
join play f on a.play=f.no
where e.grade='★★★★★'
order by a.no;
- Java 구현




🐈 04. 완성 후 검토
생각보다 시간 안에 구현하지 못한 기능과 배치가 많다..!!
아래로는 미처 완료하지 못한 부분이나 궁금증이 생긴 부분들을 정리해보았다.
- jfame에 올린 버튼을 누르면 또 새 창일 뜨는 기능을 수행하려할 때,
main에 클래스를 만드는 게 맞을까 아니면 따로 클래스 파일을 만드는 게 맞을까?
기능이 많다면 파일로 개별적으로 분리하는 게 맞는 거 같기도!
ㄴ> 필요한 메서드를 클래스끼리 공유하는데에 어려움이 있다는 단점이 있는 것 같다.
- 텍스트 필드 삽입 시 클릭하고 내용을 입력해야만 전체 텍스트필드가 보이는데,
선생님께 도움을 요청했더니 선생님 컴퓨터에서는 제대로 다 보이는 걸 확인했다!
아마 해상도 문제인 것 같아서 다음엔 다른 환경에서도 꼭 구동시켜 보아야겠다.
ㄴ> 원래 몇가지 텍스트필드를 콤보상자로 구현하려 했었는데, 아예 보이지가 않아 다시 텍스트필드 형태로 바꾸었었다.
아마 그것도 다른 환경에서 확인했다면 보였을지도 모르겠디.
- 인서트가 아닌 업데이트 시에도 조인을 이용하려면 어떻게 sql문을 작성해야 할까?
- 자식 창에서 값을 추가/수정/삭제 시 부모창의 테이블을 새로고침 하려면 어떻게 해야하지?
ㄴ>해결했으나 새로고침하는 메서드를 다른 클래스에서 사용하려고 스태틱으로 바꾸는 과정에서 마우스핸들러 사용이 불가능해졌다! 해결할 수 있는 방법이 있다면 너무 좋겠다...
- 자식 창에서 번호로 레코드를 조회하고 조회한 결과가 부모프레임에 나타나게 하려면 어떻게 하지?
첫 프로젝트인 만큼 고단했다.. 검색으로만 해결되지 않는 것들 또한 있었다.
더 분발해서 원하는 기능을 마음껏 구현할 수 있게 되면 좋겠다!
