JAVA/spring

[1028 from 스프링 백기선 JPA] 스프링데이터 _ JPA 원리, 스프링데이터 모듈

 

JpaRepository

JpaRepository<Entity, Id> 인터페이스
매직인터페이스 
@Repository가 없어도 빈으로 등록해 줌

public interface DiaryRepository extends JpaRepository<Diary, Integer> { }
@EnableJpaRepositories (스프링부트에서 지원, 생략)  컨피규레이션 위에 올림. 
스프링부트 시작은 @Import(JpaRepositoriesRegistrar.class)   
핵심은 ImportBeanDefinitionRegistrar 인터페이스 : 스프링프레임워크 
: 빈을 프로그래밍을 통해 등록가능. 
public class DiaryRegistrar implements ImportBeanDefinitionRegistrar {
    @Override public void registerBeanDefinitions(AnnotationMetadata  importingClassMetadata, BeanDefinitionRegistry registry) {
        GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
        beanDefinition.setBeanClass(Diary.class);         
        beanDefinition.getPropertyValues().add("name","오잉");
        registry.registerBeanDefinition("day", beanDefinition); }
}
jdbc  
패러다임 불일치 릴레이션 - java
단위, 관계표현, 식별자 , 상속관계표현 => ORM 해결 매핑 메타데이터 기반. 
생산성, 유지보수성, 성능.  
jpa 주의 반드시 발생하는 SQL 확인
? 출력
logging.level.org.hibernate.SQL=debug logging.level.org.hibernate.type.descriptor.sql=trace

binding parameter [2] as [VARCHAR] - [null]
binding parameter [3] as [TIMESTAMP] - [null]
binding parameter [4] as [VARCHAR] - [오늘이다.]
binding parameter [5] as [BOOLEAN] - [true]
binding parameter [6] as [INTEGER] - [3]
스프링 데이터 SQL & NoSQL 저장소, 지원프로젝트의 묶음

spring.io/projects/spring-data

스프링 데이터 모듈 : 

스프링데이터 Common : 여러 저장소 지원 프로젝트의 공통기능 제공
스프링데이터 REST: 저장소의 데이터를 하이퍼미디어 기반 Http 리소스로 REST API 제공
---------------------------
스프링데이터 JPA      : 스프링 데이터 Common 이 제공하는 기능에 jpa 관련 기능 추가. 
스프링데이터 JDBC
스프링데이터 KeyValue
---------------------------
스프링데이터 MongoDB
스프링데이터 Redis.......

 

non-invasive 논인베이시브 비침투적. 스프링 코드를 최대한 노출 시키지 않겠다. 

 

* DB 조회 변경 과정

더보기
@Repository @Transactional
public class AccountRepository {
    @PersistenceContext EntityManager entityManager;
    public Account add(Account account){
     entityManager.persist(account);
     return account;
 }
  -> @Repository @Transactional
public class AccountRepository extends GenericRepository<Account, Long> {
-> JPA package com.today10sec.diary.repository;
import com.today10sec.diary.model.Diary;
import org.springframework.data.jpa.repository.JpaRepository;

public interface DiaryRepository extends JpaRepository<Diary, Integer> {
}

package com.today10sec.diary.etc;

import com.today10sec.diary.model.Diary;
import com.today10sec.diary.repository.DiaryRepository;
import org.hibernate.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.Transactional;
import java.util.HashSet;
import java.util.Set;

@Component
@Transactional
public class JpaRunner implements ApplicationRunner {

    @PersistenceContext
    EntityManager entityManager;

    @Autowired
    DiaryRepository diaryRepository;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        Diary diary = new Diary();
        diary.setUse(true);
        diary.setName("오늘이다.");

        Session session = entityManager.unwrap(Session.class);
        session.save(diary);

        diaryRepository.findAll().forEach(diary1 -> System.out.println(diary1.getName()) );

    }
}