JPA에 대한 설명과 설정방법은 이전에 포스팅 한 글을 재작성하였다.

 

아래는 원본 글

 

[Spring Boot] JPA

웹 서비스는 데이터를 처리할 때 대부분 데이터베이스를 사용한다. 그런데 데이터베이스를 사용하려면 SQL 쿼리(query)라는 구조화된 질의를 작성하고 실행하는 등의 복잡한 과정이 필요하다. 이

win-bro.tistory.com

 


 

웹 서비스는 데이터를 처리할 때 대부분 데이터베이스를 사용한다. 그런데 데이터베이스를 사용하려면 SQL 쿼리(query)라는 구조화된 질의를 작성하고 실행하는 등의 복잡한 과정이 필요하다. 

이때 ORM(object relational mapping)을 이용하면 자바 문법만으로도 데이터베이스를 다룰 수 있다. 즉, ORM을 이용하면 개발자가 쿼리를 직접 작성하지 않아도 데이터베이스의 데이터를 처리할 수 있다.

 

SQL쿼리와 ORM의 비교

 

SQL 쿼리 : Question 이라는 테이블에 데이터를 넣기 위해 다음과 같은 쿼리를 작성하여 처리를 한다.

 

Query

insert into question (subject, content) values ( '안녕하세요' , '가입 인사드립니다 ^^' );
insert  into question (subject, content) values ( '질문 있습니다' , 'ORM이 궁금합니다' ); 

 

하지만 ORM을 사용하면 쿼리 대신 자바 코드로 다음처럼 작성할 수 있다.

 

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);

코드에서 Question은 자바 클래스이며, 이처럼 데이터를 관리하는 데 사용하는 ORM 클래스를 엔티티(Entity)라고 한다.

 

 

ORM의 장점

 

ORM을 이용하면 데이터베이스 종류에 상관 없이 일관된 코드를 유지할 수 있어서 프로그램을 유지·보수하기가 편리하다. 또한 내부에서 안전한 SQL 쿼리를 자동으로 생성해 주므로 개발자가 달라도 통일된 쿼리를 작성할 수 있고 오류 발생률도 줄일 수 있다.

 

 

JPA?

스프링부트는 JPA(Java Persistence API)를 사용하여 데이터베이스를 처리한다. JPA는 자바 진영에서 ORM(Object-Relational Mapping)의 기술 표준으로 사용하는 인터페이스의 모음이다.

* JPA는 인터페이스이다. 따라서 인터페이스를 구현하는 실제 클래스가 필요하다.

* JPA를 구현한 대표적인 실제 클래스에는 하이버네이트(Hibernate)가 있다. 

 

 

build.gragle

(... 생략 ...)

dependencies {
        implementation 'org.springframework.boot:spring-boot-starter-web'
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
        developmentOnly 'org.springframework.boot:spring-boot-devtools'
        compileOnly 'org.projectlombok:lombok'
        annotationProcessor 'org.projectlombok:lombok'
      runtimeOnly 'com.h2database:h2'  // 개발에 사용할 데이터베이스로 H2 데이터 베이스를 추가하였다.
}

(... 생략 ...)

*  "Refresh Gradle Project"를 실행하여 필요한 라이브러리를 설치

 

 

runtimeOnly

build.gradle 파일의 runtimeOnly는 해당 라이브러리가 런타임(Runtime)시에만 필요한 경우에 사용한다.
컴파일(Compile)시에만 필요한 경우에는 runtimeOnly 대신 compileOnly를 사용한다.

 

 

 

application.properties

# 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=

 

  • spring.h2.console.enabled - H2 콘솔의 접속을 허용할지의 여부이다. true로 설정한다.
  • spring.h2.console.path - 콘솔 접속을 위한 URL 경로이다.
  • spring.datasource.url - 데이터베이스 접속을 위한 경로이다.
  • spring.datasource.driverClassName - 데이터베이스 접속시 사용하는 드라이버이다.
  • spring.datasource.username - 데이터베이스의 사용자명이다. (사용자명은 기본 값인 sa로 설정한다.)
  • spring.datasource.password - 데이터베이스의 패스워드이다. 로컬 개발 용도로만 사용하기 때문에 패스워드를 설정하지 않았다.

 

H2 데이터 베이스를 사용하기 위해서는 사용자의 홈 디렉토리 local.mv.db 를 만들어준다.

홈 디렉토리 : 윈도우: c\Users\(사용자명). 맥: /users/(사용자명)

(위 설정에 local 로 설정했기 때문.(spring.datasource.url=jdbc:h2:~/local) 만약 test로 하고싶다면 mv.db파일명과 설정을 test로 맞춰주면 됨)

 

 

설정이 끝났다면 서버를 시작한 후 http://localhost:8080/h2-console로 접속하면 아래와 같은 화면이 뜬다.

(주의) mv.db 파일을 생성하지 않으면 Connect를 눌러도 연결되지 않는다.

 

접속된 화면

 

 

 

JPA 환경 설정

 

build.gradle

(... 생략 ...)

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    runtimeOnly 'com.h2database:h2'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa' //  추가
}

(... 생략 ...)

 

implementation

build.gradle 파일의 implemetation은 해당 라이브러리 설치를 위해 일반적으로 사용하는 설정이다. implemetation은 해당 라이브러리가 변경되더라도 이 라이브러리와 연관된 모든 모듈들을 컴파일하지 않고 직접 관련이 있는 모듈들만 컴파일하기 때문에 rebuild 속도가 빠르다.

 

 

application.properties 

 - JPA 사용을 위해 #JPA 부분을 추가해 주었다.

# 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=

# JPA
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update
  • spring.jpa.properties.hibernate.dialect - 데이터베이스 엔진 종류를 설정한다.
  • spring.jpa.hibernate.ddl-auto - 엔티티를 기준으로 테이블을 생성하는 규칙을 정의한다.

 

 

spring.jpa.hibernate.ddl-auto

개발 환경에서는 보통 update 모드를 사용하고 운영환경에서는 none 또는 validate 모드를 사용한다.

  • none - 엔티티가 변경되더라도 데이터베이스를 변경하지 않는다.
  • update - 엔티티의 변경된 부분만 적용한다.
  • validate - 변경사항이 있는지 검사만 한다.
  • create - 스프링부트 서버가 시작될때 모두 drop하고 다시 생성한다.
  • create-drop - create와 동일하다. 하지만 종료시에도 모두 drop 한다.

+ Recent posts