본문 바로가기

좌충우돌 개발기!/ifland 백과

[1일차] Entity 만들기

미리 만들어둔 ERD를 기준으로 엔티티를 만들어 보았다.

 

@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Entity
public class Member extends BaseTimeEntity {

  @Id
  @GeneratedValue(strategy = IDENTITY)
  @Column(name = "user_id")
  private Long id;

  private String name;

  private String ifrandNickName;

  private String password;

  public Member(String name, String ifrandNickName, String password) {
    this.name = name;
    this.ifrandNickName = ifrandNickName;
    this.password = password;
  }

}

일단 가입을 위한 Member 엔티티.

아직 초반이라 password 인코딩 처리를 하지 않았다. 이 부분은 나중에 Spring Security를 적용할 때 같이 처리할 예정.

 

 

@Getter
@Entity
public class Profile extends BaseTimeEntity {

  @Id
  @GeneratedValue(strategy = IDENTITY)
  @Column(name = "profile_id")
  private Long id;

  private String ifland_id;

  private String image;

  private String contents;

  @OneToMany(mappedBy = "profile")
  private List<Like> likes = new ArrayList<>();

  @OneToMany(mappedBy = "profile")
  private List<Hate> hates = new ArrayList<>();

  @Embedded
  private SNS sns;

  private int likeCount;

  @OneToMany(mappedBy = "profile")
  private List<ProfileComment> comments = new ArrayList<>();

  @OneToMany(mappedBy = "profile")
  private List<Tag> tags = new ArrayList<>();

}

인물도감을 위한 엔티티. 이프랜드 아이디, 이미지 등의 정보를 가지고 있다.

좋아하는것, 싫어하는 것, 태그 등은 여러 개일 수 있으니 List로 처리.

SNS의 경우에 임베디드 형태로 삽입처리하려고 한다.

좋아요 숫자 등도 같이 처리하려고 함.

 

 

@Entity @Getter
public class Hate {

  @Id
  @GeneratedValue(strategy = IDENTITY)
  @Column(name = "hate_id")
  private Long id;

  private String like;

  @ManyToOne(fetch = LAZY)
  @JoinColumn(name = "profile_id")
  private Profile profile;

}
@Getter
@Entity
public class Like {

  @Id
  @GeneratedValue(strategy = IDENTITY)
  @Column(name = "like_id")
  private Long id;

  private String like;

  @ManyToOne(fetch = LAZY)
  @JoinColumn(name = "profile_id")
  private Profile profile;
}
@Entity @Getter
public class Tag {

  @Id @GeneratedValue
  private Long id;

  private String tag;

  @ManyToOne(fetch = LAZY)
  private Profile profile;
}

싫어하는 것, 좋아하는 것, 태그는 OneToMany 형태로 처리.

 

 

@Embeddable
@Getter
public class SNS {

  private String instagram;

  private String facebook;

  private String blog;

}

SNS의 경우 인스타, 페이스북, 블로그 정보를 입력할 수 있도록 했다.

 

 

@Entity @Getter
public class ProfileComment extends BaseTimeEntity {

  @Id @GeneratedValue(strategy = IDENTITY)
  @Column(name = "comment_id")
  private Long id;

  @ManyToOne(fetch = LAZY)
  @JoinColumn(name = "profile_id")
  private Profile profile;

  private String contents;

}

인물에 대한 댓글용 엔티티.

 

 

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {

  @CreatedDate
  private String createdDate;

  @LastModifiedDate
  private String updatedDate;

  @PrePersist
  public void onPrePersist() {
    this.createdDate = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    this.updatedDate = this.createdDate;
  }

  @PreUpdate
  public void onPreUpdate() {
    this.updatedDate = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  }
}

생성일, 갱신일 처리를 위해 추상화 클래스를 하나 만듦.

해당 엔티티를 상속받는 것으로 날짜 입력.

 

 

이러고나서 회원가입을 했더니 에러가 뜨면서 Table 'ifland_dic.hibernate_sequence' doesn't exist 문구가 뜸.

 

@GeneratedValue의 경우에 GenerationType의 default가 AUTO로 되어있는데, AUTO의 경우 하이버네이트가 hibernate_sequence라는 이름의 테이블을 생성하여 사용한다. 해당 테이블이 없기 때문에 발생하는 에러. 

 

따라서 strategy를 IDENTITY로 선언해주면 된다.

 

 

그 후에 실행했더니 음..  Field 'member_id' doesn't have a default value 문구가 뜨면서 에러가 뜬다.

member_id를 엔티티 id로 사용하는데 해당 컬럼에 auto_increment를 선언해주지 않아서 발생한 에러다.

 

테이블 드랍 후, auto_increment를 선언해주었다.

 

 

이후에 정상 삽입 확인.

 

 

회원가입 로직 대충 완성.

'좌충우돌 개발기! > ifland 백과' 카테고리의 다른 글

ifland 인물사전 개발 시작  (0) 2022.02.12