JPA(2)

홍성우·2023년 2월 7일
0

jpa를 활용하기 전에 jpo객체에 대해 먼저 알아야한다.
jpo객체가 무엇이나면
도메인 객체(java 객체)와 테이블 객체(table 객체)의 타입을 서로 연결시켜 주는 객체이다.

타입이 서로 불일치하다는 용어는 '임피던스불일치' 이다.

도메인 객체와 테이블 객체를 연결시켜주기위해 jpo객체가 필요하다.

jpo객체에 관련된 어노테이션은
@Entity - 도메인 어노테이션
@Id - 식별자


이렇게 생성하면 @Entity 어노테이션(EntityManager)가 테이블 구조 맞게 도메인을
변환해준다.
참고로 여기서 lombok @Getter,@Setter,@NoArgsConstructor 같이 선언하였음

테이블의 이름은 자동으로 지정되서 생성된다.

테이블이름을 따로 생성하고 싶다면

@Table(name="{생성하고싶은 테이블명}" 을 하여 생성한다.

다음 작업으로는
JpaRepository인터페이스를 상속한다.

JpaRepository 내에는 PagingAndSortingRepository 인터페이스 -> CrudRepository 인터페이스 -> Repository 인터페이스
를 상속하고 있다.

기존 JPA 인터페이스를 상속하지 않았다면 CRUD 메서드를 각각 구현하여야 했다.
하지만 JpaRepository인터페이스를 이용하면 사용자가 직접 crud에 대해 작성하지 않아도 된다. 내부적으로 구현되어 있다.

활용할떄에는

[Create]


Jpa의 save() 메서드를 통해 생성한다

  • Entity Manager가 내부적 실행하는 쿼리

[Read]


Jpa의 findById()메서드를 활용한다. 이때 Id의 의미는 앞써만든 jpo객체에 @Id값이다.

여기서 retrieveByName()이라는 매서드는 이름으로 데이터를 찾는 기능이다.
하지만 jpa기능에는 칼럼별로 find하는 메서드가 생성되어있지 않다 하지만 조작을 하여 구현할수있게 설계되어있다.
아래 그림을 살펴보자.

jpa 인터페이스를 구현하는 ClubRepsoitory내에 findAllByName이라고 만든다.
이렇게 생성하면 테이블에서 Name이 같은 데이터드들을 jpo객체로 반환해준다.

메서드를 만들때에는 주석처리한 부분처럼 findAllBy+{칼럼명} 생성한다.
필자는 findbyAllName이런식으로 생성하여서 에러가 발생하였다.

findAllByName - Name가 일치하는 데이터 전체 반환
findByName으로 생성하면 - 결과값이 한개가 반환된다.

그리고
JpaRepository<T,T> 2가지 제네릭은 <Jpo객체, key 값의 데이터 타입>

[ReadAll]

Jpa의 findAll() 메서드를 활용한다.

[Update]


Jpa의 save() 메서드르 활용한다. create에서도 save()를 활용하였지만 update에서도 save()메서드를 활용할수 잇는 이유는 Entity 쿼리문이 내부적으로 이미 있는 객체를 수정하고, 없으면 새로 생성하는 것으로 구현되어있다.

  • Entity Manager가 내부적으로 실행하는 쿼리

    쿼리문을 살펴보면 먼저 select를 한다. where조건을 하고 update ~ set 을 수행하는 것을 알수 있다.

[Delete]


Jpa의 deleteById() 를 활용하며 여기서 id는 앞써 말한것처럼 jpo객체의 @Id 속성이다.

  • Entity Manager가 내부적으로 실행하는 쿼리
profile
제 블로그를 방문해 주셔서 감사합니다

0개의 댓글