Domain 패키지
개발 진행상황을 작성하는 글로 각 도메인의 domain 패키지 아래 개발입니다.
- User
- Post
- Comment
- Photo
- BaseEntity
User
User 아래 domain 패키지 개발입니다. model 패키지 아래 User 엔티티와 유저의 역할 Enum 클래스가 존재하고 repository 패키지 아래 UserRepository가 존재합니다.
class User
User 엔티티 클래스입니다. Builder 패턴을 사용을 위해 @Builder 어노테이션을 사용하였습니다. modify 메서드로 변경감지를 통한 수정을 수행합니다.
@Entity
@Table(name = "users")
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class User extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private Long id;
@Column(name = "login_id", nullable = false, unique = true)
private String loginId;
@Column(name = "password", nullable = false)
private String password;
@Column(name = "username", nullable = false)
private String username;
@Column(name = "email", unique = true)
private String email;
@Enumerated(EnumType.STRING)
@Column(nullable = false)
private Role role ;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Post> posts = new ArrayList<>();
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Comment> comments = new ArrayList<>();
public void modify(String username, String password) {
this.username = username;
this.password = password;
}
}
enum Role
user의 역할이 들어있는 enum 클래스입니다.
@Getter
@RequiredArgsConstructor
public enum Role {
USER("USER"),
MANAGER("MANAGER"),
ADMIN("ADMIN");
private final String value;
}
interface UserRepository
JpaRepository를 상속받은 UserRepository입니다. 로그인 아이디를 통한 검색과 이메일을 통한 검색이 구현되었습니다.
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByLoginId(String loginId);
Optional<User> findByEmail(String email);
}
Post
Post 패키지 아래 개발입니다. Post 엔티티와 게시글 종류 enum 클래스 그리고 repository가 존재합니다.
class Post
post 엔티티 클래스입니다. modify로 변경감지를 통한 수정을 수행합니다. toOne 관계는 lazy 로딩으로 설정되었습니다.
@Entity
@Table(name = "posts")
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Post extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "post_id")
private Long id;
@Column(nullable = false)
private String title;
@Column(nullable = false)
private String content;
@Column(name = "display_name")
private String displayName;
@Column(name = "password")
private String password;
@Column(name = "recom_count", columnDefinition = "INT DEFAULT 0")
private int recomCount;
@Column(name = "not_recom_count", columnDefinition = "INT DEFAULT 0")
private int notRecomCount;
@Enumerated(EnumType.STRING)
@Column(name = "post_type", nullable = false)
private PostType postType;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
@OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Comment> comments = new ArrayList<>();
@OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Photo> photos = new ArrayList<>();
public void modify(String title, String content){
this.title = title;
this.content = content;
}
}
enum PostType
게시글 종류 enum 클래스입니다. 일반, 공지, 인기가 존재합니다.
@Getter
@RequiredArgsConstructor
public enum PostType {
NORMAL("NORMAL"),
NOTICE("NOTICE"),
POPULAR("POPULAR");
private final String value;
}
interface PostRepository
JpaRepository를 상속받은 repository입니다. 유저 id를 통한 검색을 구현하였습니다.
public interface PostRepository extends JpaRepository<Post, Long> {
List<Post> findByUserId(Long userId);
}
Comment
Comment 패키지 아래 개발입니다. Comment 엔티티 클래스와 Repository가 존재합니다.
class Comment
@Entity
@Table(name = "comments")
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Comment extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "comment_id")
private Long id;
@Column(nullable = false)
private String content;
@Column(name = "display_name")
private String displayName;
@Column(name = "password")
private String password;
@Column(name = "is_deleted", columnDefinition = "BOOLEAN DEFAULT FALSE")
private boolean isDeleted;
@Column(name = "deleted_at")
private LocalDateTime deletedAt;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "post_id")
private Post post;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_comment_id")
private Comment parentComment;
public void modify(String content) {
this.content = content;
}
}
interface CommentRepository
postId와 부모 댓글을 통한 검색이 구현되었습니다.
public interface CommentRepository extends JpaRepository<Comment, Long> {
List<Comment> findByPostId(Long postId);
List<Comment> findByParentCommentId(Long parentCommentId);
}
Photo
Photo 패키지 아래 개발입니다. 엔티티와 repository가 존재합니다.
class Photo
@Entity
@Table(name = "photos")
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Photo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "photo_id")
private Long id;
@Column(name = "photo_name", nullable = false)
private String photoName;
@Column(name = "photo_path", nullable = false)
private String photoPath;
@Column(name = "uploaded_at")
private LocalDateTime uploadedAt;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "post_id")
private Post post;
}
interface PhotoRepository
postId를 통한 검색이 구현되었습니다.
public interface PhotoRepository extends JpaRepository<Photo, Long> {
List<Photo> findByPostId(Long postId);
}
BaseEntity
User, Post, Comment의 기본이 될 엔티티 클래스입니다. Audicting을 위한 생성 시간, 수정 시간을 가진 필드가 존재합니다.
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity {
@CreatedDate
@Column(name = "created_at", updatable = false)
private LocalDateTime createdAt;
@LastModifiedDate
@Column(name = "updated_at")
private LocalDateTime updatedAt;
}
'개인 프로젝트 > Toy & Side' 카테고리의 다른 글
[TOY] 개발 - Application(UserService) (0) | 2024.11.30 |
---|---|
[TOY] 개발 - UseCase & DTO (1) | 2024.11.29 |
[TOY] 설계서 - 최종 (0) | 2024.11.25 |
[TOY] 설계 - 프론트엔드 (User) (0) | 2024.11.22 |
[TOY] 설계 - 프론트 엔드 (Post) (0) | 2024.11.20 |