[개발일지] 취미 커뮤니티 개발일지 (2)

zwon·2023년 10월 11일
0

개발일지

목록 보기
14/23

User

@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();
  }
}
  • BaseTimeEntity는 등록일과 수정일이 들어있는 베이스 엔티티
  • User와 Tag는 다대다 관계로 설정함.
  • 다대다 관계는 @ManyToMany어노테이션을 사용해서 구현할 수 있지만 다대다 관계를 일대다,다대일 관계로 풀어내서 작성하는 것이 더 좋아서 UserTag라는 중간 테이블을 생성함
  • (프로필 기능은 후에 추가할 것)

Tag

@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;
}

UserTag

@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;
}

Crew

@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();
    }
}
  • 갑자기 코드가 와다다다닥 있어서 당황스럽겠지만 개발하면서 필요할꺼같은 메서드들은 미리 생성해두었다.

CrewTag

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

profile
Backend 관련 지식을 정리하는 Back과사전

0개의 댓글