반응형
개요
프로젝트 명세를 기준으로 SpringBoot 서버에서 사용할 MVC모델을 제작해 보자
이번엔 MVC 중 M에 해당하는 Model에 대한 정의를 할 것이다.
그 중에서도 DB 도메인을 그대로 따올 Entity에 대해 작성해 본다.
Entity는 DB의 테이블 정보 중 각 속성을 도메인에 맞게 파싱에 오는 느낌으로 보면 된다.
따라서 DB에 수정사항이 없을 경우 한번 정의해 놓은 Entity는 변경될 일이 없다.
우선 관련 ERD를 먼저 참고해야 한다.
해당 ERD를 기준으로 Entiy를 작성해 준다.
단, RDBMS를 PosgreSQL로 선택하였으므로 일부 내용이 다를 수 있다.
Entity를 가나다 순으로 오름차순 하여 작성하겠다.
AccessToken.java
package com.a207.smartlocker.model.entity;
import lombok.*;
import jakarta.persistence.*;
@Entity
@Table(name = "access_tokens")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class AccessToken {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long tokenId;
private long tokenValue;
}
Certification.java
package com.a207.smartlocker.model.entity;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Table(name = "certification")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Certification {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "admin_index")
private Long adminIndex;
@Column(name = "admin_id", nullable = false)
private String adminId;
@Column(name = "admin_password", nullable = false)
private String adminPassword;
}
Locker.java
package com.a207.smartlocker.model.entity;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.*;
import jakarta.persistence.*;
@Entity
@Table(name = "lockers")
@Getter @Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@JsonIgnoreProperties({"hibernateLazyInitializer"})
public class Locker {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long lockerId;
@ManyToOne
@JoinColumn(name = "locker_status_id")
private LockerStatus lockerStatus;
@ManyToOne
@JoinColumn(name = "locker_location_id")
private LockerLocation lockerLocation;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "token_id", nullable = true) // Nullable Foreign Key reference
private AccessToken tokenId;
public Long getTokenId() {
return tokenId != null ? tokenId.getTokenId() : null;
}
public void updateLockerStatus(LockerStatus status, AccessToken token) {
this.lockerStatus = status;
this.tokenId = token;
}
}
LockerLocation.java
package com.a207.smartlocker.model.entity;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Getter;
import lombok.Setter;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import jakarta.persistence.*;
// entity/LockerLocation.java
@Entity
@Table(name = "locker_locations")
@Getter @Setter
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties({"hibernateLazyInitializer"})
public class LockerLocation {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long locationId; // Matches DB SERIAL as LongEGER
@Column(nullable = false)
private String locationName; // Non-nullable
}
LockerQueue.java
package com.a207.smartlocker.model.entity;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
// 통합 테이블 방식
@Entity
@Table(name = "locker_queue")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class LockerQueue {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "queue_id")
private Long queueId;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "locker_id")
private Locker lockerId;
@Column(name = "request_type")
private String requestType;
}
LockerStatus.java
package com.a207.smartlocker.model.entity;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Getter;
import lombok.Setter;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import jakarta.persistence.*;
// entity/LockerStatus.java
@Entity
@Table(name = "locker_status")
@Getter @Setter
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties({"hibernateLazyInitializer"})
public class LockerStatus {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long lockerStatusId; // Matches DB SERIAL as LongEGER
@Column(nullable = false)
private String lockerStatus; // Non-nullable TEXT
}
LockerUsageLog.java
package com.a207.smartlocker.model.entity;
import lombok.*;
import jakarta.persistence.*;
import java.time.LocalDateTime;
@Entity
@Table(name = "locker_usage_logs")
@Getter @Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class LockerUsageLog {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long logId; // Matches DB SERIAL as LongEGER
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "locker_id", nullable = false)
private Locker locker; // Non-nullable Foreign Key reference
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
private User user; // Non-nullable Foreign Key reference
@Column(nullable = false)
private LocalDateTime storeTime; // Non-nullable
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "store_robot_id")
private Robot storeRobotId; // Nullable
@Column
private LocalDateTime retrieveTime; // Nullable
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "retrieve_robot_id")
private Robot retrieveRobotId; // Nullable
}
Robot.java
package com.a207.smartlocker.model.entity;
import lombok.Getter;
import lombok.Setter;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import jakarta.persistence.*;
import java.time.LocalDateTime;
// entity/Robot.java
@Entity
@Table(name = "robots")
@Getter @Setter
@NoArgsConstructor
@AllArgsConstructor
public class Robot {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long robotId; // Matches DB SERIAL as LongEGER
@Column(nullable = false)
private String robotName; // Non-nullable TEXT
@Column(nullable = false, columnDefinition = "Longeger default 0")
private Long completedTasks; // Default value 0, Non-nullable
@Column(nullable = false)
private LocalDateTime lastMaintenance; // Non-nullable TIMESTAMP
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "robot_status_id", nullable = false)
private RobotStatus robotStatus; // Non-nullable Foreign Key reference
}
RobotStatus.java
package com.a207.smartlocker.model.entity;
import lombok.Getter;
import lombok.Setter;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import jakarta.persistence.*;
// entity/RobotStatus.java
@Entity
@Table(name = "robot_status")
@Getter @Setter
@NoArgsConstructor
@AllArgsConstructor
public class RobotStatus {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long robotStatusId; // Matches DB SERIAL as LongEGER
@Column(nullable = false)
private String robotStatus; // Non-nullable TEXT
}
User.java
package com.a207.smartlocker.model.entity;
import lombok.*;
import jakarta.persistence.*;
// entity/User.java
@Entity
@Table(name = "users")
@Getter @Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long userId; // Matches DB SERIAL as LongEGER
@Column(unique = true, nullable = false)
private String phoneNumber; // Unique and Non-nullable TEXT
}
728x90
반응형
'프로젝트 > 무인 사물함' 카테고리의 다른 글
[AIoT] 무인 사물함 프로젝트 MVC 모델 작성 Model-DTO (0) | 2025.02.10 |
---|---|
[AIoT] 무인 사물함 프로젝트 관리자 관점 명세 정의 (0) | 2025.02.10 |
[AIoT] 무인 사물함 프로젝트 사용자 관점 명세 정의 (0) | 2025.02.10 |
[AIoT] 무인 사물함 프로젝트 물리적 DB 설계 (1) | 2025.01.23 |
[AIoT] 무인 사물함 프로젝트 논리적 DB 설계, ERD 작성 (0) | 2025.01.23 |