@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
양방향 관계가 아니라 단방향 관계로 수정함.