implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
이때 spring-boot-starter-data-jpa
는 jdbc library를 포함하기 때문에 제거해도 된다.
hibernate library가 있어야 한다. JPA는 interface이고 여기 안에 있는 hibernate 만 거의 쓴다.
spring.jpa.show-sql=true
: JPA가 날리는 SQL을 볼 수 있다.
spring.jpa.hibernate.ddl-auto=none
: JPS는 회원 객체를 보고 table도 지가 다 만들어버린다. 그래서 auto로 table 생성기능을 끈 것이다. 이를 만약에 create로 하면 알아서 자동으로 다 만들어준다.
@Entity
를 추가하고 PK인 @Id
를 설정해준다.@Column(필드 명 = "컬럼 명")
EntityManager
가 모든일을 다 한다. build.gradle
에서 jpa library
를 추가하면 spring boot
가 알아서 application.properties
의 정도를 다 조합해서 EntityManager
를 생성을 해준다. 이때 현재 DB랑 다 연결해서 만들어준다.injection
받으면 된다. public JpaMemberRepository(EntityManager em){
this.em = em;
}
@Override
public Member save(Member member){
em.persist(member);
return member;
}
@Override
public Optional<Member> findById(Long id){
Member member = em.find(Member.class, id);
return Optional.ofNullable(member);
}
@Override
public Optional<Member> findByName(String name){
List<MEmber> result = em.createQuery("select m from Member m where m.name = :name", Member.class)
.setParameter("name", name)
.getResultList();
return result.stream().findAny();
}
@Override
public List<Member> findAll() {
List<Member> result = em.createQuery("select m from Member m", Member.class)
.getResultList();
return result;
}
ctrl + alt + n
: 인라인
shift + ctrl + alt + t
: refactoring
@Override
public List<Member> findAll() {
return em.createQuery("select m from Member m", Member.class)
.getResultList();
}
이 JPA 객체를 쓰려면 항상 transaction이 있어야 한다. Data를 저장하거나 변경하려면 항상 있어야 한다.
JPA를 통한 모든 데이터 변경은 트랜잭션 안에서 실행해야 한다
얘가 SpringDataRepository를 상속받고 있다면 구현체를 자동으로 만들어준다. 그래서 Spring Bean에 자동으로 등록한다.
그래서 우리는 그냥 Config에서 assembly만 하면 된다.
JpaRepository
에 들어가보면 약 15개의 기본 CRUD
SQL method들이 구현되어있는데 회사별로 다른 특이한 SQL들을 모두 구현할 수 없으니 그런것들만 구현해주면 되는것이다.private final MemberRepository memberRepository;
@Autowired
public SpringConfig(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Bean
과 같음 어떻게? 앞서 말했든 interface에 JpaRepository
라는 것을 상속받으면 proxy라는 기술을 이용하여 요 구현체를 @Bean에 등록한다.method name, return type, parameter
)으로 query문 작성이 가능하다.