BackEnd/패캠

[JPA] data.sql 설정 / 롬복 / Repository Interface 메소드

제이드Jade 2022. 1. 29. 00:58

- ORM JPA로 실현그를 구현한게 Hibernate.. 그 중 spring에 필요한게 spring data jpa

 

 

data.sql

  • 초기에 실습하고 있는 환경은 in-memory db를 활용하므로 데이터가 영구적으로 기록되진 않는다.
  •  but) resources 하위에 data.sql파일(sql 쿼리 파일)을 넣으면 코드 실행 전에 이 파일을 실행시켜서 데이터를 db에 넣어준다.
  •  call next value for hibernate_sequence => @generatedValue를 실현시켜줌

          ㄴ 이 문장의 삽입 위치와 상관 없이 n번 삽입하면 다음에 혹여나 새로운 객체가 db에 저장되려 할 때 id가 n+1번으로 들어가게 됨.

          ㄴ data.sql에선 우리가 적어줬지만 h2데이터베이스에서 id를 매길땐 이 문장을 알아서 실행해준다.

  • now() : 현재 시간을 값으로
  • 실제 실행되는 쿼리를 로그에 표시

 

application.yml

  •  spring.jpa.defer-datasource-initialization: true  => data.sql을 시스템이 올라온 후 사용할지 여부 설정

: 이 것 땜에 몇시간 고생;

 

- User

- entity=속성+getter+setter => 캡슐화원칙

  • @NoArgu~ 디폴트 생성자는 필수!!                      //이 생성자 쓰면 @NonNull이 적용된 필드도 null로 생성
  • @Required~ : 꼭 필요한 것만 생성자로 만듦, @NonNull지정된 속성을 묶어서 만들어줌
  • @Data => getter, setter ,ToString, RequiredArgs~, equalsAndHashcode 모두 들어있다!!

           ㄴ (@EqualsAndHashcode :  객체의 동등성 검사를 위한 것)

  • @Builder : 객체 생성을 한줄에 하게 해줌

 

  • @Entity : 테이블에 매핑할 클래스임을 명시하는 어노테이션, 동시에 JPA가 관리하는 클래스임

           ㄴ 이걸 달면 primary key를 등록해줘야 한다. >> @Id

  • @GeneragedValue : 자동으로 카운트되어 증가

           ㄴ 전략에는 TABLE, SEQUENCE, IDENTITY, AUTO(디폴트)가 있다.

                       ㄴ TABLE : 기본키 생성 테이블을 만들어서 시퀀스 처럼 사용

                       ㄴ SEQUENCE: 데이터베이스 시퀀스(oracle, h2..)를 사용해서 기본 키 부여

                       ㄴ IDENTITY :  데이터베이스에 기본키 생성을 위임(mysql, mariadb)

                       ㄴ AUTO : JPA가 DB 종류에 맞게 기본키 생성 (h2 -> sequence로)

           ㄴ * sequence는 모든 엔티티에서 공통된 id 순서를 공유한다.

           따라서 h2를 쓸 땐 strategy를 identity로 변경하면 엔티티 별로 해줌. -> data.sql에 hibernate문도 삭제해야 함.

  • @Table : 클래스에 매핑되는 테이블의 정보를 명시할 수 있다.

           <속성> ( 값에 빨간 줄이 있는 것은 db에 연결이 안돼서 그런거니 신경 ㄴㄴ)

           ㄴ name : 테이블 이름을 지어줄 수 있다.(몇 가지 경우를 제외하고는 따로 지정X)

           ㄴ uniqueConstraints : unique키 지정

           ㄴ indexes : 인덱스할 키 지정

           => 주의! unique~, indexes는 jpa에 명세만 될 뿐이지 실제 db에는 적용되지 않을 수 있다.(= select insert update delete등을 할 때 효력 발생x) => 보통은 이 두 속성은 db에 맡김

 

  • @ Column : 데이터베이스의 컬럼의 특성을 지정

<속성> ㄴ name : db에서 컬럼 이름 지정

           ㄴ nullable ; not null 지정 (역시 실제 db에는 적용되지 않을 수 있음 => 뭔말인디)

           ㄴ unique : 앞서 Table은 복수개의 유니크 키 설정, 이건 개별적으로

           ㄴ length : varcahar(255)의 225 부분을 지정(참고 : varchar의 기본길이는 255)

           ㄴ updatable/insertable : 말그대로 update/insert할 때 컬럼 반영 여부

  • @Transient : 객체에는 있지만 db에는 반영되지 않는 속성
  • @Enumerated : 속성이 enum타입임을 명시

           ㄴ value : STRING, ORDINAL(디폴트)

           ㄴ enum은 열거형, 즉 상수의 집합이기 때문에 디폴트로 하면 값이 숫자로 지정됨.

                           : enum의 상수 값이 추가되는 등의 변화가 생기면 db와 불일치하게 되는 불상사가 일어날 수 있음

=> value값으로 STRING을 사용하자!!(멤버이름으로 계속 지속됨)

          

-UserRepository

  • 객체-테이블 매핑
  • Jpa리파지토리만 상속한 인터페이스를 선언하는 것만으로도 Jpa관련한 많은 메서드를 사용할 수 있음 : extends JpaRepository<객체,pk타입>
  • JpaRepository 안으로 들어가보면 여러 메서드가 있음
  • 그 중에서 iterable을 매개변수로 받는건 리스트를 매개변수로 받는 것임 (iterable : 리스트의 상위 인터페이스)
  • findAll() : 리파지토리에 있는 모든 데이터를 리스트형식으로 반환

           (실제 현업에선 이걸 사용하면 몇천만건의 데이터를 불러오는 것이 성능이슈를 발생시키므로 잘 사용하지 않음)

  •  flush() : 현재 jpa컨텍스트에서 가지고 있는 db값을 실제 db에 반영하도록 지시
            //deleteInBatch : 매개변수로 받은 엔티티 리스트를 db에서 삭제     => 이 역시 현없에서 사용할 일은 잘 x
  • getOne : id값을 받아 엔티티를 딱 하나 가져오는 것
  • findAll에서 sort를 매개변수로 받는것 >> 말그대로 sort방법을 매개변수로 받아 sorting한 리스트를 반환

 

userRepositoryTest

  • getOne: em(엔티티매니저)를 통해서 reference만 가져옴, 그래서 유지가 안됨      //메이지(?)방식
  • findById : em을 통해서 객체를 가져옴     -illegal(?)방식