본문 바로가기
Framework (Backend)/Javalin

(Java) Javalin : DB(MySQL) 붙여보기

by 가우리언 2024. 12. 13.
728x90
반응형

 

이번에는 fastify 프레임워크에 MySQL 을 붙여서 동작시켜보자. https://gauryan.tistory.com/241 을 참고하여 MySQL을 설치하기 바랍니다.

이제, mysql 을 이용해서 DB 서버에 접속해보자. mysql -u root -p 라고 입력하고, 비밀번호(test123)까지 입력해보자.

일단 새로운 User를 하나 생성해봅시다.

-- CREATE USER '아이디'@'%' IDENTIFIED BY '비밀번호';
CREATE USER 'test_user'@'%' IDENTIFIED BY 'test123';

자... 그러면... 이제 Database 를 생성해봅시다.

-- CREATE DATABASE 디비이름;
CREATE DATABASE test_db;

test_user 가 test_db 를 사용할 수 있도록 권한을 설정해보자.

-- GRANT ALL PRIVILEGES ON 디비이름.* to 사용자@'%';
GRANT ALL PRIVILEGES ON test_db.* to test_user@'%';

일단 exit 로 mysql 을 빠져나온다. mysql에 test_user로 test_db에 재접속해봅니다.

테스트용으로 테이블을 생성해봅시다.

CREATE TABLE TB_ADMIN
(
    ADMIN_NO INT AUTO_INCREMENT NOT NULL,
    LOGIN_ID VARCHAR(20) NOT NULL UNIQUE,
    PASSWD VARCHAR(20) NOT NULL,
    NICK VARCHAR(20) NOT NULL,
    EMAIL VARCHAR(40),
    PRIMARY KEY (ADMIN_NO)
);

테스용 데이터를 2개 넣어보겠습니다.

INSERT INTO TB_ADMIN(LOGIN_ID, PASSWD, NICK, EMAIL)
VALUES('honggildong', 'ajtwlddl', '홍길동', 'hgd@gmail.com');
 
INSERT INTO TB_ADMIN(LOGIN_ID, PASSWD, NICK, EMAIL)
VALUES('jangnara', 'dlQmsdl', '장나라', 'jnr@gmail.com');

스토어드 프로시저도 하나 만들어봅시다.

DELIMITER $$
CREATE PROCEDURE SP_L_ADMIN()
BEGIN
    SELECT ADMIN_NO, LOGIN_ID, PASSWD, NICK, EMAIL FROM TB_ADMIN;
END $$
DELIMITER;

DB에 접속해서 해당 스토어드 프로시져 호출이 잘 되는지도 확인해 봅시다.

 

 

여기까지 해서, Database 쪽은 준비가 되었습니다. 이제, Javalin 에서 MySQL 연결부터 조회하는 것까지 해봅시다. ORM 같은 것은 사용하지 않고, 쌩 SQL과 Stored Procedure 를 이용하는 법을 알아봅니다.

우선, build.gradle 파일을 열어서 다음을 추가해줍니다. HikariCP 는 Connection Pool 모듈이고, 다른 하나는 MySQL JDBC 드라이버 입니다.

implementation "com.zaxxer:HikariCP:6.0.0"
implementation "com.mysql:mysql-connector-j:9.1.0"

config.properties 파일에는 아래 내용을 추가해줍니다. DB연결을 위한 설정사항들입니다.

TEST_DB_CONFIG__JDBC_URL = jdbc:mysql://localhost:3306/test_db
TEST_DB_CONFIG__USERNAME = test_user
TEST_DB_CONFIG__PASSWORD = test123
TEST_DB_CONFIG__DRIVER_CLASS_NAME = com.mysql.cj.jdbc.Driver
TEST_DB_CONFIG__MINIMUM_IDLE = 10
TEST_DB_CONFIG__MAXIMUM_POOL_SIZE = 10

japi 폴더 아래에 model 이라는 폴더를 만들고, 그 안에 MysqlTest.java 파일을 생성합니다.

MysqlTest.java 의 내용은 다음과 같다.

package japi.model;

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

import java.sql.*;

import japi.util.Common;

public class MysqlTest {
    private static HikariConfig config = new HikariConfig();
    private static HikariDataSource ds;

