ERD를 설계한 후 JPA에서 사용할 수 있게 코드로 작성해 보겠습니다.
먼저 패키지 하위에 entity 디렉토리를 만들고, 각각 엔티티에 맞는 클래스를 작성 해줍니다.
1) 기본 클래스
// entity/Member.java
@Entity // JPA에서 엔티티 클래스임을 나타냄
@Getter // 해당 클래스의 모든 필드에 getter 메소드 자동 생성
@NoArgsConstructor // 해당 클래스의 기본 생성자를 자동으로 생성
@EntityListeners(AuditingEntityListener.class) // 엔티티 라이프사이클 이벤트를 감지하고 처리하기 위한 리스너를 등록하는데 사용
// AuditingEntityListener : 엔티티의 생성일자와 수정일자를 자동으로 관리
public class Member {
@Id // 해당 필드가 PK임을 나타냄
@GeneratedValue(strategy = GenerationType.IDENTITY) // 자동 값 생성 전략을 지정할 때 사용함
// GenerationType.IDENTITY : auto-increment
private Long memberId; // PK
@Column(length = 12) // String의 길이를 제한
private String nickname;
@Column(length = 10, nullable = false)
private String role = "user"; // 기본 값이 있는 경우 지정
@Column(length = 12, nullable = false)
private String provider;
@Column(length = 100)
private String email;
@Column(length = 50, nullable = false)
private String clientId;
@CreatedDate // 데이터가 들어가는 시간을 자동으로 제공 / now()의 역할
@Column(nullable = false)
private LocalDateTime registDate;
}
먼저 기본적인 클래스를 생성해 주었습니다.
각 어노테이션 및 속성 값에 대한 정보는 주석으로 정리하였습니다.
JPA의 경우 기본적으로 nullable = "true" 이기 때문에 notNull은 명시적으로 작성해주어야 합니다.
- 타입 지정
varchar(), char()
# char의 경우 -> @Column(columnDefinition = "CHAR(길이)")
# varchar()의 경우 -> @Column(length = 30)
text -> String
# @Column(columnDefinition = "TEXT")
BigInt -> Long
datetime -> LocalDateTime
2) FK를 가지는 클래스
@Entity // JPA에서 엔티티 클래스임을 나타냄
@Getter // 해당 클래스의 모든 필드에 getter 메소드 자동 생성
@NoArgsConstructor // 해당 클래스의 기본 생성자를 자동으로 생성
@EntityListeners(AuditingEntityListener.class) // 엔티티 라이프사이클 이벤트를 감지하고 처리하기 위한 리스너를 등록하는데 사용
// AuditingEntityListener : 엔티티의 생성일자와 수정일자를 자동으로 관리
public class Homework {
@Id // 해당 필드가 PK임을 나타냄
@GeneratedValue(strategy = GenerationType.IDENTITY) // 자동 값 생성 전략을 지정할 때 사용함
private Long homeworkId; // PK
// 내가 多, 상대가 1
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
private Member member; // FK
// 내가 多, 상대가 1
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "article_id")
private Article article; // FK
@Column(length = 30, nullable = false)
private String title;
@Column(length = 255)
private String file;
@Column(columnDefinition = "TEXT", nullable = false) // text type을 쓰는 경우 Column으로 정의
private String content;
@CreatedDate // 데이터가 들어가는 시간을 자동으로 제공 / now()의 역할
@Column(nullable = false)
private LocalDateTime writeDate;
private LocalDateTime editDate;
}
FK와 같이 외부로부터 받아오는 속성은
@ManyToOne(fetch = FetchType.LAZY)
등을 사용해야 합니다.
3) 복합키를 가지는 클래스
// entity/ApprovalId.java
@Embeddable // 복합키를 가진 엔티티 클래스임을 알려줌
@NoArgsConstructor
@EqualsAndHashCode // 객체 동등성 비교 시 사용 -> 현재는 복합키 구분을 위해서 사용
public class ApprovalId {
@Column(name = "member_id")
private Long memberId;
@Column(name = "course_id")
private Long courseId;
// 빌더 생성 필요
@Builder
public ApprovalId(Long memberId, Long courseId) {
this.memberId = memberId;
this.courseId = courseId;
}
}
복합 키를 가진 클래스 생성 시에는 복합 키를 가지는 id 클래스를 포함하여 2개의 클래스를 생성해야 합니다.
Id 클래스는 복합 키로 가져야 할 속성과, 속성을 기반으로 한 생성자를 작성해 줍니다.
// entity/Approval.java
@Entity // JPA에서 엔티티 클래스임을 나타냄
@Getter // 해당 클래스의 모든 필드에 getter 메소드 자동 생성
@NoArgsConstructor // 해당 클래스의 기본 생성자를 자동으로 생성
public class Approval {
@EmbeddedId
private ManagerId id;
@MapsId("memberId") // 복합키를 가지는 엔티티 매핑 시 사용
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
private Member member; // 복합키
@MapsId("courseId") // 복합키를 가지는 엔티티 매핑 시 사용
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "course_id")
private Course course; // 복합키
@Column(length = 10, nullable = false)
private String state = "unapply";
private LocalDateTime approvalDate;
}
방금 생성한 Id 클래스를 임베드 해옵니다.
아래에는 매핑을 통해서 키값을 가져와 줍니다.
마지막으로 테이블에서 사용하는 고유 속성 값을 작성해줍니다.
실행을 누르면 코드를 기반으로 Database에 테이블을 생성해줍니다.
MySQL 워크밴치에 들어가면 지난번에 생성한 class_manager에 테이블이 잘 작성되어 있는 것을 확인할 수 있습니다.
상단 메뉴 - Database - Reverse Engineer를 클릭하면 Database 테이블을 ERD로 확인할 수 있습니다.
이전에 설계한 ERD와 동일한 상태로 잘 만들어졌다면 성공입니다.
[Vercel] 웹 서비스 배포하기 (Feat. Next, Github) (1) | 2024.03.13 |
---|---|
[Netlify] 웹 서비스 배포하기 (Feat. Github, React) (1) | 2024.02.02 |
[R3F] Drei, 재질 텍스쳐 매핑 (0) | 2023.10.20 |
[R3F] Geometry, Material (0) | 2023.10.18 |
[R3F] React Three Fiber 설치 & 기본 개념 정리 (1) | 2023.10.17 |