본문 바로가기
기타/백엔드 기초

스트링부트 | 데이터베이스

by YUNI Heo 2023. 5. 2.
반응형

 

✅ 데이터베이스

  • 데이터를 저장하거나 조회하거나 수정하는 등의 기능을 구현해야 한다. 
  • 웹 서비스는 데이터를 처리할 때 대부분 데이터베이스를 사용한다.
  • 데이터베이스를 사용하려면 SQL 쿼리(query)라는 구조화된 질의를 작성하고 실행하는 등의 복잡한 과정이 필요하다. 

 

✅ ORM, Object Relational Mapping

  • 자바 문법만으로도 데이터베이스를 다룰 수 있다. 
  • ORM을 이용하면 개발자가 쿼리를 직접 작성하지 않아도 데이터베이스의 데이터를 처리할 수 있다.
  • ORM을 사용하면 내부에서 SQL 쿼리를 자동으로 생성해 주므로 직접 작성하지 않아도 된다. 
  • 즉, 자바만 알아도 데이터베이스에 질의할 수 있다.
  • ORM을 이용하면 데이터베이스 종류에 상관 없이 일관된 코드를 유지할 수 있어서 프로그램을 유지·보수하기가 편리하다. 
  • 또한 내부에서 안전한 SQL 쿼리를 자동으로 생성해 주므로 개발자가 달라도 통일된 쿼리를 작성할 수 있고 오류 발생률도 줄일 수 있다.

 

 

💡 SQL 쿼리 비교

SQL 쿼리와 ORM을 비교해 보자.

다음과 같은 형태로 구성된 질문 테이블에 데이터를 입력한다고 가정해 보자.

ID Subject Content
1 안녕하세요 가입 인사드립니다 ^^
2 질문 있습니다 ORM이 궁금합니다

insert into question (subject, content) values ('안녕하세요', '가입 인사드립니다 ^^');
insert into question (subject, content) values ('질문 있습니다', 'ORM이 궁금합니다');
Question q1 = new Question();
q1.setSubject("안녕하세요");
q1.setContent("가입 인사드립니다 ^^");
this.questionRepository.save(q1);

Question q2 = new Question();
q2.setSubject("질문 있습니다");
q2.setContent("ORM이 궁금합니다");
this.questionRepository.save(q2);

 

✅ H2 데이터베이스

  • JPA를 사용하기 전에 데이터를 저장할 데이터베이스를 설치해 보자. 
  • 개발시에는 Oracle, MSSQL 등의 굵직한 데이터베이스 보다는 설치도 쉽고 사용도 편리한 H2 데이터베이스를 많이 사용한다.
  • H2 데이터베이스는 주로 개발용이나 소규모 프로젝트에서 사용되는 파일 기반의 경량 데이터베이스이다. 
  • 개발시에는 H2를 사용하여 빠르게 개발하고 실제 운영시스템은 좀 더 규모있는 DB를 사용하는 것이 일반적인 개발 패턴이다.

 

💡 H2 데이터베이스 설치

  • build.gradle 파일 수정: 프로젝트의 build.gradle 파일을 열고, dependencies 항목에 다음 코드를 추가한다.
  • runtimeOnly
    • build.gradle 파일의 runtimeOnly는 해당 라이브러리가 런타임(Runtime)시에만 필요한 경우에 사용한다. 
    • 컴파일(Compile)시에만 필요한 경우에는 runtimeOnly 대신 compileOnly를 사용한다.
dependencies {
	// 다른 의존성
    runtimeOnly 'com.h2database:h2'
}

  • Gradle 프로젝트 새로고침: build.gradle 파일을 수정한 후 Gradle 프로젝트를 반드시 새로고침 한다. 
    • 프로젝트 파일에서 마우스 오른쪽 버튼을 클릭하고, [Gradle -> Refresh Gradle Project]를 선택한다.