    static {
        config.setJdbcUrl(Common.getProperties("TEST_DB_CONFIG__JDBC_URL"));
        config.setUsername(Common.getProperties("TEST_DB_CONFIG__USERNAME"));
        config.setPassword(Common.getProperties("TEST_DB_CONFIG__PASSWORD"));
        config.setDriverClassName(Common.getProperties("TEST_DB_CONFIG__DRIVER_CLASS_NAME"));
        config.setMinimumIdle(Integer.parseInt(Common.getProperties("TEST_DB_CONFIG__MINIMUM_IDLE")));
        config.setMaximumPoolSize(Integer.parseInt(Common.getProperties("TEST_DB_CONFIG__MAXIMUM_POOL_SIZE")));
        config.addDataSourceProperty("cachePrepStmts", "true");
        config.addDataSourceProperty("prepStmtCacheSize", "250");
        config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
        ds = new HikariDataSource(config);
    }

    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }

    public static String getAdminList() {
        String result = "";
        Connection conn = null;
        Statement stmt = null;

        try {
            conn = getConnection();
            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT ADMIN_NO, LOGIN_ID, PASSWD, NICK, EMAIL FROM TB_ADMIN");
            while (rs.next()) {
                String admin_no = rs.getString("admin_no");
                String login_id = rs.getString("login_id");
                String passwd = rs.getString("passwd");
                String nick = rs.getString("nick");
                String email = rs.getString("email");
                result += "(" + admin_no + "," + login_id + "," + passwd + "," + nick + "," + email + ") ";
            }
            rs.close();
            stmt.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return result;
    }
}

TestController.java 를 다음처럼 수정한다.

package japi.controller;

import japi.model.MysqlTest;
import io.javalin.http.Context;

public class TestController {
    // /test/request
    public static void request(Context ctx) {
        String admin_list = "";
        admin_list = MysqlTest.getAdminList();
        System.out.println(admin_list);
        ctx.contentType("application/json;charset=UTF-8");
        ctx.result(admin_list);
    }
}

그리고, 웹브라우저에서 http://localhost:8080/test/request 를 요청하면 아래와 같이 DB에서 가져온 데이터를 볼 수 있습니다.

이 데이터를 JSON 으로 변환해주면 더 좋겠지요? ^^ 문자열로 일일이 만들어줄 수도 있겠지만, 일단 폼이 안나고 지저분하거든요. 괜찮은 JSON 라이브러리를 이용해서 해봅시다.
 
build.gradle 에 다음을 추가해줍니다.

implementation "com.googlecode.json-simple:json-simple:1.1.1"

MysqlTest.java 에 JSONArray 와 JSONObject 를 import 해주고

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

getAdminList() 함수를 이렇게 수정해줍니다.

    @SuppressWarnings("unchecked")
    public static String getAdminList() {
        String result = "";
        Connection conn = null;
        Statement stmt = null;

        try {
            conn = getConnection();
            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT ADMIN_NO, LOGIN_ID, PASSWD, NICK, EMAIL FROM TB_ADMIN");
            JSONArray json_array = new JSONArray();
            while (rs.next()) {
                JSONObject row = new JSONObject();
                String admin_no = rs.getString("admin_no");
                String login_id = rs.getString("login_id");
                String passwd   = rs.getString("passwd");
                String nick     = rs.getString("nick");
                String email    = rs.getString("email");
                row.put("admin_no", admin_no);
                row.put("login_id", login_id);
                row.put("passwd", passwd);
                row.put("nick", nick);
                row.put("email", email);

                json_array.add(row);
            }
            result = json_array.toJSONString();
            rs.close();
            stmt.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return result;
    }

이 상태에서 웹브라우저에서 호출해보면... 짜잔...~!!! JSON 형태로 데이터가 출력됩니다.

이제, SQL 을 직접 작성해서 호출방법을 알아보았고, 아까 만들어놓은 스토어드 프로시저를 호출해서 출력 것도 해봅시다.

@SuppressWarnings("unchecked")
    public static String getAdminList() {
        String result = "";
        Connection conn = null;
        Statement stmt  = null;

        try {
            conn = getConnection();
            conn.setAutoCommit(false);

            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("CALL SP_L_ADMIN()");
            JSONArray json_array = new JSONArray();
            while (rs.next()) {
                JSONObject row = new JSONObject();
                String admin_no = rs.getString("ADMIN_NO");
                String login_id = rs.getString("LOGIN_ID");
                String passwd   = rs.getString("PASSWD");
                String nick     = rs.getString("NICK");
                String email    = rs.getString("EMAIL");
                row.put("admin_no", admin_no);
                row.put("login_id", login_id);
                row.put("passwd", passwd);
                row.put("nick", nick);
                row.put("email", email);

                json_array.add(row);
            }
            result = json_array.toJSONString();

            conn.commit();
            rs.close();
            stmt.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return result;
    }

이번에도 웹브라우저에서 http://localhost:8080/test/request 를 요청하면, JSON 으로 결과를 볼 수 있을 것이다.

 

아직 해야할 것들이 좀 있지만, 이정도면 어느정도 틀은 갖추어진 것이다. 여기에서 필요할 것들을 덧붙여서 실제 운영에서 사용할 수 있는 서비스로 만들기를 바란다.

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형