티스토리 뷰
본 포스팅은 백기선님의 스프링과 JPA 기반 웹 애플리케이션 개발 강의를 참고하여 작성하였습니다.
소스 코드는 여기 있습니다. (commit hash: 49137fc)> git clone https://github.com/lcalmsky/spring-boot-app.git > git checkout 49137fc
ℹ️ squash merge를 사용해 기존 branch를 삭제하기로 하여 앞으로는 commit hash로 포스팅 시점의 소스 코드를 공유할 예정입니다.
Overview
모임(Event)과 참가(Enrollment) 두 개의 Entity
를 설계하고 기존 Entity
와의 관계를 설정합니다.
설계
먼저 Entity
관계는 아래와 같습니다.
Event
는 Study
, Account
를 참조할 수 있는 단방향 연관관계를 가지고 Enrollment
와는 양방향 연관관계를 가집니다.
Enrollment
는 Study
와는 관계를 가질 필요가 없고 Account
와는 단방향 연관관계를, Event
와는 양방향 연관관계를 가집니다.
Entity 작성
속성은 필드를 보고 충분히 파악할 수 있으므로 따로 정리하지 않고 바로 Entity
를 작성하겠습니다.
event
패키지 하위에 모임 정보를 담고있는 Event Entity
를 작성합니다.
/src/main/java/io/lcalmsky/app/event/domain/entity/Event.java
package io.lcalmsky.app.modules.event.domain.entity;
import io.lcalmsky.app.modules.account.domain.entity.Account;
import io.lcalmsky.app.modules.study.domain.entity.Study;
import java.time.LocalDateTime;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import lombok.AccessLevel;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@ToString
@EqualsAndHashCode(of = "id")
public class Event {
@Id
@GeneratedValue
private Long id;
@ManyToOne
private Study study;
@ManyToOne
private Account createdBy;
@Column(nullable = false)
private String title;
@Lob
private String description;
@Column(nullable = false)
private LocalDateTime createdDateTime;
@Column(nullable = false)
private LocalDateTime endEnrollmentDateTime;
@Column(nullable = false)
private LocalDateTime startDateTime;
@Column(nullable = false)
private LocalDateTime endDateTime;
private Integer limitOfEnrollments;
@OneToMany(mappedBy = "event")
private List<Enrollment> enrollments;
@Enumerated(EnumType.STRING)
private EventType eventType;
}
Event Entity
에서 사용된 EventType
은 다음과 같습니다.
/src/main/java/io/lcalmsky/app/modules/event/domain/entity/EventType.java
package io.lcalmsky.app.modules.event.domain.entity;
public enum EventType {
FCFS, // FIRST_COME_FIRST_SERVED
CONFIRMATIVE;
}
마찬가지로 참가 정보를 담고있는 Enrollment Entity
를 작성합니다.
/src/main/java/io/lcalmsky/app/event/domain/entity/Enrollment.java
package io.lcalmsky.app.modules.event.domain.entity;
import io.lcalmsky.app.modules.account.domain.entity.Account;
import java.time.LocalDateTime;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import lombok.AccessLevel;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@ToString
@EqualsAndHashCode(of = "id")
public class Enrollment {
@Id
@GeneratedValue
private Long id;
@ManyToOne
private Event event;
@ManyToOne
private Account account;
private LocalDateTime enrolledAt;
private boolean accepted;
private boolean attend;
}
모임과 참가는 서로 양방향 연관관계를 가지고 있으므로 Event.enrollments
에 mappedBy
를 이용해 관계를 정의해줍니다.
그 외에 @ManyToOne
등의 관계는 기본 값을 사용하므로 단방향 관계를 나타냅니다.
따라서 Account
나 Study
에서는 Event
를 조회할 수 없습니다. (아예 방법이 없는 게 아니라 객체 navigation을 통해서는 불가능합니다.)
다음 포스팅부터는 모임에 관련된 기능을 순차적으로 구현하겠습니다.
'SpringBoot > Web Application 만들기' 카테고리의 다른 글
스프링 부트 웹 애플리케이션 제작(50): 모임 조회 기능 구현 (0) | 2022.05.12 |
---|---|
스프링 부트 웹 애플리케이션 제작(49): 모임 만들기 기능 구현 (3) | 2022.05.09 |
스프링 부트 웹 애플리케이션 제작(47): 모임 도메인 설계 (6) | 2022.05.02 |
스프링 부트 웹 애플리케이션 제작(46): 스터디 가입, 탈퇴 기능 구현 (0) | 2022.05.01 |
스프링 부트 웹 애플리케이션 제작(45): 스터디 상태, 경로, 이름 설정, 삭제 기능 구현 (0) | 2022.04.21 |
스프링 부트 웹 애플리케이션 제작(44): 스터디 관심 주제 및 지역 설정 (0) | 2022.04.20 |
-
코카곰 드뎌.. 모임까지 왔습니다..
의지로 손코딩 하는 중인데 맞는거겟죠?ㅋㅋㅋ 2022.06.14 17:57 -
Jaime.Lee 처음 해보시는 거면 손코딩도 중요하지만 직접 응용해서 바꿔보시는 게 더 좋을 거 같아요 :) 2022.06.14 18:07 신고
-
코카곰 따라치는 것보다 혼자서 응용해서 해보고 치는게 났다는거져? 그나저나 코드 양이 상당하네요 2022.06.14 18:18
-
Jaime.Lee 넵 저도 강의 코드 그대로 사용하는 부분이 더 많긴 하지만 제 스타일대로도 작성하고 있습니다😄 2022.06.14 18:22 신고
-
코카곰 package clone.jaime.app.springbootapp.server.event.domain.entity;
public enum EventType {
FCFS,
CONFIRMATIVE
}
EventType 코드가 빠졌어유 ㅎㅎ 2022.06.14 18:48 -
Jaime.Lee 수정했습니다. 감사합니다🙇♂️ 2022.06.15 08:13 신고
- Total
- 83,835
- Today
- 55
- Yesterday
- 439
- @ManyToOne
- Spring Boot Tutorial
- leetcode
- leetcode bst
- spring boot application
- Spring Data JPA
- 스프링 부트 튜토리얼
- spring boot app
- Spring Boot JPA
- 스프링 부트
- 스프링 부트 jwt
- leetcode stack
- JPA
- 알고리즘
- spring boot jwt
- QueryDSL
- Jackson
- 스프링 데이터 jpa
- intellij
- Java
- r
- gRPC
- 스프링 부트 애플리케이션
- 스프링부트
- 스프링 부트 회원 가입
- proto3
- JSON
- leetcode binary search
- Linux
- Spring Boot