[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

댓글

이 블로그의 인기 게시물

데이터 바인딩 추상화 - propertyEditor

[샤니마스 SPRING PARTY2020] THE IDOLM @ STER SHINY COLORS SPRING...

Spring Web Form