본문 바로가기
Back/JPA

[JPA] Spring Data JPA

by 은z 2022. 3. 4.

메소드 명명 규칙만 잘 따르면 간단한 쿼리를 해결할 수 있는 Spring Data JPA

 

1. 사용법

Spring Data JPA에서 구현 클래스를 만들어준다. 우리는 인터페이스만 만들고, 의존성 주입받아서

사용하면 된다.

 

예를 들면, 아래 코드 처럼!

//<Type,PK>
public interface MemberRepository extends JpaRepository<Member, Long> {
		
}

여기서 주의할 점은 JpaRepository의 제네릭인데,

<엔티티 타입, 식별자 타입> 의로 설정해야한다.

 

 

2. 주요 메소드

-save(S) : 새로운 엔티티는 저장하고, 있는 엔티티는 병합
-delete(T) : 엔티티 하나를 삭제. 내부에서 EntitiManager.remove() 호출
-findById(Id) : 엔티티 하나를 조회, 내부에서 EntitiManager.find() 호출
-getOne(Id) : 엔티티를 프록시로 조회. EntitiManager.getReference() 호출
-findAll(..) : 모든 엔티티 조회. 정렬이나 페이징 조건 제공 가능.

 

이외에도

 

 

3. 반환 타입

List<Member> findListByUsername(String username); //컬렉션

Member findMemberByUsername(String username); //단건

Optional<Member> findOptionalByUsername(String username); //옵셔널
  • List<Member> : 컬렉션, 결과가 없으면 빈 컬렉션 반환(null이 아니다)
  • Member : 단건(결과가 없으면 결과가 null, 결과가 2개이면 에러 발생)
  • Optional<Member> : 단건 optional(결과가 2개이면 에러 발생)

 

주의할 점!

JPASpring Data JPA에서는 조회되는 값이 없더라도 Exception이 터지지않게 내부적으로 Try Catch문을 구현해 놓음.

그래서 컬렉션일 경우 빈 컬렉션을 반환하고 

단건일 경우 null을 반환해준다.

 

데이터가 있을지 없을지 모르면 Optional을 사용하여 분기해준다.

 

반환 타입은 하나인데 결과가 2개이상이라면 예외가 터진다. -> javax.persistence.NonUniqueResultException 예외 발생

 

때문에 컬렉션을 쓰는 경우 null체크가 비교적 쉬우니 컬렉션으로 반환하고,

단건 조회를 하는 경우 Optional을 활용해 null체크를 하는 것이 좋다.

 

 

 

4. 엔티티로 조회도 가능!

 

public interface LikeRepository extends JpaRepository<TimeLineLike, Long>, LikeRepositoryCustom {
    TimeLineLike findByTimeLineAndMember(TimeLine timeLine, Member member);
}

 

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
@Entity(name = "time_line_like")
public class TimeLineLike {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="timelike_seq")
    private long timeLikeSeq;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="timeline_seq")
    private TimeLine timeLine;

    @ManyToOne(fetch = FetchType.LAZY)
    @JsonIgnore
    @JoinColumn(name="user_seq")
    private Member member;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="like_seq")
    private LikeType likeType;

    @Column(name="del_yn")
    private boolean delYn;  //눌렀을 경우 true , 취소할 경우 false



}

이렇게 쿼리가 나감!

댓글