스프링 JPA를 사용하려면 3가지를 만들어야 한다.
첫번째로 Enitity
public class Product extends Timestamped {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private Long userId;
private String title;
private String image;
private String link;
private int lprice;
private int myprice;
}
데이터 베이스 테이블을 매핑해주는 역활을 한다. 엔티티 끼리 연관관계를 설정 할수 있다
@Getter
@Entity
@NoArgsConstructor
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String memberName;
@OneToMany(mappedBy = "member", fetch = FetchType.EAGER)
private List<Orders> orders = new ArrayList<>();
public Member(String memberName) {
this.memberName = memberName;
}
}
@Getter
@Entity
@NoArgsConstructor
public class Food {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String foodName;
@Column(nullable = false)
private int price;
@OneToMany(mappedBy = "food",fetch = FetchType.EAGER)
private List<Orders> orders = new ArrayList<>();
public Food(String foodName, int price) {
this.foodName = foodName;
this.price = price;
}
}
@Getter
@Entity
@NoArgsConstructor
public class Orders {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "food_id")
private Food food;
@ManyToOne
@JoinColumn(name = "member_id")
private Member member;
public Orders(Food food, Member member) {
this.food = food;
this.member = member;
}
}
두번째로 Repository
public interface MemberRepository extends JpaRepository<Member, Long> {
}
public interface OrdersRepository extends JpaRepository<Orders, Long> {
}
public interface FoodRepository extends JpaRepository<Food, Long> {
}
Repository는 인터페이스로 만들어지며 JpaRepository를 상속받아서 만든다. 간단한 기능들(save(),saveAll(),findAll(),findById()...등)은 자동으로 생성이 된다. 복잡한 기능들은 추가할수 있다.
jpa 추가 기능 구현 공식링크
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods
public interface ProductRepository extends JpaRepository<Product, Long> {
// (1) 회원 ID 로 등록된 상품들 조회
List<Product> findAllByUserId(Long userId);
// (2) 상품명이 title 인 관심상품 1개 조회
Product findByTitle(String title);
// (3) 상품명에 word 가 포함된 모든 상품들 조회
List<Product> findAllByTitleContaining(String word);
// (4) 최저가가 fromPrice ~ toPrice 인 모든 상품들을 조회
List<Product> findAllByLpriceBetween(int fromPrice, int toPrice);
}
세번째로 Service
실제로 repository를 활용하는 단계이다
@Component
@RequiredArgsConstructor
public class RestaurantService implements ApplicationRunner {
private final FoodRepository foodRepository;
private final OrdersRepository ordersRepository;
private final MemberRepository memberRepository;
@Override
public void run(ApplicationArguments args) throws Exception {
List<Food> foods = new ArrayList<>();
Food food1 = new Food("후라이드", 10000);
foods.add(food1);
Food food2 = new Food("양념치킨", 12000);
foods.add(food2);
Food food3 = new Food("반반치킨", 13000);
foods.add(food3);
Food food4 = new Food("고구마피자", 9000);
foods.add(food4);
Food food5 = new Food("아보카도피자", 110000);
foods.add(food5);
foodRepository.saveAll(foods);
List<Member> members = new ArrayList<>();
Member member1 = new Member("삼식이");
members.add(member1);
Member member2 = new Member("먹깨비");
members.add(member2);
memberRepository.saveAll(members);
System.out.println("==================================================================");
System.out.println("Member 데이터");
List<Member> findMembers = memberRepository.findAll();
for (Member findMember : findMembers) {
System.out.println("findMember = " + findMember.getMemberName());
}
System.out.println("==================================================================");
System.out.println("Food 데이터");
List<Food> findFoods = foodRepository.findAll();
for (Food findFood : findFoods) {
System.out.println("findFood = " + findFood.getFoodName());
}
List<Orders> ordersList = new ArrayList<>();
Orders orders1 = new Orders(findFoods.get(0), findMembers.get(0));
ordersList.add(orders1);
Orders orders2 = new Orders(findFoods.get(3), findMembers.get(1));
ordersList.add(orders2);
Orders orders3 = new Orders(findFoods.get(4), findMembers.get(1));
ordersList.add(orders3);
Orders orders4 = new Orders(findFoods.get(2), findMembers.get(0));
ordersList.add(orders4);
Orders orders5 = new Orders(findFoods.get(2), findMembers.get(0));
ordersList.add(orders5);
Orders orders6 = new Orders(findFoods.get(1), findMembers.get(1));
ordersList.add(orders6);
Orders orders7 = new Orders(findFoods.get(1), findMembers.get(0));
ordersList.add(orders7);
Orders orders8 = new Orders(findFoods.get(3), findMembers.get(1));
ordersList.add(orders8);
ordersRepository.saveAll(ordersList);
System.out.println("==================================================================");
int num = 1;
System.out.println("Orders 데이터");
List<Orders> orderList = ordersRepository.findAll();
for (Orders orders : orderList) {
System.out.println(num);
System.out.println("주문한 사람 = " + orders.getMember().getMemberName());
System.out.println("주문한 음식 = " + orders.getFood().getFoodName());
num++;
}
System.out.println("==================================================================");
System.out.println("삼식이 주문한 음식");
Member samsik = memberRepository.findById(1L).orElseThrow(
()->new RuntimeException("없음")
);
num = 1;
for (Orders orders : samsik.getOrders()) {
System.out.println(num);
System.out.println("주문한 음식 = " + orders.getFood().getFoodName());
System.out.println("주문한 음식 가격 = " + orders.getFood().getPrice());
num++;
}
System.out.println("==================================================================");
System.out.println("아보카도피자 주문한 사람");
Food abocado = foodRepository.findById(5L).orElseThrow(
()->new RuntimeException("없음")
);
for (Orders order : abocado.getOrders()) {
System.out.println("주문한 사람 = " + order.getMember().getMemberName());
}
}
}
간단하게 스프링 JPA를 사용하는 방법을 알아보았다.