[Lettrip] 기본 도메인 구현

subbni·2023년 4월 7일

Lettrip

목록 보기
1/7
post-thumbnail

사용자 도메인

User


import jakarta.persistence.*;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
@Entity
public class User {
    @Id
    @Column(name="USER_ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @NotNull
    @Email
    private String email;

    @NotNull
    @NotBlank
    private String password;

    @NotNull
    @NotBlank
    private String name;
    @NotNull
    @NotBlank
    private String nickname;
    @Column(nullable = true)
    private String imageUrl;

    @NotNull
    private ProviderType providerType;

    @Builder
    public User(String email, String password, String name,
                String nickname, String imageUrl, ProviderType providerType ) {
        this.email = email;
        this.password = password;
        this.name = name;
        this.nickname = nickname;
        this.imageUrl = imageUrl;
        this.providerType = providerType;
    }

    public void update(String name, String nickname, String imageUrl) {
        this.name = name;
        this.nickname = nickname;
        this.imageUrl = imageUrl;
    }
}

ProviderType

package com.lettrip.lettripbackend.domain.user;

import lombok.Getter;

@Getter
public enum ProviderType {
    LOCAL,NAVER,KAKAO,GOOGLE
}
  • LOCAL : 소셜로그인이 아닌, form을 작성하여 가입한 사용자
  • NAVER, KAKAO, GOOGLE : 소셜로그인 provider

커뮤니티 관련 도메인

Article

package com.lettrip.lettripbackend.domain.community;

import com.lettrip.lettripbackend.domain.BaseTimeEntity;
import com.lettrip.lettripbackend.domain.user.User;
import jakarta.persistence.*;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
@Entity
public class Article extends BaseTimeEntity {
    @Id
    @Column(name="ARTICLE_ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @ManyToOne
    @JoinColumn(name="USER_ID")
    private User user;

    private String title;

    private String content;

    private int hit;

    private int likeCount;

    @Builder
    public Article(User user, String title, String content) {
        this.user = user;
        this.title = title;
        this.content = content;
        this.hit = 0;
        this.likeCount = 0;
    }

    public void update(String title, String content) {
        this.title = title;
        this.content = content;
    }
    public void updateLikeCount(int amount) {
        likeCount += amount;
    }

    public void addHit() {
        hit++;
    }

}

Comment

package com.lettrip.lettripbackend.domain.community;

import com.lettrip.lettripbackend.domain.BaseTimeEntity;
import com.lettrip.lettripbackend.domain.user.User;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Getter
@NoArgsConstructor
@Entity
public class Comment extends BaseTimeEntity {
    @Id
    @Column(name="COMMENT_ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name="USER_ID")
    private User user;

    @ManyToOne
    @JoinColumn(name="ARTICLE_ID")
    private Article article;

    @NotNull
    @NotBlank
    private String content;

    @Builder
    public Comment(User user, Article article, String content) {
        this.user = user;
        this.article = article;
        this.content = content;
    }

    public void update(String content) {
        this.content = content;
    }
}

좋아요 관련 도메인

Liked

package com.lettrip.lettripbackend.domain.like;

import com.lettrip.lettripbackend.domain.user.User;
import jakarta.persistence.*;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
@Entity
public class Liked {
    @Id
    @Column(name="LIKED_ID")
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private long id;
    private LikedType likedType;

    @ManyToOne
    @JoinColumn(name="USER_ID")
    private User user;

    private long targetId;

    @Builder
    public Liked(LikedType likedType, User user, long targetId) {
        this.likedType = likedType;
        this.user = user;
        this.targetId = targetId;
    }
}

LikedType

package com.lettrip.lettripbackend.domain.like;

public enum LikedType {
    ARTICLE_LIKE,
    TRAVEL_LIKE,
    PLACE_LIKE
}
  • 좋아요를 누를 수 있는 대상
  1. ARTICLE
  2. TRABEL
  3. PLACE

여행 코스 관련 도메인

Place

package com.lettrip.lettripbackend.domain.travel;

import jakarta.persistence.*;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.List;

@Getter
@NoArgsConstructor
@Entity
public class Place {
    @Id
    @Column(name="PLACE_ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private String locationUrl;

    private String category;

    @OneToMany(mappedBy = "place")
    private List<Review> reviews = new ArrayList<>();

    private float totalRating;

    @Builder
    public Place(String locationUrl, String category) {
        this.locationUrl = locationUrl;
        this.category = category;
        this.totalRating = 0;
    }

    public void addReviews(Review review) {
        this.reviews.add(review);
    }
}

Review

package com.lettrip.lettripbackend.domain.travel;

import com.lettrip.lettripbackend.domain.BaseTimeEntity;
import com.lettrip.lettripbackend.domain.travel.Place;
import com.lettrip.lettripbackend.domain.user.User;
import jakarta.persistence.*;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.List;

@Getter
@NoArgsConstructor
@Entity
public class Review extends BaseTimeEntity {
    @Id
    @Column(name="REVIEW_ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="USER_ID")
    private User user;

    @ManyToOne
    @JoinColumn(name="PLACE_ID")
    private Place place;

    private int visitTimes;
    private List<String> imageUrls;

    // 상세 후기
    private String detailedReview;

    // 별점
    @Max(5)
    @Min(1)
    @NotNull
    private int rating;

    @Builder
    public Review(User user, Place place, int visitTimes, List<String> imageUrls,
                  String detailedReview, int rating) {
        this.user=user;
        this.place=place;
        this.visitTimes=visitTimes;
        this.imageUrls=imageUrls;
        this.detailedReview=detailedReview;
        this.rating=rating;
    }

    public void update(List<String> imageUrls, String detailedReview, int rating) {
        this.imageUrls=imageUrls;
        this.detailedReview=detailedReview;
        this.rating=rating;
    }

}

BaseTimeEntity

package com.lettrip.lettripbackend.domain;

import jakarta.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass;
import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

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

    @CreatedDate
    private LocalDateTime createdDate;
    @LastModifiedDate
    private LocalDateTime modifiedDate;
}
  • JPA Auditing 기능을 사용한다
  • 이를 위해 Application에 @EnableJpaAuditing 어노테이션을 추가해주어야 한다.
profile
개발콩나물

0개의 댓글