Skip to content

Commit edd8e09

Browse files
authored
[refactor] stores table 추가
1 parent 3343c24 commit edd8e09

5 files changed

Lines changed: 197 additions & 2 deletions

File tree

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package com.back.domain.store.entity;
2+
3+
import java.time.LocalDateTime;
4+
import java.util.ArrayList;
5+
import java.util.List;
6+
7+
import com.back.domain.user.entity.User;
8+
import com.back.global.entity.BaseEntity;
9+
10+
import jakarta.persistence.Column;
11+
import jakarta.persistence.Entity;
12+
import jakarta.persistence.FetchType;
13+
import jakarta.persistence.GeneratedValue;
14+
import jakarta.persistence.GenerationType;
15+
import jakarta.persistence.Id;
16+
import jakarta.persistence.OneToMany;
17+
import jakarta.persistence.SequenceGenerator;
18+
import jakarta.persistence.Table;
19+
import lombok.AccessLevel;
20+
import lombok.Getter;
21+
import lombok.NoArgsConstructor;
22+
23+
@Entity
24+
@Table(name = "stores")
25+
@Getter
26+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
27+
public class Store extends BaseEntity {
28+
@Id
29+
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "store_seq")
30+
@SequenceGenerator(
31+
name = "store_seq",
32+
sequenceName = "store_seq",
33+
allocationSize = 100
34+
)
35+
private Long id;
36+
37+
@Column(name = "name", nullable = false, length = 30)
38+
private String name;
39+
40+
@Column(
41+
name = "registration_number",
42+
nullable = false,
43+
length = 16
44+
)
45+
private String registrationNumber;
46+
47+
@Column(name = "address", nullable = false)
48+
private String address;
49+
50+
@Column(name = "deleted_at")
51+
private LocalDateTime deleteDate;
52+
53+
@OneToMany(mappedBy = "store", fetch = FetchType.LAZY)
54+
private List<User> managers = new ArrayList<>();
55+
56+
public void addManager(User user) {
57+
managers.add(user);
58+
user.changeStore(this);
59+
}
60+
}

backend/src/main/java/com/back/domain/user/entity/User.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,20 @@
66
import org.hibernate.annotations.Filter;
77
import org.hibernate.annotations.FilterDef;
88

9+
import com.back.domain.store.entity.Store;
910
import com.back.global.entity.BaseEntity;
1011

