사용자 도구

사이트 도구


wiki:spring:jpa

문서의 이전 판입니다!


Spring에 JPA 적용하기

  • description :
  • author : 도봉산핵주먹
  • email : hylee@repia.com
  • lastupdate : 2020-12-16

JPA 사용해야 되는 이유

  • 안녕히 계세요 SQL?
  • 자바 개발자의 필수 기술 (트렌드에 뒤쳐지지 말자)
    • 안녕히 계세요 마이바티스?
  • 객체지향과 관계형DB의 패러다임이 불일치 해결
    • 객체 상속 관계 - Table 슈퍼타입 서브타입 관계
    • 설계는 가능하지만 추가는 어찌 어찌 개발 하겠지만 조회는 답이 없음

JPA 어려운 이유

  • JPA 사용 방법을 알아야 한다. - 진입 장벽이 있음
  • 객체와 테이블 설계 매핑이 쉽지 않다.(성능 고려)
  • JPA 내부 동작 방식을 제대로 알아야 한다.

JPA 설계

  • 테이블에 맞게 객체를 설계 or 설계에 맞게 테이블 설계

JPA 요점

  • 객체와 관계형 데이터베이스 매핑 (설계 관점, 정적)
  • 영속성 컨텍스트 (운영 관점)
    • 장점
      • 1차 캐시 기능 (트랜잭션 내에서)
      • 영속 엔티티의 동일성 보장 (동일한 트랜잭션 내에서)
  • 트랙잭션을 지원하는 쓰기 지연
    • 쓰기 지연 SQL 저장소가 있음
    • 개발자에게 최적화의 여지를 둠
  • 변경 감지 (Dirty Checking)
  • 엔티티 삭제
  • 플러시
    • 영속성 컨텍스를 비우지 않으며, 데이터베이스와 동기화라고 보면 됨
  • 준영속 상태
  • 지연 로딩(Lazy Loading)

매핑

@Entity : JPA가 관리함을 의미
  public, protected 생성자, 기본 생성자 필수
  @Table(name = "데이터베이스 테이블명")

실행 시점에 테이블 자동 생성 가능
  create, create-drop, update, validate, auto, none
  개발 초기 단계는 create, update
  테스트 서버는 update, validate
  스테이징, 운영 서버 validate, none
  
  @Column의 옵션은 JPA 로직과는 상관이 없고, 생성시 ddl에 영향을 줌
  updatable = false, 업데이트시에 업데이트 하지 않음
  nullable = false 
  unique = true, 생성시 이름이 

  sql은 date=날짜, time=시간, tiemstamp만 있음

  GeneratorType.IDENTIFY
  persist()하면 쿼리가 실행됨
  
  GeneratorType.SEQUENCE
  트랜잭션을 해야해야 쿼리가 실행됨

  실전 예제
  
  
  

연관 관계

  • 연관관계의 주인을 정한다는 것은 외래 키 관리자를 선택하는 것이다.
  • 연관관계의 주인은 외래키가 있는 곳
  • 주인은 mappedBy 속성을 사용하지 않는다.
  • 주인이 아니면 mappedBy 속성을 사용해서 속성의 값으로 연관관계의 주인을 지정해야 한다.
  • 연관관계의 주인만이 데이터베이스의 연관관계와 매핑되고 외래 키를 관리할 수 있다.
  • 주인이 아닌 곳은 읽기만 할 수 있다.
  • 데이터베이스 테이블의 다대일, 일대다 관계에서는 대부분 다 쪽이 외래 키를 가진다. (주인)

적용파일 목록

  • context-hibernate.xml
  • context-jpa-respository.xml

context-hibernate.xml

Tip

아래 코드에서 3곳만 고치면 된다.

<property name=“dataSource” ref=“” />

  • context-datasource.xml 에 JPA로 사용할 DB정보의 bean ID

<property name=“packagesToScan” value=“” >

  • values는 패키지 정보를 입력

<prop key=“hibernate.dialect”>

  • JPA가 적용되는 DB 정보와 맞게 입력
  • 정보는 아래표 참고



