본문 바로가기
개발(라이브러리,프레임워크)/Spring boot

JPA

by zieunee 2021. 4. 4.
반응형

스프링 DB

JPA

  • JPA 기존의 반복코드는 물론 , 기본적인 SQL도 JPA가 처리를 해줌
  • SQL, 데이터 중심 설계에서 객체 중심의 설계로 패러다임 전환 할 수 있음
  • JPA는 표준 인터페이스 / 구현체로 hibernate가 있음
  • JPA은 ORM(객체랑 관계형 데이터베이스) 기술

설치

  • gradle 의존성 추가 (~~ data-jpa)

  • application.properties 에 jpa 설정 추가

  • spring.jpa.show-sql=true
    spring.jpa.hibernate.ddl-auto=none

ex>

package com.example.jieundemo.webservice.domain.posts;

import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.data.annotation.Id;


import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;

@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Entity
public class Posts {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "userName",length = 500, nullable = false)
    private String name;

    public void setId(Long id){
    ..
    }
    ...

}

DB와 매핑될 자바 클래스를 만든다. 이 자바클래스가 Entity클래스 라고 함

JPA 어노테이션

  • @Entity
    • 테이블과 링크될 클래스
    • _ 으로 이름을 매칭함
    • 이제부터 JPA가 관리하는 엔티티
  • @Id
    • pk필드
  • @GeneratedValue
    • pk생성 규칙
    • @GeneratedValue(strategy = GenerationType.IDENTITY)
      • insert할 때 db가 id를 자동 생성해줌 >> identity 하고 한다. 이 전략을 취하겠다.
  • @Column
    • 테이블 컬럼을 나타내면 굳이 선언하지 않더라고 해당 크래스의 픽드는 모두 컬럼이 된다.
    • 기본값이외에 변경필요한 옵션이 있음 사용함
    • @Column(name = "userName",length = 500, nullable = false)
      • name = 이거 없으면 컬럼명은 그냥 name/ 있으면 컬럼명 userName으로 매핑된다.
package com.example.jieundemo.webservice.domain.posts;

import org.springframework.data.jpa.repository.JpaRepository;

public interface PostsRepository extends JpaRepository<Posts, Long> {
    private final EntityManager em;

    ...

    @Override
    public Member save(Member member){
        em.persist(member); 
        return member;
    }
    @Override
    public Optional<Member> findById (Member member){
        Member member = em.find(Member.class, id);
        return Optional.ofNullable(member);
    }

    @Override
    public Optional<Member> findByName(Member member){
        return em.createQuery(qlString: "select m from Member m where m.name = :name", Member.class)
        .setParameter(name:"name",name)
        .getResultList();
    }

    @Override
    public List<Member> findByAll(Member member){
        return em.createQuery(qlString: "select m from Member m", Member.class)
        .getResultList();
    }
}
  • EntityManager 이란 ?

    JAP는 EntityManager로 모두 동작한다. application.properties 에 jpa 설정을 했다면 스프링 부트가 자동으로 세팅을 해줌

  • 위와같이 save 함수를 적으면 JPA가 insert 쿼리를 만들어 넣어준다.

  • findById 함수는 조회 (pk)

  • findByAll 은 jpql이라는 객체지향 쿼리를 써야한다.

    • 객체 대상으로 쿼리를 날림
    • Memeber 라는 Entity를 조회함 , 객체 자체를 쓴다.
  • 주의사항 : 데이터를 저장하고 변경할때는 항상 @ransactional이 있어야한다. (~Service.class 에 넣어준다)

https://jojoldu.tistory.com/251?category=635883 / 김영한의 스프링 (인프런)

반응형