위와 같은 Product Entity를 생성하고, 컴파일 하여 스키마에 table이 생성되었다.
인터페이스로 선언!
public interface ProductJpaRepository extends JpaRepository<ProductEntity, Long> {
}
public class ProductService {
private final ProductJpaRepository productJpaRepository;
private final ProductRepository productRepository;
public ProductService(ProductJpaRepository productJpaRepository,
ProductRepository productRepository) {
this.productJpaRepository = productJpaRepository;
this.productRepository = productRepository;
}
public List<ProductEntity> findAll() {
return productJpaRepository.findAll();
}
public void save(ProductEntity productEntity) {
productJpaRepository.save(productEntity);
}
위와 같은 코드로 Product Entity 로 product를 조회, 등록하는 api를 구현하였다.
ProductService 에서 JpaRepository를 상속받아 만든 ProductJpaRepository 를 이용해서 호출하였다.
@GetMapping("")
public List<ProductEntity> findAll() {
return productService.findAll();
}
@PostMapping("")
public String saveProduct(@RequestBody ProductEntity productEntity) {
productService.save(productEntity);
return "정상 저장됐습니다.";
}
ProductController 에서도 ProductEntity 타입으로 바꿔주었다.
Postman 프로그램에서 키보드를 먼저 등록하고, 마우스까지 POST 하여 상품을 등록하였다.
위와 같이 GET 요청을 하니 지금까지 저장된 상품들이 출력되는 것을 확인할 수 있다. 그럼 연동된 MySQL 에서도 저장이 되었는지 확인해보자!
이와 같이 MySQL에서 Postman을 통해 저장된 상품들을 출력해보았다. 정상적으로 저장되어 있는 것을 확인할 수 있다!
미션 전체 코드는 깃허브 PR 에서 확인할 수 있다.
DAY 6 깃허브 PR 링크
@GetMapping(params = "id")
public Optional<ProductEntity> findOneById(@RequestParam Long id) {
return productService.findOneById(id);
}
id 값을 입력(요청)받아 ProductService 에서 해당 id 값에 맞는 product를 찾도록 한다!
위와 같이 [get]api/products?id=2
를 요청하면 id가 2인 상품을 데이터베이스 테이블에서 찾아 return 하는 api를 구현하였다.
@GetMapping(value = "", params = "name")
public List<ProductEntity> findByName(@RequestParam String name) {
return productService.findByName(name);
}
위와 같이 params 를 name 으로 받아 이름으로 해당 product를 상세 조회 하도록 하였다.
이름으로 상품 상세조회를 구현하기 위해, branch를 생성하였다.
feat/findbyname 브랜치로 이동하여 코드를 작성하였다.
public interface ProductJpaRepository extends JpaRepository<ProductEntity, Long> {
List<ProductEntity> findByName(String name);
}
위와 같이 ProductJpaRepository 에 한줄만 추가해주면, JPA 인터페이스 내에서 구현 없이 선언만 해주면 선언한 메소드 이름으로 적절한 JPQL쿼리를 생성해서 실행해주는 아주 편리한 기능을 통해 구현이 가능하다!!!!!!
위 사진처럼 의도한 대로 구현이 완료되었다.
List<ProductEntity> findByPriceOrderByNameDesc(Long price);
ProductJpaRepository 에서 이렇게 메소드의 이름을 통해 자동으로 생성해서 실행해 준다.
@GetMapping(params = "price")
public List<ProductEntity> findByPriceOrderByNameDesc(@RequestParam Long price) {
return productService.findByPriceOrderByNameDesc(price);
}
ProductController 에서는 이렇게 선언해주면, price 조회시 name 기준으로 내림차순으로 조회 된다!
궁금해서 찾아 본 점 : findBy~ 와 findAllBy~ 의 차이는 없다!
링크
위와 같이 정상적으로 작동이 된다.
@GetMapping(params= {"name","price"})
public List<ProductEntity> findByNameAndPrice(@RequestParam String name,
@RequestParam Long price) {
return productService.findByNameAndPrice(name, price);
}
와 , 여기 진짜 애먹었다. 항상 다중매핑 부분이 너무 애를 먹은것 같다!
params={ }
안에는 "" 으로 변수를 설정해주어야한다!!!!!!!!
제발 이거 까먹지 말자 ㅠㅠ 이 안에만 넣으면 params를 여러개 설정 가능하다!
오랜만에 깃허브 PR을 날리기 위해 이렇게 진행해보았다. 그냥 main에 push 만 했었는데 jscode repository에 들어가보니 다른 스터디원분들은 알차게 이용하고 계서서 나도 허겁지겁 사용법이랑 찾아봤다..!
잘하는 분들이 너무 많다.. 염탐해보았는데 심화 미션 끝까지 진행한 분들이 되게많았던.. 열심히 해야지 ㅠ
@Query(value = "select ProductEntity " +
"from ProductEntity productentity " +
"where productentity.name not like :모니터")
List<ProductEntity> findAllByNameIsNot(String name);
이렇게 작성해보았는데, 테스트 할줄을 모르겠어서 맞는 지 모르겠다,,ㅠㅠ 사실 이렇게 하니 컴파일도 에러났다 하하..
@Query 어노테이션 부분은 테스트 하는 방법과 SQL 쿼리 문을 더 공부해야할 것 같아서 여기까지만 진행하였다.
배운 내용, 깨달은 점
이번 스터디에는 JPA를 활용해 DB와 직접 연동하고, 다양한 기능의 api를 구현해보았다. 코드 자체는 길지 않아 공부하면서 금방금방 구현하였다.
SQL 문이 처음 공부하는거라 시간이 오래 걸렸다. 실제로 동작하는 과정을 보며 진행하니 너무 재밌었다 !!! 사실 깃허브 repository에 들어가보니 다른 스터디 분들은 심화미션 끝까지 진행하신 분이 많아 나도 더 해야겠다는 생각이 든다ㅎㅎ,, 허허 잘하는 사람이 너무 많구나;;
어려웠던 점, 반성하고 싶은 점 / 개선할 방법
다른 학교 과제들 때문에 마지막 심화미션 쿼리 어노테이션을 활용한 조회는 진행하지 못해 아쉽다 ㅠㅠ
이 부분과 Test를 하는 방법을 몰라 진행하지 못했다. Test 하는 방법과 쿼리문에 대해 더 공부해야겠다!
궁금한 점
PR에 적어 놓았습니다!