Skip to content

Commit 92b4ede

Browse files
committed
complete learning jpa with api
1 parent 5a444b0 commit 92b4ede

18 files changed

+769
-19
lines changed

book/jpashop/build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ dependencies {
4646
implementation 'org.springframework.boot:spring-boot-starter-web'
4747
implementation 'org.springframework.boot:spring-boot-devtools'
4848
implementation 'org.webjars:webjars-locator-core'
49-
49+
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-hibernate5'
5050

5151
compile('com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.8')
5252

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package jpabook.jpashop;
2+
3+
import javax.annotation.PostConstruct;
4+
import javax.persistence.EntityManager;
5+
6+
import org.springframework.stereotype.Component;
7+
import org.springframework.transaction.annotation.Transactional;
8+
9+
import jpabook.jpashop.domain.Address;
10+
import jpabook.jpashop.domain.Delivery;
11+
import jpabook.jpashop.domain.Member;
12+
import jpabook.jpashop.domain.Order;
13+
import jpabook.jpashop.domain.OrderItem;
14+
import jpabook.jpashop.domain.item.Book;
15+
import lombok.RequiredArgsConstructor;
16+
17+
/**
18+
* 총 주문 2개
19+
* - userA
20+
* - JPA1 BOOK
21+
* - JPA2 BOOK
22+
* - userB
23+
* - SPRING1 BOOK
24+
* - SPRING2 BOOK
25+
*/
26+
@Component
27+
@RequiredArgsConstructor
28+
public class InitDb {
29+
30+
private final InitService initService;
31+
32+
@PostConstruct
33+
private void init() {
34+
initService.initDb1();
35+
initService.initDb2();
36+
}
37+
38+
@Component
39+
@Transactional
40+
@RequiredArgsConstructor
41+
static class InitService {
42+
43+
private final EntityManager em;
44+
45+
public void initDb1() {
46+
Member member = createMember("userA", new Address("서울", "1", "1111"));
47+
em.persist(member);
48+
49+
Book book1 = createBook("JPA1 BOOK", 10000, 100);
50+
em.persist(book1);
51+
52+
Book book2 = createBook("JPA2 BOOK", 20000, 100);
53+
em.persist(book2);
54+
55+
OrderItem orderItem1 = OrderItem.createOrderItem(book1, 10000, 1);
56+
OrderItem orderItem2 = OrderItem.createOrderItem(book2, 20000, 2);
57+
58+
Delivery delivery = createDelivery(member);
59+
60+
Order order = Order.createOrder(member, delivery, orderItem1, orderItem2);
61+
em.persist(order);
62+
}
63+
64+
public void initDb2() {
65+
Member member = createMember("userB", new Address("진주", "2", "2222"));
66+
em.persist(member);
67+
68+
Book book1 = createBook("SPRING1 BOOK", 20000, 200);
69+
em.persist(book1);
70+
71+
Book book2 = createBook("SPRING2 BOOK", 40000, 300);
72+
em.persist(book2);
73+
74+
OrderItem orderItem1 = OrderItem.createOrderItem(book1, 20000, 3);
75+
OrderItem orderItem2 = OrderItem.createOrderItem(book2, 40000, 4);
76+
77+
Delivery delivery = createDelivery(member);
78+
79+
Order order = Order.createOrder(member, delivery, orderItem1, orderItem2);
80+
em.persist(order);
81+
}
82+
83+
public Member createMember(String user, Address address) {
84+
Member member = new Member();
85+
member.setName(user);
86+
member.setAddress(address);
87+
return member;
88+
}
89+
90+
public Book createBook(String name, int price, int stockQuantity) {
91+
Book book = new Book();
92+
book.setName(name);
93+
book.setPrice(price);
94+
book.setStockQuantity(stockQuantity);
95+
96+
return book;
97+
}
98+
99+
public Delivery createDelivery(Member member) {
100+
Delivery delivery = new Delivery();
101+
delivery.setAddress(member.getAddress());
102+
return delivery;
103+
}
104+
}
105+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package jpabook.jpashop.api;
2+
3+
import java.util.List;
4+
import java.util.stream.Collectors;
5+
6+
import javax.validation.Valid;
7+
import javax.validation.constraints.NotEmpty;
8+
9+
import org.springframework.web.bind.annotation.GetMapping;
10+
import org.springframework.web.bind.annotation.PathVariable;
11+
import org.springframework.web.bind.annotation.PostMapping;
12+
import org.springframework.web.bind.annotation.PutMapping;
13+
import org.springframework.web.bind.annotation.RequestBody;
14+
import org.springframework.web.bind.annotation.RestController;
15+
16+
import jpabook.jpashop.domain.Member;
17+
import jpabook.jpashop.service.MemberService;
18+
import lombok.AllArgsConstructor;
19+
import lombok.Data;
20+
import lombok.RequiredArgsConstructor;
21+
22+
@RestController
23+
@RequiredArgsConstructor
24+
public class MemberApiController {
25+
26+
private final MemberService memberService;
27+
28+
@GetMapping("/api/v1/members")
29+
public List<Member> getMembersV1() {
30+
return memberService.findMembers();
31+
}
32+
33+
@GetMapping("/api/v2/members")
34+
public Result<List<MemberDto>> getMemberV2() {
35+
List<Member> findMembers = memberService.findMembers();
36+
List<MemberDto> members = findMembers.stream()
37+
.map(member -> new MemberDto(member.getName()))
38+
.collect(Collectors.toList());
39+
40+
return new Result<>(members);
41+
}
42+
43+
@PostMapping("/api/v1/members")
44+
public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member) {
45+
Long id = memberService.join(member);
46+
return new CreateMemberResponse(id);
47+
}
48+
49+
@PostMapping("/api/v2/members")
50+
public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request) {
51+
Member member = new Member();
52+
member.setName(request.getName());
53+
54+
Long id = memberService.join(member);
55+
return new CreateMemberResponse(id);
56+
}
57+
58+
@PutMapping("/api/v2/members/{id}")
59+
public UpdateMemberResponse updateMemberV2(
60+
@PathVariable("id") Long id,
61+
@RequestBody @Valid UpdateMemberRequest request) {
62+
63+
memberService.update(id, request.getName());
64+
Member member = memberService.findOne(id);
65+
66+
return new UpdateMemberResponse(id, member.getName());
67+
}
68+
69+
@Data
70+
@AllArgsConstructor
71+
static class Result<T> {
72+
private T data;
73+
}
74+
75+
@Data
76+
@AllArgsConstructor
77+
static class MemberDto {
78+
79+
private String name;
80+
}
81+
82+
@Data
83+
static class UpdateMemberRequest {
84+
private String name;
85+
}
86+
87+
@Data
88+
@AllArgsConstructor
89+
static class UpdateMemberResponse {
90+
private Long id;
91+
private String name;
92+
}
93+
94+
@Data
95+
static class CreateMemberRequest {
96+
@NotEmpty
97+
private String name;
98+
}
99+
100+
@Data
101+
@AllArgsConstructor
102+
static class CreateMemberResponse {
103+
private Long id;
104+
}
105+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
package jpabook.jpashop.api;
2+
3+
import static java.util.stream.Collectors.groupingBy;
4+
import static java.util.stream.Collectors.mapping;
5+
import static java.util.stream.Collectors.toList;
6+
7+
import java.time.LocalDateTime;
8+
import java.util.List;
9+
import java.util.stream.Collectors;
10+
11+
import org.springframework.web.bind.annotation.GetMapping;
12+
import org.springframework.web.bind.annotation.RequestParam;
13+
import org.springframework.web.bind.annotation.RestController;
14+
15+
import jpabook.jpashop.domain.Address;
16+
import jpabook.jpashop.domain.Order;
17+
import jpabook.jpashop.domain.OrderItem;
18+
import jpabook.jpashop.domain.OrderStatus;
19+
import jpabook.jpashop.repository.OrderRepository;
20+
import jpabook.jpashop.repository.OrderSearch;
21+
import jpabook.jpashop.repository.query.OrderFlatDto;
22+
import jpabook.jpashop.repository.query.OrderItemQueryDto;
23+
import jpabook.jpashop.repository.query.OrderQueryDto;
24+
import jpabook.jpashop.repository.query.OrderQueryRepository;
25+
import lombok.Data;
26+
import lombok.RequiredArgsConstructor;
27+
28+
@RestController
29+
@RequiredArgsConstructor
30+
public class OrderApiController {
31+
32+
private final OrderRepository orderRepository;
33+
private final OrderQueryRepository orderQueryRepository;
34+
35+
@GetMapping("/api/v1/orders")
36+
public List<Order> getOrdersV1() {
37+
final List<Order> orders = orderRepository.findAll(new OrderSearch());
38+
39+
for (Order order : orders) {
40+
order.getMember().getName();
41+
order.getDelivery().getStatus();
42+
order.getOrderItems().forEach(o -> o.getItem().getName());
43+
}
44+
45+
return orders;
46+
}
47+
48+
@GetMapping("/api/v2/orders")
49+
public List<OrderDto> getOrdersV2() {
50+
final List<Order> orders = orderRepository.findAll(new OrderSearch());
51+
52+
return orders.stream()
53+
.map(OrderDto::new)
54+
.collect(toList());
55+
}
56+
57+
@GetMapping("/api/v3/orders")
58+
public List<OrderDto> getOrdersV3() {
59+
60+
final List<Order> orders = orderRepository.findAllWithItems();
61+
62+
return orders.stream()
63+
.map(OrderDto::new)
64+
.collect(toList());
65+
66+
}
67+
68+
@GetMapping("/api/v3.1/orders")
69+
public List<OrderDto> getOrdersV3_page(@RequestParam(value = "offset", defaultValue = "0") int offset,
70+
@RequestParam(value = "limit", defaultValue = "100") int limit) {
71+
final List<Order> orders = orderRepository.findAllWithMemberDelivery(offset, limit);
72+
73+
return orders.stream()
74+
.map(OrderDto::new)
75+
.collect(toList());
76+
}
77+
78+
@GetMapping("/api/v4/orders")
79+
public List<OrderQueryDto> getOrdersV4() {
80+
return orderQueryRepository.findOrderQueryDto();
81+
}
82+
83+
@GetMapping("/api/v5/orders")
84+
public List<OrderQueryDto> getOrdersV5() {
85+
return orderQueryRepository.findAllByDto_optimization();
86+
}
87+
88+
@GetMapping("/api/v6/orders")
89+
public List<OrderQueryDto> ordersV6() {
90+
List<OrderFlatDto> flats = orderQueryRepository.findAllByDto_flat();
91+
return flats.stream()
92+
.collect(groupingBy(o -> new OrderQueryDto(o.getOrderId(),
93+
o.getName(), o.getOrderDate(),
94+
o.getOrderStatus(), o.getAddress()),
95+
mapping(o -> new OrderItemQueryDto(o.getOrderId(),
96+
o.getItemName(), o.getOrderPrice(),
97+
o.getCount()), toList())
98+
)).entrySet().stream()
99+
.map(e -> new OrderQueryDto(e.getKey().getOrderId(),
100+
e.getKey().getName(), e.getKey().getOrderDate(),
101+
e.getKey().getOrderStatus(),
102+
e.getKey().getAddress(), e.getValue()))
103+
.collect(Collectors.toList());
104+
}
105+
106+
@Data
107+
static class OrderDto {
108+
109+
private Long orderId;
110+
private String name;
111+
private LocalDateTime orderDate;
112+
private OrderStatus orderStatus;
113+
private Address address;
114+
private List<OrderItemDto> orderItems;
115+
116+
public OrderDto(Order order) {
117+
orderId = order.getId();
118+
name = order.getMember().getName();
119+
orderDate = order.getOrderDate();
120+
orderStatus = order.getStatus();
121+
address = order.getDelivery().getAddress();
122+
orderItems = order.getOrderItems()
123+
.stream()
124+
.map(OrderItemDto::new)
125+
.collect(toList());
126+
}
127+
}
128+
129+
@Data
130+
static class OrderItemDto {
131+
132+
private String itemName;
133+
private int orderPrice;
134+
private int count;
135+
136+
public OrderItemDto(OrderItem orderItem) {
137+
itemName = orderItem.getItem().getName();
138+
orderPrice = orderItem.getOrderPrice();
139+
count = orderItem.getCount();
140+
}
141+
}
142+
}

0 commit comments

Comments
 (0)