1112
import jakarta.persistence.Column;
1213
import jakarta.persistence.Entity;
1314
import jakarta.persistence.EnumType;
1415
import jakarta.persistence.Enumerated;
16+
import jakarta.persistence.FetchType;
17+
import jakarta.persistence.ForeignKey;
1518
import jakarta.persistence.GeneratedValue;
1619
import jakarta.persistence.GenerationType;
1720
import jakarta.persistence.Id;
21+
import jakarta.persistence.JoinColumn;
22+
import jakarta.persistence.ManyToOne;
1823
import jakarta.persistence.SequenceGenerator;
1924
import jakarta.persistence.Table;
2025
import lombok.AccessLevel;
@@ -67,6 +72,10 @@ public class User extends BaseEntity {
6772
@Column(name = "deleted_at")
6873
private LocalDateTime deleteDate;
6974

75+
@ManyToOne(fetch = FetchType.LAZY)
76+
@JoinColumn(name = "store_id", foreignKey = @ForeignKey(name = "fk_user_store"))
77+
private Store store;
78+
7079
@Builder
7180
public User(String email, String fullName, String nickname, String password,
7281
LocalDate birthDate, UserRole role, UserActiveStatus activeStatus) {
@@ -94,4 +103,8 @@ public void softDelete() {
94103
this.deleteDate = LocalDateTime.now();
95104
this.activeStatus = UserActiveStatus.BLOCKED;
96105
}
106+
107+
public void changeStore(Store store) {
108+
this.store = store;
109+
}
97110
}

backend/src/main/resources/application-dev.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@ spring:
88
hibernate:
99
ddl-auto: create-drop
1010
flyway:
11-
enabled: true
12-
clean-disabled: false
11+
enabled: false
1312

1413
security:
1514
password:
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/* =========================================================
2+
* 0-1. Sequence: user_seq
3+
* ========================================================= */
4+
CREATE SEQUENCE IF NOT EXISTS user_seq
5+
START WITH 1
6+
INCREMENT BY 1
7+
CACHE 100;
8+
9+
/* =========================================================
10+
* 0-2. Table: users (User 엔티티 기반)
11+
* - store_id 는 뒤에서 ALTER/ FK 걸어도 되지만,
12+
* "users 자체가 없는 문제"를 막기 위해 여기서 같이 만들어도 됨
13+
* ========================================================= */
14+
CREATE TABLE IF NOT EXISTS users
15+
(
16+
id BIGINT PRIMARY KEY DEFAULT nextval('user_seq'),
17+
18+
email VARCHAR(100) NOT NULL,
19+
full_name VARCHAR(30) NOT NULL,
20+
nickname VARCHAR(20) NOT NULL,
21+
password TEXT NOT NULL,
22+
birth_date DATE NULL,
23+
24+
role VARCHAR(255) NOT NULL,
25+
deleted_status VARCHAR(255) NOT NULL,
26+
27+
deleted_at TIMESTAMP NULL,
28+
29+
store_id BIGINT NULL,
30+
31+
created_at TIMESTAMP NULL,
32+
modified_at TIMESTAMP NULL
33+
);
34+
35+
/* =========================================================
36+
* 0-3. Unique constraints (엔티티의 unique=true 반영)
37+
* ========================================================= */
38+
CREATE UNIQUE INDEX IF NOT EXISTS uk_users_email
39+
ON users (email);
40+
41+
CREATE UNIQUE INDEX IF NOT EXISTS uk_users_nickname
42+
ON users (nickname);
43+
44+
/* =========================================================
45+
* 0-4. (선택) deleted_at IS NULL 조건으로만 유니크를 원하면
46+
* - 현재 엔티티는 "그냥 unique"라서 논리삭제 후에도 중복 불가.
47+
* - 만약 논리삭제 후 재가입/재사용을 허용하려면 위 uk_* 대신 이걸 사용.
48+
* ========================================================= */
49+
/*
50+
DROP INDEX IF EXISTS uk_users_email;
51+
DROP INDEX IF EXISTS uk_users_nickname;
52+
53+
CREATE UNIQUE INDEX IF NOT EXISTS uk_users_email_active
54+
ON users(email)
55+
WHERE deleted_at IS NULL;
56+
57+
CREATE UNIQUE INDEX IF NOT EXISTS uk_users_nickname_active
58+
ON users(nickname)
59+
WHERE deleted_at IS NULL;
60+
*/
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/* =========================================================
2+
* 1. Sequence: store_seq
3+
* ========================================================= */
4+
CREATE SEQUENCE IF NOT EXISTS store_seq
5+
START WITH 1
6+
INCREMENT BY 1
7+
CACHE 100;
8+
9+
10+
/* =========================================================
11+
* 2. Table: stores
12+
* ========================================================= */
13+
CREATE TABLE IF NOT EXISTS stores (
14+
id BIGINT PRIMARY KEY DEFAULT nextval('store_seq'),
15+
name VARCHAR(30) NOT NULL,
16+
registration_number VARCHAR(16) NOT NULL,
17+
address TEXT NOT NULL,
18+
deleted_at TIMESTAMP NULL,
19+
20+
created_at TIMESTAMP NULL,
21+
modified_at TIMESTAMP NULL
22+
);
23+
24+
25+
/* =========================================================
26+
* 3. Partial Unique Index
27+
* - deleted_at IS NULL 인 경우만 유니크
28+
* ========================================================= */
29+
CREATE UNIQUE INDEX IF NOT EXISTS uk_store_registration_active
30+
ON stores (registration_number)
31+
WHERE deleted_at IS NULL;
32+
33+
34+
/* =========================================================
35+
* 4. Alter: users - add store_id (NULL 허용)
36+
* ========================================================= */
37+
ALTER TABLE users
38+
ADD COLUMN IF NOT EXISTS store_id BIGINT NULL;
39+
40+
41+
/* =========================================================
42+
* 5. Foreign Key: users.store_id → stores.id
43+
* ========================================================= */
44+
DO $$
45+
BEGIN
46+
IF NOT EXISTS (
47+
SELECT 1
48+
FROM pg_constraint
49+
WHERE conname = 'fk_user_store'
50+
) THEN
51+
ALTER TABLE users
52+
ADD CONSTRAINT fk_user_store
53+
FOREIGN KEY (store_id)
54+
REFERENCES stores(id);
55+
END IF;
56+
END $$;
57+
58+
59+
/* =========================================================
60+
* 6. Index: users.store_id (조회 성능)
61+
* ========================================================= */
62+
CREATE INDEX IF NOT EXISTS idx_users_store_id
63+
ON users(store_id);

0 commit comments

Comments
 (0)