현대타운301 2023. 9. 21. 15:36

2023.09.20

 

첫 번째 팀 프로젝트 후기...

 

DB에 질문을 추가해도

1) 질문의 각 유형(EI/NS/FT/PJ)별로 3개씩 랜덤하게 추출하고,

2) 추출한 질문들의 순서를 랜덤하게 재배열해서 (= 유형들이 서로 섞이게 끔)

질문지를 작성하기 위해 고민을 많이 했다.

 

아래 프로그램에서는 0부터 특정 배열의 길이(length) 만큼의 랜덤배열(randArrayI())을 만들고,

만들어진 랜덤배열의 각 요소들을 특정 배열의 index로 부여하는 방법(randArray2())을 사용했다.

 

 

test 결과

"C:\Program Files\Amazon Corretto\jdk17.0.8_7\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2023.2.1\lib\idea_rt.jar=57859:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2023.2.1\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\user\Intellij\MBTI\out\production\MBTI;C:\app\user\product\21c\dbhomeXE\jdbc\lib\ojdbc8.jar MBTIMain.MBTItest
DB 접속 성공!
[1, 2, 3, 4, 5]					// EI 유형 질문
[6, 7, 8, 9]					// NS 유형 질문
[10, 11, 12, 13, 14, 15]			// FT 유형 질문
[16, 17, 18, 19, 20, 21, 22]			// PJ 유형 질문
[1, 3, 2, 4, 5]					// RANDOM EI
[7, 6, 9, 8]					// RANDOM NS
[10, 11, 14, 13, 15, 12]			// RANDOM FT
[16, 17, 19, 18, 20, 21, 22]			// RANDOM PJ
[1, 3, 2, 7, 6, 9, 10, 11, 14, 16, 17, 19]	// 각 유형별로 앞에서 3개씩 추출
[10, 3, 2, 7, 17, 9, 1, 11, 14, 16, 19, 6]	// 유형끼리 섞이게끔 랜덤하게 재배열

Process finished with exit code 0

 


 

실행결과

 

* 팀명 : 4간지 (팀원 4명의 출생 연도가 모두 달라서...)

"C:\Program Files\Amazon Corretto\jdk17.0.8_7\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2023.2.1\lib\idea_rt.jar=57303:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2023.2.1\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\user\Intellij\MBTI\out\production\MBTI;C:\app\user\product\21c\dbhomeXE\jdbc\lib\ojdbc8.jar MBTIMain.MBTIMain
DB 접속 성공!
===============성격검사===============
[1]테스트      [2]결과조회     [3]종료
=====================================
메뉴선택 > 2
조회할 회원이 없습니다...
===============성격검사===============
[1]테스트      [2]결과조회     [3]종료
=====================================
메뉴선택 > 1
당신의 이름은?
jaeha
안녕하세요, jaeha님! 지금부터 '4간지st' <성격유형검사>를 시작합니다!
[4, 2, 5, 1, 6, 7, 9, 12, 3, 10, 8, 11]

----------------------------------------------------------------

당신은 디저트로 유명하다는 카페에 2시간동안 줄을 서서 입장하였다.
시킨 메뉴가 나와서 테이블로 가지고 가려고 보니 자리가 없어서
어쩔 수 없이 쟁반을 들고 2층을 오르고 있다. 이때 당신은?

(1) 맛있겠다 근데 들고 올라가다가 넘어지면 어떡하지?
(2) 맛있겠다라는 생각 뿐이다

답변선택 (1 또는 2) >> a
1 또는 2 중에 입력하세요...

----------------------------------------------------------------

당신은 디저트로 유명하다는 카페에 2시간동안 줄을 서서 입장하였다.
시킨 메뉴가 나와서 테이블로 가지고 가려고 보니 자리가 없어서
어쩔 수 없이 쟁반을 들고 2층을 오르고 있다. 이때 당신은?

(1) 맛있겠다 근데 들고 올라가다가 넘어지면 어떡하지?
(2) 맛있겠다라는 생각 뿐이다

답변선택 (1 또는 2) >> 1

----------------------------------------------------------------

당신이 롯데월드 퍼레이드를 보고 있는데 이때 캐릭터 분장을 한 사람이 다가와서
사람들이 많은 중앙에서 당신의 손을 잡고 춤추자고 한다. 이때 당신은?

(1) 캐릭터 분장한 사람만큼 텐션을 올려서 스텝을 밟는다
(2) 살짝 웃으며 나름 열심히 스텝을 밟는다

답변선택 (1 또는 2) >> 1

----------------------------------------------------------------

당신은 친구들과 신나는 해외 여행을 가게 되었다.기대되는 비행기를 타고나니
더 들뜬 마음이다.이때 당신은?

(1) 만약 비행기가 추락하면 어쩌지.. 바다로 떨어지면 좋겠다 구조요청은 어떻게 해야하지?
(2) 도착까지 얼마나 걸리지? 좀 자야겠다..

답변선택 (1 또는 2) >> 1

----------------------------------------------------------------

당신이 친구들과 시내에 놀러갔는데 마침 그때 시내에 놀러온
백만유튜버 랄랄님이 반갑게 다가오며 손을 흔든다. 이때 당신은?

(1) 나까지 덩달아 신나서 격하게 오버하며 인사한다
(2) 속으론 너무 신기하지만 어색하게 인사를 한다

답변선택 (1 또는 2) >> 2

----------------------------------------------------------------

바나나를 연상하면 떠오르는 것은?

(1) 원숭이.아 동물원 가고 싶다..아 맞다 내 친구 중에 원숭이 닮은 애 있는데 킥킥..
(2) 노랗다. 길다. 맛있겠다. 요즘 제철인가?

답변선택 (1 또는 2) >> 2

----------------------------------------------------------------

조별 과제를 끝낸 나에게 친구가 이렇게 말한다.
"너 그리 열심히 안 한 것 같았는데 결과가 너무 좋은데? 원래 타고났나봐"

(1) 그래도 나 나름 열심히 했는데..
(2) 이게 바로 내 클라스 ^^

답변선택 (1 또는 2) >> 1

----------------------------------------------------------------

상대가 고백을 했다.이때 내가 상대에게 "생각해볼게"라고 했다.이 의미는?

(1) 상대가 상처 받을까 봐 나중에 거절해야지 OR 거절 의미
(2) 음 진짜 한 번 생각을 해봐야겠다

답변선택 (1 또는 2) >> 2

----------------------------------------------------------------

당신이 짜놨던 계획에 대해 차질이 생겼습니다.이때 당신은?

(1) 뭐 그럴 수도 있지..아쉽지만 다음에 잘해야지..
(2) 아 진짜 스트레스 받네 내가 열심히 짠 계획인데..

답변선택 (1 또는 2) >> 2

----------------------------------------------------------------

인천일보아카데미에서 수업이 끝난 후 생각을 해보니 오늘은 평소보다 유독 시끄러운 날이었다.
사람들과 목청이 터져라 수다를 떤 날이다. 이때 당신은? 

(1) 이 신나는 기세를 이어서 학원 사람들과 끝나고 놀러간다
(2) 학원도 끝났고 기가 빨렸으니 집 가서 쉬어야겠다

