Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat - 배너 정보 불러오기 #197

Merged
merged 7 commits into from
Nov 20, 2024
25 changes: 25 additions & 0 deletions src/main/java/sopt/org/hmh/domain/banner/Banner.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package sopt.org.hmh.domain.banner;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

import static jakarta.persistence.GenerationType.IDENTITY;

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Banner {

@Id
@GeneratedValue(strategy = IDENTITY)
private Long id;

private String title;
private String subTitle;
private String imageUrl;
private String linkUrl;
}
20 changes: 20 additions & 0 deletions src/main/java/sopt/org/hmh/domain/banner/BannerResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package sopt.org.hmh.domain.banner;

import lombok.Builder;

@Builder
public record BannerResponse(
String title,
String subTitle,
String imageUrl,
String linkUrl
) {
public static BannerResponse of(Banner banner) {
return BannerResponse.builder()
.title(banner.getTitle())
.subTitle(banner.getSubTitle())
.imageUrl(banner.getImageUrl())
.linkUrl(banner.getLinkUrl())
.build();
}
}
20 changes: 20 additions & 0 deletions src/main/java/sopt/org/hmh/domain/banner/BannerService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package sopt.org.hmh.domain.banner;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import sopt.org.hmh.domain.banner.exception.BannerError;
import sopt.org.hmh.domain.banner.exception.BannerException;
import sopt.org.hmh.domain.banner.repository.BannerRepository;

@Service
@RequiredArgsConstructor
public class BannerService {

private final BannerRepository bannerRepository;

public BannerResponse getBanner() {
return bannerRepository.findTopByOrderByIdAsc()
.map(BannerResponse::of)
.orElseThrow(() -> new BannerException(BannerError.BANNER_NOT_FOUND));
}
}
29 changes: 29 additions & 0 deletions src/main/java/sopt/org/hmh/domain/banner/controller/BannerApi.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package sopt.org.hmh.domain.banner.controller;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.http.ResponseEntity;
import sopt.org.hmh.domain.banner.BannerResponse;
import sopt.org.hmh.global.common.response.BaseResponse;

@Tag(name = "배너 관련 API")
public interface BannerApi {

@Operation(
summary = "배너 정보를 불러오는 API",
responses = {
@ApiResponse(
responseCode = "200",
description = "배너 정보 불러오기에 성공하였습니다."),
@ApiResponse(
responseCode = "404",
description = "배너를 찾을 수 없습니다.",
content = @Content),
@ApiResponse(
responseCode = "500",
description = "서버 내부 오류입니다.",
content = @Content)})
ResponseEntity<BaseResponse<BannerResponse>> orderGetBanner();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package sopt.org.hmh.domain.banner.controller;

import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import sopt.org.hmh.domain.banner.BannerResponse;
import sopt.org.hmh.domain.banner.BannerService;
import sopt.org.hmh.domain.banner.exception.BannerSuccess;
import sopt.org.hmh.global.common.response.BaseResponse;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v2/banner")
public class BannerController implements BannerApi {

private final BannerService bannerService;

@Override
@GetMapping
public ResponseEntity<BaseResponse<BannerResponse>> orderGetBanner() {
return ResponseEntity
.status(BannerSuccess.GET_BANNER_SUCCESS.getHttpStatus())
.body(BaseResponse.success(BannerSuccess.GET_BANNER_SUCCESS, bannerService.getBanner()));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package sopt.org.hmh.domain.banner.exception;

import lombok.AllArgsConstructor;
import org.springframework.http.HttpStatus;
import sopt.org.hmh.global.common.exception.base.ErrorBase;

@AllArgsConstructor
public enum BannerError implements ErrorBase {

BANNER_NOT_FOUND(HttpStatus.NOT_FOUND, "배너를 찾을 수 없습니다."),
;

private final HttpStatus status;
private final String errorMessage;

@Override
public int getHttpStatusCode() {
return status.value();
}

@Override
public HttpStatus getHttpStatus() {
return this.status;
}

@Override
public String getErrorMessage() {
return this.errorMessage;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package sopt.org.hmh.domain.banner.exception;

import sopt.org.hmh.global.common.exception.base.ExceptionBase;

public class BannerException extends ExceptionBase {
public BannerException(BannerError error) { super(error); }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package sopt.org.hmh.domain.banner.exception;

import lombok.AllArgsConstructor;
import org.springframework.http.HttpStatus;
import sopt.org.hmh.global.common.exception.base.SuccessBase;

@AllArgsConstructor
public enum BannerSuccess implements SuccessBase {

GET_BANNER_SUCCESS(HttpStatus.OK, "배너 정보 불러오기에 성공하였습니다."),
;

private final HttpStatus status;
private final String successMessage;

@Override
public int getHttpStatusCode() {
return this.status.value();
}

@Override
public HttpStatus getHttpStatus() {
return this.status;
}

@Override
public String getSuccessMessage() {
return this.successMessage;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package sopt.org.hmh.domain.banner.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import sopt.org.hmh.domain.banner.Banner;

import java.util.Optional;

public interface BannerJpaRepository extends JpaRepository<Banner, Long> {
Optional<Banner> findTopByOrderByIdAsc(); // 디비에 배너 하나만 존재
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package sopt.org.hmh.domain.banner.repository;

import sopt.org.hmh.domain.banner.Banner;

import java.util.Optional;

public interface BannerRepository {
Optional<Banner> findTopByOrderByIdAsc();
}
Copy link
Member

@kseysh kseysh Nov 19, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P4. Banner 엔티티는 Jpa외에 복잡한 쿼리를 사용할 일이 없을 것 같아 JpaRepository 하나만 있는게 코드 복잡도 측면에서 더 좋을 것 같은데 어떠신가요?

저는 보통 복잡한 쿼리가 필요하여 Querydsl 사용시에 이렇게 나누는 편이라 복잡한 쿼리가 필요없다면 하나만 유지해도 좋을 것 같아요!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

좋은 생각입니당! 빠른 코리 감사드려요

Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package sopt.org.hmh.domain.banner.repository;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import sopt.org.hmh.domain.banner.Banner;

import java.util.Optional;

@Repository
@RequiredArgsConstructor
public class BannerRepositoryImpl implements BannerRepository {

private final BannerJpaRepository bannerJpaRepository;

@Override
public Optional<Banner> findTopByOrderByIdAsc() {
return bannerJpaRepository.findTopByOrderByIdAsc();
}
}
Loading