[프로젝트] 게시판 프로젝트 - 3

DreamJJW·2023년 6월 12일
0

Spring

목록 보기
3/3
post-thumbnail

도메인 생성

일단 게시판에 필요한 도메인은
사용자 계정 UserAccount 도메인,
게시글 Post 도메인,
그리고 댓글 Comments 도메인이다.

게시글에 필요한 Entity는
id, title, content, hashtag, createdDate, createdBy, modifiedDate, modifiedBy로
설정했다. (추후 변동 가능)

Post.java

@Getter
@ToString(callSuper = true)
@Table(indexes = {
        @Index(columnList = "title"),
        @Index(columnList = "hashtag"),
        @Index(columnList = "createdDate"),
        @Index(columnList = "createdBy"),
})

@Table 에노테이션을 이용한 테이블 설정

@Entity
public class Post extends AuditingField{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id; // 게시글 id
    
    @Setter @Column(nullable = false) private String title; // 게시글 제목
    @Setter @Column(nullable = false, length = 10000) private String content; // 게시글 본문

    @Setter private String hashtag; // 해시태그

    @ToString.Exclude
    @OrderBy("id")
    // Cascading
    @OneToMany(mappedBy = "post", cascade = CascadeType.ALL)
    // 게시글의 댓글에는 중복을 허락하지 않고 콜렉션으로 본다.
    private final Set<Comment> comments = new LinkedHashSet<>();

    protected Post() {}

    public Post(String title, String content, String hashtag) {
        this.title = title;
        this.content = content;
        this.hashtag = hashtag;
    }

createdDate, createdBy, modifiedDate, modifiedBy는 메타데이터로,
post와 comment 두 도메인에서 겹치느로 따로 클래스를 만들어줘 상속하게끔 정리했다.

작성된 @ 어노테이션은

@ID
@GeneratedValue
@Setter, @Getter (Lombok)
@Colmun
@ManyToOne
@Entity
@ToString 정도이다.

해당 어노테이션에 대한 정리는 Spring References를 참고하면 될 듯하다.

equals & hashcode

@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Comment comment)) return false;
        return Objects.equals(id, comment.id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }

UserAccount.java


@Getter
@ToString(callSuper = true)
@Table(indexes = {
        @Index(columnList = "email", unique = true),
        @Index(columnList = "createdDate"),
        @Index(columnList = "createdBy")
})

@Entity
public class UserAccount extends AuditingField{
    @Id
    @Column(length = 50)
    private String userId;
    @Setter @Column(nullable = false) private String userPw;

    @Setter @Column(nullable = false, length = 100) private String email;
    @Setter @Column(nullable = false, length = 100) private String nickname;

    public UserAccount() {
    }

    public UserAccount(String userId, String userPw, String email, String nickname) {
        this.userId = userId;
        this.userPw = userPw;
        this.email = email;
        this.nickname = nickname;
    }

    public static UserAccount of(String userId, String userPw, String email, String nickname)
    {
        return UserAccount.of(userId, userPw, email, nickname);
    }
    
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof UserAccount that)) return false;
        return Objects.equals(userId, that.userId);
    }

    @Override
    public int hashCode() {
        return Objects.hash(userId);
    }
}

UserAccount과 Comment도 데이터 형식이나 종류에만 차이가 있을 뿐, 큰 맥락은 같다고 보면 된다.

AuditingField.java

// Auditing Metadata들을 묶었다.

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

    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
    @CreatedDate
    @Column(nullable = false, updatable = false) private LocalDateTime createdDate; // 생성일자

    @CreatedBy
    @Column(nullable = false, updatable = false, length = 100) private String createdBy; // 작성자 nickname

    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
    @LastModifiedDate
    @Column(nullable = false) private LocalDateTime modifiedDate; // 수정일자

    @LastModifiedBy
    @Column(nullable = false, length = 100) private String modifiedBy; // 수정자 nickname

}

앞서 미리 설명한 Auditing 클래스이다.

이렇게 도메인 설정이 끝났으니

다음은 Repository와 Dto 설정에 들어가보자

profile
간절한 사람

0개의 댓글