<aside> 👨🏻‍🏫

학습목표

</aside>

✔️ 저번 시간에 만들었던 엔티티

@Table
@Entity
public class TestTable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String name;

		public TestTable(){ }
}

저번 시간에 테이블과 연결되는 엔티티를 구현하는 것까지 해봤습니다. 이번에는 테이블을 연결하고, 연결한 테이블에 실제 데이터를 조회, 저장하는 것까지 해보겠습니다!

📖 (예제) Product Entity

@Table
@Entity
public class ProductEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String name;

    @Column
    private Long price;

    public ProductEntity() {

    }
}

📖 (예제) Spring Data JPA를 이용한 ProductRepository

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)

📖 (예제) Product 조회 api

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();
    }
}

📖 (예제) Product 조회 api