✅ 모임 도메인

Yuri Lee·2020년 11월 26일
0

Event

  • EventType (enum)
  • Study
  • Account createdBy
  • String title
  • @Lob String description
  • int limitOfEnrollments
  • List enrollments

맵핑 관계

  • Event에서 Study 쪽으로 @ManyToOne 단방향 관계
  • Event와 Enrollment는 @OneToMany @ManyToOne 양방향 관계
  • Event는 Account 쪽으로 @ManyToOne 단방향 관계
  • Enrollment는 Account 쪽으로 @ManyToOne 단방향 관계
@ManyToMany
private Set<Tag> tags = new HashSet<>();
@ManyToMany
private Set<Zone> zones = new HashSet<>();

어노테이션 builder 를 사용하면 다음의 값들이 set 값들이 null로 들어간다. 기본값이 적용이 안된다. 그래서 삭제하자. (Account.java)

FCFS: First Come First Served
CONFIRMATIVE : 관리자 확인이 필요한 것

@Enumerated(EnumType.STRING)
private EventType eventType;

enum 을 사용할 때는 이런 식으로 사용한다.

Event.java

package com.yuri.studyolle.domain;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.List;

@Entity
@Getter @Setter @EqualsAndHashCode(of = "id")
public class Event {

    @Id @GeneratedValue
    private Long id;

    @ManyToOne
    private Study study;

	....

    @OneToMany(mappedBy = "event")
    private List<Enrollment> enrollments;

    @Enumerated(EnumType.STRING)
    private EventType eventType;

}

Enrollment.java

@Entity
@Getter @Setter @EqualsAndHashCode(of = "id")
public class Enrollment {

    @Id @GeneratedValue
    private Long id;

    @ManyToOne
    private Event event;

Enrollment 참가 신청 하나는 어느 특정한 이벤트 하나에 맵핑된다. 따라서 끝은 무조건 One, 하지만 Event 입장에서 생각했을 때 이벤트에 참가 신청이 여러개 있을 수 있다. 그래서 OneToMany 이다. 여기서 맵핑을 멈추면 양방향 맵핑이 아니다. 2개의 단방향 맵핑을 한 것이다. 서로 다른 연관관계 2개를 단방향으로 맵핑한 것이다. 이것을 양방향을 묶이려면 관련되어있다는 것을 알려줘야 한다.

mappedBy = "event" 설정을 통해 이에 관한 join table은 생기지 않는다. 그리고 이것에 관한 관계맵핑은 Enrollment.java의 event에서 하고 있다고 JPA가 이해한다.

@ManyToOne
private Event event;

위 부분에서 관련 객체 관계가 변경될 때 Enrollment 에 있는 event 를 지칭하는 Foreign Key 값을 수정하게 된다.

❗ 👩‍💻 실제로 database tab 사용해서 스키마를 삭제했다가, 생성하면서 연습해보기
❗ 이해 안간 부분이 많음 ㅠㅠ 다시 보자


enum

enum은 class, interface와 동급의 형식을 가지는 단위다. 하지만 enum은 사실상 class이다. 편의를 위해서 enum만을 위한 문법적 형식을 가지고 있기 때문에 구분하기 위해서 enum이라는 키워드를 사용하는 것이다. enum은 많은 곳에서 사용하던 디자인 패턴을 언어가 채택해서 문법적인 요소로 단순화시킨 것텍스트이라고 할 수 있다.

enum을 사용하는 이유

코드가 단순해진다.
인스턴스 생성과 상속을 방지한다.
키워드 enum을 사용하기 때문에 구현의 의도가 열거임을 분명하게 나타낼 수 있다.

@Getter & @Setter

Getter와 Setter를 만들어 주는 것

@Builder

빌더 패턴을 생성해 주는 것.

빌드 패턴이란? 생성자의 인자로 너무 많은 인자가 넘겨지는 경우나 모든 필드에 값이 들어가지 않는 경우에는 가독성 측면에서 매우 좋지 않다. 이를 해결하기 위해 나온 패턴이다.

@EqualsAndHashCode

equals와 hashcode를 만들어 주는 것

equals: 두 객체의 내용이 같은 지 확인
hashcode: 두 객체가 같은 객체인지 확인

❗ Tip @EqualsAndHashCode(of="id"): 연관 관계가 복잡해 질 때, @EqualsAndHashCode에서 서로 다른 연관 관계를 순환 참조하느라 무한 루프가 발생하고, 결국 stack overflow가 발생할 수 있기 때문에 id 값만 주로 사용

@AllArgsConstructor

모든 필드 값을 파라미터로 받는 생성자 생성

@NoArgsConstructor

파라미터가 없는 기본 생성자 생성

@RequiredArgsConstructor

private final 타입의 멤버변수의 생성자를 만들어준다.


출처 : 인프런 백기선님의 스프링과 JPA 기반 웹 애플리케이션 개발
https://velog.io/@max9106/Lombok

profile
Step by step goes a long way ✨

0개의 댓글