# CH01 핵심개념이해 1

## JDBC 의미 <a href="#jdbc" id="jdbc"></a>

![](https://fistkim101.github.io/images/concept-jdbc.png)

[JDBC](https://ko.wikipedia.org/wiki/JDBC) (Java Database Connectivity)는 자바 어플리케이션에서 데이터베이스에 DDL, DML을 수행 요청할 수 있도록 하는 자바 API 이다.

JDBC 라는 단어 자체가 어떠한 추상적인 개념을 의미하는 것 같지만, 사실 직관적으로 표현하자면 ‘자바 API’를 의미하는 것이다. ‘자바 API’ 인데, 역할 및 목적이 자바 어플리케이션에서 데이터베이스에 DML, DDL을 수행 요청할 수 있도록 하는 것이고 java.sql, javax.sql 패키지에 포함된 모든 자바 자원들을 통칭한다고 할 수 있다.

즉, JDBC는 ‘java.sql, javax.sql 패키지에 포함된 모든 자바 자원들’ 이라고 표현해도 맞는 말이다.

하지만 JDBC만 있다고 해서 DDL, DML 수행을 할 수는 없고 위 그림에서 확인할 수 있듯이 수행하고자 하는 database 에 맞는 드라이버가 반드시 필요하다. 드라이버 없이 JDBC만을 이용해서 어플리케이션에서 DDL 요청을 할 경우 드라이버를 못찾았다며 실패하는 로그를 확인할 수 있다.

```
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -v /Users/jungkwonkim/Lab/Database:/var/lib/mysql --name mysql-local mysql
```

```java
public class Main {
    public static void main(String[] args) throws SQLException {
        String url = "jdbc:mysql://localhost:3306/fistkim";
        String user = "root";
        String password = "root";

        try (Connection connection = DriverManager.getConnection(url, user, password)) {
            String sql = "CREATE TABLE USER (id int, name varchar(255));";
            try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
                preparedStatement.execute();
            }
        }
    }
}
```

## ORM 의미 <a href="#orm" id="orm"></a>

[ORM](https://www.techopedia.com/definition/24200/object-relational-mapping--orm) 의 의미에 대해서 정의된 자료는 많았지만 강의에서 말하고 있는 의미와 가장 유사하고 내가 생각하기에 가장 적절한 표현이라고 생각되는 것은 아래와 같다.

> Object-relational mapping (ORM) is a programming technique in which a metadata descriptor is used to connect object code to a relational database. Object code is written in object-oriented programming (OOP) languages such as Java or C#. ORM converts data between type systems that are unable to coexist within relational databases and OOP languages.

다시 말해, ORM 은 우리가 데이터를 영속화 할 때 RDBMS를 이용하고 싶은 상황인데 코드는 객체 지향 언어로 작성을 해야할 경우 이를 해결해주는 기술 이라고 말할 수 있는 것이다.

ORM 은 메타 데이터를 통해서 특정한 object와 특정한 RDBMS 의 테이블(relational) 을 매핑해주고, 같은 맥락에서 특정한 object 의 특정한 필드와 특정한 테이블의 특정한 컬럼을 매핑해주는 기술인 것이다.

여기서 말하는 메타 데이터란 @Table, @Column 등으로 사용했던 코드들을 의미한다.

## ORM 의 장점 (결국 ORM 쓰는 이유가 무엇인가) <a href="#orm-orm" id="orm-orm"></a>

한 마디로 객체 지향적으로 코드를 작성하는 것이 용이하기 때문이다. 이것은 ‘테스트가 쉽다’, ‘코드가 더 간결해진다’ 등 여러가지를 내포한다.

특정 데이터를 insert 한다는 가정에서 JDBC를 이용한 코드와 ORM을 이용한 코드를 비교해보자.

```java
String url = "jdbc:mysql://localhost:3306/fistkim";
String user = "root";
String password = "root";

try (Connection connection = DriverManager.getConnection(url, user, password)) {
    String sql = "INSERT INTO USER VALUES(1, 'name');";
    try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
        preparedStatement.execute();
    }
}
```

```java
userRepository.save(new User(1, "name"));
```

이미 라인 수만 비교해봐도 굉장히 간결하다는 것을 알 수 있다. 필요한 보일러 플레이트 성격의 코드들을 만들 필요도 없고, 스키마가 바뀔 경우 JDBC로 처리 했다면 sql들을 모두 바꿔줘야하는 반면 ORM으로 작성한 경우 변경점이 비교적 적다.

뿐만 아니라 미리 만들어둔 커넥션을 가져다 쓸 수도 있고, 벤더마다 다른 sql에 대해서 몰라도 알아서 자동으로 벤더에 맞는 sql을 만들어줘서 개발 생산성이 올라간다고 할 수 있다.

그리고 레이지 로딩 전략을 통해서 개발 생산성도 증대시킬 수 있다.

## [Spring Data JPA, JPA, hibernate, JDBC 각각의 의미 및 연관관계](https://suhwan.dev/2019/02/24/jpa-vs-hibernate-vs-spring-data-jpa/) <a href="#spring-data-jpa-jpa-hibernate-jdbc" id="spring-data-jpa-jpa-hibernate-jdbc"></a>

<figure><img src="https://fistkim101.github.io/images/concept-jpa-flow.png" alt=""><figcaption></figcaption></figure>

### [JPA](https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%ED%8D%BC%EC%8B%9C%EC%8A%A4%ED%84%B4%EC%8A%A4_API) <a href="#jpa" id="jpa"></a>

자바로 영속성을 관리하기 위한 API(Java Persistence API, JPA)이다. 같은 말이지만 자바 API 인데 그 목적이 영속성 관리인 것이다.

### [Spring Data JPA](https://spring.io/projects/spring-data-jpa) <a href="#spring-data-jpa" id="spring-data-jpa"></a>

스프링 공식문서에도 잘 나와있다시피 Spring Data JPA 는 JPA based data access layer 를 support 하는 목적으로 만들어진 라이브러리이다.

> Spring Data JPA, part of the larger Spring Data family, makes it easy to easily implement JPA based repositories. This module deals with enhanced support for JPA based data access layers. It makes it easier to build Spring-powered applications that use data access technologies.

### [hibernate](https://hibernate.org/orm/) <a href="#hibernate" id="hibernate"></a>

ORM 프레임워크이다. 달리 표현하자면 JPA 의 구현체라고 할 수 있다. JPA 에서는 hibernate 를 내부적으로 가지고 있고 이를 활용하고 있다. (참고로 그래서 JPA를 거치지 않고 hibernate를 직접 활용하는 것도 가능하다.)

hibernate 공식 홈페이지에도 hibernate를 JPA 의 구현체라고 밝히고 있다.

