이번에는 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 으로 결과를 볼 수 있을 것이다.
아직 해야할 것들이 좀 있지만, 이정도면 어느정도 틀은 갖추어진 것이다. 여기에서 필요할 것들을 덧붙여서 실제 운영에서 사용할 수 있는 서비스로 만들기를 바란다.
'Framework (Backend) > Javalin' 카테고리의 다른 글
Javalin 프레임워크에 PostgreSQL 붙여보기 (0) | 2024.09.09 |
---|---|
Javalin 프레임워크 시작해보기 (0) | 2024.08.23 |