본문 바로가기
Java/네트워크 통신

[Java] 120. JDBC를 활용한 CRUD와 SOLID 원칙 (1)

글: Song hyun 2024. 6. 14.
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
반응형