<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
 
	<!-- 컨테이너가 관리하는 EntityManager 생성, @PersistenceContext와 함께 사용 -->
	<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="dataSource" ref="egov.dataSource" />
		<!-- 어노테이션 매핑정보 스캔 -->
		<property name="packagesToScan" value="com" />
		<!-- 구현체별 자체 기능을 표준화 -->
		<property name="jpaVendorAdapter">
			<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
				<property name="showSql" value="true" />
				<property name="generateDdl" value="true" />
			</bean>
		</property>
		<!-- persistence.xml 설정정보와 함께 사용가능 -->
		<property name="jpaProperties">
			<props>
				<!-- <prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.EJB3NamingStrategy</prop> -->
				<prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
				<!-- hibernate 5 버전에서의 세팅 (4 버전은 위에껄 사용)-
				<prop key="hibernate.naming.implicit-strategy">org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl</prop>
				<prop key="hibernate.naming.physical-strategy">org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl</prop> 
				-->
				<prop key="hibernate.hbm2ddl.auto">validate</prop>
				<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
				<prop key="hibernate.show_sql">true</prop>                
				<prop key="hibernate.format_sql">true</prop>                
				<prop key="hibernate.use_sql_comments">true</prop>         
				<prop key="hibernate.jdbc.batch_size">5</prop>
			</props>
		</property>
	</bean>
 
</beans>



hibernate.dialect 정보

DB2 org.hibernate.dialect.DB2Dialect
DB2 AS/400 org.hibernate.dialect.DB2400Dialect
DB2 OS390 org.hibernate.dialect.DB2390Dialect
PostgreSQL org.hibernate.dialect.PostgreSQLDialect
MySQL5 org.hibernate.dialect.MySQL5Dialect
MySQL5 with InnoDB org.hibernate.dialect.MySQL5InnoDBDialect
MySQL with MyISAM org.hibernate.dialect.MySQLMyISAMDialect
Oracle (any version) org.hibernate.dialect.OracleDialect
Oracle 9i org.hibernate.dialect.Oracle9iDialect
Oracle 10g org.hibernate.dialect.Oracle10gDialect
Oracle 11g org.hibernate.dialect.Oracle10gDialect
Sybase org.hibernate.dialect.SybaseASE15Dialect
Sybase Anywhere org.hibernate.dialect.SybaseAnywhereDialect
Microsoft SQL Server 2000 org.hibernate.dialect.SQLServerDialect
Microsoft SQL Server 2005 org.hibernate.dialect.SQLServer2005Dialect
Microsoft SQL Server 2008 org.hibernate.dialect.SQLServer2008Dialect
SAP DB org.hibernate.dialect.SAPDBDialect
Informix org.hibernate.dialect.InformixDialect
HypersonicSQL org.hibernate.dialect.HSQLDialect
H2 Database org.hibernate.dialect.H2Dialect
Ingres org.hibernate.dialect.IngresDialect
Progress org.hibernate.dialect.ProgressDialect
Mckoi SQL org.hibernate.dialect.MckoiDialect
Interbase org.hibernate.dialect.InterbaseDialect
Pointbase org.hibernate.dialect.PointbaseDialect
FrontBase org.hibernate.dialect.FrontbaseDialect
Firebird org.hibernate.dialect.FirebirdDialect

context-jpa-respository.xml

Tip

아래 코드에서 한개만 고치면 된다.

<jpa:repositories base-package=“”>

  • base-package=“” 는 패키지 정보 입력



<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:jpa="http://www.springframework.org/schema/data/jpa"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
	http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
 
	<jpa:repositories base-package="com"></jpa:repositories>
 
</beans>

POM.xml

	<properties>
		<egovframework.jpa.version>3.7.0</egovframework.jpa.version>
		<hibernate.version>4.3.11.Final</hibernate.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>egovframework.rte</groupId>
			<artifactId>egovframework.rte.psl.data.jpa</artifactId>
			<version>${egovframework.jpa.version}</version>
		</dependency>
 
		<!-- Hibernate -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>${hibernate.version}</version>
		</dependency>
 
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-validator</artifactId>
			<version>5.4.2.Final</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-jpa</artifactId>
			<version>1.11.10.RELEASE</version>
			<exclusions>
				<exclusion>
					<groupId>org.slf4j</groupId>
					<artifactId>slf4j-api</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.slf4j</groupId>
					<artifactId>jcl-over-slf4j</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
	</dependencies>

Builder 사용하기

/volume1/web/dokuwiki/data/attic/wiki/spring/jpa.1656331320.txt.gz · 마지막으로 수정됨: 2022/06/27 21:02 저자 dhan