사용자 도메인
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++;
}
}
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
}
- ARTICLE
- TRABEL
- 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 어노테이션을 추가해주어야 한다.