About JPA & Hibernate 내가 이해한대로 서술

JunH·2022년 8월 2일
0

그게 뭔데 ?

목록 보기
2/2

About JPA & Hibernate

원리보단 실증적인 용도, 사용법 위주로 서술.

간단 개념정리

ORM :: https://en.wikipedia.org/wiki/Object–relational_mapping

뜻 : 객체 관계형 매핑

매핑 :: 연결

즉 객체 관계 연결 이라고 볼 수 있습니다.

객체 그리고 관계형 DB의 데이터 를 연결하는게 목적인데.

https://stackoverflow.com/questions/49475385/diffrence-between-jpa-api-and-hibernate-native-api

  • 정의
    • As JPA is just a specification, it doesn't perform any operation by itself. It requires an implementation. So, ORM tools like Hibernate, TopLink and iBatis implements JPA specifications for data persistence. https://www.javatpoint.com/jpa-introduction

JPA라고 이루어진 명세를 구현하는것들 가운데 하나가 Hibernate 이다.

현재 프로젝트에서는 Hiber Native API는 사용하지 않는중

Annotations

Examples

Source :: https://www.baeldung.com/spring-data-query-by-example

Persistence+with+Spring.pdf

  • Create Table
    • given Data Example
    • Create Table
      @Entity
      class Passenger {
      
          @Id
          @GeneratedValue
          @Column(nullable = false)
          private Long id;
      
          @Basic(optional = false)
          @Column(nullable = false)
          private String firstName;
      
          @Basic(optional = false)
          @Column(nullable = false)
          private String lastName;
      
          @Basic(optional = false) 
          @Column(nullable = false)
          private int seatNumber;
      
          // constructor, getters etc.
      		//@basic 생략가능
      }
      And run Spring, so Created Table and Column
    • Create Repository
      @Repository
      public interface JpaRepository<T, ID>
        extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
      		}
      
      // PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> 생략가능
    • (Optional, 생략가능) QueryByExampleExecutor (I)
      public interface QueryByExampleExecutor<T> {
          <S extends T> Optional<S> findOne(Example<S> var1);
          <S extends T> Iterable<S> findAll(Example<S> var1);
          <S extends T> Iterable<S> findAll(Example<S> var1, Sort var2);
          <S extends T> Page<S> findAll(Example<S> var1, Pageable var2);
          <S extends T> long count(Example<S> var1);
          <S extends T> boolean exists(Example<S> var1);
      } // 이하 커스텀 메서드 , 쿼리 작성가능 이렇게 분리해도되고
        // 직접 리포지토리 내부에 작성해도 됨

내가 이해한대로 설명 (날것주의)

기본적인 골자만 먼저 요약설명 후 수정 및 내용추가.

  1. 제일먼저 어떤 DB이든 연결부터 한다.
  2. 객체(도메인)을 만든다.
  3. 리포지토리를 만든다.
  4. 다른 클래스에서 리포지토리를 갖다쓴다.
  5. 그러다 필요하면 관계설정도 하고 쿼리도 추가하고 리포지토리에 메서드도 추가해가며 이것저것 수정하며 쓰면 된다.

객체? 도메인?

@NoArgsConstructor
@Builder
@ToString
@AllArgsConstructor
@Setter
@Getter
@Entity
@Table(name = "USER_TABLE",uniqueConstraints = {
        @UniqueConstraint(columnNames = "email")
})
public class User {

    @Id
    @GeneratedValue
    private Long id;

    @Column(nullable = false)
    private String password;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private String email;

    private String imageUrl;

    @Enumerated(EnumType.STRING)
    private AuthProvider provider;

    private String providerId;

    @Temporal(TemporalType.TIMESTAMP)
    @CreationTimestamp
    @Column(nullable = false)
    private java.util.Date createDate; //Timestamp

}

Source :: TravelSite Proj

객체이자 도메인이자 나중에 테이블이 될 것. Entity 어노테이션 상단은 lombok에서 지원

  • 참고 : Data 어노테이션 @Data는 @Getter@Setter@RequiredArgsConstructor@ToString@EqualsAndHashCode 를 전부 포함하는 어노테이션인데, 아직 적응이 잘 안되서 본인은 일일히 명시하고 필요할때마다 추가하는걸 선호.
  • 어노테이션 간단설명 @Entity : 엔티티 (@NoArgsConstructor, @AllArgsConstructor,@Id 어노테이션을 요구함. ) id : 해당 컬럼은 UK테이블 생성시 UK가 될 예정 (필수) GenerateValue : 추가될때 따로 언급안해도 규칙에 따라 자동생성 DB마다 이것마다 저것마다 다르다.
    (strategy=GenerationType.IDENTITY) IDENTITY = AUTO_INCREMENT
    SEQUENCE :: (ORACLE, PostgreSQL, DB2, H2) order by sequence file or table
    TABLE :: Like sequence however create key building table (able ALL DB)
    AUTO :: auto (DEFAULT)
    Column : DB 켜본사람은 전부가 아는 컬럼. 커스텀 이름, nullable 설정 가능 @Table(name = "USER_TABLE",uniqueConstraints = {@UniqueConstraint(columnNames = "email")}) : USER은 예약어라 해당 이름 자체로 테이블 생성불가 그러나 엔티티명은 유저로 유지하고싶을때 DB에는 이름을 바꿔 등록, UK에 email 컬럼 추가.
  • Temporal 이하 DB에는 타임스탬프 형식으로 등록. 변수형태는 무조건 java의 DATE 유형 객체를 쓰도록 강제됨

리포지토리?

@Repository
public interface UserRepository extends JpaRepository<User,Long> {
    @Query(value = "select id from USER where id = : id", nativeQuery = true)
    List<User> searchParamRepo(@Param("id") String id);

    Optional<User> findByname(String username);

    @Query(value =
            "SELECT * FROM USER_TABLE" +
                    "ORDER BY email"
            ,nativeQuery = true)
    List<User> searchByEmail(@Param("email") String email);

    Optional<User> findByEmail(String email);

    Boolean existsByEmail(String email);

}
  • 사용시 정말 간단설명 findbyXX 시리즈 : 옵셔널 객체로 리턴 : 따로 쿼리 작성 X 리포지토리에서 찾아준다. existsByXX 시리즈 : 검색시 유무를 리턴 (Boolean) : 아이디찾기 이런거 할때 유효성 검사에 쓴다. Query : 커스텀 쿼리 등록 가능, 복잡한 다중 쿼리 사용시 따로 인터페이스를 만들어서 분리해 상속시켜 구현해도 됨.
  • 관계설정 단방향, 양방향, 1:1 1:M 등등 있음. 상단 어노테이션 표 참조.

0개의 댓글