- [Java] 120. JDBC를 활용한 CRUD와 SOLID 원칙 (1)2024년 06월 14일
- Song hyun
- 작성자
- 2024.06.14.:46
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 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)