<aside> 👨🏻🏫
학습목표
</aside>
@Table
@Entity
public class TestTable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String name;
public TestTable(){ }
}
저번 시간에 테이블과 연결되는 엔티티를 구현하는 것까지 해봤습니다. 이번에는 테이블을 연결하고, 연결한 테이블에 실제 데이터를 조회, 저장하는 것까지 해보겠습니다!
@Table
@Entity
public class ProductEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String name;
@Column
private Long price;
public ProductEntity() {
}
}
public interface ProductJpaRepository extends JpaRepository<엔티티, id타입> {
}
public interface ProductJpaRepository extends JpaRepository<ProductEntity, Long> {
}
이렇게만 ProductJpaRepository를 만들어주면 저희는 이 내부에서 사용할 메소드들을 명시해주고 바로 사용할 수 있습니다.
<aside>
💡 extends?
extends는 클래스를 상속받을 때 사용합니다. 위 코드에서는 ProductJpaRepository
가 부모클래스 JpaRepository를 상속받은 것 입니다. java를 사용해보신 분들은 아시겠지만, 부모 클래스를 ‘상속’받으면 부모에서 선언한 모든 메소드와 변수를 그대로 사용할 수 있습니다.
JpaRepository
를 타고 들어가(ctrl+클릭) 보시면 내부에 선언된 findAll
, findAllById
등등의 메소드들을 보실 수 있을 겁니다. ProductJpaRepository
는 이를 상속받았기 때문에 우린 여기 있는 모든 메소드들을 사용할 수 있습니다.
</aside>
Spring Data JPA 는 어떻게 interface 만으로도 동작할까? (feat. reflection, proxy)
ProductService에서 우리가 이전에 만들었던 ProductRepository
가 아닌 JpaRepository
를 상속받아 만든 ProductJpaRepository
를 이용해서 호출해봅시다.
public class ProductService {
private final ProductJpaRepository productJpaRepository;
public ProductService(ProductJpaRepository productJpaRepository) {
this.productJpaRepository = productJpaRepository;
}
public List<ProductEntity> findAll() {
return productJpaRepository.findAll();
}
}