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로 접속하면 아래와 같은 화면이 뜬다.
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 한다.