Java HTTP 서버발행일 2024. 5. 30.원본 https://blog.naver.com/jword_/223462183415 ↗

[java 웹 서버] JDBC를 통한 Mysql(Maria DB)연결

[java 웹 서버] JDBC를 통한 Mysql(Maria DB)연결 — #JDBC #javadatabase #jdbc연결 #javamysql연결 #javamariadb #mysql #mariadb #java웹서버 #개발자의...

#[java]HTTPserver#Naver Blog

#JDBC #javadatabase #jdbc연결 #javamysql연결 #javamariadb #mysql #mariadb #java웹서버 #개발자의도구들

​

AI스쿨 msa기반 java 백엔드 코스 중에 공부한 내용을 작성하였습니다

\* 현재 웹 서버 프로젝트를 진행중입니다. 전체적인 목차를 보시려면 여기에서 참고하세요

\* 전체코드: https://github.com/keyveloper/HTTP\_server.git

이미지

메모리 저장

이전글을 postman으로 제가 만든 서버에 request를 날리고 response를 응답받는 과정을 보여드렸습니다. 이후 추가적으로 클라이언트에게 제공할 서비스를 몇개 더 만들었습니다.

post /text/{id} : {id}를 키값으로 하여 전달된 body를 서버에 저장get /text/{id} : {id}를 키값으로 하는 text 불러오기delete /text/{id} : 서버에 저장된 {id}를 키값 제거/textall : 전체 텍스트 출력/image : 서버에 저장된 이미지 받아오기

()

코드를 보면 아시다 싶이 서버의 메모리에 데이터를 저장하고 있는데요. 서버가 한번이라도 꺼지거나 오류나면, 메모리에 있는 모든 데이터가 날라가겠죠?

​

클라이언트가 보내는 데이터를 서버가 온전히 저장하기 위해서 어떻게 해야할까요? 네, 영구적으로 저장가능한 디스크와 같은곳에 저장을 해둘 필요가 있습니다. 그냥 파일로 저장을 바로 해버려도 되겠지만, 효율적인 자료관리를 위해서는 DataBase를 많이 사용하는데요.

​

오늘은 직접 만든 웹서버를 내 컴퓨터 환경의 DataBase시스템이 연동하는 방법에 대해서 알아보겠습니다.

​

JDBC와 연동하기

java에서 Database와의 연동을 위해 가장 기본적으로 사용되는 것이 바로 JDBC(Java DataBase Connectivity)입니다. (참고: JDBC란?)

​

자세한 설명은 윗 링크를 참고하시면 좋겠고(업데이트 예정), 오늘은 바로 실습으로 들어가 보겠습니다.

dataBase 선택하기 : mysql

JDBC는 다양한 데이터베이스를 지원하기 떄문에, 원하는 데이터베이스를 선택하시면 될 것 같습니다.

저의 경우에는 mysql을 설치해서 진행하였습니다.

\데이터 베이스 선택 기준\서비스금융​

이미지

설치 다하시고 mysql로그인을 하시면 됩니다. 참고로 저는 원래 GUI인 mysql workbench를 사용했었는데, 오류가 너무 잘나서, 그냥 CLI로 옮겨서 진행했습니다. 익숙해지니 이게 더 편하네요!

​

dataBase생성하기

jdbc와 연동하기전에, 당연히 데이터 베이스를 먼저 생성해야 겠죠?

CREATE database http;SHOW databases;

이미지

http의 이름을 가진 데이터베이스를 생성했습니다. 그럼이제 jdbc연결때 이 이름을 써야합니다.

jdbc사용하여 database연동하기

build.gradle

가장 우선적으로 의존성을 추가해야합니다. 저는 mariaDB를 사용하기 때문에(mysql과 다릅니다!) mariadb에 맞는 의존성을 넣었습니다.

implementation 'org.mariadb.jdbc:mariadb-java-client:2.7.2'

싱글톤 패턴으로 구현하기

우선 DB연동전에 저는 DataBaseManger를 통해 서버내의 DB를 관리하고자 하였는데요. 데이터 베이스를 하나만 쓴다는 가정하에 진행하였습니다.

​

데이터 베이스가 하나이기 때문에 서버 시스템 내에서 언제 어디서든 동일한 데이터베이스를 불러와야하기 때문에 싱글톤패턴으로 구현을 하였습니다.

package org.example;​import lombok.Getter;​import java.sql.\;​@Getterpublic class DataBaseManager { private static DataBaseManager instance; private Connection connection; private static final Object dataBaseLock = new Object(); private final String; private final String; private final String;​ private DataBaseManager() { startConnect(); } private void startConnect() { try { this.connection = DriverManager.getConnection(url, user, password); System.out.println("connecting success"); } catch (SQLException e) { System.out.println("DataBaseManger - sql err: " + e.getMessage()); } }​ public static DataBaseManager getInstance() { synchronized (dataBaseLock) { if (instance == null) { instance = new DataBaseManager(); } } return instance*; }}​

url, user, password set

DriveManger가 DB와 연동을 시작할때, url, user, password 값을 받습니다.

private final String url = "jdbc:mariadb://localhost:3306/http"; //서버 주소private final String user = "root";private final String password = "";

url은 jdbc:DBtype//server ip:port/databaseName 입니다.

user는 해당 DB에 접근 권한이 있는 유저 id를 적으면 되고, 비밀번호는 해당 DB의 비밀번호를 입력하시면 됩니다.

이미지

성공적으로 연결이 되었습니다. 이때 DriverManger클래스가 사용되는데, JDBC의 구조를 알고계시면 아시겠지만, JDBC드라이버와 데이터 베이스 사이를 연결하는 역할을 해줍니다. 실질적인 연결부 역할을 수행합니다.

테이블에 데이터 넣기

일단 간단하게 table을 만들었습니다. 이름은 texts이고 ID varchar(25), value varcahr(55) 형태로 테이블을 구성하였습니다.

​

이제 DB와 연동 되었기 때문에 원하는 sql문을 작성하여 데이터를 넣으면 됩니다.

public void putText(String key, String value) { String sql = "INSERT INTO texts (ID, value) VALUES (?, ?)";​ try { PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setString(1, key); preparedStatement.setString(2, value);​ int effectedRows = preparedStatement.executeUpdate();​ if (effectedRows > 0) { System.out.println("A new row has been inserted successfully."); } else { System.out.println("A new row insertion failed"); } } catch (SQLException e) { System.out.println("DataBase Manger: putText err: " + e.getMessage()); }}

이때 사용하는 class는 PreparedStatement입니다. 해당 클래스는 SQL문을 DB로 안전하게 전달하는 역할을 수행합니다.

​

putText의 경우 parameter를 key와 String으로 받고있는데, 이는 query문에 사용됩니다. "INSERT INTO texts (ID, value) VALUES (?, ?)";

​

이때 "?"의 값을 결정 지어줘야하는데 이를 위해 setString()이 사용됩니다. setString(1, key)는 첫번째 물음표에 key String변수를 넣겠다는 뜻이 됩니다.

​

TEST

@Testpublic void connectionTest() { // Given DataBaseManager dataBaseManager = DataBaseManager.getInstance();​ // when dataBaseManager.putText("key", "value"); dataBaseManager.putText("key1", "value1"); dataBaseManager.putText("key2", "value2");}

​

실행결과

이미지

잘 들어가는 것을 볼 수 있습니다.

​

이제 JDBC를 활용하여 client의 모든 요청사항을 DB에 저장시켜 보겠습니다.