본문으로 바로가기
728x90
반응형

[Java] 123. HikariCP 라이브러리를 프로젝트에 추가하기


 

https://github.com/brettwooldridge/HikariCP

 

GitHub - brettwooldridge/HikariCP: 光 HikariCP・A solid, high-performance, JDBC connection pool at last.

光 HikariCP・A solid, high-performance, JDBC connection pool at last. - brettwooldridge/HikariCP

github.com

 

https://mvnrepository.com/artifact/com.zaxxer/HikariCP

 

 

*HikariCP 라이브러리 사용을 위해 다른 라이브러리 설정이 필요하다.

 

https://mvnrepository.com/artifact/org.slf4j/slf4j-api/2.0.0-alpha5

 

 

package com.tenco.quiz.ver3;


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

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

public class DBConnectionManager{
	
	private static HikariDataSource dataSource;

    private static final String URL = "jdbc:mysql://localhost:3306/quizdb?serverTimezone=Asia/Seoul";
    private static final String USER = "root";
    private static final String PASSWORD = "asd123";

    // static {} 블록 - 정적 초기화 블록
    // 클래스가 처음 로드될 때 한 번 실행 됩니다.
    // 정적 변수의 초기화나 복잡한 초기화 작업을 수행할 때 사용
    // static {} 블록안에 예외를 던질 수도 있다.
    static {
    	// HikariCP 를 사용하기 위한 설정이 필요하다.
    	// HikariCPconfig --> 제공해줘서 이 클래스를 활용해서 설정을 상세히 할 수 있다.
    	HikariConfig config=new HikariConfig();
    	config.setJdbcUrl(URL);
    	config.setUsername(USER);
    	config.setPassword(PASSWORD);
    	config.setMaximumPoolSize(10); // 최대 연결 수 설정 10

    	dataSource = new HikariDataSource(config);
    }
    
    public static Connection getConnection() throws SQLException{
    	System.out.println("HikariCP를 사용한 Data Source ");
    	return dataSource.getConnection();
    }
    
    
    // 테스트 코드 확인 
    public static void main(String[] args) throws SQLException {
		
    	Connection conn = DBConnectionManager.getConnection();
    	
	} // end of main
    
    
 // 기본 JDBC 드라이버 사용 버전
 //  static Connection getConnection() throws SQLException{
 //           return DriverManager.getConnection(URL,USER,PASSWORD);
      
}
package com.tenco.quiz.ver3;

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;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

public class QuizGame {


	public static void main(String[] args) {
		
		try (Connection conn = DBConnectionManager.getConnection();
				Scanner scanner = new Scanner(System.in)) {

			while (true) {
				printMenu();

				// 블로킹 처리
				int choice = scanner.nextInt(); // 블로킹

				// 실행의 흐름
				if (choice == 1) {
					// 퀴즈 문제 추가
					// 사용자 퀴즈와 답을 입력받아야 함
					// connection을 활용해서 query를 날려야 한다.
					addQuizQuestion(conn, scanner);

				} else if (choice == 2) {
					// 퀴즈 문제 조회
					viewQuizQuestion(conn);
					
				} else if (choice == 3) {
					// 퀴즈 게임 시작
					playQuizGame(conn,scanner);
					
				} else if (choice == 4) {
					// 게임 종료
					System.out.println("게임을 종료합니다.");
					return;
					
				} else {
					System.out.println("잘못된 값입니다. 다시 입력해 주세요.");

				}

			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	} // end of main


	private static void printMenu() {
		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("옵션을 선택하세요.");
	}
	
	private static void playQuizGame(Connection conn,Scanner sc) {
		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);
				// 버그처리
				sc.nextLine();
				System.out.println("정답을 입력하세요 : ");
				String userAnswer = sc.nextLine();
				if(userAnswer.equalsIgnoreCase(answer)) {
					System.out.println("정답입니다! 점수 + 1");
					System.out.println("퀴즈 정답 : " + answer);
				} else {
					System.out.println("틀렸습니다!");
					System.out.println("퀴즈 정답 : " + answer);
				}
			} else {
				System.out.println("죄송합니다 아직 퀴즈 문제를 만들고 있습니다.");
			}
		} 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();
			while(resultSet.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) {
			e.printStackTrace();
		}
		
		
		
	}

	private static void addQuizQuestion(Connection conn, Scanner sc) {
		
		System.out.println("퀴즈 문제를 입력하세요: ");
		sc.nextLine();
		String question = sc.nextLine();
		System.out.println("퀴즈 정답을 입력하세요: ");
		String answer = sc.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();
		}
		
	}

	
	
}
728x90
반응형