프로젝트 간략 소개 : 함께 운동 경기를 할 인원을 모집하는 서비스

순환구조가 되는건 좋지 않다고 하는데.. 아무리 생각해도 다른 방안이 떠오르지 않았다.
ERD 만 봤을 때 USER가 POST와 MATCH 두 엔티티 모두와 관계가 있는 것이 이상해보이는데 POST 를 등록한 USER 의 경우에는 POST -> MATCH 와 같이 MATCH 엔티티로 접근이 가능하지만, 단순히 등록된 모집글을 통해 MATCH 에 참가 신청을 한 경우에는 PARTICIPATION -> MATCH 을 통해 접근하는 방법 뿐이기 때문이다.
그럼 아예 MATCH를 없애..? 기에는 MATCH 엔티티 자체가 갖는 필드들이 많았기에 그냥 따로 뺐다.
1. User.java
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="User_id",updatable = false)
private Long userId;
@Column(name="Name", nullable = false)
private String name;
@Column(name="Email")
private String email;
@Column(name="Sex")
private char gender;
@Column(name = "Age")
private String age;
@Column(name="Sex_visible")
@ColumnDefault("1")
private boolean genderVisible;
@Column(name="Age_visible")
@ColumnDefault("1")
private boolean ageVisible;
@Column(name = "winningRate")
private float winningRate;
@Column(name = "Late_rate")
private float lateRate;
@Builder
public User(Long userId, String name, String email,
char gender, String age, boolean genderVisible,
boolean ageVisible, float winningRate, float lateRate) {
this.userId = userId;
this.name = name;
this.email = email;
this.gender = gender;
this.age = age;
this.genderVisible = genderVisible;
this.ageVisible = ageVisible;
this.winningRate = winningRate;
this.lateRate = lateRate;
}
}
2. Post.java
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = "posts")
public class Post extends BaseEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "Post_id", updatable = false)
private Long postId;
@ManyToOne
@JoinColumn(name = "User_id")
@CreatedBy
private User user;
@OneToOne
@JoinColumn(name = "Tag_id")
private Tag tag;
@OneToOne
@JoinColumn(name = "Match_id")
private Match match;
@Column(name = "Title", nullable = false)
private String title;
@Column(name = "Content", nullable = false)
private String content;
@Builder
public Post(Long postId, User user, Tag tag, Match match, String title, String content) {
this.postId = postId;
this.user = user;
this.tag = tag;
this.match = match;
this.title = title;
this.content = content;
}
}
3. Tag.java
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = "tags")
public class Tag {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "Tag_id",updatable = false)
private Long tagId;
@ManyToOne
@JoinColumn(name="Post_id")
private Post post;
@Column(name = "Sex")
private String genderType;
@Column(name = "Level")
private String levelType;
@Column(name = "Age")
private String ageType;
@Builder
public Tag(Long tagId, Post post, String genderType, String levelType, String ageType) {
this.tagId = tagId;
this.post = post;
this.genderType = genderType;
this.levelType = levelType;
this.ageType = ageType;
}
}
4. Match.java
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = "matches")
public class Match {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "Match_id",updatable = false)
private Long matchId;
@ManyToOne
@JoinColumn(name = "Post_id")
private Post post;
@ManyToOne
@JoinColumn(name = "User_id")
private User user;
@Column(name = "Category",nullable = false)
private String category;
@Column(name = "Current_head_cnt",nullable = false)
private int currentHeadCnt;
@Column(name = "Head_cnt",nullable = false)
private int headCnt;
@Column(name = "Place", nullable = false)
private String place;
@Column(name = "Match_date",nullable = false)
private Timestamp matchDate;
@Column(name = "Attendance_count",nullable = false)
private int attendanceCnt;
@Builder
public Match(Long matchId, Post post, User user,
String category, int currentHeadCnt, int headCnt,
String place, Timestamp matchDate, int attendanceCnt) {
this.matchId = matchId;
this.post = post;
this.user = user;
this.category = category;
this.currentHeadCnt = currentHeadCnt;
this.headCnt = headCnt;
this.place = place;
this.matchDate = matchDate;
this.attendanceCnt = attendanceCnt;
}
}
5.Participation.java
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = "participations")
public class Participation{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "Participation_id",updatable = false)
private Long participationId;
@ManyToOne
@JoinColumn(name = "User_id")
private User user;
@ManyToOne
@JoinColumn(name = "Match_id")
private Match match;
@Column(name = "Status", nullable = false)
@ColumnDefault("wait")
private String status;
@Column(name = "Attendance", nullable = false)
@ColumnDefault("0")
private boolean attendance;
@Column(name = "Iswin", nullable = false)
@ColumnDefault("0")
private boolean isWin;
@Builder
public Participation(Long participationId, User user, Match match,
String status, boolean attendance, boolean isWin){
this.participationId = participationId;
this.user = user;
this.match = match;
this.status = status;
this.attendance = attendance;
this.isWin = isWin;
}
}
6.BaseEntity
➡️ 자동 생성/수정 날짜를 상속받기 위해 만든 클래스
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {
@Column(name = "Created_date", nullable = false)
@CreatedDate
@DateTimeFormat(pattern = "yyyy-MM-dd/HH:mm:ss")
private Timestamp createdDate;
@Column(name = "Modified_date", nullable = false)
@LastModifiedDate
private Timestamp modifiedDate;
}
근데 사실 @ManytoOne, @ManytoMany 등이 정확히 어떻게 이용되는지 아직 모르고 원래 디비 관계에서 생각할 수 있는대로 비슷하겠지.. 하고 적용해놨다. 아마 다시 공부해서 재적용을 해야할 것 같다.
@GetMapping("/api/post/{id}")
public ResponseEntity<PostResponse> findPostById(@PathVariable Long id) {
Optional<Post> post = postService.findById(id);
return ResponseEntity.ok()
.body(new PostResponse(post,post.getTag(),post.getMatch(),post.getUser()));
}
@GetMapping("/api/post/{id}")
public ResponseEntity<PostResponse> findPostById(@PathVariable Long id) {
Optional<Post> byId = postService.findById(id);
Post post = byId.orElse(null);
return ResponseEntity.ok()
.body(new PostResponse(post,post.getTag(),post.getMatch(),post.getUser()));
}


모두 제대로 작동함을 확인했다!
그런데 일단 mockdata로 생성,수정 날짜를 임의로 주입했으므로 추후에 자동생성을 확인해야하고,
지금 제일 궁금한건 post dto 생성 시에 등록한 user의 정보는 id만 넣어놓으면 되는건지, 아니면 user 객체 자체를 넣어야하는건지..
그리고 전자대로 id만 넣어놓을 경우 나중에 해당 post와 연관이 있는 그외의 user 정보는 어떻게 불러오는지이다.