From dc62719902df44a00ea3f41364615f6c3e385223 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=8F=99=ED=98=B8?= <66300965+kdkdhoho@users.noreply.github.com> Date: Tue, 18 Jul 2023 13:05:17 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EA=B8=B0=EB=B3=B8=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=EB=93=A4=EC=9D=84=20=EC=83=9D=EC=84=B1=ED=95=9C?= =?UTF-8?q?=EB=8B=A4=20(#132)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 기본 예외 작성 (#131) * feat: BaseEntity 작성 (#131) * feat: Celeb 도메인 작성 (#130) * feat: Restaurant 도메인 작성 (#130) * feat: RestaurantImage 도메인 작성 (#130) * feat: Video 도메인 작성 (#130) * style: polishing (#130) --------- Co-authored-by: shin-mallang Co-authored-by: TaeyeonRoyce Co-authored-by: odo27 --- .../java/com/celuveat/celeb/domain/Celeb.java | 38 +++++++++++ .../celeb/domain/CelebRepository.java | 6 ++ .../com/celuveat/common/config/JpaConfig.java | 9 +++ .../celuveat/common/domain/BaseEntity.java | 30 +++++++++ .../common/exception/BaseException.java | 9 +++ .../common/exception/BaseExceptionType.java | 10 +++ .../exception/ExceptionControllerAdvice.java | 29 +++++++++ .../common/exception/ExceptionResponse.java | 6 ++ .../restaurant/domain/Restaurant.java | 65 +++++++++++++++++++ .../restaurant/domain/RestaurantImage.java | 54 +++++++++++++++ .../domain/RestaurantImageRepository.java | 6 ++ .../domain/RestaurantRepository.java | 6 ++ .../restaurant/domain/SocialMedia.java | 8 +++ .../java/com/celuveat/video/domain/Video.java | 53 +++++++++++++++ .../video/domain/VideoRepository.java | 6 ++ 15 files changed, 335 insertions(+) create mode 100644 backend/src/main/java/com/celuveat/celeb/domain/Celeb.java create mode 100644 backend/src/main/java/com/celuveat/celeb/domain/CelebRepository.java create mode 100644 backend/src/main/java/com/celuveat/common/config/JpaConfig.java create mode 100644 backend/src/main/java/com/celuveat/common/domain/BaseEntity.java create mode 100644 backend/src/main/java/com/celuveat/common/exception/BaseException.java create mode 100644 backend/src/main/java/com/celuveat/common/exception/BaseExceptionType.java create mode 100644 backend/src/main/java/com/celuveat/common/exception/ExceptionControllerAdvice.java create mode 100644 backend/src/main/java/com/celuveat/common/exception/ExceptionResponse.java create mode 100644 backend/src/main/java/com/celuveat/restaurant/domain/Restaurant.java create mode 100644 backend/src/main/java/com/celuveat/restaurant/domain/RestaurantImage.java create mode 100644 backend/src/main/java/com/celuveat/restaurant/domain/RestaurantImageRepository.java create mode 100644 backend/src/main/java/com/celuveat/restaurant/domain/RestaurantRepository.java create mode 100644 backend/src/main/java/com/celuveat/restaurant/domain/SocialMedia.java create mode 100644 backend/src/main/java/com/celuveat/video/domain/Video.java create mode 100644 backend/src/main/java/com/celuveat/video/domain/VideoRepository.java diff --git a/backend/src/main/java/com/celuveat/celeb/domain/Celeb.java b/backend/src/main/java/com/celuveat/celeb/domain/Celeb.java new file mode 100644 index 000000000..8bd30022c --- /dev/null +++ b/backend/src/main/java/com/celuveat/celeb/domain/Celeb.java @@ -0,0 +1,38 @@ +package com.celuveat.celeb.domain; + +import static lombok.AccessLevel.PROTECTED; + +import com.celuveat.common.domain.BaseEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.NoArgsConstructor; + +@Entity +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = PROTECTED) +public class Celeb extends BaseEntity { + + @Column(nullable = false) + private String name; + + @Column(nullable = false, unique = true) + private String youtubeChannelName; + + @Column(nullable = false) + private String profileImageUrl; + + public String name() { + return name; + } + + public String youtubeChannelName() { + return youtubeChannelName; + } + + public String profileImageUrl() { + return profileImageUrl; + } +} diff --git a/backend/src/main/java/com/celuveat/celeb/domain/CelebRepository.java b/backend/src/main/java/com/celuveat/celeb/domain/CelebRepository.java new file mode 100644 index 000000000..1f33f37bf --- /dev/null +++ b/backend/src/main/java/com/celuveat/celeb/domain/CelebRepository.java @@ -0,0 +1,6 @@ +package com.celuveat.celeb.domain; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CelebRepository extends JpaRepository { +} diff --git a/backend/src/main/java/com/celuveat/common/config/JpaConfig.java b/backend/src/main/java/com/celuveat/common/config/JpaConfig.java new file mode 100644 index 000000000..b8b02fee2 --- /dev/null +++ b/backend/src/main/java/com/celuveat/common/config/JpaConfig.java @@ -0,0 +1,9 @@ +package com.celuveat.common.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; + +@Configuration +@EnableJpaAuditing +public class JpaConfig { +} diff --git a/backend/src/main/java/com/celuveat/common/domain/BaseEntity.java b/backend/src/main/java/com/celuveat/common/domain/BaseEntity.java new file mode 100644 index 000000000..8973e475c --- /dev/null +++ b/backend/src/main/java/com/celuveat/common/domain/BaseEntity.java @@ -0,0 +1,30 @@ +package com.celuveat.common.domain; + +import jakarta.persistence.EntityListeners; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.MappedSuperclass; +import java.time.LocalDateTime; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +@MappedSuperclass +@EntityListeners(AuditingEntityListener.class) +public class BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @CreatedDate + private LocalDateTime createdDate; + + public Long id() { + return id; + } + + public LocalDateTime createdDate() { + return createdDate; + } +} diff --git a/backend/src/main/java/com/celuveat/common/exception/BaseException.java b/backend/src/main/java/com/celuveat/common/exception/BaseException.java new file mode 100644 index 000000000..91a51f621 --- /dev/null +++ b/backend/src/main/java/com/celuveat/common/exception/BaseException.java @@ -0,0 +1,9 @@ +package com.celuveat.common.exception; + +public abstract class BaseException extends RuntimeException { + + public BaseException() { + } + + public abstract BaseExceptionType exceptionType(); +} diff --git a/backend/src/main/java/com/celuveat/common/exception/BaseExceptionType.java b/backend/src/main/java/com/celuveat/common/exception/BaseExceptionType.java new file mode 100644 index 000000000..5ad8800bf --- /dev/null +++ b/backend/src/main/java/com/celuveat/common/exception/BaseExceptionType.java @@ -0,0 +1,10 @@ +package com.celuveat.common.exception; + +import org.springframework.http.HttpStatus; + +public interface BaseExceptionType { + + HttpStatus httpStatus(); + + String errorMessage(); +} diff --git a/backend/src/main/java/com/celuveat/common/exception/ExceptionControllerAdvice.java b/backend/src/main/java/com/celuveat/common/exception/ExceptionControllerAdvice.java new file mode 100644 index 000000000..2820e7ca5 --- /dev/null +++ b/backend/src/main/java/com/celuveat/common/exception/ExceptionControllerAdvice.java @@ -0,0 +1,29 @@ +package com.celuveat.common.exception; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +public class ExceptionControllerAdvice { + + private final Logger log = LoggerFactory.getLogger(getClass()); + + @ExceptionHandler(BaseException.class) + ResponseEntity handleException(BaseException e) { + BaseExceptionType type = e.exceptionType(); + log.warn("[WARN] 잘못된 요청이 들어왔습니다. 내용 -> {}", type.errorMessage()); + return new ResponseEntity<>( + new ExceptionResponse(type.errorMessage()), + type.httpStatus()); + } + + @ExceptionHandler(Exception.class) + ResponseEntity handleException(Exception e) { + log.error("[ERROR] 예상하지 못한 예외가 발생했습니다.", e); + return ResponseEntity.internalServerError() + .body(new ExceptionResponse("알 수 없는 오류가 발생했습니다.")); + } +} diff --git a/backend/src/main/java/com/celuveat/common/exception/ExceptionResponse.java b/backend/src/main/java/com/celuveat/common/exception/ExceptionResponse.java new file mode 100644 index 000000000..02c60512a --- /dev/null +++ b/backend/src/main/java/com/celuveat/common/exception/ExceptionResponse.java @@ -0,0 +1,6 @@ +package com.celuveat.common.exception; + +public record ExceptionResponse( + String message +) { +} diff --git a/backend/src/main/java/com/celuveat/restaurant/domain/Restaurant.java b/backend/src/main/java/com/celuveat/restaurant/domain/Restaurant.java new file mode 100644 index 000000000..8265925f1 --- /dev/null +++ b/backend/src/main/java/com/celuveat/restaurant/domain/Restaurant.java @@ -0,0 +1,65 @@ +package com.celuveat.restaurant.domain; + +import static lombok.AccessLevel.PROTECTED; + +import com.celuveat.common.domain.BaseEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.NoArgsConstructor; + +@Entity +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = PROTECTED) +public class Restaurant extends BaseEntity { + + @Column(nullable = false) + private String name; + + @Column(nullable = false) + private String roadAddress; + + @Column(nullable = false) + private String category; + + @Column(nullable = false) + private String latitude; + + @Column(nullable = false) + private String longitude; + + private String phoneNumber; + + @Column(nullable = false) + private String naverMapUrl; + + public String name() { + return name; + } + + public String roadAddress() { + return roadAddress; + } + + public String category() { + return category; + } + + public String latitude() { + return latitude; + } + + public String longitude() { + return longitude; + } + + public String phoneNumber() { + return phoneNumber; + } + + public String naverMapUrl() { + return naverMapUrl; + } +} diff --git a/backend/src/main/java/com/celuveat/restaurant/domain/RestaurantImage.java b/backend/src/main/java/com/celuveat/restaurant/domain/RestaurantImage.java new file mode 100644 index 000000000..5902d6ec5 --- /dev/null +++ b/backend/src/main/java/com/celuveat/restaurant/domain/RestaurantImage.java @@ -0,0 +1,54 @@ +package com.celuveat.restaurant.domain; + +import static jakarta.persistence.EnumType.*; +import static jakarta.persistence.FetchType.*; +import static lombok.AccessLevel.PROTECTED; + +import com.celuveat.common.domain.BaseEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.NoArgsConstructor; + +@Entity +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = PROTECTED) +public class RestaurantImage extends BaseEntity { + + @Column(nullable = false) + private String name; + + @Column(nullable = false) + private String author; + + @Column(nullable = false) + @Enumerated(STRING) + private SocialMedia socialMedia; + + @ManyToOne(fetch = LAZY) + @JoinColumn(name = "restaurant_id") + private Restaurant restaurant; + + public String name() { + return name; + } + + public String author() { + return author; + } + + public SocialMedia socialMedia() { + return socialMedia; + } + + public Restaurant restaurant() { + return restaurant; + } +} diff --git a/backend/src/main/java/com/celuveat/restaurant/domain/RestaurantImageRepository.java b/backend/src/main/java/com/celuveat/restaurant/domain/RestaurantImageRepository.java new file mode 100644 index 000000000..a33b63b98 --- /dev/null +++ b/backend/src/main/java/com/celuveat/restaurant/domain/RestaurantImageRepository.java @@ -0,0 +1,6 @@ +package com.celuveat.restaurant.domain; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface RestaurantImageRepository extends JpaRepository { +} diff --git a/backend/src/main/java/com/celuveat/restaurant/domain/RestaurantRepository.java b/backend/src/main/java/com/celuveat/restaurant/domain/RestaurantRepository.java new file mode 100644 index 000000000..26dc824f3 --- /dev/null +++ b/backend/src/main/java/com/celuveat/restaurant/domain/RestaurantRepository.java @@ -0,0 +1,6 @@ +package com.celuveat.restaurant.domain; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface RestaurantRepository extends JpaRepository { +} diff --git a/backend/src/main/java/com/celuveat/restaurant/domain/SocialMedia.java b/backend/src/main/java/com/celuveat/restaurant/domain/SocialMedia.java new file mode 100644 index 000000000..8576bd5ae --- /dev/null +++ b/backend/src/main/java/com/celuveat/restaurant/domain/SocialMedia.java @@ -0,0 +1,8 @@ +package com.celuveat.restaurant.domain; + +public enum SocialMedia { + + YOUTUBE, + INSTAGRAM, + ; +} diff --git a/backend/src/main/java/com/celuveat/video/domain/Video.java b/backend/src/main/java/com/celuveat/video/domain/Video.java new file mode 100644 index 000000000..dac34ca5f --- /dev/null +++ b/backend/src/main/java/com/celuveat/video/domain/Video.java @@ -0,0 +1,53 @@ +package com.celuveat.video.domain; + +import static jakarta.persistence.FetchType.LAZY; +import static lombok.AccessLevel.PROTECTED; + +import com.celuveat.celeb.domain.Celeb; +import com.celuveat.common.domain.BaseEntity; +import com.celuveat.restaurant.domain.Restaurant; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import java.time.LocalDate; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.NoArgsConstructor; + +@Entity +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = PROTECTED) +public class Video extends BaseEntity { + + @Column(nullable = false) + private String youtubeUrl; + + @Column(nullable = false) + private LocalDate uploadDate; + + @ManyToOne(fetch = LAZY) + @JoinColumn(name = "celeb_id") + private Celeb celeb; + + @ManyToOne(fetch = LAZY) + @JoinColumn(name = "restaurant_id") + private Restaurant restaurant; + + public String youtubeUrl() { + return youtubeUrl; + } + + public LocalDate uploadDate() { + return uploadDate; + } + + public Celeb celeb() { + return celeb; + } + + public Restaurant restaurant() { + return restaurant; + } +} diff --git a/backend/src/main/java/com/celuveat/video/domain/VideoRepository.java b/backend/src/main/java/com/celuveat/video/domain/VideoRepository.java new file mode 100644 index 000000000..fb623d742 --- /dev/null +++ b/backend/src/main/java/com/celuveat/video/domain/VideoRepository.java @@ -0,0 +1,6 @@ +package com.celuveat.video.domain; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface VideoRepository extends JpaRepository { +}