728x90
1.Entity 설계
우선 기존 Entity에 CartItem , OrderItem 테이블을 추가하였다. 각각 Customer 과 Product에 연결되어있다.
2.SpringBoot Entity 생성
2-1.Customer 수정
orderedItems,cartItems을 Customer 엔티티에 추가한다
CascadeType.ALL로 해서 Customer가 삭제될시 연결된 orderedItems,cartItems를 삭제한다.
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "member_id", referencedColumnName = "id", nullable = false)
private Member member;
@OneToMany(mappedBy = "customer", cascade = CascadeType.ALL, orphanRemoval = true)
@Builder.Default
private List<OrderItem> orderedItems = new ArrayList<>();
@OneToMany(mappedBy = "customer", cascade = CascadeType.ALL, orphanRemoval = true)
@Builder.Default
private List<CartItem> cartItems = new ArrayList<>();
}
2-2.OrderItem
고객이 주문한 데이터인 OrderItem 엔티티를 생성한다.
public class OrderItem {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "customer_id", nullable = false)
private Customer customer;
@ManyToOne
@JoinColumn(name = "product_id", nullable = false)
private Product product;
private int quantity;
private LocalDateTime orderDate;
}
2-3.CartItem
고객이 카트에 담은 데이터인 CartItem엔티티를 생성한다.
public class CartItem {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "customer_id", nullable = false)
private Customer customer;
@ManyToOne
@JoinColumn(name = "product_id", nullable = false)
private Product product;
private int quantity;
}
3.@Entity
해당 클래스가 JPA 엔티티임을 나타내고 데이터베이스 테이블에 매핑해준다 ,name 속성으로 테이블 이름을 명시할수있다.
@Entity(name = "테이블이름")
4.@Id
해당 필드가 기본 키(primary key)임을 나타냄, 클래스당 1개의 필드만 가능
@Id
4-1.@GeneratedValue
기본 키 값의 자동 생성 전략을 정의하는 어노테이션
4-1-1.strategy
GenerationType.IDENTITY 를 사용하면 데이터베이스에서 기본 키를 자동으로 증가시킴
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
5.@Column
컬럼의 속성을 정의하는 어노테이션으로 @Entity를 사용하면 기본적으로 매핑되지만
@Column을 사용하면 다양한 속성을 설정할수있다.
@Column(name = "user_name", nullable = false, length = 50, unique = true)
private String name;
5-1.name
컬럼의 이름을 지정한다. 데이터베이스에서 컬럼명을 작성할 때 Snake Case 규칙을 따라서 작성하는것이 일반적이므로 다음처럼 만든다.
@Column(name = "member_id")
private String memberId;
5-2.nullable
컬럼이 null 값을 허용하는지 여부를 지정 (기본값 true)
5-3.unique
컬럼의 값이 고유해야 하는지 여부를 지정 (기본값 false)
5-4.length
String 타입 컬럼에 길이를 지정
5.@Enumerated
Enum 타입을 데이터베이스 컬럼에 매핑할 때 사용한다.
@Enumerated(EnumType.STRING)
@Column(nullable = false)
private Role role;
5-1.EnumType.STRING
Enum 값을 문자열로 저장한다.
5-2.EnumType.ORDINAL
Enum 값을 숫자로 저장한다. (기본값임)
6.@ManyToOne, @OneToMany, @OneToOne, @ManyToMany
엔티티 간의 관계를 정의하는 데 사용되는 어노테이션들이다.
6-1.cascade
부모 엔티티에 추가하는 속성 , 부모 엔티티에 대한 상태 변화가 자식 엔티티에 어떻게 전파될지 지정한다.
cascade = CascadeType.ALL을 쓰면 저장, 업데이트, 삭제가 자식에게 전달된다.
@Entity
public class Customer {
@OneToMany(mappedBy = "customer", cascade = CascadeType.ALL)
private List<OrderItem> orderItems = new ArrayList<>();
}
6-2.mappedBy
양방향 관계에서 사용되는 속성으로 부모 엔티티에 추가하는 속성이다.
이 경우 OrderItem은 자식 엔티티이고, Customer는 부모 엔티티다.
mappedBy로 Order 테이블의 customer 필드가 외래 키를 관리한다고 JPA에알려준다.
@JoinColumn에서 customer_id(바꿔도됨 일반적인거임)이름으로 Customer의 기본 키를 참조해서 외래 키로 관리한다.
@Entity
public class Customer {
@OneToMany(mappedBy = "customer", cascade = CascadeType.ALL)
private List<OrderItem> orderItems = new ArrayList<>();
}
@Entity
public class OrderItem {
@ManyToOne
@JoinColumn(name = "customer_id")
private Customer customer;
}
7.@JoinColumn
JPA에서 두 엔티티 간의 관계를 맺을 때, 외래 키(Foreign Key) 컬럼을 어떻게 설정할지를 지정하는 어노테이션
다음은 customer_id라는 컬럼을 외래 키로 사용하겠다고 명시하고 Customer 테이블의 id와 연관된다.
@ManyToOne
@JoinColumn(name = "customer_id")
private Customer customer;
7-1.name
외래 키 컬럼의 이름을 지정한다.
7-2.referencedColumnName
외래 키가 참조하는 컬럼 이름을 지정한다. (기본적으로 @Id로 설정된 컬럼인 기본키를 참고한다.)
8.@Transient
필드가 데이터베이스 컬럼으로 매핑되지 않도록 지정하는 어노테이션
@Transient
private String tempData;
728x90
'BackEnd > SpringBoot' 카테고리의 다른 글
[SpringBoot] Redis 추가, Redis로 JWT 블랙리스트 구현 (0) | 2025.03.10 |
---|---|
[SpringBoot] @PreAuthorize 사용설정 (0) | 2025.02.28 |
[SpringBoot] 역할 접근권한설정, 상품 소유 인증 (0) | 2025.02.25 |