티스토리 뷰

개요

  • H2 Database자바 기반의 경량 관계형 데이터베이스로, 인메모리 모드와 파일 기반 모드를 모두 지원하여 개발 및 테스트 환경에서 빠른 데이터 액세스와 간편한 설정이 가능한 도구
  • Spring Boot DevToolsSpring Boot 애플리케이션 개발 시 자동 재시작, 라이브 릴로드, 개발용 설정 최적화 등 다양한 기능을 제공하여 개발 주기를 단축하고 생산성을 향상


장점

H2 Database

빠른 시작과 경량성

  • 인메모리 모드 사용 시 매우 빠르게 데이터베이스를 시작할 수 있으며, 설정이 간단

개발 및 테스트 최적화

  • 인메모리와 파일 기반 저장 방식을 선택할 수 있어 로컬 개발과 단위 테스트에 적합

웹 콘솔 지원

  • 내장 웹 콘솔을 통해 SQL 실행, 데이터 확인, 스키마 관리 등을 손쉽게 수행할 수 있음

Spring Boot DevTools

자동 재시작 기능

  • 코드 변경 시 클래스 경 변경을 감지하여 애플리케이션을 자동으로 재시작함으로써, 개발자가 변경 사항을 빠르게 확인할 수 있음

라이브 릴로드

  • 브라우저와 연동해 프론트엔드 변경 시 자동 새로고침 기능을 제공하여 UI 개발 시간을 단축시킴

개발용 설정 최적화

  • 캐시 비활성화, 로깅 레벨 조정 등 개발 환경에 최적화된 설정을 지원하여 디버깅 및 테스트를 보다 용이하게 만듬

단점

H2 Database

제한된 확장성

  • 대규모 운영 환경에서는 성능과 안정성 면에서 한계가 있으므로 주로 개발 및 테스트 용도로 사용됨

데이터 영속성

  • 인메모리 모드 사용 시 애플리케이션 종료와 함께 데이터가 소실되므로, 영속성이 필요한 환경에서는 주의가 필요

Spring Boot DevTools

프로덕션 환경 부적합

  • 개발 편의성을 위해 제공되는 도구이므로, 실제 운영 환경에서는 사용하지 않아야 함

자동 재시작의 한계

  • 특정 라이브러리나 복잡한 의존성 구조에서는 자동 재시작 기능이 예상대로 동작하지 않을 수 있어 환경 설정에 주의해야 함

핵심 개념 및 활용

H2 Database 활용

모드 선택

  • 인메모리 모드와 파일 기반 모드 중 프로젝트 상황에 맞는 모드를 선택할 수 있음

웹 콘솔 사용

  • 내장 웹 콘솔을 통해 데이터베이스 상태 확인, SQL 실행 및 스키마 관리를 손쉽게 진행할 수 있음

Spring Boot 연동

  • Spring Boot의 자동 설정 기능과 간단한 프로퍼티 설정(application.properties 또는 application.yml)을 통해 H2 Database를 쉽게 연동할 수 있음

Spring Boot DevTools 활용

자동 재시작

클래스 경로 변경을 감지하여 애플리케이션을 자동으로 재시작해 코드 변경 사항을 빠르게 반영

라이브 릴로드

브라우저 새로고침을 자동으로 수행하여 프론트엔드 변경 사항을 즉시 확인할 수 있도록 도움

개발 환경 최적화

개발 중 불필요한 캐시를 비활성화하거나 로깅 설정을 조정해 디버깅 및 테스트 과정에서 효율성을 극대화


1. 의존성 추가

  • 먼저, Maven이나 Gradle과 같은 빌드 도구에 H2 Database 의존성을 추가해야 함
  • 예를 들어, Gradle을 사용하는 경우 build.gradle 파일에 다음과 같이 추가함
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    runtimeOnly 'com.h2database:h2'
    // 개발 중 자동 재시작을 위한 DevTools (선택 사항)
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
}

2. 데이터베이스 설정

  • application.properties 또는 application.yml 파일에 H2 Database 관련 설정을 추가
  • 예시로 application.properties 파일 설정은 다음과 같음
# H2 인메모리 데이터베이스 설정
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

# H2 콘솔 활성화 (웹 브라우저에서 직접 DB를 확인)
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
  • spring.datasource.url = jdbc:h2:mem:testdb
    • 인메모리 모드를 사용하면 애플리케이션 실행 중에만 데이터베이스가 생성되고, 종료되면 데이터가 소실
  • spring.h2.console.enabled = true
    • 웹 브라우저에서 H2 콘솔에 접속할 수 있음

3. H2 콘솔 접속 및 사용

  • 애플리케이션 실행 후 웹 브라우저에서 http://localhost:8080/h2-console에 접속하면 H2 Database의 웹 콘솔에 접근할 수 있음
  • 설정된 데이터베이스 URL, 사용자 이름, 비밀번호를 입력하여 데이터베이스 상태를 확인하거나 SQL 쿼리를 실행할 수 있음

