@Entity @Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Table(name = "users")
public class User extends BaseTimeEntity {
  @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
  private String username; // 본명
  private String nickname; // 별명
  private String password;
  private String email;
  @OneToMany(mappedBy = "user")
  private Set<UserTag> tags = new HashSet<>(); // tag를 중복으로 가질 수 없으니 Set 자료형으로 함.
  @Builder
  public User(String username, String nickname, String password, String email) {
    this.username = username;
    this.nickname = nickname;
    this.password = password;
    this.email = email;
  }
  public void update(UserUpdateRequestDto updateDto) {
    this.nickname = updateDto.getNickname();
    this.password = updateDto.getPassword();
  }
}
@NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PROTECTED)
@Getter @Entity @Builder
public class Tag extends BaseTimeEntity {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
  private String tagName;
}
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@Getter @Entity @Builder
public class UserTag {
  // user - UserTag - tag
  // User는 관심 주제를 Tag로 설정해서 알림을 받을 수 있도록함.
  // 그래서 user와 tag는 다대다 관계여서 일대다, 다대일 관계로 풀어주기 위한 중간 테이블 생성
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
  @ManyToOne
  @JoinColumn(name = "user_id")
  private User user;
  @ManyToOne
  @JoinColumn(name="tag_id")
  private Tag tag;
}
@Entity
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Crew extends BaseTimeEntity {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
  private Long leaderId; // 크루장 id
  private String name; // 크루이름
  private boolean type; //  true-온라인, false-오프라인
  private boolean cost; // true-유료탑승, false-무료탑승
  private String thumbnail; //이미지 경로
  @Lob // varchar보다 클 경우 사용하는 어노테이션
  private String description; // 크루즈 설명
  private byte capacity; // 인원수
  @OneToMany(mappedBy = "crew")
  private Set<CrewTag> tags = new HashSet<>(); // tag를 중복으로 가질 수 없으니 Set 자료형으로 함.
  @Builder
  public Crew(Long leaderId, String name, boolean type, boolean cost,
              String introduction, byte capacity, String thumbnail) {
    this.leaderId = leaderId;
    this.name = name;
    this.type = type;
    this.cost = cost;
    this.description = introduction;
    this.capacity = capacity;
    this.thumbnail = thumbnail;
  }
  public void update(CrewUpdateRequestDto updateDto) {
    this.name = updateDto.getName();
    this.type = updateDto.isType();
    this.cost = updateDto.isCost();
    this.introduction = updateDto.getIntroduction();
    this.capacity = updateDto.getCapacity();
    this.thumbnail = updateDto.getThumbnail();
    }
}
@NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PROTECTED)
@Getter @Entity @Builder
public class CrewTag {
  // Crew-CrewTag-tag , 다대다 관계를 일대다 다대일 관계로 풀어내기 위한 중간 테이블
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "crew_id")
  private Crew crew;
  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name="tag_id")
  private Tag tag;
}
뭔가 빵꾸가 와장창 있는 코드같다.. 공부하면서 리팩토링을 계속 해야겠다.
음...우선 도메인을 구성하면서 든 생각이,, 자유게시판부터 구현해야겠다.
다음 포스팅은 자유게시판 구현부터 시작하겠다.
조언, 충고,,잔소리 쓴소리 너무 감사합니다.
10.16
양방향 관계가 아니라 단방향 관계로 수정함.