application.properties 파일을 작성한다.

  • spring.h2.console.enabled: H2 콘솔의 접속을 허용할지의 여부이다. true로 설정한다.
  • spring.h2.console.path: 콘솔 접속을 위한 URL 경로이다.
  • spring.datasource.url: 데이터베이스 접속을 위한 경로이다.
    • spring.datasource.url에 설정한 경로에 해당하는 데이터베이스 파일을 만들어야 한다. 
    • jdbc:h2:~/local 로 설정했기 때문에 사용자의 홈디렉터리(~ 에 해당하는 경로) 밑에 local.mv.db 라는 파일을 생성해야 한다. 
    • 본인이 사용하는 OS에 맞는 홈디렉터리에 local.mv.db 파일을 생성한다.
    • type NUL > local.mv.db
  • spring.datasource.driverClassName: 데이터베이스 접속시 사용하는 드라이버이다.
  • spring.datasource.username: 데이터베이스의 사용자명이다. (사용자명은 기본 값인 sa로 설정한다.)
  • spring.datasource.password :데이터베이스의 패스워드이다. 로컬 개발 용도로만 사용하기 때문에 패스워드를 설정하지 않았다.
# DATABASE
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.datasource.url=jdbc:h2:~/local
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

  • URL 주소로 H2 콘솔에 접속한다.
    • http://localhost:8080/h2-console

  • H2 콘솔화면을 볼수 있다.
    • 경로를 application.properties 파일에 설정한 jdbc:h2:~/local로 변경하고 "연결" 버튼을 클릭한다.


JPA, Java Persistence API

  • 스프링부트는 JPA(Java Persistence API)를 사용하여 데이터베이스를 처리한다. 
  • JPA는 자바 진영에서 ORM(Object-Relational Mapping)의 기술 표준으로 사용하는 인터페이스의 모음이다.
  • JPA는 인터페이스이다. 
  • 따라서 인터페이스를 구현하는 실제 클래스가 필요하다. J
  • PA를 구현한 대표적인 실제 클래스에는 하이버네이트(Hibernate)가 있다. 
  • SBB도 JPA + 하이버네이트 조합을 사용한다.

 

💡 JPA, Java Persistence API 환경설정

  • H2 데이터베이스를 사용할 준비가 완료되었다. 
  • 이제 자바 프로그램에서 H2 데이터베이스를 사용할 수 있게 해야한다. 
  • 자바 프로그램에서 데이터베이스에 데이터를 저장하거나 조회하려면 JPA를 사용해야 한다. 
  • 하지만 JPA를 사용하기 전에 JPA를 사용하기 위한 준비 작업이 필요하다.

  • build.gradle 파일 수정: 프로젝트의 build.gradle 파일을 열고, dependencies 항목에 다음 코드를 추가한다.
  • implementation
    • build.gradle 파일의 implementation은 해당 라이브러리 설치를 위해 일반적으로 사용하는 설정이다. 
    • implementation은 해당 라이브러리가 변경되더라도 이 라이브러리와 연관된 모든 모듈들을 컴파일하지 않고 직접 관련이 있는 모듈들만 컴파일하기 때문에 rebuild 속도가 빠르다.
dependencies {
    // 다른 의존성
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}

  • Gradle 프로젝트 새로고침: build.gradle 파일을 수정한 후 Gradle 프로젝트를 반드시 새로고침 한다. 
    • 프로젝트 파일에서 마우스 오른쪽 버튼을 클릭하고, [Gradle -> Refresh Gradle Project]를 선택한다.

application.properties 파일에 다음 항목을 추가한다.

  • spring.jpa.properties.hibernate.dialect: 데이터베이스 엔진 종류를 설정한다.
  • spring.jpa.hibernate.ddl-auto: 엔티티를 기준으로 테이블을 생성하는 규칙을 정의한다.
    • 위 설정에서 spring.jpa.hibernate.ddl-auto를 update로 설정했다. update와 같은 설정값에 대해서 간단히 알아보자.
    • none - 엔티티가 변경되더라도 데이터베이스를 변경하지 않는다.
    • update - 엔티티의 변경된 부분만 적용한다.
    • validate - 변경사항이 있는지 검사만 한다.
    • create - 스프링부트 서버가 시작될때 모두 drop하고 다시 생성한다.
    • create-drop - create와 동일하다. 하지만 종료시에도 모두 drop 한다.
    • 개발 환경에서는 보통 update 모드를 사용하고 운영환경에서는 none 또는 validate 모드를 사용한다.
# JPA
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update

 

 

 

 

 

반응형