[Spring] Spring Boot 에 DB 붙이기 (ft. h2)

GuruneLee·2022년 1월 19일
0

Let's Study 공부해요~

목록 보기
14/36

지금까지 몇 차례나 Spring Boot 서버에 DB를 붙여왔다. 아니, 붙이는 것을 지켜봤다. 직접 DB를 붙이지 않고 보기만 하니 정확한 방법을 설명하지 못했고, DB 앞에 자신감을 잃어가고 있는 것 같아 직접 붙여보기로 했다.

일단 해보자

원리니 뭐니 이해하려 하지 말고, 일단 따라해보자.

0. 준비물 (필요한 의존성)

  1. h2 데이터 베이스(com.h2database:h2)
  2. Spring-Data-Jpa
    (org.springframework.boot:spring-boot-starter-data-jpa)
  3. Spring-Web (org.springframework.boot:spring-boot-starter-web)

1. Demo 앱 만들기

기존에 바로 적용할 수 있는 프로젝트가 있으면 그대로 사용하고 부족한 의존성을 추가한다. 실습 프로젝트를 분리하고 싶으면 Spring Initializr 에서 필요한 의존성을 포함한 Spring Boot 프로젝트를 만든다.

+ 빌드 툴은 Gradle 을 사용한다 (Maven 도 무방하다)
+ 버전은 원하는 것을 선택한다 (실습에 포함된 내용은 버전에 따른 차이가 거의 없다)
+ 필자는 IntelliJ IDE 를 사용해 프로젝트를 열었다 (eclipse 도 괜찮다)

2. 데이터베이스 준비하기

Spring Boot 가 DB를 이용하게 하려면 DB 서버를 구축해 포트를 열고, Spring Boot 설정파일(application.yml 혹은 application.properties)에 spring.datasource 패스 정보를 기입해놓아야 한다.

// 설정파일 예시 - 안따라해도 된다
spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/db_example
spring.datasource.username=springuser
spring.datasource.password=ThePassword
spring.datasource.driver-class-name =com.mysql.jdbc.Driver

이렇게 설정파일을 기입해놓으면 Spring Boot 앱이 실행될 때 DataSourceAutoConfiuration 클래스에서 이 DataSource 정보를 읽어들여서 DB 연결 설정을 하게된다.
(+ DataSourceAutoCofiguration 클래스는 Spring-Data-Jpa 에 포함되어있다. 이걸 비활성화 시키는 방법도 있는데, 다음에 Auto Configuration 이 이루어지는 과정을 공부하면서 이야기해보자)

하지만 우리 데모쟁이들은 DB서버를 구축할 필요도, DataSource 를 입력할 필요도 없다. 설정파일에 아무것도 기입되어있지 않으면 Spring Boot가 알아서 인-메모리 DB를 띄워주고, 그에대한 정보도 가져와주기 때문이다.

But, 필자는 설정파일을 직접 기입하는 방법을 추천한다. 그 이유는 h2-console 을 이용하기 불편하기 때문인데... 이건 나중에 설명하고 일단 다음과 같이 applcation.properties 파일을 채워보자 (application.yml 도 좋아요).

// h2 인메모리 db 설정파일 - 따라하자
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver

+ 참고로 파일 내용은 url 을 제외하곤 모두 default 값이다 (그래서 의존성 중에 h2 가 필요하다!)
+ url 의 default 값에는 '랜덤 스트링'이 포함되어있다

3. 확인하기

Entity, Repository 만들어서 DB채우기

User 엔터티와 UserRepository를 만들자

// User.java
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private Long age;

    public User(String name, Long age) {
        this(null, name, age);
    }

    protected User() {

    }

    public User(Long id, String name, Long age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
}
// UserRepository.java
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}

@Repository 어노테이션은 해당 클래스가 DAO(Data-Access-Object) Component 임을 명시한다. Component 이므로,

CommandLineRunner를 사용해서 서버가 실행될 때 바로 DB가 채워지도록 만들자. CommandLineRunner를 사용하면 스프링 서버가 시작할때 바로 로직을 실행시킬 수 있다 (공식 Docs 참고)
(컨트롤러를 활용하거나 테스트를 짜도 되지만, 바로 확인하려면 CommandLineRunner 를 활용하는것이 편하다.)

@Component
public class DataLoader implements CommandLineRunner {
    private final UserRepository userRepository;

    public DataLoader(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    @Override
    public void run(String... args){
        int numOfSample = 1000000;
        for (int i = 0; i < numOfSample; i++) {
            userRepository.save(new User(String.format("name%07d", i), 10L));
        }
    }
}

이제 실행후 DB를 확인해보자

h2-console 에 접속해서 데이터 확인하기

h2는 웹 워크벤치를 제공한다. 접속하는 방법은 http://서버주소:포트/h2-console 이다.
하지만 그 전에!!
Spring Boot 서버에서 h2-console 에 접근할 수 있게 '허가'해줘야 한다.
다시 application.properties로 가서 한 줄 추가해보자

// h2 인메모리 db 설정파일 - 따라하자
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver

// 여기부터 추가해주세요
spring.h2.console.enabled: true

자, 이렇게 입력하고 나서 서버를 실행해보자.

사진과 같은 INFO 가 뜨는것을 확인할 수 있다 (그 전엔 안뜸)

Database 위치도 application.properties 에 입력했던 jdbc:h2:mem:testdb 로 등록된걸 알 수 있다. 이 부분은 url 을 등록안해주면 mem 이후 랜덤스트링이 할당된다.

- 랜덤 스트링!

자 그럼, h2 웹 워크벤치에 접속해보자.
서버를 실행하고 브라우저 주소창에 http://localhost:8080/h2-console라고 입력한다.
이런 게 뜨는데, 잘 보면 모두 application.properties 에 입력했던 정보다. 맞는지 확인하고 Connect를 클릭하면 다음과 같은 워크벤치로 진입하게 된다.

저렇게 쿼리를 직접 날려볼 수도 있다. select * from USER 쿼리를 날리니 미리 생성한 User 칼럼들이 추가되어 있는 것을 확인할 수 있다.

결론

h2를 이용해 간단하게 DB를 붙이는 실습을 해보았다. 실무에서는 h2가 아닌 RDS 등의 외부 DB를 사용하게 될 것이고, 서비스가 커지면 고려할 것도 많아질 것이지만, 지금은 이정도로 충분하다.
큰 골격은 DB를 준비하고, DB주소를 Spring 서버에게 제공하는 것이다.

물론 JPA, Hibernate 등 Spring 서버와 DB의 연결을 책임져주는 여러 요소들을 함께 공부하게 될 것이지만 오늘처럼 직접 실습해보며 차근차근 공부해나가면 된다!

DB 이제 안무서워!

profile
Today, I Shoveled AGAIN....

0개의 댓글