# JdbcTemplate 로 db 접근

추가

```xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
```

내장 db 는 로컬에서 잠깐 테스트 하기 좋으나 실제 운영에서는 거의 사용하지 않는다.

그럼 HSQL 를 사용해보자

```xml
<dependency>
    <groupId>org.hsqldb</groupId>
    <artifactId>hsqldb</artifactId>
    <scope>runtime</scope>
</dependency>
```

혹은 운영환경이라면 mysql를 사용하는것도 좋다.

```xml
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
```

src/main/resources/application.properties 를 아래와 같이 세팅해보자. 물론 앞서 배운 .yml 파일을 적용해도 무방하다.

application.properties 설정

```properties
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
```

application.yml 설정

```yaml
datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    password: dbpass
    url: jdbc:mysql://localhost:3306/test
    username: dbuser
```

{% hint style="info" %}
주의! Spring2.1.x 부터는 기본으로 mysql 8.0 드라이버로 변경되었다. 그래서 구버전인 com.mysql.jdbc.Driver 사용하지 말고 com.mysql.cj.jdbc.Driver를 사용한다.
{% endhint %}

```shell
spring.datasource.jndi-name=java:jboss/datasources/customers
```

#### DB 생성 후 테이블 생성

```sql
CREATE TABLE `User` (
  `name` varchar(100) COLLATE utf8mb4_general_ci NOT NULL,
  `age` int NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
```

#### User 객체를 만든다.

```java
@Data
@NoArgsConstructor
public class User {

    private String name;
    private Integer age;

}
```

#### db 액세서 interface를 정의 한다.

```java
public interface UserService {

    /**
     * 사용자 추가 
     *
     * @param name
     * @param age
     */
    int create(String name, Integer age);

    /**
     * name 으로 사용자 조회
     *
     * @param name
     * @return
     */
    List<User> getByName(String name);

    /**
     * name 기준으로 사용자 삭제
     *
     * @param name
     */
    int deleteByName(String name);

    /**
     * 사용자 전체 건수
     */
    int getAllUsers();

    /**
     * 사용자 삭제
     */
    int deleteAllUsers();

}
```

#### JdbcTemplate 로 Service를 구현하는 클래스 추가&#x20;

```java
@Service
public class UserServiceImpl implements UserService {

    private JdbcTemplate jdbcTemplate;

    UserServiceImpl(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @Override
    public int create(String name, Integer age) {
        return jdbcTemplate.update("insert into USER(NAME, AGE) values(?, ?)", name, age);
    }

    @Override
    public List<User> getByName(String name) {
        List<User> users = jdbcTemplate.query("select NAME, AGE from USER where NAME = ?", (resultSet, i) -> {
            User user = new User();
            user.setName(resultSet.getString("NAME"));
            user.setAge(resultSet.getInt("AGE"));
            return user;
        }, name);
        return users;
    }

    @Override
    public int deleteByName(String name) {
        return jdbcTemplate.update("delete from USER where NAME = ?", name);
    }

    @Override
    public int getAllUsers() {
        return jdbcTemplate.queryForObject("select count(1) from USER", Integer.class);
    }

    @Override
    public int deleteAllUsers() {
        return jdbcTemplate.update("delete from USER");
    }

}
```

#### 테스트 코드를 작성해 본다.

```java
@RunWith(SpringRunner.class)
@SpringBootTest
public class Chapter31ApplicationTests {

    @Autowired
    private UserService userSerivce;

    @Before
    public void setUp() {
        // 테스트코드이니 일단 있는 테스트 사용자를 삭제한다.
        userSerivce.deleteAllUsers();
    }

    @Test
    public void test() throws Exception {
        // 사용자 5명 추가 
        userSerivce.create("Tom", 10);
        userSerivce.create("Mike", 11);
        userSerivce.create("Didispace", 30);
        userSerivce.create("Oscar", 21);
        userSerivce.create("Linda", 17);

        // Oscar라는 이름 사용자 조회 ，나이가 해당 나이인지 판다.
        List<User> userList = userSerivce.getByName("Oscar");
        Assert.assertEquals(21, userList.get(0).getAge().intValue());

        // 사용자 조회 , 5명이라고 가정하고 
        Assert.assertEquals(5, userSerivce.getAllUsers());

        // 2명 사용자 삭제
        userSerivce.deleteByName("Tom");
        userSerivce.deleteByName("Mike");

        // 삭제후 현재 사용자 몇명인지 , 3명 맞는지...판단.
        Assert.assertEquals(3, userSerivce.getAllUsers());

    }

}
```

#### JdbcTemplate 에 관련 더 많은 정보 와 사용방법은 아래 링크를 참조하면 된다.

{% embed url="<https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/jdbc/core/JdbcTemplate.html>" %}

끝!


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://blakes-organization.gitbook.io/rainsister/springboot-2.x/database-connection/jdbctemplate-db.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
