Java

[어드민 페이지 만들기] ERD 설계 & Table 생성 & Entity 생성

15호의 개발자 2022. 2. 27. 12:00
반응형

[어드민 페이지 만들기] ERD 설계 & Table 생성 & Entity 생성

 

 


ERD 설계하기

이제 본격적으로 쇼핑몰 어드민 페이지를 만들어보자. 우선 어드민 페이지를 만들기 전에 ERD 설계부터 해야 한다. 다음과 같이 7개 테이블을 생성할 것이며 각 테이블간의 연관관계는 다음과 같다.

테이블간 연관관계

 

admin_user는 다른 테이블과 연관관계 없이 설정을 해둠으로써 모든 테이블을 조회할 수 있게 하였다. 

 

 


Table 생성하기 & Entity 생성하기

ERD 설계가 끝났다면 이제 테이블을 생성해야 한다. 내가 만들 쇼핑몰 어드민 페이지에 필요한 테이블 수는 총 7개이며, 각 테이블에 필요한 컬럼들은 아래와 같다.

 

 

 

1-1. category 테이블 설계

category table

파트너사의 type을 구분하는 용도로 사용한다. 여기서 말하는 카테고리라 함은, 예를 들어 전자, 가전, 뷰티, 음식 등에 해당한다.

 

1-2. category 엔티티 생성

@NoArgsConstructor  // 기본 생성자
@AllArgsConstructor // 전체 생성자
@Data
@Entity
public class Category {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 기본적으로 mySQL은 IDENTITY를 사용함
    private Long id;

    private String type;

    private String title;

    private LocalDateTime createdAt;

    private String createdBy;

    private LocalDateTime updatedAt;

    private String updatedBy;

}

설계한 table을 바탕으로 위와 같이 category entity를 만든다.

 

 

 

2-1. user 테이블 설계

user table

쇼핑몰을 이용하는 user들의 테이블이다. 로그인시 필요한 user의 계정, 비밀번호 등을 갖고 있다.

 

2-2. user 엔티티 생성

@Data   // 기본 생성자와 변수에 대해 get, set 메서드 생성
@AllArgsConstructor // 모든 매개변수를 가진 생성자도 추가
@NoArgsConstructor  // 파라미터가 없는 생성자 생성
@Entity // Entity임을 선언 = table
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String account;

    private String password;

    private UserStatus status;

    private String email;

    private String phoneNumber;

    private LocalDateTime registeredAt;

    private LocalDateTime unregisteredAt;

    private LocalDateTime createdAt;

    private String createdBy;

    private LocalDateTime updatedAt;

    private String updatedBy;

}

 

 

 

3-1. partner 테이블 설계

partner table

쇼핑몰을 이용하는 파트너사의 테이블이다. 위 표에는 없지만 외래키로 사용할 Long type의 categoryId를 추가해야 한다.

 

3-2. partner 엔티티 생성

@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
public class Partner {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    private String status;

    private String address;

    private String callCenter;

    private String partnerNumber;

    private String businessNumber;

    private String ceoName;

    private LocalDateTime registeredAt;

    private LocalDateTime unregisteredAt;

    private LocalDateTime createdAt;

    private String createdBy;

    private LocalDateTime updatedAt;

    private String updatedBy;
    
    private Long categoryId;

}

 

 

 

4-1. item 테이블 설계

item table

쇼핑몰을 이용하는 파트너사는 자신들의 상품을 쇼핑몰에 등록할 것이다. 이를 item 테이블에 입력한다. 위 표에는 없지만 외래키로 사용할 Long type의 partnerId를 추가해야 한다.

 

4-2. item 엔티티 생성

@Data
@AllArgsConstructor // 모든 생성자
@NoArgsConstructor  // 기본 생성자
@Entity // 엔티티임을 명시
public class Item {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // mySQL이므로 identity로 설정
    private Long id;

    private ItemStatus status;

    private String name;

    private String title;

    private String content;

    private BigDecimal price;

    private String brandName;

    private LocalDateTime registeredAt;

    private LocalDateTime unregisteredAt;

    private LocalDateTime createdAt;

    private String createdBy;

    private LocalDateTime updatedAt;

    private String updatedBy;
    
    private Long partnerId;

}

 

 

 

5-1. order_detail 테이블 설계

order_detail table

item에 대해서 어떤 주문을 했는지 상세 내역을 볼 수 있는 테이블이다. item에 대해서 여러 개의 값을 가질 수 있다. 위 표에는 없지만 외래키로 사용할 Long type의 itemId와 orderGroupId를 추가해야 한다.

 

5-2. order_detail 엔티티 생성

@Data
@NoArgsConstructor  // 기본 생성자
@AllArgsConstructor // 모든 매개변수를 가진 생성자
@Entity // 엔티티임을 명시, 자바는 카멜케이스이고 DB에 연결할 때는 스네이크케이스이므로 order_detail에 자동으로 연결
public class OrderDetail {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String status;

    private LocalDateTime arrivalDate;

    private Integer quantity;

    private BigDecimal totalPrice;

    private LocalDateTime createdAt;

    private String createdBy;

    private LocalDateTime updatedAt;

    private String updatedBy;
    
    private Long itemId;
    
    private Long orderGroupId;

}

 

 

 

6-1. order_group 테이블 설계

order_group table

order_detail에 대해서 여러 상품을 묶음으로 가지고 있는 테이블이다. 한 가지 주문내역에 대해 여러 개의 상품을 담을 수 있다. 주문내역(order_detail)에 대해 여러 개의 값을 가질 수 있고, 장바구니와 같다고 생각하면 된다. 위 표에는 없지만 외래키로 사용할 Long type의 userId를 추가해야 한다.

 

6-2. order_group 엔티티 생성

@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
public class OrderGroup {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String status;

    private OrderType orderType;   // 주문의 형태 - 일괄 / 개별

    private String revAddress;

    private String revName;

    private PaymentType paymentType; // 카드 / 현금

    private BigDecimal totalPrice;

    private Integer totalQuantity;

    private LocalDateTime orderAt;

    private LocalDateTime arrivalDate;

    private LocalDateTime createdAt;

    private String createdBy;

    private LocalDateTime updatedAt;

    private String updatedBy;
    
    private Long userId;

}

 

 

 

7-1. admin_user 테이블 설계

admin_user table

어드민 페이지의 핵심인 테이블이다. 우선, 로그인하기 위해 기본적으로 account와 password를 가지고 있다. 나중에 spring security를 연결하게 되면 사용할 role(회원 권한) 컬럼이 있으며, 오랫동안 접속하지 않으면 계정을 잠금상태로 바꾸기 위해 필요한 last_login_at(마지막 접근일자) 컬럼이 있고, password가 오랫동안 갱신되지 않으면 갱신을 요청하기 위해 password_updated_at(비밀번호 갱신일자) 컬럼이 있고, 로그인 실패 횟수가 일정 카운트를 넘어갔을 시 계정을 잠가야하므로 login_fail_count(비밀번호 실패 이력) 컬럼이 있다. 

 

7-2. admin_user 엔티티 생성

@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
public class AdminUser {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String account;

    private String password;

    private String status;

    private String role;

    private LocalDateTime lastLoginAt;

    private LocalDateTime passwordUpdatedAt;

    private int loginFailCount;

    private LocalDateTime registeredAt;

    private LocalDateTime unregisteredAt;

    private LocalDateTime createdAt;

    private String createdBy;

    private LocalDateTime updatedAt;

    private String updatedBy;
}

 

 

 

(출처: 패스트캠퍼스 Java & SpringBoot로 시작하는 웹 프로그래밍)

반응형