4. 엔티티 및 Repository 예제

  • H2 Database는 실제 데이터베이스처럼 CRUD 작업을 수행할 수 있으므로, 일반적인 JPA 엔티티 및 Repository를 사용해 데이터베이스 연동을 진행

User 엔티티 클래스

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Column;

@Entity
public class User {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(nullable = false)
    private String name;
    
    @Column(unique = true, nullable = false)
    private String email;
    
    // 기본 생성자
    public User() {}
    
    // 생성자
    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }
    
    // Getter 및 Setter
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }
}

UserRepository 인터페이스

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
    // 필요에 따라 추가적인 쿼리 메서드를 정의할 수 있습니다.
}
이제, 스프링 부트 애플리케이션을 실행하면 H2 Database에 자동으로 테이블이 생성되고, Repository를 통해 데이터 추가, 조회, 수정, 삭제 등의 작업을 수행할 수 있음

5. 간단한 테스트 및 사용 예

Spring Boot 애플리케이션 실행 후, 예를 들어 CommandLineRunner를 활용해 데이터를 추가해볼 수 있음

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class DataLoader implements CommandLineRunner {

    private final UserRepository userRepository;

    public DataLoader(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Override
    public void run(String... args) throws Exception {
        // 데이터베이스에 초기 사용자 데이터를 저장합니다.
        userRepository.save(new User("Alice", "alice@example.com"));
        userRepository.save(new User("Bob", "bob@example.com"));

        // 저장된 사용자 목록을 출력합니다.
        userRepository.findAll().forEach(user -> 
            System.out.println("User: " + user.getName() + ", Email: " + user.getEmail())
        );
    }
}
애플리케이션 시작 시 자동으로 Alice와 Bob 사용자 정보가 저장되고, 콘솔에서 해당 정보를 확인할 수 있음

면접 대비 질문

더보기

기초 질문

Q1. H2 Database란 무엇이며, 주로 어떤 용도로 사용되나요?

모범 답안

H2 Database는 자바 기반의 경량 관계형 데이터베이스로, 인메모리 모드와 파일 기반 모드를 지원하여 개발 및 테스트 환경에서 빠르고 간편하게 사용할 수 있습니다.


Q2. Spring Boot DevTools의 주요 기능은 무엇인가요?

모범 답안

Spring Boot DevTools는 자동 재시작, 라이브 릴로드, 개발용 환경 설정 최적화 등 개발 중 코드 변경에 따른 빠른 피드백과 디버깅을 지원하는 도구입니다.


심화 질문

Q1. H2 Database의 인메모리 모드와 파일 기반 모드의 차이점은 무엇인가요?

모범 답안

인메모리 모드는 애플리케이션 실행 시 메모리 내에서 데이터베이스를 생성하여 빠른 성능을 제공하지만, 종료 시 데이터가 소실됩니다. 파일 기반 모드는 데이터를 디스크에 저장해 영속성을 보장하지만, 인메모리 모드보다 속도가 다소 느릴 수 있습니다.


Q2. Spring Boot DevTools가 개발 생산성에 미치는 영향과 활용 방법은 무엇인가요?

모범 답안

DevTools는 코드 변경 시 자동 재시작과 라이브 릴로드 기능을 통해 개발자가 변경 사항을 빠르게 확인할 수 있게 하여 개발 주기를 단축시키고 생산성을 높입니다.


압박 질문

Q1. H2 Database를 실제 운영 환경에서 사용하지 않는 이유는 무엇인가요?

모범 답안

H2 Database는 경량화와 빠른 시작을 목표로 설계되어 대규모 데이터 처리와 복잡한 트랜잭션 관리에 한계가 있으므로 주로 개발 및 테스트 용도로 사용됩니다.


Q2. Spring Boot DevTools의 자동 재시작 기능이 의도대로 동작하지 않을 때의 원인과 해결 방안은 무엇인가요?

모범 답안

자동 재시작 기능은 클래스패스 변경을 감지하여 동작하는데, 특정 라이브러리나 복잡한 의존성 구조에서는 감지가 어려울 수 있습니다. 이 경우 DevTools 설정을 조정하거나, 불필요한 캐시를 비활성화하는 등의 방법으로 문제를 해결할 수 있습니다.


Q3. H2 Database와 DevTools 사용 시 주의해야 할 잠재적 문제점은 무엇인가요?

모범 답안

H2 Database는 인메모리 모드 사용 시 데이터 소실 문제가 발생할 수 있으며, DevTools는 프로덕션 환경에서 사용하면 안 되므로, 각각의 사용 목적과 환경에 맞춰 설정해야 합니다.

'Spring' 카테고리의 다른 글

[Spring] @Scheduled와 Quartz 스케줄러  (1) 2025.02.27
[Spring] AOP(Aspect Oriented Programming)  (0) 2025.02.26
[Spring] 트랜잭션 관리(@Transactional)  (0) 2025.02.25
[Spring] JPA  (0) 2025.02.24
[Spring] MyBatis  (0) 2025.02.24
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함