Skip to content

Commit 874f374

Browse files
Merge pull request #334 from smartandhandsome/week3
[4기 박상민] Springboot-jpa weekly 미션 3 PR입니다.
2 parents 0cdc711 + 9731909 commit 874f374

File tree

11 files changed

+326
-8
lines changed

11 files changed

+326
-8
lines changed

src/main/java/org/programmers/jpaweeklymission/customer/Customer.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,17 @@
55
import jakarta.persistence.GeneratedValue;
66
import jakarta.persistence.GenerationType;
77
import jakarta.persistence.Id;
8+
import jakarta.persistence.OneToMany;
89
import jakarta.persistence.Table;
9-
import jakarta.validation.constraints.NotBlank;
1010
import jakarta.validation.constraints.Size;
1111
import lombok.AccessLevel;
1212
import lombok.Builder;
1313
import lombok.Getter;
1414
import lombok.NoArgsConstructor;
1515
import org.programmers.jpaweeklymission.global.BaseEntity;
16+
import org.programmers.jpaweeklymission.order.domain.Order;
17+
import java.util.ArrayList;
18+
import java.util.List;
1619

1720
@Table(name = "customers")
1821
@Entity
@@ -21,18 +24,20 @@
2124
public class Customer extends BaseEntity {
2225
@Id
2326
@GeneratedValue(strategy = GenerationType.IDENTITY)
27+
@Column(name = "id")
2428
private Long id;
2529

26-
@NotBlank
2730
@Size(min = 1, max = 20)
2831
@Column(name = "first_name", length = 20, nullable = false)
2932
private String firstName;
3033

31-
@NotBlank
3234
@Size(min = 1, max = 20)
3335
@Column(name = "last_name", length = 20, nullable = false)
3436
private String lastName;
3537

38+
@OneToMany(mappedBy = "customer")
39+
private List<Order> orders = new ArrayList<>();
40+
3641
@Builder
3742
private Customer(String firstName, String lastName) {
3843
this.firstName = firstName;
@@ -51,4 +56,8 @@ private void changeFirstName(String firstName) {
5156
private void changeLastName(String lastName) {
5257
this.lastName = lastName;
5358
}
59+
60+
public void removeOrder(Order order) {
61+
this.orders.remove(order);
62+
}
5463
}

src/main/java/org/programmers/jpaweeklymission/customer/presentation/dto/CustomerCreationRequest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package org.programmers.jpaweeklymission.customer.presentation.dto;
22

3+
import jakarta.validation.constraints.NotBlank;
34
import jakarta.validation.constraints.Size;
45

56
public record CustomerCreationRequest(
7+
@NotBlank(message = "First name must not be blank.")
68
@Size(min = 1, max = 20, message = "First name must be at least 1 character and no more than 20 characters.")
79
String firstName,
10+
@NotBlank(message = "Last name must not be blank.")
811
@Size(min = 1, max = 20, message = "Last name must be at least 1 character and no more than 20 characters.")
912
String lastName
1013
) {

src/main/java/org/programmers/jpaweeklymission/customer/presentation/dto/CustomerUpdateRequest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package org.programmers.jpaweeklymission.customer.presentation.dto;
22

3+
import jakarta.validation.constraints.NotBlank;
34
import jakarta.validation.constraints.Size;
45

56
public record CustomerUpdateRequest(
7+
@NotBlank(message = "First name must not be blank.")
68
@Size(min = 1, max = 20, message = "First name must be at least 1 character and no more than 20 characters.")
79
String firstName,
10+
@NotBlank(message = "Last name must not be blank.")
811
@Size(min = 1, max = 20, message = "Last name must be at least 1 character and no more than 20 characters.")
912
String lastName
1013
) {

src/main/java/org/programmers/jpaweeklymission/global/BaseEntity.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
public abstract class BaseEntity {
1515
@Column(name = "create_at", nullable = false, updatable = false)
1616
@CreatedDate
17-
LocalDateTime createAt;
17+
private LocalDateTime createAt;
1818
@Column(name = "update_at", nullable = false)
1919
@LastModifiedDate
20-
LocalDateTime updateAt;
20+
private LocalDateTime updateAt;
2121
}

src/main/java/org/programmers/jpaweeklymission/global/exception/GlobalExceptionHandler.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
@Slf4j
1313
@RestControllerAdvice
14-
public class GlobalExceptionHandler { // TODO: 혹시 멘토님들은 여기서 어떤 어떤 에러를 잡으시나요?
14+
public class GlobalExceptionHandler {
1515
@ExceptionHandler(EntityNotFoundException.class)
1616
@ResponseStatus(HttpStatus.NOT_FOUND)
1717
public ErrorResponse handleEntityNotFoundException(EntityNotFoundException e) {
@@ -23,7 +23,11 @@ public ErrorResponse handleEntityNotFoundException(EntityNotFoundException e) {
2323
@ResponseStatus(HttpStatus.BAD_REQUEST)
2424
public ErrorResponse handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
2525
log.warn(e.getMessage(), e);
26-
return ErrorResponse.newErrorResponse(e.getMessage());
26+
return ErrorResponse.newErrorResponse(e
27+
.getBindingResult()
28+
.getFieldErrors()
29+
.get(0)
30+
.getDefaultMessage());
2731
}
2832

2933
@ExceptionHandler(HttpMessageNotReadableException.class)
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package org.programmers.jpaweeklymission.item.domain;
2+
3+
import jakarta.persistence.Column;
4+
import jakarta.persistence.Entity;
5+
import jakarta.persistence.GeneratedValue;
6+
import jakarta.persistence.GenerationType;
7+
import jakarta.persistence.Id;
8+
import jakarta.persistence.Table;
9+
import lombok.AccessLevel;
10+
import lombok.Builder;
11+
import lombok.Getter;
12+
import lombok.NoArgsConstructor;
13+
import org.programmers.jpaweeklymission.global.BaseEntity;
14+
15+
@Table(name = "items")
16+
@Getter
17+
@Entity
18+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
19+
public class Item extends BaseEntity {
20+
@Id
21+
@Column(name = "id")
22+
@GeneratedValue(strategy = GenerationType.AUTO)
23+
private Long id;
24+
25+
@Column(name = "price")
26+
private int price;
27+
28+
@Column(name = "stock_quantity")
29+
private int stockQuantity;
30+
31+
@Builder
32+
public Item(int price, int stockQuantity) {
33+
this.price = price;
34+
this.stockQuantity = stockQuantity;
35+
}
36+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package org.programmers.jpaweeklymission.order.domain;
2+
3+
import jakarta.persistence.*;
4+
import jakarta.validation.constraints.NotNull;
5+
import lombok.AccessLevel;
6+
import lombok.Builder;
7+
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
import org.programmers.jpaweeklymission.customer.Customer;
10+
import org.programmers.jpaweeklymission.global.BaseEntity;
11+
12+
import java.util.List;
13+
import java.util.Objects;
14+
15+
@Table(name = "orders")
16+
@Entity
17+
@Getter
18+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
19+
public class Order extends BaseEntity {
20+
@Id
21+
@Column(name = "id")
22+
@GeneratedValue(strategy = GenerationType.AUTO)
23+
private Long id;
24+
25+
@Enumerated(EnumType.STRING)
26+
@Column(name = "status", nullable = false)
27+
@NotNull
28+
private OrderStatus status;
29+
30+
@Lob
31+
@Column(name = "memo")
32+
private String memo;
33+
34+
@ManyToOne(fetch = FetchType.LAZY)
35+
@JoinColumn(name = "customer_id", referencedColumnName = "id")
36+
private Customer customer;
37+
38+
@OneToMany(mappedBy = "order")
39+
private List<OrderItem> orderItems;
40+
41+
@Builder
42+
public Order(OrderStatus status, String memo) {
43+
this.status = status;
44+
this.memo = memo;
45+
}
46+
47+
public void setCustomer(Customer customer) {
48+
if (Objects.nonNull(this.customer)) {
49+
customer.removeOrder(this);
50+
}
51+
this.customer = customer;
52+
customer.getOrders().add(this);
53+
}
54+
55+
public void addOrderItems(OrderItem orderItem) {
56+
orderItem.setOrder(this);
57+
}
58+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package org.programmers.jpaweeklymission.order.domain;
2+
3+
import jakarta.persistence.*;
4+
import lombok.AccessLevel;
5+
import lombok.Builder;
6+
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
8+
import org.programmers.jpaweeklymission.global.BaseEntity;
9+
import org.programmers.jpaweeklymission.item.domain.Item;
10+
11+
import java.util.Objects;
12+
13+
@Entity
14+
@Getter
15+
@Table(name = "order_items")
16+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
17+
public class OrderItem extends BaseEntity {
18+
@Id
19+
@GeneratedValue(strategy = GenerationType.AUTO)
20+
@Column(name = "id")
21+
private Long id;
22+
23+
@ManyToOne
24+
@JoinColumn(name = "order_id", referencedColumnName = "id")
25+
private Order order;
26+
27+
@ManyToOne
28+
@JoinColumn(name = "item_id", referencedColumnName = "id")
29+
private Item item;
30+
31+
public void setOrder(Order order) {
32+
this.order = order;
33+
order.getOrderItems().add(this);
34+
}
35+
36+
public void setItem(Item item) {
37+
this.item = item;
38+
}
39+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package org.programmers.jpaweeklymission.order.domain;
2+
3+
4+
public enum OrderStatus {
5+
CREATED,
6+
SHIPPING,
7+
DELIVERED,
8+
CANCELED
9+
}

0 commit comments

Comments
 (0)