Backend

openApi 활용(3) DB 연동하기

openDeveloper 2023. 4. 16. 00:31

지난 글에서 Gson 라이브러리를 사용해 get 호출로 받은 Json 데이터를 파싱하여 객체에 저장하였다. 이번 글에서는 MariaDB를 사용하여 java에서 객체를 데이터베이스를 저장한다.

 

1. DB 시스템 구성(MariaDB)

 

MariaDB를 로컬에 기본 port, localhost:3306으로 구성하였으며, test 계정을 생성하고, 권한을 부여하였다.

 

use mysql;

SELECT HOST, USER, PASSWORD FROM USER;


CREATE USER '아이디'@'%' IDENTIFIED BY '비밀번호';
create user 'test'@'localhost' identified by 'password';

-- 사용자 권한 주기

GRANT ALL PRIVILEGES ON 데이터베이스.* TO '아이디'@'%';

FLUSH PRIVILEGES; -> 꼭 반영을 해줘야 한다

 

2. DB 테이블 구성

create table swifi
(
    SWIFI_MGR_NO      varchar(10) not null
        primary key,
    SWIFI_WRDOFC      varchar(50) null,
    SWIFI_MAIN_NM     varchar(50) null,
    SWIFI_ADRES1      varchar(50) null,
    SWIFI_ADRES2      varchar(50) null,
    SWIFI_INSTL_FLOOR varchar(50) null,
    SWIFI_INSTL_TY    varchar(50) null,
    SWIFI_INSTL_MBY   varchar(50) null,
    SWIFI_SVC_SE      varchar(50) null,
    SWIFI_CMCWR       varchar(50) null,
    SWIFI_CNSTC_YEAR  year        null,
    SWIFI_INOUT_DOOR  varchar(50) null,
    SWIFI_REMARS3     varchar(50) null,
    LAT               double      null,
    LNT               double      null,
    WORK_DTTM         datetime    null
);

 

3.  Connection, PreparedStatement, ResultSet 

 

java 내에서 DB로 sql문을 날리기 위해서는 Class.forName("org.mariadb.jdbc.Driver") mariadb 드라이버로 connection을 열어야한다. 먼저 pom.xml 파일 mariadb-java-client 최신 버전을 로드해야 한다.

        <dependency>
            <groupId>org.mariadb.jdbc</groupId>
            <artifactId>mariadb-java-client</artifactId>
            <version>3.1.3</version>
        </dependency>

아래 코드는 table에 insert, select 문을 보내어 table에 값을 채우거나 값을 가져와 읽는 함수를 구현하였다.

