개인 프로젝트/Toy & Side

[TOY] 개발 - Domain

kwang2134 2024. 11. 29. 17:21
728x90
반응형
728x90

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;
}
728x90