답변선택 (1 또는 2) >> 1

----------------------------------------------------------------

당신은 친구랑 서울로 여행을 가기 위해 카톡으로 약속을 정했다.이때 약속의 형식은?

(1) ㅇㅇ시에 만나서 배고프면 근처에서 밥 먹고 배 안 고프면 주위 구경할 겸 돌아다녔다가 숙소 가자!
(2) ㅇㅇ시에 출발해서 도착하면 ㅇㅇ시니까 먼저 검색해둔 ㅇㅇ식당에 갔다가 ㅇㅇ시까지 숙소에 도착해서 짐 풀자!

답변선택 (1 또는 2) >> 1

----------------------------------------------------------------

다음 중 내가 더 화날 것 같은 친구는?

(1) 내가 자리 비운 사이 내 과제를 몰래 배껴 간 호진이
(2) 날 도와주려다가 내 과제에 실수로 커피를 엎어서 무용지물 만든 지영이

답변선택 (1 또는 2) >> 2

----------------------------------------------------------------

당신은 저번주부터 오늘을 방 청소날로 지정했고 드디어 그 날이 왔다.이때 당신은?

(1) 아 막상 당일 되니까 귀찮네..폰 조금 하다가 하거나 내일 해야겠다..
(2) 방청소 계획한 날이니까 귀찮아도 열심히 해야겠다

답변선택 (1 또는 2) >> 2

jaeha 님! 당신의 유형은 '사자송편(ENTJ)'으로 나왔습니다!
당신은 아마 이런 사람일지도..?
------------------------------------------------------------------------------
정열적이고 활동적이며 무엇을 도전하는 것에 대하여 매력을 느끼는 유형
성취감을 중요시한다.
인기 있는 사람보다는 일을 잘 하는 사람으로 비춰지는 것을 더 좋아하기에,
인기보다는 자신의 능력에 대한 타인의 인정을 더 중요시여긴다.
이러한 ENTJ 유형은 가끔 엉뚱한 모습을 보이기도 하며
성격이 급하고 인내심이 없는 편이기 때문에 가끔씩 답답할 때 욱하는 경향이 있다.
------------------------------------------------------------------------------

=========================궁합보기=========================
[1]나와 잘 맞는♥ 궁합은?  [2]나와 파국인♨ 궁합은?   [3]종료
==========================================================
메뉴선택 > 1

MBTI : INTP
송편 이름 : 늑대송편
--------------------------------이 유형의 성격은--------------------------------
혼자서도 매우 잘지내는 고양이 같은 타입
오히려 사람들과 어울리는걸 매우 불편해 한다. 
잡지식이 아주 많으며 어떤 현상이나 사물에 대해 논리적으로 분석하는 것을 즐긴다.
본인이 알고 싶어 하는 분야, 관심 있는 분야는 밤을 새워서라도 알아내고 마는 성격이지만 
자신이 관심 없는 분야는 거들떠 보지 않는다.
또한 이 유형은 개그코드가 특이하여 다른 사람들은 공감 못하는 개그에 빵 터지기도 한다.
------------------------------------------------------------------------------

=========================궁합보기=========================
[1]나와 잘 맞는♥ 궁합은?  [2]나와 파국인♨ 궁합은?   [3]종료
==========================================================
메뉴선택 > 2

MBTI : INFJ
송편 이름 : 부엉이송편
--------------------------------이 유형의 성격은--------------------------------
차분하다는 소리를 많이 듣지만 마음 한켠에는 불만과 분노가 있다. 
공감능력이 매우 뛰어나 친구들의 고민 상담을 잘해주는 편이다.
그러나 속으로는 생각이 많은 편이라 무슨 생각을 하고 있는지 잘 모를 때가 많다. 
또한 이 유형들은 사람들과 잘 지내려고 매우 노력하는 타입으로 싫은 소리를 잘 못한다.
싫은 소리를 직접적으로 하기보다는 조용히 멀어지는 편이다. 
혼자 있을 때가 가장 좋은 유형이지만 그렇다고 너무 집에만 있으면 심심해 하는 특이한 유형
------------------------------------------------------------------------------

=========================궁합보기=========================
[1]나와 잘 맞는♥ 궁합은?  [2]나와 파국인♨ 궁합은?   [3]종료
==========================================================
메뉴선택 > 3
검사를 종료 합니다..
===============성격검사===============
[1]테스트      [2]결과조회     [3]종료
=====================================
메뉴선택 > 2

No.	Name	Type		Date
===========================================================
[1]	jaeha	사자송편(ENTJ)   2023년09월21일 03:25:18
조회하고 싶은 사람의 번호를 입력하세요 
>> 1

jaeha 님의 정보입니다.
유형 : 사자송편(ENTJ) 
------------------------------------------------------------------------------
정열적이고 활동적이며 무엇을 도전하는 것에 대하여 매력을 느끼는 유형
성취감을 중요시한다.
인기 있는 사람보다는 일을 잘 하는 사람으로 비춰지는 것을 더 좋아하기에,
인기보다는 자신의 능력에 대한 타인의 인정을 더 중요시여긴다.
이러한 ENTJ 유형은 가끔 엉뚱한 모습을 보이기도 하며
성격이 급하고 인내심이 없는 편이기 때문에 가끔씩 답답할 때 욱하는 경향이 있다.

===============성격검사===============
[1]테스트      [2]결과조회     [3]종료
=====================================
메뉴선택 > 3
테스트를 종료합니다...

Process finished with exit code 0

 


 

DB TABLES

 

* user : ICIA

MBTI1TYPE 의 MTYPE을 PK로 설정 후 참조

 

DROP TABLE MATCH;
DROP TABLE MBTI1DESC;
DROP TABLE MUSER;
DROP TABLE MBTI2TYPE;
DROP TABLE MBTI1TYPE;
DROP TABLE QUESTIONS;

CREATE TABLE MBTI1TYPE(
    M1NO     NUMBER UNIQUE,             -- 번호 (1-16)
    MTYPE   NVARCHAR2(10) PRIMARY KEY   -- 유형 (ENFP, ISTJ, ...)
);
INSERT INTO MBTI1TYPE VALUES(1, 'ENFP');
INSERT INTO MBTI1TYPE VALUES(2, 'ENTP');
INSERT INTO MBTI1TYPE VALUES(3, 'ENFJ');
INSERT INTO MBTI1TYPE VALUES(4, 'ENTJ');
INSERT INTO MBTI1TYPE VALUES(5, 'ESFP');
INSERT INTO MBTI1TYPE VALUES(6, 'ESTP');
INSERT INTO MBTI1TYPE VALUES(7, 'ESFJ');
INSERT INTO MBTI1TYPE VALUES(8, 'ESTJ');
INSERT INTO MBTI1TYPE VALUES(9, 'INFP');
INSERT INTO MBTI1TYPE VALUES(10, 'INTP');
INSERT INTO MBTI1TYPE VALUES(11, 'INFJ');
INSERT INTO MBTI1TYPE VALUES(12, 'INTJ');
INSERT INTO MBTI1TYPE VALUES(13, 'ISFP');
INSERT INTO MBTI1TYPE VALUES(14, 'ISTP');
INSERT INTO MBTI1TYPE VALUES(15, 'ISFJ');
INSERT INTO MBTI1TYPE VALUES(16, 'ISTJ');

