미리 만들어둔 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 |
---|