public void getWifiList() {

            Connection conn = null;
            PreparedStatement preparedStatement = null;
            ResultSet rs = null;
            String whereId = "ttttt";

            // 좌표값 가까운 리스트들 조회해야됨

            try {
                // SQLite JDBC 드라이버를 로드합니다.
                Class.forName("org.mariadb.jdbc.Driver");

                // 데이터베이스에 연결합니다.
                conn = DriverManager.getConnection(url,dbId,dbPwd);

                // 쿼리를 실행합니다.
                String sql = " select id, name, password, age  from member " +
                        " where id = ? ";

                preparedStatement = conn.prepareStatement(sql);
                preparedStatement.setString(1, whereId);

                rs = preparedStatement.executeQuery();

                // 결과를 처리합니다.
                while (rs.next()) {
                    // 결과 처리 코드
                    String memberId = rs.getString("id");
                    String userName = rs.getString("name");
                    String password = rs.getString("password");
                    String age = rs.getString("age");

                    System.out.println(memberId +", " + userName + ", " + password + ", " + age);

                }


            } catch (SQLException e) {
                throw new RuntimeException(e);
            } catch (ClassNotFoundException e) {
                throw new RuntimeException(e);
            }finally {
                // 연결을 닫습니다.
                try {
                    if (rs != null && !rs.isClosed()) {
                        rs.close();
                    }
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
                try {
                    if (preparedStatement != null && !preparedStatement.isClosed()) {
                        preparedStatement.close();
                    }
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
                try {
                    if (conn != null && !conn.isClosed()) {
                        conn.close();
                    }
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }

            }
         }
public void insertWifiList(ArrayList<Wifi> wifi) {

        Connection conn = null;
        PreparedStatement preparedStatement = null;
        ResultSet rs = null;

        if(wifi.size() == 0){
            return;
        }


        try {
            // SQLite JDBC 드라이버를 로드합니다.
            Class.forName("org.mariadb.jdbc.Driver");

            // 데이터베이스에 연결합니다.
            conn = DriverManager.getConnection(url,dbId,dbPwd);
            int affected = 0;
            for (int i = 0; i < wifi.size(); i++) {

            // 쿼리를 실행합니다.
                String sql = " REPLACE swifi (SWIFI_MGR_NO, SWIFI_WRDOFC, SWIFI_MAIN_NM, SWIFI_ADRES1, SWIFI_ADRES2, SWIFI_INSTL_FLOOR, SWIFI_INSTL_TY, SWIFI_INSTL_MBY, SWIFI_SVC_SE, SWIFI_CMCWR, SWIFI_CNSTC_YEAR, SWIFI_INOUT_DOOR, SWIFI_REMARS3, LAT, LNT, WORK_DTTM) VALUES " +
                    "( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? ) ";

                preparedStatement = conn.prepareStatement(sql);
                preparedStatement.setString(1, wifi.get(i).getX_SWIFI_MGR_NO());
                preparedStatement.setString(2, wifi.get(i).getX_SWIFI_WRDOFC());
                preparedStatement.setString(3, wifi.get(i).getX_SWIFI_MAIN_NM());
                preparedStatement.setString(4, wifi.get(i).getX_SWIFI_ADRES1());
                preparedStatement.setString(5, wifi.get(i).getX_SWIFI_ADRES2());
                preparedStatement.setString(6, wifi.get(i).getX_SWIFI_INSTL_FLOOR());
                preparedStatement.setString(7, wifi.get(i).getX_SWIFI_INSTL_TY());
                preparedStatement.setString(8, wifi.get(i).getX_SWIFI_INSTL_MBY());
                preparedStatement.setString(9, wifi.get(i).getX_SWIFI_SVC_SE());
                preparedStatement.setString(10, wifi.get(i).getX_SWIFI_CMCWR());
                preparedStatement.setString(11, wifi.get(i).getX_SWIFI_CNSTC_YEAR());
                preparedStatement.setString(12, wifi.get(i).getX_SWIFI_INOUT_DOOR());
                preparedStatement.setString(13, wifi.get(i).getX_SWIFI_REMARS3());
                preparedStatement.setString(14, wifi.get(i).getLAT());
                preparedStatement.setString(15, wifi.get(i).getLNT());
                preparedStatement.setString(16, wifi.get(i).getWORK_DTTM());

                affected += preparedStatement.executeUpdate();
            }

            // 결과를 처리합니다.
            if(affected == wifi.size()){
                System.out.println("Wifi insert 성공");
            }else{
                System.out.println("Wifi insert 실패");
            }

        } catch (SQLException e) {
            throw new RuntimeException(e);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }finally {
            // 연결을 닫습니다.
            try {
                if (rs != null && !rs.isClosed()) {
                    rs.close();
                }
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
            try {
                if (preparedStatement != null && !preparedStatement.isClosed()) {
                    preparedStatement.close();
                }
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
            try {
                if (conn != null && !conn.isClosed()) {
                    conn.close();
                }
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }

        }
    }

다음 글에는 DB에 저장된 값을 나의 위치 기반으로 가까운 순으로 값을 가져오는 방법에 대해 생각해봐야겠다.

 

방안 1. 전체 list에서 위도, 경도 값을 가져와 나의 위치와 비교하여 가까운 순 표현

방안 2. 같은 동네에 있는 객체들만 가져와 가까운 순 표현