(13) Repository Interface 계층 살펴보기

728x90
@Data
@AllArgsConstructor
@NoArgsConstructor
@RequiredArgsConstructor
@Builder
@Entity
public class User extends BaseEntity {

    // User 라는 테이블의 pk, 1 씩 자동으로 증가
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    // Enum 을 사용하는 경우 EnumType.STRING 으로 해줘야 Enum 값이 추가될 때 오류가 발생하지 않는다.
    @Enumerated(value = EnumType.STRING)
    private Gender gender;

    @NonNull
    private String name;

    @NonNull
    @Column(unique = true) // 이 컬럼의 값은 유일해야 한다.
    private String email;

}

 

  •  @Entity
    • 위의 클래스들은 실제 DB 테이블과 매칭될 클래스들이며, 보통 Entity 클래스라고도 불린다. JPA 사용할 경우, 바로 Entity 클래스의 수정을 통해 DB 데이터에 작업한다.
    • 태아붉허 링크될 클래스이며, 기본값으로 카멜케이스 이름을 언더스코어 네이밍(_) 으로 테이블 이름을 매칭한다. ex) UserScore -> user_score
  • @Id
    • 해당 테이블의 PK 필드이다.
  • @GeneratedValue
    • PK의 생성 규칙 표시다.
    • Spring Boot 2.0 부터는 auto_increment 를 위해서 GenerationType.IDENTITY 옵션 추가가 필수이다.
  • @Column
    • 테이블의 컬럼임을 표시한다.
    • 필수는 아니며, 기본값 외에 변경이 필요한 옵션이 존재할 경우 사용한다. ex) @Column(unique = true)
  • @NoArgsConstructor
    • Lombok 을 사용하여 쓸 수 있는 어노테이션 중 하나로 인자 없는 생성자를 만든다.
  • @Builder
    • 해당 클래스의 빌더 패턴 클래스를 생성한다.
    • 생성자 상단에 선언 시 생성자에 포함된 필드만 빌더에 포함한다.
  • @Enumerated
    • 자바 enum 타입을 엔티티 클래스의 속성으로 사용할 수 있다.
    • EnumType.ORDINAL 과 EnumType.STRING 이 있다. ORDINAL 은 enum 순서 값을 DB 에 저장하고 STRING 은 enum 이름을 DB 에 저장한다.
      enum Gender {
      	MALE,
          FEMALE
      }
       이와 반대로, @Enumerated(value = EnumType.STRING) 으로 지정하면 DB 에는 "MALE", "FEMALE" 문자열 자체가 저장된다.
    • enum 이 위와 같이 생겼을 때 @Enumerated(value = EnumType.ORDINAL) 로 지정하고 Gender.MALE 값을 지정해주면 DB 에는 1 이 저장되고, Gender.FEMALE 을 지정하고 DB 에 저장하면 DB 에는 2가 세팅된다. Gender 에 선언되어 있는 순서가 값이 되기 때문이다.

 

// 처음 값은 entity 타입 두번째 값은 유저의 pk 값을 가지면 된다.
public interface UserRepository extends JpaRepository<User, Long> {

    
}

UserRepository 는 JpaRepository 인터페이스를 상속으며, JpaRepository<엔티티 타입, 해당 엔티티의 pk 타입> 을 갖는다. 

기본적으로 제공되는 메서드로는 다음과 같다.

 

  • findAll() 
    • 성능 이슈가 있어서 잘 사용하지 않는 메서드이다.
    • 엔티티의 모든 레코드를 콜렉션 타입으로 가져온다.
  • findAllById() 
    • id 값을 리스트로 받아서 여러가지 레코드들을 조회한다.
  • save()
    • 엔티티에 해당 객체를 저장한다.
    • 영속화에 따라 create 가 될 수 있고 update 가 될 수 있다.
  • findById()
    • 해당하는 id 로 레코드를 찾고 Optional 타입으로 리턴한다.
  • existsById()
    • 해당하는 id 를 갖는 레코드가 존재하는지 boolean 값으로 리턴해준다.
  • saveAll()
    • 엔티티를 리스트 형태로 받아서 DB 에 저장한다.
  • flush()
    • 현재 JPA 컨텍스트에서 가지고 있는 DB 값을 DB 에 반영(저장)하도록 지시한다.
    • 영속성 컨텍스트 때문에 문제가 발생할 경우 flush(), clear() 메서드를 사용하여 해결한다.
  • saveAndFlush()
    • 저장한 데이터를 JPA 컨텍스트에 가지고 있지 않고 바로 DB 에 반영(저장)하도록 한다.
    • DB 에 저장한 값을 JPA 컨텍스트에 저장하지 않는다.
  • deleteInBatch()
    • 엔티티를 리스트 형태로 받아서 한꺼번에 지우는 명령이다.
  • getOne()
    • 주어진 식별자를 가진 엔티티에 대한 참조를 반환한다.
    • findById() 메소드와 차이점은 Lazy 로드인지 Eager 로드인지의 차이이다. 지연(Lazy) 로드 된 getOne() 메서드는 리턴 된 프록시 오브젝트의 특성에 따라 실제로 접근하기 전까지 DB에 쿼리문을 날리지 않으므로 JVM 에서 데이터베이스 왕복을 피한다.
    • 객체의 속성에 접근할 필요가 없는 경우에만 유용하다.(Lazy loading 이기 때문), 그래서 findById 보다 더 나은 성능을 가진다.

 

 

728x90