@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Where(clause = "deleted_at is null")
public class User extends BaseEntityWithUpdate {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long userId;
@NotNull
@Column(nullable = false)
private String email;
@NotNull
@Enumerated(EnumType.STRING)
@Column(nullable = false)
private SocialCode socialCode;
private LocalDateTime lastDiaryDate;
@Enumerated(EnumType.STRING)
private UserRole userRole;
private LocalDateTime deletedAt;
@Builder(access = AccessLevel.PRIVATE)
private User(String email, SocialCode socialCode) {
this.email = email;
this.socialCode = socialCode;
this.userRole = UserRole.USER;
}
public static User create(String email, SocialCode socialCode) {
return User.builder()
.email(email)
.socialCode(socialCode)
.build();
}
public void setEmail(String email) {
this.email = email;
}
public void setLastDiaryDate(LocalDateTime date) {
this.lastDiaryDate = date;
}
public void deleteUser() {
this.deletedAt = LocalDateTime.now();
}
public boolean checkDrawLimit() {
return this.getLastDiaryDate() == null
|| !this.getLastDiaryDate().toLocalDate().equals(LocalDate.now());
}
public boolean isAdmin() {
return this.userRole == UserRole.ADMIN;
}
}
저번에 Soft delete에 대한 건 찾아봤었고
create 메서드를 쓰는 것, table 이름을 어떻게 할지에 대해 고민을 해봤다.
일단 create 메서드는 굳이 필요하지 않은 것 같다. 아래는 김영한님 답변
https://www.inflearn.com/community/questions/16235/생성-메서드-setter-질문
그냥 생성자를 만들기로 했다.
그리고 table 이름.
아니 전에 찾아보기로는 table명은 의미상 복수로 하는 것이 낫다는 걸 본 적이 있던 것 같은데, 다시 보니 그냥 단수로 쓰는 게 나아 보인다.
복수 vs 단수는 사실 정답이 있다기 보다 의견이 갈리는 주제인데 글들을 찾다 보니 단수가 더 나은 것 같았다. Entity 클래스에 굳이 @Table(name = "users")를 해 줄 필요도 없고..
https://velog.io/@drypot/Table-Name
https://stackoverflow.com/questions/5290609/what-is-the-best-practice-in-naming-your-user-table