[Spring & SpringBoot-JPA] DB 연관관계 테이블을 Spring JPA를 이용...
[Spring & SpringBoot-JPA] DB 연관관계 테이블을 Spring JPA를 이용...
지난 시간에 우리는 DB 연관관계 테이블 생성 까지 진행을 하였다.
연관관계 테이블을 생성하며 1:N 과 N:1의 연관관계에 대해서 테이블을 작성하였고 이제는 Spring에서 실제로 관계를 통한 Data 호출을 학습해보자.
현재 테이블의 연관 관계
다음과 같을 때 연관 관계를 풀어보자면
user 과 item 의 관계 : 서로 필요한 정보를 담고 있지 않기 때문에 어떠한 관계도 맺지 않고 있다.
user 과 order_list 의 관계 : order_list 가 현재 user 의 id 를 참조하고 있기 때문에 (orderList)n:1(user) 의 관계 이다.
item과 order_list의 관계 : order_list가 현재 item의 id 를 참조하고 있기 때문에 (orderList)n:1(item) 의 관계 이다.
그럼 이제 코딩을 해보자.
연관관계를 토대로 Entity를 만들자
테이블을 생성했으므로 Springboot에서 테이블에 따른 Entity를 만들어 보자.
entity 패키지에 테이블 이름에 맞는 클래스를 만들어 준다. 테이블의 칼럼을 클래스의 필드로 만들어 준다.
이제 Order_detail의 Entity를 테스트 해보자.
우리의 목적은 Order_Detail에서 주문한 고객의 회원 id와 해당 고객의 아이템 id를 이용해 주문을 생성하는 것 이므로 다음과 같은 소스를 만들어 보자
간결한 소스코드를 위해 import 구문을 모두 제거하였습니다.
@RestController @RequestMapping("/item") public class ItemController { @Autowired UserRepository userRepository; @Autowired OrderDetailRepository orderDetailRepository; @Autowired ItemRepository itemRepository; @GetMapping("/order") public String order(@RequestParam Long userId, @RequestParam Long itemId){ AtomicBoolean userFlag = new AtomicBoolean(false); AtomicBoolean itemFlag = new AtomicBoolean(false); Optional user = userRepository.findById(userId); user.ifPresent(selectUser ->{ userFlag.set(true); }); Optional item = itemRepository.findById(itemId); item.ifPresent(selectItem ->{ itemFlag.set(true); }); if (userFlag.get() && itemFlag.get()) { OrderDetail orderDetail = new OrderDetail(); orderDetail.setUserId(userId); orderDetail.setItemId(itemId); orderDetail.setOrderAt(LocalDateTime.now()); OrderDetail newOrder = orderDetailRepository.save(orderDetail); return "주문 정보" + newOrder + " 의 주문이 주문 되었습니다."; } return "잘못된 주문 입니다."; } }
에서 http://localhost:8080/item/order/?userId=6&itemId;=4 과 같은 url을 입력하면
과 같은 결과가 나오는 것을 알 수 있다.
하지만
하지만 이와 같이 한다면 우리는 연관관계를 이용하지 않고 했으므로 아무런 소용이 없다.
이제 여기에 연관 관계를 추가시킨다면
과 같은 식으로 Long 타입의 user 정보와 item 정보가 아닌 객체 타입의 user와 item을 받을 것이다.
하지만 빨간색으로 User와 Item 밑에 밑줄이 생긴 것을 볼 수 있는데 이는 Hibernate를 통한 연관 관계 Annotation을 설정하기 않았기 때문이다.
연관관계 어노테이션
아까 연관관계를 풀어 놓았던 것을 보면
user 과 order_list 의 관계 : order_list 가 현재 user 의 id 를 참조하고 있기 때문에 (orderList)n:1(user) 의 관계 이다.
item과 order_list의 관계 : order_list가 현재 item의 id 를 참조하고 있기 때문에 (orderList)n:1(item) 의 관계 이다.
에서
N:1 -> @ManyToOne
1:N -> @OneToMany
로 바꿀 수 있는데 위와 같은 어노테이션을 적용하려면 무조건 객체 타입으로 받아야 한다.
User 입장에서 OrderDetail
User 입장에서 OrderDetail는 1명의 user가 여러가지 OrderDetail를 가질 수 있기 때문에 1:N ( @OneToMany )관계 이므로 해당 어노테이션을 추가하는데 다음과 같은 추가적 변수가 필요하다.
mappedBy = "user" :user 테이블에 연결시키기 위함
fetch = FetchType.LAZY : 추후 설명
또한 위에 본다면 List 로 받는 것을 볼 수 있는데, 이는 OrderDetail 이 N에 해당하므로 List로 받는 것이다.
Item 입장에서 OrderDetail 또한 위와 같은 방법으로 설정하면 된다
Test 코드 작성
이제 OrderDetail의 id를 통해서 User와 Item의 정보를 검색할 수 있는데, 다음과 같이
의 코드를 통해서 여러 번의 user의 검색과 item의 검색 없이 바로
과 같은 객체 정보를 얻을 수 있게 된다.
from http://wonit.tistory.com/137 by ccl(S) rewrite - 2020-03-11 09:20:27
댓글
댓글 쓰기