728x90
반응형
[Java] 120. JDBC를 활용한 CRUD와 SOLID 원칙 (1)
콘솔을 활용한 퀴즈 게임 만들기
콘솔을 활용한 퀴즈 게임 만들기
*설계 과정(사이클)
- (1) DB, 테이블 펄스 (DB부터 설계한다.)
- (2) 기본 데이터 입력(정규화)
- (3) 자바측 라이브러리 설정
- (4) 자바측 기능 구현 및 테스트
- (5) 리팩토링
(1) DB, 테이블 펄스 (DB부터 설계한다.)
-- 데이터베이스 생성
create database quizdb;
use quizdb;
create table quiz(
ID int auto_increment primary key,
question varchar(500) not null,
answer varchar(500) not null
);
desc quiz;
(2) 기본 데이터 입력(정규화)
-- 기본 샘플 데이터 입력
insert into quiz(question,answer)
values('대한민국의 수도는?','서울'),
('한반도의 남쪽에 위치한 나라는?','대한민국'),
('세계에서 가장 높은 산은?','에베레스트'),
('태양계의 세 번째 행성은?','지구'),
('한국의 전통 명절 중 하나로, 음력 8월 15일에 해당하는 날은?','추석'),
('임진왜란 종전 년도는?','1598년'),
('고기압과 저기압에서 바람이 부는 방향은?','고기압');
select*from quiz;
(3) 자바측 라이브러리 설정
*프로젝트 파일 생성 및 필요한 라이브러리들을 Class.Path에 등록한다.
(4) 자바측 기능 구현 및 테스트
*일반적으로 패키지명은 (회사이름)+(프로젝트이름) <-으로 지어진다.
기본적인 실행의 흐름을 만든다.
*Final의 세 가지 용법
- 변수에 사용시 -> 상수 (초기화 불가)
- 메서드에 사용시 -> 상속 시 오버라이드 불가
- 클래스에 사용시 -> 상속 불가
package com.tenco.quiz;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Scanner;
public class QuizGame {
// 준비물
private static final String URL = "jdbc:mysql://localhost:3306/quizdb?serverTimezon=Asia/Seoul";
private static final String USER = "root";
private static final String PASSWORD = "asd123";
public static void main(String[] args) {
// JDBC 드라이버 로드 <- 인터페이스 <--구현 클래스가 필요하다.
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
return;
}
try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Scanner scanner = new Scanner(System.in);) {
while(true) {
System.out.println();
System.out.println("-------------------------------");
System.out.println("1. 퀴즈 문제 추가");
System.out.println("2. 퀴즈 문제 조회");
System.out.println("3. 퀴즈 게임 시작");
System.out.println("4. 종료");
System.out.println("옵션을 선택하세요.");
// 블로킹 처리
int choice=scanner.nextInt(); // 블로킹
// 실행의 흐름
if(choice==1) {
// 퀴즈 문제 추가
} else if(choice==2) {
// 퀴즈 문제 조회
} else if(choice==3) {
// 퀴즈 게임 시작
} else if(choice==4) {
// 게임 종료
System.out.println("게임을 종료합니다.");
return;
}else {
System.out.println("잘못된 값입니다. 다시 입력해 주세요.");
}
}
} catch (Exception e) {
// TODO: handle exception
}
} // end of main
(1) 퀴즈 생성 메서드
private static void addQuizQuestion(Connection conn, Scanner scanner) {
System.out.println("퀴즈 문제를 입력하세요: ");
scanner.nextLine();
String question = scanner.nextLine();
System.out.println("퀴즈 정답을 입력하세요: ");
String answer = scanner.nextLine();
String sql = "insert into quiz(question,answer) values(?,?) ";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1,question);
pstmt.setString(2, answer);
int rowsInsertedCount=pstmt.executeUpdate();
System.out.println("추가한 행의 수 : "+rowsInsertedCount);
} catch (SQLException e) {
e.printStackTrace();
}
}
(2) 퀴즈 조회 메서드
private static void viewQuizQuestion(Connection conn) {
String sql="select * from quiz";
try (PreparedStatement pstmt= conn.prepareStatement(sql);){
ResultSet resultSet = pstmt.executeQuery(); // ResultSet을 반환한다.
while(resultSet.next()) { // next:다음 값 반환
System.out.println("문제 ID : "+resultSet.getInt("id"));
System.out.println("문제 : "+resultSet.getString("question"));
System.out.println("정답 : "+resultSet.getString("answer"));
if(!resultSet.isLast()) {
System.out.println();
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
(3) 퀴즈 게임 시작 메서드
private static void playQuizQuestion(Connection conn, Scanner scanner) {
String sql= "select*from quiz order by rand() limit 1 ";
try (PreparedStatement pstmt=conn.prepareStatement(sql)){
ResultSet rs = pstmt.executeQuery();
if(rs.next()) {
String question=rs.getString("question");
String answer=rs.getString("answer");
System.out.println("퀴즈 문제 : "+question);
//버그 처리
scanner.nextLine();
System.out.print("당신의 답: ");
String userAnswer=scanner.nextLine();
if(userAnswer.equalsIgnoreCase(answer)) {
System.out.println("정답입니다! 점수를 얻었습니다.");
} else {
System.out.println("오답입니다.");
System.out.println("퀴즈 정답 : "+answer);
}
} else {
System.out.println("죄송합니다. 아직 퀴즈 문제를 만들고 있습니다.");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
*전체 코드
package com.tenco.quiz.ver1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
import com.mysql.cj.x.protobuf.MysqlxPrepare.Execute;
public class QuizGame {
// 준비물
private static final String URL = "jdbc:mysql://localhost:3306/quizdb?serverTimezon=Asia/Seoul";
private static final String USER = "root";
private static final String PASSWORD = "asd123";
public static void main(String[] args) {
// JDBC 드라이버 로드 <- 인터페이스 <--구현 클래스가 필요하다.
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
return;
}
try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Scanner scanner = new Scanner(System.in);) {
while (true) {
System.out.println();
System.out.println("-------------------------------");
System.out.println("1. 퀴즈 문제 추가");
System.out.println("2. 퀴즈 문제 조회");
System.out.println("3. 퀴즈 게임 시작");
System.out.println("4. 종료");
System.out.println("옵션을 선택하세요.");
// 블로킹 처리
int choice = scanner.nextInt(); // 블로킹
// 실행의 흐름
if (choice == 1) {
// 퀴즈 문제 추가
// 사용자 퀴즈와 답을 입력받아야 함
// connection을 활용해서 query를 날려야 한다.
addQuizQuestion(conn, scanner);
} else if (choice == 2) {
// 퀴즈 문제 조회
viewQuizQuestion(conn);
} else if (choice == 3) {
// 퀴즈 게임 시작
playQuizQuestion(conn,scanner);
} else if (choice == 4) {
// 게임 종료
System.out.println("게임을 종료합니다.");
return;
} else {
System.out.println("잘못된 값입니다. 다시 입력해 주세요.");
}
}
} catch (Exception e) {
// TODO: handle exception
}
} // end of main
private static void addQuizQuestion(Connection conn, Scanner scanner) {
System.out.println("퀴즈 문제를 입력하세요: ");
scanner.nextLine();
String question = scanner.nextLine();
System.out.println("퀴즈 정답을 입력하세요: ");
String answer = scanner.nextLine();
String sql = "insert into quiz(question,answer) values(?,?) ";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1,question);
pstmt.setString(2, answer);
int rowsInsertedCount=pstmt.executeUpdate();
System.out.println("추가한 행의 수 : "+rowsInsertedCount);
} catch (SQLException e) {
e.printStackTrace();
}
}
private static void viewQuizQuestion(Connection conn) {
String sql="select * from quiz";
try (PreparedStatement pstmt= conn.prepareStatement(sql);){
ResultSet resultSet = pstmt.executeQuery(); // ResultSet을 반환한다.
while(resultSet.next()) { // next:다음 값 반환
System.out.println("문제 ID : "+resultSet.getInt("id"));
System.out.println("문제 : "+resultSet.getString("question"));
System.out.println("정답 : "+resultSet.getString("answer"));
if(!resultSet.isLast()) {
System.out.println();
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static void playQuizQuestion(Connection conn, Scanner scanner) {
String sql= "select*from quiz order by rand() limit 1 ";
try (PreparedStatement pstmt=conn.prepareStatement(sql)){
ResultSet rs = pstmt.executeQuery();
if(rs.next()) {
String question=rs.getString("question");
String answer=rs.getString("answer");
System.out.println("퀴즈 문제 : "+question);
//버그 처리
scanner.nextLine();
System.out.print("당신의 답: ");
String userAnswer=scanner.nextLine();
if(userAnswer.equalsIgnoreCase(answer)) {
System.out.println("정답입니다! 점수를 얻었습니다.");
} else {
System.out.println("오답입니다.");
System.out.println("퀴즈 정답 : "+answer);
}
} else {
System.out.println("죄송합니다. 아직 퀴즈 문제를 만들고 있습니다.");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
728x90
반응형
'Java > 네트워크 통신' 카테고리의 다른 글
[Java] 122. JDBC 성능 최적화 (0) | 2024.06.17 |
---|---|
[Java] 121. JDBC를 활용한 CRUD와 SOLID 원칙 (2) (0) | 2024.06.14 |
[Java] 119. 트랜잭션과 배치 처리 (0) | 2024.06.13 |
[Java] 118. 코드 예제 : 트랜잭션을 이용해 MySQL 쿼리 내부에 데이터 생성하기 (0) | 2024.06.12 |
[Java] 117. 트랜잭션의 개념과 트랜잭션 관리 (0) | 2024.06.12 |