본문 바로가기
SpringBoot/(책)스프링부트 시작하기

[springboot] 14. 스프링 데이터 jpa 1(개념,설정)

by 평범한kiki 2023. 5. 6.

* JPA(Java Persistence API)
 자바 객체와 데이터베이스 테이블 간의 매핑을 처리하는 ORM(Object Relational Mapping) 기술의 표준
 ORM은 간단히 표현하는 객체와 관계를 설정하는 것
 JPA중 하이버네이트가 가장 많이 사용된다
 장점) 개발편리, 디비에 독립적인 개발 가능, 유지보수 쉽다
 단점) 학습곡선크다(튜닝등..), 특정 디비기능 사용못함(오라클 함수..), 객체지향 설계필요(디비의 테이블 설계후 그에 맞춰서 객체 및 비지니스 로직이 설계,개발된다)

* 스프링 데이터 JPA
  JPA를 스프링에서 쉽게 사용할 수 있게 제공하는 라이브러리
  Repository 인터페이스 제공하여 이 인터페이스 상속받아 정해진 규칙에 맞게 메소드 작성
  그리고 내부적으로는 실제 기능을 담당하는 JPA의 구현제(JPA 프로바이더로 하이버네이트) 가 사용한다.
  하이버네이트를 모르더라도 프레임워크가 하이버네이트를 이용해서 적절한 코드를 생성하기에 JPA를 쉽게 사용가능하다

* 스프링 데이터 jpa 기본설정

1) resources/application.properties 추가

#JPA 설정
spring.jpa.database=mysql
#Mysql 상세지정
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
spring.jpa.properties.hibernate.dialect.storage_engine=innodb
#테이블생성과 같은 스크립트(DDL)를 자동으로 실행되게한다. 
#실제 개발에서는 꼭 false로 설정!!(디비에 변경이 생기면서 데이터가 삭제될수 있다)
spring.jpa.generate-ddl=true
#새로운 ID 생성옵션. 하이버네이트ID 생성 옵션은 AUTO,TABLE,SEQUENCE가 있음. 
#여기서는 mysql의 자동증가 사용으로 false 설정
spring.jpa.hibernate.use-new-id-generator-mappings=false
#실행되는 SQL문을 보여줄 것인가?
spring.jpa.show-sql=true

-- spring.jpa.generate-ddl=true 실제 개발에서는 꼭 false로 설정!!(디비에 변경이 생기면서 데이터가 삭제될수 있다)

2) JPA 설정 빈등록하기
  board/configuration/DatabaseConfiguration.java

import java.util.Properties;

@Configuration
@PropertySource("classpath:/application.properties") //설정파일 위치지정
@EnableTransactionManagement  //스프링에서 제공하는 어노테이션 기반 트랜잭션을 활성화
public class DatabaseConfiguration {
	
	@Autowired
	private ApplicationContext applicationContext;

    ..중략 ...
	 @ConfigurationProperties(prefix = "spring.jpa")
	 public Properties hibernateConfig() {
		 return new Properties();
	 }

}


3) 날짜 API 설정하기(Jsr310JpaConverters)
/board/BoardApplication.java

-- @EnableJpaAuditing, @EntityScan 추가

package board;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.data.jpa.convert.threeten.Jsr310JpaConverters;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@EnableJpaAuditing
@EntityScan(
		 basePackageClasses = {Jsr310JpaConverters.class},
		 basePackages = {"board"})//basePackages의 하위에서 JPA 엔티티검색
@SpringBootApplication
public class BoardApplication {

	public static void main(String[] args) {
		SpringApplication.run(BoardApplication.class, args);
	}

}