# Intellij) JDBC 프로젝트 (4) JDBC 연결하기

> ***Simple JDBC Project (kor)  
> (1) ***[Java, DB 설치 + Docker Compose로 쉽게 해 보기](https://letsdev.hashnode.dev/intellij-jdbc-1-kor)  
> (***2)*** [***프로젝트 생성, Postgresql 컨테이너 게시***](https://letsdev.hashnode.dev/intellij-jdbc-2-kor)  
> ***(3)*** [***Flyway 도입하기***](https://letsdev.hashnode.dev/intellij-jdbc-3-kor)  
> ***(4)*** JDBC 연결하기  
> (5) [위임된 Main Application](https://letsdev.hashnode.dev/intellij-jdbc-5-kor)

# JDBC Driver가 추가되었는지 확인하기

이번 글에서는 JDBC를 통해 데이터베이스에 잘 연결할 수 있는지 확인해 보는 짧은 코드를 제시합니다.

우선 우리는 Flyway 적용 과정에서 이미 Postgresql용 JDBC 드라이버 라이브러리를 추가했습니다. `org.postgresql:postgresql:42.7.3` 라이브러리가 잘 추가되어 있는지 확인해 보세요.

```java
dependencis {
    // ...

    // db
    implementation 'org.postgresql:postgresql:42.7.3'
    implementation 'org.flywaydb:flyway-mysql:9.22.3'

    // ...
}
```

# JDBC 및 데이터베이스 연결 확인해 보기

이제 JDBC 드라이버를 통해 데이터베이스에 연결이 잘되고 있는지 확인해 봅니다.

## 확인용 클래스 생성 (권장)

우리는 연습삼아 JDBC 연결 확인용 클래스를 만들어 봅시다.

`DriverManager`의 static 메서드인 `getConnection(URL, username, password)` 메서드를 통하여 DB 연결을 확인할 수 있습니다. 이 함수는 checked exception으로 `SQLException`을 catch 또는 throw 하도록 지시합니다.

우리가 주목해야 할 주요 동작은 try~catch~resources 구문에서 connection을 꺼내 온 것입니다. 그리고 그 connection이 `null`이면 연결되지 않은 것, `null`이 아니라면 연결이 잘 수행된 것입니다.

참고: try~catch~resources 구문은 `connection.close()`를 보장해 줍니다. (만약 `AutoClosable` 인터페이스를 구현한 클래스라면 `try~catch~resources` 구문을 통해 close를 보장하는 게 좋습니다.)

* package: `com.example.common.support.db`
    

```java
package com.example.common.support.db;

import java.sql.DriverManager;

public class JdbcAccessChecker {

    private final String dbUrl;
    private final String username;
    private final String password;

    // static 초기화 블록
    //  JdbcAccessChecker.class가 로드될 때 한 번 실행됩니다.
    static {
        try {
            // [1] Driver 로드를 명시합니다. (일부 데이터베이스용 드라이버는 자동으로 로드 되지만, 일부는 명시해야 합니다.)
            Class.forName("org.postgresql.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    // [2] 생성자에서 DB 접속 정보를 받습니다.
    public JdbcAccessChecker(
            String dbUrl,
            String dbUsername,
            String dbPassword
    ) {
        this.dbUrl = dbUrl;
        this. username = dbUsername;
        this. password = dbPassword;
    }

    // [3] DB 연결에 성공하면 true, 아니면 false를 반환하는 메서드를 만듭니다.
    //     커넥션을 생성해 보고, 이것이 null이면 false를 반환하도록 구현합니다.
    public boolean hasConnectivity() {
        try (
                // 데이터베이스에 대한 '접속' 또는 '연결'이라고 부르는 객체입니다.
                Connection connection =
                        DriverManager.getConnection(dbUrl, username, password);
        ) {
            // connection이 null이 아니면 DB 연결에 성공한 것입니다.
            return connection != null;
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
```

## 연결 확인

```java
import com.example.common.flyway.config.MyFlyway;

import com.example.common.support.db.MyJdbcConnectivityChecker;

import static com.example.common.support.db.DatabaseAccessConstants.DB_PASSWORD;
import static com.example.common.support.db.DatabaseAccessConstants.DB_URL;
import static com.example.common.support.db.DatabaseAccessConstants.DB_USERNAME;

public class Main {

    public static void main(String[] args) {
        // 이전 글에서 작성한 플라이웨이 실행 코드입니다.
        MyFlyway myFlyway = new MyFlyway(DB_URL, DB_USERNAME, DB_PASSWORD);
        myFlyway.migrate();

        // JDBC 연결을 확인합니다.
        validateJdbcConnectivity();
    }

    private static void validateJdbcConnectivity() {
        // 연결 확인용 객체입니다.
        JdbcAccessChecker checker =
                new JdbcAccessChecker(DB_URL, DB_USERNAME, DB_PASSWORD);

        // 연결 여부 확인: `checker.hasConnectivity()`
        boolean hasConnectivity = checker.hasConnectivity();

        // 연결되지 않았다면 런타임 예외를 발생시킵니다.
        if (!hasConnectivity) {
            throw new RuntimeException("JDBC 연결 필요");
        }

        // 정상적으로 연결되었다면 위에서 throw되지 않고 이곳에 도착합니다.
        System.out.println("JDBC 연결 성공");
    }
}
```

---

**&lt; Prev**

[***(3) Flyway 도입하기***](https://letsdev.hashnode.dev/intellij-jdbc-3-kor)

**Next &gt;**

[(5) 위임된 Main Application](https://letsdev.hashnode.dev/intellij-jdbc-5-kor)