CREATE TABLE MBTI1DESC(
    M1TYPE    NVARCHAR2(10),            -- 유형1 (ENFP, ISTJ, ...)
    M1DESC    NVARCHAR2(300),           -- 유형별 설명 (ENFP : ...)
    CONSTRAINT FK_MBTI1_M1TYPE FOREIGN KEY(M1TYPE) REFERENCES MBTI1TYPE(MTYPE)
);
INSERT INTO MBTI1DESC VALUES('ENFP','사람들과 어울리기를 좋아하고 사교성이 밝기 때문에 동물로 따지면 강아지같은 유형이다.
분위기를 잘 띄워주는 능력 덕분에 친구들 사이에서 인기가 많은 편이다.
하지만 이러한 ENFP 유형은 반복적인 체계에 대해서 지루함을 잘 느끼며,
소속감이 드는 것에 만족을 느끼기 때문에
같이 어울리는 친구들이 자신을 배제하고 모임을 가지는 상황에 많이 서운해한다.
또한 연인에게 질투가 많은 편이므로 특히 ENFP 유형을 만나는 사람은 지속적으로 사랑을 확인시켜줘야 한다.');

INSERT INTO MBTI1DESC VALUES('ENTP','자기 잘난 맛에 사는 경향이 있다.
현실적인 모습이 있는 반면 은근 감성적인 면모도 있다.
또한 사람들과 어울리기를 좋아하지만 낯가림이 있는 모순적이지만 신비로운(?) 성격이다.
ENTP 유형은 E중에 가장 I성향을 가진 유형으로 유명하며 이러한 ENTP 유형은 자기 말이 다 맞다고 우기는 고집쟁이기도 하다.
하지만 말싸움도 논리있는 척 잘 하기 때문에 ENTP 유형한테 가스라이팅을 당한 피해자가 많다.
그러므로 ENTP을 대할 땐 다 맞춰주는 쪽이 더 속편할 지도 모른다.');

INSERT INTO MBTI1DESC VALUES('ENFJ','연인을 만날 때 다른 유형들보다 유독 예쁜 말을 잘하는 유형 
많은 사람들이 사귀고 싶은 유형으로 뽑는 유형 중 하나다.
사람들에게 잘 맞춰주는 유형이기 때문에 연인과 싸웠을 때도 주로 먼저 사과를 하는 편
신뢰를 중요시하므로 상대가 자신을 신뢰하는 모습을 보이면 쉽게 감동을 받는 편이다.(감정을 잘 못 숨기는 걸로 유명)
이러한 ENFJ 유형은 너무 이상적이고 이타적이기 때문에 좋아하는 사람을 유독 신격화 하는 경향이 있다.');

INSERT INTO MBTI1DESC VALUES('ENTJ','정열적이고 활동적이며 무엇을 도전하는 것에 대하여 매력을 느끼는 유형
성취감을 중요시한다.
인기 있는 사람보다는 일을 잘 하는 사람으로 비춰지는 것을 더 좋아하기에,
인기보다는 자신의 능력에 대한 타인의 인정을 더 중요시여긴다.
이러한 ENTJ 유형은 가끔 엉뚱한 모습을 보이기도 하며
성격이 급하고 인내심이 없는 편이기 때문에 가끔씩 답답할 때 욱하는 경향이 있다.');

INSERT INTO MBTI1DESC VALUES('ESFP','쾌활하며 변화하는 상황 속에서도 적응이 빠른 편
사람들과 단체로 어울리는 것을 즐기는 편이다.
자유로운 영혼이기 때문에 구속받는 것을 싫어하는 유형이며, 생각없이 잘 사는 편이다.
이러한 ESFP 유형은 팔랑귀 재질에 상대방 험담을 잘 까는 스타일이나, 자신에 대한 험담은 못 참는 편이다.
또한 말이 너무 많기 때문에 쫑알쫑알 거린다는 말이 잘 어울리는 유형이다.');

INSERT INTO MBTI1DESC VALUES('ESTP','ESTP유형은 전세계 4%로 희귀한 유형
그 중 80%가 남자이기 때문에 남자가 유독 많은 유형이다.
한 번 사는 인생 즐기자라는 마인드
재미를 절대적으로 추구하며, 단순하기 때문에 화가나도 돌아서면 금방 털어버리는 성격이다. 
남 눈치를 잘 보지 않으며 그렇기에 스트레스도 잘 안 받고 자기애가 넘치는 유형이나, 
현실적이기 때문에 가끔씩 지나친 팩폭으로 상대에게 상처를 준다.
또한 거칠다라는 소리를 유독 많이 듣는 유형이다.');

INSERT INTO MBTI1DESC VALUES('ESFJ','생각이 많은 편이며,사람을 보고 파악하는 게 빠르다.
또한 인간관계가 틀어지면 스트레스를 많이 받는 편이다.
ESFJ는 리액션이 좋아서 남을 잘 웃겨주는 성격을 가졌으며,새로운 사람을 만나서 노는 것에 대해 흥미를 느낀다.
이러한 ESFJ 유형은 아직 일어나지도 않은 일에 대해 걱정을 많이 하는 편이며,
감정기복이 심하지만 그 감정이 얼굴에 그대로 잘 드러나는 성질을 가지고 있다.');

INSERT INTO MBTI1DESC VALUES('ESTJ','호불호가 확실하며 지적받는 것을 극도록 싫어함
지적에 대해 확실한 근거가 뒷받침 되지 않으면 자기 말이 맞다고 주장하는 경향이 있다.
또한 언어적인 표현이 직설적이며 하나가 틀어지면 하던 것을 하기 싫어하는 편이다.
이러한 ESTJ는 융통성이 부족하며 창의력이 부족하기 때문에 창조하는 것에 대해 고통을 받는 편이다.
다른 유형보다 공감능력이 부족하며 공감을 해주기보단 상대에 대한 잘잘못을 따지는 편이다.');

INSERT INTO  MBTI1DESC VALUES('INFP',  '낯을 가려 혼자 있는걸 가장 좋아 하지만 아싸 중에선 인싸
은근 약속이 많고 사람들에게 친절하며 은근 관심을 받기를 원한다. 
문학적인 감각이 뛰어나 영화나 소설을 좋아하고 그것을 자기만의 방식으로 해석하는걸 즐긴다. 
또한 남에게 피해를 끼치는 것을 극도로 꺼려해 자신의 행동 부터 모범적으로 하는 유형이다.
그러나 상처를 잘 받는 유리멘탈이라 다른 사람의 시선과 말에 민감해서 타인의 입장에서 기분 나쁠말이라면 
절대로 하지 않는 타입이다.');

INSERT INTO  MBTI1DESC VALUES('INTP', '혼자서도 매우 잘지내는 고양이 같은 타입
오히려 사람들과 어울리는걸 매우 불편해 한다. 
잡지식이 아주 많으며 어떤 현상이나 사물에 대해 논리적으로 분석하는 것을 즐긴다.
본인이 알고 싶어 하는 분야, 관심 있는 분야는 밤을 새워서라도 알아내고 마는 성격이지만 
자신이 관심 없는 분야는 거들떠 보지 않는다.
또한 이 유형은 개그코드가 특이하여 다른 사람들은 공감 못하는 개그에 빵 터지기도 한다.');

INSERT INTO  MBTI1DESC VALUES('INFJ', '차분하다는 소리를 많이 듣지만 마음 한켠에는 불만과 분노가 있다. 
공감능력이 매우 뛰어나 친구들의 고민 상담을 잘해주는 편이다.
그러나 속으로는 생각이 많은 편이라 무슨 생각을 하고 있는지 잘 모를 때가 많다. 
또한 이 유형들은 사람들과 잘 지내려고 매우 노력하는 타입으로 싫은 소리를 잘 못한다.
싫은 소리를 직접적으로 하기보다는 조용히 멀어지는 편이다. 
혼자 있을 때가 가장 좋은 유형이지만 그렇다고 너무 집에만 있으면 심심해 하는 특이한 유형');

INSERT INTO  MBTI1DESC VALUES('INTJ', '겉으로는 따뜻해 보이는 인자한 미소를 지니고 있으나 속으로는 아주 냉정한 사람
이 유형이 미소를 보인다고 그 미소를 다 친절과 호감의 미소로 생각하면 큰 오산
논리정연적인 것, 분석하는 것을 좋아하고 독립적으로 일하는 것을 선호한다. 
이 유형은 또한 은근 남에게 관심이 많은 편이라 꽤 사교적인 유형이다. 
가끔 던지는 농담이 아주 재밌으며 사람들을 잘 챙겨주는 유형이다. 
기본적으로 사람에 대한 편견이 적은 편이고 가장 공정한 유형이다.' );

INSERT INTO  MBTI1DESC VALUES('ISFP', '의외로 게으른 편이라 주변 사람들이 놀란다.
이들은 누워있는 것을 가장 좋아한다.
체력이 항상 적은 편이라 복잡하고 책임감이 막중한 일은 피하고 싶어한다.
많은 유형중에 가장 무난한 성격으로 붙리는 이 유형은 대부분의 사람들과 무난하게 잘 지내는 편
사람들과 갈등을 빚는 과정 마저 체력이 소모되는 일이라고 생각해 과정 자체를 안만들려 함
한 번 마음을 준 상대와 오랜 관계를 유지하는 편이며 
의외로 냉철하고 현실적인 편이라 현실감각이 좋은 유형 중 하나이다.' );

INSERT INTO  MBTI1DESC VALUES('ISTP','모든 일을 귀찮아 하는 편이다.
시간 낭비를 가장 싫어하며 모든 일을 효율적이게 처리하려고 노력한다.
표정의 변화가 없어 주변 사람들에게 기분이 안좋냐는 말을 항상 듣는다. 
남에게 기본적으로 관심이 없으며 잘 휘둘리지 않는 편이다. 
굳이? 왜? 그럴 수 있지. 라는 말을 말버릇처럼 하고 모든 일을 물 흘러가듯 내버려둔다.
타인에게 잔소리나 충고를 듣는 것을 싫어하며 개인주의가 강함
집단 생활 보다는 모든 것을 혼자 처리하고 싶어 하는 유형이다.');

INSERT INTO  MBTI1DESC VALUES('ISFJ', '심성이 따뜻한 편이며 기억력이 좋고 세심한 편이라 사람 챙겨주기를 좋아한다. 
내향적인 편이나 사람들에게 잘 다가가며 거절을 잘 못한다.
계획적이지만 아주 부지런한 편은 아니다. 
조용한 편인 것 같으나 주변의 상황들을 자세히 알고 있고 눈치가 빠르다. 
예민한 편이라 분위기에 민감하다. 
실수하는 것을 극도로 꺼려해 모든 일을 완벽하게 처리하려고 노력한다.
한 번 눈 밖에 난 사람은 거들떠 보지 않으며 사람에 대한 기준이 엄격해 친해지기 어려울 수 있다.');

INSERT INTO  MBTI1DESC VALUES('ISTJ', '성실한 것으로 유명한 유형
우리나라의 대부분 사람들이 해당하는 유형이다.
정해진 루틴대로 살아가는 것을 선호하는 유형이며 그런 삶을 지루해 하지 않는다.
공과사 구분이 확실하며 감정적인 사람을 좋아하지 않는다. 
영혼 없이 리액션 하는 편이며 대체적으로 건강한 멘탈을 가지고 있다. 
자신이 맡은 바에 끝까지 책임을 지는 유형이며 그렇지 않은 사람을 싫어한다. 
융통성이 없다는 말을 많이 들으며 꽉 막힌 사고 방식이 단점이다.');


CREATE TABLE MBTI2TYPE(
    M2NO    NUMBER UNIQUE,              -- 번호 (1-16)
    M1TYPE  NVARCHAR2(10),              -- 유형1 (ENFP, ISTJ, ...)
    M2TYPE  NVARCHAR2(20) PRIMARY KEY,  -- 유형2 (호랑이송편, 부엉이빈대떡, ...)
    CONSTRAINT FK_MBTI2_M1TYPE FOREIGN KEY(M1TYPE) REFERENCES MBTI1TYPE(MTYPE)
);
/*
SELECT M2.M2TYPE, M2.M1TYPE, D1.M1DESC FROM MBTI2TYPE M2, MBTI1TYPE M1, MBTI1DESC D1
WHERE M2.M1TYPE = M1.MTYPE AND M2.M1TYPE = D1.M1TYPE AND M2.M1TYPE = 'ENFP';
*/
INSERT INTO MBTI2TYPE VALUES(1, 'ENFP', '너구리송편');
INSERT INTO MBTI2TYPE VALUES(2, 'ENTP', '여우송편');
INSERT INTO MBTI2TYPE VALUES(3, 'ENFJ', '강아지송편');
INSERT INTO MBTI2TYPE VALUES(4, 'ENTJ', '사자송편');
INSERT INTO MBTI2TYPE VALUES(5, 'ESFP', '펭귄송편');
INSERT INTO MBTI2TYPE VALUES(6, 'ESTP', '원숭이송편');
INSERT INTO MBTI2TYPE VALUES(7, 'ESFJ', '쿼카송편');
INSERT INTO MBTI2TYPE VALUES(8, 'ESTJ', '호랑이송편');
INSERT INTO MBTI2TYPE VALUES(9, 'INFP', '코알라송편');
INSERT INTO MBTI2TYPE VALUES(10, 'INTP', '늑대송편');
INSERT INTO MBTI2TYPE VALUES(11, 'INFJ', '부엉이송편');
INSERT INTO MBTI2TYPE VALUES(12, 'INTJ', '독수리송편');
INSERT INTO MBTI2TYPE VALUES(13, 'ISFP', '토끼송편');
INSERT INTO MBTI2TYPE VALUES(14, 'ISTP', '나무늘보송편');
INSERT INTO MBTI2TYPE VALUES(15, 'ISFJ', '사슴송편');
INSERT INTO MBTI2TYPE VALUES(16, 'ISTJ', '거북이송편');


CREATE TABLE MATCH(
    MNO     NUMBER,
    L1TYPE  NVARCHAR2(10),  -- USER의 MBTI 결과
    L2TYPE  NVARCHAR2(10),  -- L1TYPE과 잘 맞는 TYPE
    L3TYPE  NVARCHAR2(10),  -- L2TYPE과 잘 안 맞는 TYPE
    CONSTRAINT FK_L1TYPE FOREIGN KEY(L1TYPE) REFERENCES MBTI1TYPE(MTYPE)
);
INSERT INTO MATCH VALUES(1, 'ENFP', 'INTJ', 'ISTP');
INSERT INTO MATCH VALUES(2, 'ENTP' ,'INFJ', 'ISFP');
INSERT INTO MATCH VALUES(3, 'ENFJ', 'INFP', 'ISTJ');
INSERT INTO MATCH VALUES(4, 'ENTJ', 'INTP', 'INFJ');
INSERT INTO MATCH VALUES(5, 'ESFP', 'ISTJ', 'ENFJ');
INSERT INTO MATCH VALUES(6, 'ESTP', 'ISFJ', 'INFP');
INSERT INTO MATCH VALUES(7, 'ESFJ', 'ISTP', 'ENFP');
INSERT INTO MATCH VALUES(8, 'ESTJ', 'ISFP', 'INFJ');
INSERT INTO MATCH VALUES(9, 'INFP', 'INFP', 'ESTP');
INSERT INTO MATCH VALUES(10, 'INTP','ENTJ', 'ESFP');
INSERT INTO MATCH VALUES(11, 'INFJ', 'ENTP', 'ESTJ');
INSERT INTO MATCH VALUES(12, 'INTJ', 'ENFP', 'ESFJ');
INSERT INTO MATCH VALUES(13, 'ISFP', 'ESTJ', 'ENTP');
INSERT INTO MATCH VALUES(14, 'ISTP', 'ESFJ', 'ENFP');
INSERT INTO MATCH VALUES(15, 'ISFJ', 'ESTP', 'INFP');
INSERT INTO MATCH VALUES(16, 'ISTJ', 'ESFP', 'ENFJ');

/*
-- 잘 맞는 유형
SELECT D.L2TYPE, C.M2TYPE, B.M1DESC FROM MBTI1TYPE A, MBTI1DESC B, MBTI2TYPE C, MATCH D
WHERE B.M1TYPE = A.MTYPE AND C.M1TYPE = A.MTYPE AND D.L2TYPE = A.MTYPE AND D.L1TYPE = 'INTP';
-- 잘 안맞는 유형
SELECT D.L3TYPE, C.M2TYPE, B.M1DESC FROM MBTI1TYPE A, MBTI1DESC B, MBTI2TYPE C, MATCH D
WHERE B.M1TYPE = A.MTYPE AND C.M1TYPE = A.MTYPE AND D.L3TYPE = A.MTYPE AND D.L1TYPE = 'INTP';
*/

CREATE TABLE QUESTIONS(
    QNO     NUMBER PRIMARY KEY,
    QTYPE   NVARCHAR2(10),
    QDESC   NVARCHAR2(300) UNIQUE
);
INSERT INTO QUESTIONS VALUES(1, 'EI', '
당신이 친구들과 시내에 놀러갔는데 마침 그때 시내에 놀러온
백만유튜버 랄랄님이 반갑게 다가오며 손을 흔든다. 이때 당신은?

(1) 나까지 덩달아 신나서 격하게 오버하며 인사한다
(2) 속으론 너무 신기하지만 어색하게 인사를 한다
');

INSERT INTO QUESTIONS VALUES(2, 'EI', '
당신이 롯데월드 퍼레이드를 보고 있는데 이때 캐릭터 분장을 한 사람이 다가와서
사람들이 많은 중앙에서 당신의 손을 잡고 춤추자고 한다. 이때 당신은?

(1) 캐릭터 분장한 사람만큼 텐션을 올려서 스텝을 밟는다
(2) 살짝 웃으며 나름 열심히 스텝을 밟는다
');

INSERT INTO QUESTIONS VALUES(3, 'EI', '
인천일보아카데미에서 수업이 끝난 후 생각을 해보니 오늘은 평소보다 유독 시끄러운 날이었다.
사람들과 목청이 터져라 수다를 떤 날이다. 이때 당신은? 

(1) 이 신나는 기세를 이어서 학원 사람들과 끝나고 놀러간다
(2) 학원도 끝났고 기가 빨렸으니 집 가서 쉬어야겠다
');

INSERT INTO QUESTIONS VALUES(4, 'NS', '
당신은 디저트로 유명하다는 카페에 2시간동안 줄을 서서 입장하였다.
시킨 메뉴가 나와서 테이블로 가지고 가려고 보니 자리가 없어서
어쩔 수 없이 쟁반을 들고 2층을 오르고 있다. 이때 당신은?

(1) 맛있겠다 근데 들고 올라가다가 넘어지면 어떡하지?
(2) 맛있겠다라는 생각 뿐이다
');

INSERT INTO QUESTIONS VALUES(5, 'NS', '
당신은 친구들과 신나는 해외 여행을 가게 되었다.기대되는 비행기를 타고나니
더 들뜬 마음이다.이때 당신은?

(1) 만약 비행기가 추락하면 어쩌지.. 바다로 떨어지면 좋겠다 구조요청은 어떻게 해야하지?
(2) 도착까지 얼마나 걸리지? 좀 자야겠다..
');

INSERT INTO QUESTIONS VALUES(6, 'NS', '
바나나를 연상하면 떠오르는 것은?

(1) 원숭이.아 동물원 가고 싶다..아 맞다 내 친구 중에 원숭이 닮은 애 있는데 킥킥..
(2) 노랗다. 길다. 맛있겠다. 요즘 제철인가?
');

INSERT INTO QUESTIONS VALUES(7, 'FT', '
조별 과제를 끝낸 나에게 친구가 이렇게 말한다.
"너 그리 열심히 안 한 것 같았는데 결과가 너무 좋은데? 원래 타고났나봐"

(1) 그래도 나 나름 열심히 했는데..
(2) 이게 바로 내 클라스 ^^
');

INSERT INTO QUESTIONS VALUES(8, 'FT', '
다음 중 내가 더 화날 것 같은 친구는?

(1) 내가 자리 비운 사이 내 과제를 몰래 배껴 간 호진이
(2) 날 도와주려다가 내 과제에 실수로 커피를 엎어서 무용지물 만든 지영이
');

INSERT INTO QUESTIONS VALUES(9, 'FT', '
상대가 고백을 했다.이때 내가 상대에게 "생각해볼게"라고 했다.이 의미는?

(1) 상대가 상처 받을까 봐 나중에 거절해야지 OR 거절 의미
(2) 음 진짜 한 번 생각을 해봐야겠다
');

INSERT INTO QUESTIONS VALUES(10, 'PJ', '
당신은 친구랑 서울로 여행을 가기 위해 카톡으로 약속을 정했다.이때 약속의 형식은?

(1) ㅇㅇ시에 만나서 배고프면 근처에서 밥 먹고 배 안 고프면 주위 구경할 겸 돌아다녔다가 숙소 가자!
(2) ㅇㅇ시에 출발해서 도착하면 ㅇㅇ시니까 먼저 검색해둔 ㅇㅇ식당에 갔다가 ㅇㅇ시까지 숙소에 도착해서 짐 풀자!
');

INSERT INTO QUESTIONS VALUES(11, 'PJ', '
당신은 저번주부터 오늘을 방 청소날로 지정했고 드디어 그 날이 왔다.이때 당신은?

(1) 아 막상 당일 되니까 귀찮네..폰 조금 하다가 하거나 내일 해야겠다..
(2) 방청소 계획한 날이니까 귀찮아도 열심히 해야겠다
');

INSERT INTO QUESTIONS VALUES(12, 'PJ', '
당신이 짜놨던 계획에 대해 차질이 생겼습니다.이때 당신은?

(1) 뭐 그럴 수도 있지..아쉽지만 다음에 잘해야지..
(2) 아 진짜 스트레스 받네 내가 열심히 짠 계획인데..
');


CREATE TABLE MUSER(
    UNO     NUMBER PRIMARY KEY,
    UNAME   NVARCHAR2(10),
    U1TYPE  NVARCHAR2(10),
    U2TYPE  NVARCHAR2(10),
    UDATE   NVARCHAR2(20),
    CONSTRAINT FK_U1TYPE FOREIGN KEY (U1TYPE) REFERENCES MBTI1TYPE (MTYPE),
    CONSTRAINT FK_U2TYPE FOREIGN KEY (U2TYPE) REFERENCES MBTI2TYPE (M2TYPE)
);
/*
SELECT M.UNAME, M.U1TYPE, M.U2TYPE, D1.M1DESC FROM MUSER M, MBTI1DESC D1
WHERE D1.M1TYPE = M.U1TYPE AND M.UNO = ?;
*/
COMMIT;

 


 

Java Project / Package / Class 구성

 

 


 

MBTIDTO package

 

* getters & setters

MBTI1Desc

MBTI1Type

MBTI2Desc

MBTI2Type

MBTIUser

Questions

 


 

MBTIDAO package

 

DBConnection

package MBTIDAO;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBConnection {
    public static Connection DBConnect(){
        Connection con = null;
        String url = "jdbc:oracle:thin:@localhost:1521:xe";
        String user = "ICIA";
        String password = "1111";

        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            con = DriverManager.getConnection(url, user, password);
            System.out.println("DB 접속 성공!");
        } catch (ClassNotFoundException | SQLException e) {
            throw new RuntimeException(e);
        }

        return con;
    }
}

 

 

MBTISQL

package MBTIDAO;

import MBTIDTO.MBTIUser;

import javax.swing.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class MBTISQL {
    Scanner sc = new Scanner(System.in);
    Connection con;
    PreparedStatement pstmt;
    ResultSet rs;
    boolean run2 = true;
    boolean run3 = true;

    // 1. DB 접속 메소드
    public void connect() {
        con = DBConnection.DBConnect();
    }

    // 2. 번호 생성 메소드
    public int genNo() {
        int uNo = 0;
        String sql = "SELECT MAX(UNO) FROM MUSER";
        try {
            pstmt = con.prepareStatement(sql);
            rs = pstmt.executeQuery();
            if (rs.next()) {
                uNo = rs.getInt(1) + 1;
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return uNo;
    }

    // 3-1. 랜덤 index 배열 생성 메소드
    public List<Integer> randArrayI(int length) {
        List<Integer> list = new ArrayList<Integer>();
        int a = 0;
        boolean run = true;
        while (run) {
            a = (int) (((Math.random()) * length) + 1);
            list.add(a);
            if (list.size() == length) {
                run = false;
            }
        }
        run = true;
        while (run) {
            int cnt = 0;
            for (int i = 0; i < list.size() - 1; i++) {
                for (int j = i + 1; j < list.size(); j++) {
                    boolean run2 = true;
                    while (run2) {
                        if (list.get(i) == list.get(j)) {
                            cnt++;
                            a = (int) (((Math.random() * length) + 1));
                            list.set(j, a);
                        } else {
                            run2 = false;
                        }
                    }
                }
            }
            if (cnt == 0) {
                for (int i = 0; i < list.size(); i++) {
                    int temp = list.get(i);
                    list.set(i, temp - 1);
                }
                run = false;
            }
        }
        return list;
    }

    // 3-2. 길이 = length 인 랜덤 배열 생성 메소드
    public List<Integer> randArray1 (int length) {
        List<Integer> list = new ArrayList<Integer>();
        int a = 0;
        boolean run = true;
        while (run) {
            a = (int) (((Math.random()) * length) + 1);
            list.add(a);
            if (list.size() == length) {
                run = false;
            }
        }
        run = true;
        while (run) {
            int cnt = 0;
            for (int i = 0; i < list.size() - 1; i++) {
                for (int j = i + 1; j < list.size(); j++) {
                    boolean run2 = true;
                    while (run2) {
                        if (list.get(i) == list.get(j)) {
                            cnt++;
                            a = (int) (((Math.random() * length) + 1));
                            list.set(j, a);
                        } else {
                            run2 = false;
                        }
                    }
                }
            }
            if (cnt == 0) {
                run = false;
            }
        }
        return list;
    }

    // 3-3. 랜덤 배열 생성 메소드 2
    public List<Integer> randArray2 () {
        List<Integer> list = new ArrayList<Integer>();
        int qEI = 0;
        int qNS = 0;
        int qFT = 0;
        int qPJ = 0;
        List<Integer> listEI = new ArrayList<Integer>();
        List<Integer> listNS = new ArrayList<Integer>();
        List<Integer> listFT = new ArrayList<Integer>();
        List<Integer> listPJ = new ArrayList<Integer>();
        List<Integer> listMix = new ArrayList<Integer>();
        List<Integer> listSum = new ArrayList<Integer>();
        String sql1 = "SELECT QNO FROM QUESTIONS WHERE QTYPE = 'EI'";
        String sql2 = "SELECT QNO FROM QUESTIONS WHERE QTYPE = 'NS'";
        String sql3 = "SELECT QNO FROM QUESTIONS WHERE QTYPE = 'FT'";
        String sql4 = "SELECT QNO FROM QUESTIONS WHERE QTYPE = 'PJ'";
        try {
            pstmt = con.prepareStatement(sql1);
            rs = pstmt.executeQuery();
            while (rs.next()) {
                listEI.add(rs.getInt(1));
            }
            pstmt = con.prepareStatement(sql2);
            rs = pstmt.executeQuery();
            while (rs.next()) {
                listNS.add(rs.getInt(1));
            }
            pstmt = con.prepareStatement(sql3);
            rs = pstmt.executeQuery();
            while (rs.next()) {
                listFT.add(rs.getInt(1));
            }
            pstmt = con.prepareStatement(sql4);
            rs = pstmt.executeQuery();
            while (rs.next()) {
                listPJ.add(rs.getInt(1));
            }
//            System.out.println(listEI);
//            System.out.println(listNS);
//            System.out.println(listFT);
//            System.out.println(listPJ);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        listMix = randArrayI(listEI.size());
        for (int i = 0; i < listEI.size(); i++) {
            int tempi = listEI.get(i);
            int tempj = listEI.get(listMix.get(i));
            listEI.set(i, tempj);
            listEI.set(listMix.get(i), tempi);
        }
        listMix = randArrayI(listNS.size());
        for (int i = 0; i < listNS.size(); i++) {
            int tempi = listNS.get(i);
            int tempj = listNS.get(listMix.get(i));
            listNS.set(i, tempj);
            listNS.set(listMix.get(i), tempi);
        }
        listMix = randArrayI(listFT.size());
        for (int i = 0; i < listFT.size(); i++) {
            int tempi = listFT.get(i);
            int tempj = listFT.get(listMix.get(i));
            listFT.set(i, tempj);
            listFT.set(listMix.get(i), tempi);
        }
        listMix = randArrayI(listPJ.size());
        for (int i = 0; i < listPJ.size(); i++) {
            int tempi = listPJ.get(i);
            int tempj = listPJ.get(listMix.get(i));
            listPJ.set(i, tempj);
            listPJ.set(listMix.get(i), tempi);
        }
//        System.out.println(listEI);
//        System.out.println(listNS);
//        System.out.println(listFT);
//        System.out.println(listPJ);

        for (int i = 0; i < 3; i++) {
            listSum.add(listEI.get(i));
        }
        for (int i = 0; i < 3; i++) {
            listSum.add(listNS.get(i));
        }
        for (int i = 0; i < 3; i++) {
            listSum.add(listFT.get(i));
        }
        for (int i = 0; i < 3; i++) {
            listSum.add(listPJ.get(i));
        }
//        System.out.println(listSum);
        listMix = randArrayI(listSum.size());
        for (int i = 0; i < listSum.size(); i++) {
            int tempi = listSum.get(i);
            int tempj = listSum.get(listMix.get(i));
            listSum.set(i, tempj);
            listSum.set(listMix.get(i), tempi);
        }
        list = listSum;
        System.out.println(listSum);
        return list;
    }

    // 3-4. 질문 메소드
    public String questions(int i) {
        String ques = null;
        String sql = "SELECT QDESC FROM QUESTIONS WHERE QNO = ?";
        try {
            pstmt = con.prepareStatement(sql);
            pstmt.setInt(1, i);
            rs = pstmt.executeQuery();
            if (rs.next()) {
                System.out.println("\n----------------------------------------------------------------");
                ques = rs.getString(1);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return ques;
    }

    // 3-5. MBTI 유형 분류 메소드
    public String classify(List<Integer> list) {
        String newType = "";
        ArrayList<Integer> uType = new ArrayList<Integer>();
        String ans = null;
        int cntEI = 0;
        int cntNS = 0;
        int cntFT = 0;
        int cntPJ = 0;
        int QEI = 0;
        int QNS = 0;
        int QFT = 0;
        int QPJ = 0;
        boolean run = true;
        int j = 0;

        String sql1 = "SELECT MAX(QNO) FROM QUESTIONS WHERE QTYPE = 'EI'";
        String sql2 = "SELECT MAX(QNO) FROM QUESTIONS WHERE QTYPE = 'NS'";
        String sql3 = "SELECT MAX(QNO) FROM QUESTIONS WHERE QTYPE = 'FT'";
        String sql4 = "SELECT MAX(QNO) FROM QUESTIONS WHERE QTYPE = 'PJ'";

        try {
            pstmt = con.prepareStatement(sql1);
            rs = pstmt.executeQuery();
            if (rs.next()) {
                QEI = rs.getInt(1);
            }
            pstmt = con.prepareStatement(sql2);
            rs = pstmt.executeQuery();
            if (rs.next()) {
                QNS = rs.getInt(1);
            }
            pstmt = con.prepareStatement(sql3);
            rs = pstmt.executeQuery();
            if (rs.next()) {
                QFT = rs.getInt(1);
            }
            pstmt = con.prepareStatement(sql4);
            rs = pstmt.executeQuery();
            if (rs.next()) {
                QPJ = rs.getInt(1);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

        while (run) {
            if (j == list.size()) {
                run = false;
                break;
            }
            System.out.println(questions(list.get(j)));
            System.out.print("답변선택 (1 또는 2) >> ");
            ans = sc.next();
            switch (ans) {
                case "1":
                    if (list.get(j) <= QEI) {
                        cntEI++;
                        j++;
                    } else if (QEI < list.get(j) && list.get(j) <= QNS) {
                        cntNS++;
                        j++;
                    } else if (QNS < list.get(j) && list.get(j) <= QFT) {
                        cntFT++;
                        j++;
                    } else if (QFT < list.get(j) && list.get(j) <= QPJ) {
                        cntPJ++;
                        j++;
                    }
                    break;
                case "2":
                    j++;
                    break;
                default:
                    System.out.println("1 또는 2 중에 입력하세요...");
                    break;
            }
        }

        uType.add(cntEI);
        uType.add(cntNS);
        uType.add(cntFT);
        uType.add(cntPJ);

        for (int i = 0; i < uType.size(); i++) {
            if (i == 0) {
                if (uType.get(i) == 3 || uType.get(i) == 2) {
                    newType += "E";
                } else {
                    newType += "I";
                }
            } else if (i == 1) {
                if (uType.get(i) == 3 || uType.get(i) == 2) {
                    newType += "N";
                } else {
                    newType += "S";
                }
            } else if (i == 2) {
                if (uType.get(i) == 3 || uType.get(i) == 2) {
                    newType += "F";
                } else {
                    newType += "T";
                }
            } else if (i == 3) {
                if (uType.get(i) == 3 || uType.get(i) == 2) {
                    newType += "P";
                } else {
                    newType += "J";
                }
            }
        }
        return newType;
    }

    // 3-6. m2type 정의 메소드
    public String newMbti(String mbti1) {
        String m2type = null;
        String sql = "SELECT M2TYPE FROM MBTI2TYPE WHERE M1TYPE = ?";
        try {
            pstmt = con.prepareStatement(sql);
            pstmt.setString(1, mbti1);
            rs = pstmt.executeQuery();
            if (rs.next()) {
                m2type = rs.getString(1);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return m2type;
    }

    // 4. muser update 메소드
    public void updateMuser(MBTIUser muser) {
        String sql = "INSERT INTO MUSER VALUES(?, ?, ?, ?, ?)";
        try {
            pstmt = con.prepareStatement(sql);
            pstmt.setInt(1, muser.getuNo());
            pstmt.setString(2, muser.getuName());
            pstmt.setString(3, muser.getMbti1());
            pstmt.setString(4, muser.getMbti2());
            pstmt.setString(5, muser.getDate());
            int result = pstmt.executeUpdate();

            if (result < 0) {
                System.out.println("검사 실패! 에러 발생...");
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    // 5-1. 결과 출력 메소드
    public void selectResult(MBTIUser muser) {
        String sql = "SELECT M2.M2TYPE, M2.M1TYPE, D1.M1DESC FROM MBTI2TYPE M2, MBTI1TYPE M1, MBTI1DESC D1\n" +
                "WHERE M2.M1TYPE = M1.MTYPE AND M2.M1TYPE = D1.M1TYPE AND M2.M1TYPE = ?";

        try {
            pstmt = con.prepareStatement(sql);
            pstmt.setString(1, muser.getMbti1());
            rs = pstmt.executeQuery();
            while (rs.next()) {
                System.out.printf("\n%s 님! 당신의 유형은 '%s(%s)'으로 나왔습니다!\n당신은 아마 이런 사람일지도..?\n"
                        , muser.getuName(), rs.getString(1), rs.getString(2));
                System.out.println("------------------------------------------------------------------------------");
                System.out.println(rs.getString(3));
                System.out.println("------------------------------------------------------------------------------\n");
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    // 5-2. muser table is null 확인 메소드
    public boolean isNull() {
        boolean isnull = false;
        String sql = "SELECT * FROM MUSER";
        try {
            pstmt = con.prepareStatement(sql);
            rs = pstmt.executeQuery();
            if (!rs.next()) {
                isnull = true;
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return isnull;
    }

    // 5-3. 검사 결과 목록 메소드
    public boolean selectUser() {
        boolean checkCnt = false;
        if (isNull()) {     // 목록이 비어있는지 확인
            System.out.println("조회할 회원이 없습니다...");
        } else {
            checkCnt = true;
            String sql1 = "SELECT RPAD(UNAME, 10) FROM MUSER";
            String sql2 = "SELECT UNO, U1TYPE, U2TYPE, UDATE FROM MUSER";
            String uname = null;
            try {
                pstmt = con.prepareStatement(sql1);
                rs = pstmt.executeQuery();
                if (rs.next()) {
                    uname = rs.getString(1);
                }
                pstmt = con.prepareStatement(sql2);
                rs = pstmt.executeQuery();
                System.out.println("\nNo.\t\tName\t\tType\t\t\t\tDate");
                System.out.println("===========================================================");
                while (rs.next()) {
                    System.out.printf("[%d]\t\t%s\t%s(%s)   \t%s\n", rs.getInt(1), uname, rs.getString(3), rs.getString(2), rs.getString(4));
                }
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        return checkCnt;
    }

    // 5-4. 다른 user의 검사결과 보기
    public void userInfo(int no) {
        String sql = "SELECT M.UNAME, M.U1TYPE, M.U2TYPE, D1.M1DESC FROM MUSER M, MBTI1DESC D1\n" +
                "WHERE D1.M1TYPE = M.U1TYPE AND M.UNO = ?";
        try {
            pstmt = con.prepareStatement(sql);
            pstmt.setInt(1, no);
            rs = pstmt.executeQuery();
            if (!rs.next()) {
                System.out.println("조회할 회원이 없습니다...");
            } else {
                System.out.printf("\n%s 님의 정보입니다.\n유형 : %s(%s) \n", rs.getString(1), rs.getString(3), rs.getString(2));
                System.out.println("------------------------------------------------------------------------------");
                System.out.printf("%s\n\n", rs.getString(4));
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    // 6-1. 잘 맞는 mbti 메소드
    public void match1(MBTIUser muser) {
        String sql = "SELECT D.L2TYPE, C.M2TYPE, B.M1DESC FROM MBTI1TYPE A, MBTI1DESC B, MBTI2TYPE C, MATCH D " +
                "WHERE B.M1TYPE = A.MTYPE AND C.M1TYPE = A.MTYPE AND D.L2TYPE = A.MTYPE AND D.L1TYPE = ?";
        try {
            pstmt = con.prepareStatement(sql);
            pstmt.setString(1, muser.getMbti1());
            rs = pstmt.executeQuery();
            while (rs.next()) {
                System.out.println("\nMBTI : " + rs.getString(1));
                System.out.println("송편 이름 : " + rs.getString(2));
                System.out.println("--------------------------------이 유형의 성격은--------------------------------");
                System.out.println(rs.getString(3));
                System.out.println("------------------------------------------------------------------------------\n");
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    // 6-2. 잘 안맞는 mbti 메소드
    public void match2(MBTIUser muser) {
        String sql = "SELECT D.L3TYPE, C.M2TYPE, B.M1DESC FROM MBTI1TYPE A, MBTI1DESC B, MBTI2TYPE C, MATCH D " +
                "WHERE B.M1TYPE = A.MTYPE AND C.M1TYPE = A.MTYPE AND D.L3TYPE = A.MTYPE AND D.L1TYPE = ?";
        try {
            pstmt = con.prepareStatement(sql);
            pstmt.setString(1, muser.getMbti1());
            rs = pstmt.executeQuery();
            while (rs.next()) {
                System.out.println("\nMBTI : " + rs.getString(1));
                System.out.println("송편 이름 : " + rs.getString(2));
                System.out.println("--------------------------------이 유형의 성격은--------------------------------");
                System.out.println(rs.getString(3));
                System.out.println("------------------------------------------------------------------------------\n");
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

 


 

MBTIMain package

 

MBTIMain

package MBTIMain;

import MBTIDAO.MBTISQL;
import MBTIDTO.MBTIUser;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Scanner;

public class MBTIMain {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        MBTIUser muser = new MBTIUser();
        MBTISQL sql = new MBTISQL();
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy년MM월dd일 hh:mm:ss");
        String date = dtf.format(LocalDateTime.now());
        sql.connect();        // DB 접속
        boolean run1 = true;

        while (run1) {
            boolean run2 = true;
            System.out.println("===============성격검사===============");
            System.out.println("[1]테스트      [2]결과조회     [3]종료");
            System.out.println("=====================================");
            System.out.print("메뉴선택 > ");
            int menu = sc.nextInt();

            switch (menu) {
                case 1:
                    muser.setuNo(sql.genNo());
                    muser.setDate(date);
                    System.out.println("당신의 이름은?");
                    muser.setuName(sc.next());
                    System.out.printf("안녕하세요, %s님! 지금부터 '4간지st' <성격유형검사>를 시작합니다!\n", muser.getuName());
                    String mbti1 = sql.classify(sql.randArray2());
                    muser.setMbti1(mbti1);
                    muser.setMbti2(sql.newMbti(mbti1));
                    sql.updateMuser(muser);
                    sql.selectResult(muser);

                    while (run2) {
                        System.out.println("=========================궁합보기=========================");
                        System.out.println("[1]나와 잘 맞는♥ 궁합은?  [2]나와 파국인♨ 궁합은?   [3]종료");
                        System.out.println("==========================================================");
                        System.out.print("메뉴선택 > ");
                        int se = sc.nextInt();
                        switch (se) {
                            case 1:
                                sql.match1(muser);
                                break;
                            case 2:
                                sql.match2(muser);
                                break;
                            case 3:
                                System.out.println("검사를 종료 합니다..");
                                run2 = false;
                                break;
                            default:
                                System.out.println("1 또는 2 중에 선택하세요");
                        }
                    }
                    break;
                case 2:
                    if (sql.selectUser()) {
                        System.out.print("조회하고 싶은 사람의 번호를 입력하세요 \n>> ");
                        int no = sc.nextInt();
                        sql.userInfo(no);
                        break;
                    } else {
                        break;
                    }
                case 3:
                    System.out.println("테스트를 종료합니다...");
                    run1 = false;
                    break;
                default:
                    System.out.println("1 또는 2 중에 선택하세요...");
                    break;
            }
        }
    }
}