diff --git a/src/main/java/org/guzzing/studayserver/domain/academy/repository/academy/AcademyJpaRepository.java b/src/main/java/org/guzzing/studayserver/domain/academy/repository/academy/AcademyJpaRepository.java index 538067c08..fee116655 100644 --- a/src/main/java/org/guzzing/studayserver/domain/academy/repository/academy/AcademyJpaRepository.java +++ b/src/main/java/org/guzzing/studayserver/domain/academy/repository/academy/AcademyJpaRepository.java @@ -1,22 +1,15 @@ package org.guzzing.studayserver.domain.academy.repository.academy; -import jakarta.persistence.EntityNotFoundException; import org.guzzing.studayserver.domain.academy.model.Academy; import org.guzzing.studayserver.domain.academy.repository.dto.AcademiesByName; import org.guzzing.studayserver.domain.academy.repository.dto.AcademyFee; -import org.guzzing.studayserver.global.error.response.ErrorCode; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -public interface AcademyJpaRepository extends JpaRepository, AcademyQueryRepository, AcademyRepository { - - default Academy getById(Long academyId) { - return findById(academyId) - .orElseThrow(() -> new EntityNotFoundException(ErrorCode.NOT_FOUND_ENTITY.getMessage())); - } +public interface AcademyJpaRepository extends JpaRepository { @Query(value = "SELECT a.id AS academyId, a.academy_name AS academyName, a.full_address AS fullAddress, a.latitude, a.longitude " diff --git a/src/main/java/org/guzzing/studayserver/domain/academy/repository/academy/AcademyQueryRepository.java b/src/main/java/org/guzzing/studayserver/domain/academy/repository/academy/AcademyQueryRepository.java index 473452c6f..2814abfde 100644 --- a/src/main/java/org/guzzing/studayserver/domain/academy/repository/academy/AcademyQueryRepository.java +++ b/src/main/java/org/guzzing/studayserver/domain/academy/repository/academy/AcademyQueryRepository.java @@ -1,20 +1,205 @@ package org.guzzing.studayserver.domain.academy.repository.academy; +import jakarta.persistence.EntityManager; +import jakarta.persistence.Query; +import java.util.List; import org.guzzing.studayserver.domain.academy.repository.dto.AcademiesByFilterWithScroll; import org.guzzing.studayserver.domain.academy.repository.dto.AcademiesByLocationWithScroll; +import org.guzzing.studayserver.domain.academy.repository.dto.AcademyByFilterWithScroll; +import org.guzzing.studayserver.domain.academy.repository.dto.AcademyByLocationWithScroll; import org.guzzing.studayserver.domain.academy.repository.dto.AcademyFilterCondition; +import org.hibernate.query.NativeQuery; +import org.hibernate.transform.ResultTransformer; +import org.hibernate.type.StandardBasicTypes; +import org.springframework.stereotype.Repository; -public interface AcademyQueryRepository { +@Repository +public class AcademyQueryRepository { - AcademiesByLocationWithScroll findAcademiesByLocation( + private static final String BLANK_QUERY = ""; + private final EntityManager em; + + public AcademyQueryRepository(EntityManager em) { + this.em = em; + } + + public AcademiesByLocationWithScroll findAcademiesByLocation( String pointFormat, Long memberId, int pageNumber, - int pageSize); + int pageSize) { + + String nativeQuery = """ + SELECT + a.id AS academyId, + a.academy_name AS academyName, + a.phone_number AS phoneNumber, + a.full_address AS fullAddress, + a.latitude AS latitude, + a.longitude AS longitude, + a.shuttle AS shuttleAvailable, + (CASE WHEN l.academy_id IS NOT NULL THEN true ELSE false END) AS isLiked, + ac.category_id AS categoryId + FROM + academies AS a + INNER JOIN + academy_categories AS ac ON a.id = ac.academy_id + LEFT JOIN + likes AS l ON a.id = l.academy_id AND l.member_id = %s """; + + String formattedQuery = String.format(nativeQuery, memberId); + + formattedQuery += builderWhere(); + + formattedQuery += whereWithinDistance(pointFormat); + formattedQuery = makeScroll(pageNumber, pageSize, formattedQuery); - AcademiesByFilterWithScroll filterAcademies( + Query emNativeQuery = em.createNativeQuery( + formattedQuery); + + List academiesByLocation = + emNativeQuery.unwrap(org.hibernate.query.NativeQuery.class) + .addScalar("academyId", StandardBasicTypes.LONG) + .addScalar("academyName", StandardBasicTypes.STRING) + .addScalar("fullAddress", StandardBasicTypes.STRING) + .addScalar("phoneNumber", StandardBasicTypes.STRING) + .addScalar("latitude", StandardBasicTypes.DOUBLE) + .addScalar("longitude", StandardBasicTypes.DOUBLE) + .addScalar("shuttleAvailable", StandardBasicTypes.STRING) + .addScalar("isLiked", StandardBasicTypes.BOOLEAN) + .addScalar("categoryId", StandardBasicTypes.LONG) + .setResultTransformer((tuple, aliases) -> new AcademyByLocationWithScroll( + (Long) tuple[0], + (String) tuple[1], + (String) tuple[2], + (String) tuple[3], + (Double) tuple[4], + (Double) tuple[5], + (String) tuple[6], + (boolean) tuple[7], + (Long) tuple[8] + )) + .getResultList(); + + return AcademiesByLocationWithScroll.of( + academiesByLocation, + isHasNest(academiesByLocation.size(), pageSize) + ); + } + + public AcademiesByFilterWithScroll filterAcademies( AcademyFilterCondition academyFilterCondition, Long memberId, int pageNumber, - int pageSize); + int pageSize) { + String nativeQuery = """ + SELECT DISTINCT + a.id AS academyId, + a.academy_name AS academyName, + a.full_address AS fullAddress, + a.phone_number AS phoneNumber, + a.latitude, a.longitude, + a.shuttle AS shuttleAvailable, + (CASE WHEN l.academy_id IS NOT NULL THEN true ELSE false END) AS isLiked + FROM + academy_categories as ac + LEFT JOIN + academies AS a ON ac.academy_id = a.id + LEFT JOIN + likes AS l ON a.id = l.academy_id AND l.member_id = %s + WHERE + MBRContains(ST_LINESTRINGFROMTEXT(%s), a.point) + """; + + String formattedQuery = String.format( + nativeQuery, + memberId, + academyFilterCondition.pointFormat()); + formattedQuery = whereFilters(formattedQuery, academyFilterCondition); + formattedQuery += orderByDesc("a.id"); + formattedQuery = makeScroll(pageNumber, pageSize, formattedQuery); + + Query query = em.createNativeQuery(formattedQuery); + + List academyByFilter = query.unwrap(NativeQuery.class) + .addScalar("academyId", StandardBasicTypes.LONG) + .addScalar("academyName", StandardBasicTypes.STRING) + .addScalar("fullAddress", StandardBasicTypes.STRING) + .addScalar("phoneNumber", StandardBasicTypes.STRING) + .addScalar("latitude", StandardBasicTypes.DOUBLE) + .addScalar("longitude", StandardBasicTypes.DOUBLE) + .addScalar("shuttleAvailable", StandardBasicTypes.STRING) + .addScalar("isLiked", StandardBasicTypes.BOOLEAN) + .setResultTransformer( + new ResultTransformer() { + @Override + public Object transformTuple(Object[] tuple, String[] aliases) { + return new AcademyByFilterWithScroll( + (Long) tuple[0], + (String) tuple[1], + (String) tuple[2], + (String) tuple[3], + (Double) tuple[4], + (Double) tuple[5], + (String) tuple[6], + (boolean) tuple[7] + ); + } + + @Override + public List transformList(List collection) { + return collection; + } + } + ) + .getResultList(); + + return AcademiesByFilterWithScroll.of( + academyByFilter, + isHasNest(academyByFilter.size(), pageSize) + ); + } + + private String builderWhere() { + return " where "; + + } + + private boolean isHasNest(int resultSize, int pageSize) { + return resultSize == pageSize; + } + + private String whereFilters(String formattedQuery, AcademyFilterCondition academyFilterCondition) { + formattedQuery += whereInCategories(academyFilterCondition); + formattedQuery += whereBetweenEducationFee(academyFilterCondition); + return formattedQuery; + } + + private String whereWithinDistance(String pointFormat) { + return String.format(" MBRContains(ST_LINESTRINGFROMTEXT(%s), a.point) ", pointFormat); + } + + private String whereInCategories(AcademyFilterCondition academyFilterCondition) { + if (academyFilterCondition.categories() != null && !academyFilterCondition.categories().isEmpty()) { + return " AND ac.category_id IN " + academyFilterCondition.categories(); + } + return BLANK_QUERY; + } + + private String whereBetweenEducationFee(AcademyFilterCondition academyFilterCondition) { + if (academyFilterCondition.desiredMinAmount() != null && academyFilterCondition.desiredMaxAmount() != null) { + return " AND max_education_fee BETWEEN " + academyFilterCondition.desiredMinAmount() + " AND " + + academyFilterCondition.desiredMaxAmount(); + } + return BLANK_QUERY; + } + + private String makeScroll(int pageNumber, int pageSize, String formattedQuery) { + formattedQuery += " LIMIT " + pageSize + " OFFSET " + pageNumber * pageSize; + return formattedQuery; + } + + private String orderByDesc(String columnName) { + return String.format(" ORDER BY %s %s ", columnName, " DESC "); + } } diff --git a/src/main/java/org/guzzing/studayserver/domain/academy/repository/academy/AcademyQueryRepositoryImpl.java b/src/main/java/org/guzzing/studayserver/domain/academy/repository/academy/AcademyQueryRepositoryImpl.java deleted file mode 100644 index 7f1992180..000000000 --- a/src/main/java/org/guzzing/studayserver/domain/academy/repository/academy/AcademyQueryRepositoryImpl.java +++ /dev/null @@ -1,211 +0,0 @@ -package org.guzzing.studayserver.domain.academy.repository.academy; - -import jakarta.persistence.EntityManager; -import jakarta.persistence.Query; -import java.util.List; -import org.guzzing.studayserver.domain.academy.repository.dto.AcademiesByFilterWithScroll; -import org.guzzing.studayserver.domain.academy.repository.dto.AcademiesByLocationWithScroll; -import org.guzzing.studayserver.domain.academy.repository.dto.AcademyByFilterWithScroll; -import org.guzzing.studayserver.domain.academy.repository.dto.AcademyByLocationWithScroll; -import org.guzzing.studayserver.domain.academy.repository.dto.AcademyFilterCondition; -import org.hibernate.query.NativeQuery; -import org.hibernate.transform.ResultTransformer; -import org.hibernate.type.StandardBasicTypes; - -public class AcademyQueryRepositoryImpl implements AcademyQueryRepository { - - private static final String BLANK_QUERY = ""; - private final EntityManager em; - - public AcademyQueryRepositoryImpl(EntityManager em) { - this.em = em; - } - - public AcademiesByLocationWithScroll findAcademiesByLocation( - String pointFormat, - Long memberId, - int pageNumber, - int pageSize) { - - String nativeQuery = """ - SELECT - a.id AS academyId, - a.academy_name AS academyName, - a.phone_number AS phoneNumber, - a.full_address AS fullAddress, - a.latitude AS latitude, - a.longitude AS longitude, - a.shuttle AS shuttleAvailable, - (CASE WHEN l.academy_id IS NOT NULL THEN true ELSE false END) AS isLiked, - ac.category_id AS categoryId - FROM - academies AS a - INNER JOIN - academy_categories AS ac ON a.id = ac.academy_id - LEFT JOIN - likes AS l ON a.id = l.academy_id AND l.member_id = %s """; - - String formattedQuery = String.format(nativeQuery, memberId); - - formattedQuery += builderWhere(); - - formattedQuery += whereWithinDistance(pointFormat); - formattedQuery = makeScroll(pageNumber, pageSize, formattedQuery); - - Query emNativeQuery = em.createNativeQuery( - formattedQuery); - - List academiesByLocation = - emNativeQuery.unwrap(org.hibernate.query.NativeQuery.class) - .addScalar("academyId", StandardBasicTypes.LONG) - .addScalar("academyName", StandardBasicTypes.STRING) - .addScalar("fullAddress", StandardBasicTypes.STRING) - .addScalar("phoneNumber", StandardBasicTypes.STRING) - .addScalar("latitude", StandardBasicTypes.DOUBLE) - .addScalar("longitude", StandardBasicTypes.DOUBLE) - .addScalar("shuttleAvailable", StandardBasicTypes.STRING) - .addScalar("isLiked", StandardBasicTypes.BOOLEAN) - .addScalar("categoryId", StandardBasicTypes.LONG) - .setResultTransformer((tuple, aliases) -> new AcademyByLocationWithScroll( - (Long) tuple[0], - (String) tuple[1], - (String) tuple[2], - (String) tuple[3], - (Double) tuple[4], - (Double) tuple[5], - (String) tuple[6], - (boolean) tuple[7], - (Long) tuple[8] - )) - .getResultList(); - - return AcademiesByLocationWithScroll.of( - academiesByLocation, - isHasNest(academiesByLocation.size(), pageSize) - ); - } - - public AcademiesByFilterWithScroll filterAcademies( - AcademyFilterCondition academyFilterCondition, - Long memberId, - int pageNumber, - int pageSize) { - String nativeQuery = """ - SELECT DISTINCT - a.id AS academyId, - a.academy_name AS academyName, - a.full_address AS fullAddress, - a.phone_number AS phoneNumber, - a.latitude, a.longitude, - a.shuttle AS shuttleAvailable, - (CASE WHEN l.academy_id IS NOT NULL THEN true ELSE false END) AS isLiked - FROM - academy_categories as ac - LEFT JOIN - academies AS a ON ac.academy_id = a.id - LEFT JOIN - likes AS l ON a.id = l.academy_id AND l.member_id = %s - WHERE - MBRContains(ST_LINESTRINGFROMTEXT(%s), a.point) - """; - - String formattedQuery = String.format( - nativeQuery, - memberId, - academyFilterCondition.pointFormat()); - formattedQuery = whereFilters(formattedQuery, academyFilterCondition); - formattedQuery += orderByDesc("a.id"); - formattedQuery = makeScroll(pageNumber, pageSize, formattedQuery); - - Query query = em.createNativeQuery(formattedQuery); - - List academyByFilter = query.unwrap(NativeQuery.class) - .addScalar("academyId", StandardBasicTypes.LONG) - .addScalar("academyName", StandardBasicTypes.STRING) - .addScalar("fullAddress", StandardBasicTypes.STRING) - .addScalar("phoneNumber", StandardBasicTypes.STRING) - .addScalar("latitude", StandardBasicTypes.DOUBLE) - .addScalar("longitude", StandardBasicTypes.DOUBLE) - .addScalar("shuttleAvailable", StandardBasicTypes.STRING) - .addScalar("isLiked", StandardBasicTypes.BOOLEAN) - .setResultTransformer( - new ResultTransformer() { - @Override - public Object transformTuple(Object[] tuple, String[] aliases) { - return new AcademyByFilterWithScroll( - (Long) tuple[0], - (String) tuple[1], - (String) tuple[2], - (String) tuple[3], - (Double) tuple[4], - (Double) tuple[5], - (String) tuple[6], - (boolean) tuple[7] - ); - } - - @Override - public List transformList(List collection) { - return collection; - } - } - ) - .getResultList(); - - return AcademiesByFilterWithScroll.of( - academyByFilter, - isHasNest(academyByFilter.size(), pageSize) - ); - } - - private String builderWhere() { - return " where "; - - } - - private boolean isHasNest(int resultSize, int pageSize) { - return resultSize == pageSize; - } - - private String whereFilters(String formattedQuery, AcademyFilterCondition academyFilterCondition) { - formattedQuery += whereInCategories(academyFilterCondition); - formattedQuery += whereBetweenEducationFee(academyFilterCondition); - return formattedQuery; - } - - private String whereWithinDistance(String pointFormat) { - return String.format(" MBRContains(ST_LINESTRINGFROMTEXT(%s), a.point) ", pointFormat); - } - - private String whereInCategories(AcademyFilterCondition academyFilterCondition) { - if (academyFilterCondition.categories() != null && !academyFilterCondition.categories().isEmpty()) { - return " AND ac.category_id IN " + academyFilterCondition.categories(); - } - return BLANK_QUERY; - } - - private String whereBetweenEducationFee(AcademyFilterCondition academyFilterCondition) { - if (academyFilterCondition.desiredMinAmount() != null && academyFilterCondition.desiredMaxAmount() != null) { - return " AND max_education_fee BETWEEN " + academyFilterCondition.desiredMinAmount() + " AND " - + academyFilterCondition.desiredMaxAmount(); - } - return BLANK_QUERY; - } - - private String makeScroll(int pageNumber, int pageSize, String formattedQuery) { - formattedQuery += " LIMIT " + pageSize + " OFFSET " + pageNumber * pageSize; - return formattedQuery; - } - - private String orderByDesc(String columnName) { - return String.format(" ORDER BY %s %s ", columnName, " DESC "); - } - - private Long getBeforeLastId(List academiesByLocation) { - if (academiesByLocation != null && !academiesByLocation.isEmpty()) { - return academiesByLocation.get(academiesByLocation.size() - 1).academyId(); - } - return null; - } - -} diff --git a/src/main/java/org/guzzing/studayserver/domain/academy/repository/academy/AcademyRepositoryImpl.java b/src/main/java/org/guzzing/studayserver/domain/academy/repository/academy/AcademyRepositoryImpl.java new file mode 100644 index 000000000..40012d3c2 --- /dev/null +++ b/src/main/java/org/guzzing/studayserver/domain/academy/repository/academy/AcademyRepositoryImpl.java @@ -0,0 +1,75 @@ +package org.guzzing.studayserver.domain.academy.repository.academy; + +import jakarta.persistence.EntityNotFoundException; +import java.util.Optional; +import org.guzzing.studayserver.domain.academy.model.Academy; +import org.guzzing.studayserver.domain.academy.repository.dto.AcademiesByFilterWithScroll; +import org.guzzing.studayserver.domain.academy.repository.dto.AcademiesByLocationWithScroll; +import org.guzzing.studayserver.domain.academy.repository.dto.AcademiesByName; +import org.guzzing.studayserver.domain.academy.repository.dto.AcademyFee; +import org.guzzing.studayserver.domain.academy.repository.dto.AcademyFilterCondition; +import org.guzzing.studayserver.global.error.response.ErrorCode; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; +import org.springframework.stereotype.Repository; + +@Repository +public class AcademyRepositoryImpl implements AcademyRepository { + + private final AcademyJpaRepository academyJpaRepository; + private final AcademyQueryRepository academyQueryRepository; + + public AcademyRepositoryImpl(AcademyJpaRepository academyJpaRepository, + AcademyQueryRepository academyQueryRepository) { + this.academyJpaRepository = academyJpaRepository; + this.academyQueryRepository = academyQueryRepository; + } + + @Override + public Academy getById(Long academyId) { + return academyJpaRepository.findById(academyId) + .orElseThrow(() -> new EntityNotFoundException(ErrorCode.NOT_FOUND_ENTITY.getMessage())); + } + + @Override + public Academy save(Academy academy) { + return academyJpaRepository.save(academy); + } + + @Override + public Slice findAcademiesByName(String academyName, Pageable pageable) { + return academyJpaRepository.findAcademiesByName(academyName, pageable); + } + + @Override + public AcademyFee findAcademyFeeInfo(Long academyId) { + return academyJpaRepository.findAcademyFeeInfo(academyId); + } + + @Override + public boolean existsById(Long academyId) { + return academyJpaRepository.existsById(academyId); + } + + @Override + public void deleteAll() { + academyJpaRepository.deleteAll(); + } + + @Override + public Optional findAcademyById(Long academyId) { + return academyJpaRepository.findById(academyId); + } + + @Override + public AcademiesByLocationWithScroll findAcademiesByLocation(String pointFormat, Long memberId, int pageNumber, + int pageSize) { + return academyQueryRepository.findAcademiesByLocation(pointFormat, memberId, pageNumber, pageSize); + } + + @Override + public AcademiesByFilterWithScroll filterAcademies(AcademyFilterCondition academyFilterCondition, Long memberId, + int pageNumber, int pageSize) { + return academyQueryRepository.filterAcademies(academyFilterCondition, memberId, pageNumber, pageSize); + } +} diff --git a/src/main/java/org/guzzing/studayserver/domain/academy/repository/academycategory/AcademyCategoryJpaRepository.java b/src/main/java/org/guzzing/studayserver/domain/academy/repository/academycategory/AcademyCategoryJpaRepository.java index 3402c9783..d7d8c753d 100644 --- a/src/main/java/org/guzzing/studayserver/domain/academy/repository/academycategory/AcademyCategoryJpaRepository.java +++ b/src/main/java/org/guzzing/studayserver/domain/academy/repository/academycategory/AcademyCategoryJpaRepository.java @@ -6,7 +6,7 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -public interface AcademyCategoryJpaRepository extends JpaRepository, AcademyCategoryRepository { +public interface AcademyCategoryJpaRepository extends JpaRepository { AcademyCategory save(AcademyCategory academyCategory); diff --git a/src/main/java/org/guzzing/studayserver/domain/academy/repository/academycategory/AcademyCategoryRepositoryImpl.java b/src/main/java/org/guzzing/studayserver/domain/academy/repository/academycategory/AcademyCategoryRepositoryImpl.java new file mode 100644 index 000000000..6fb02fe26 --- /dev/null +++ b/src/main/java/org/guzzing/studayserver/domain/academy/repository/academycategory/AcademyCategoryRepositoryImpl.java @@ -0,0 +1,30 @@ +package org.guzzing.studayserver.domain.academy.repository.academycategory; + +import java.util.List; +import org.guzzing.studayserver.domain.academy.model.AcademyCategory; +import org.springframework.stereotype.Repository; + +@Repository +public class AcademyCategoryRepositoryImpl implements AcademyCategoryRepository { + + private final AcademyCategoryJpaRepository academyCategoryJpaRepository; + + public AcademyCategoryRepositoryImpl(AcademyCategoryJpaRepository academyCategoryJpaRepository) { + this.academyCategoryJpaRepository = academyCategoryJpaRepository; + } + + @Override + public AcademyCategory save(AcademyCategory academyCategory) { + return academyCategoryJpaRepository.save(academyCategory); + } + + @Override + public List findCategoryIdsByAcademyId(Long academyId) { + return academyCategoryJpaRepository.findCategoryIdsByAcademyId(academyId); + } + + @Override + public void deleteAll() { + academyCategoryJpaRepository.deleteAll(); + } +} diff --git a/src/main/java/org/guzzing/studayserver/domain/academy/repository/lesson/LessonJpaRepository.java b/src/main/java/org/guzzing/studayserver/domain/academy/repository/lesson/LessonJpaRepository.java index e7da7fda5..7abdcc9a8 100644 --- a/src/main/java/org/guzzing/studayserver/domain/academy/repository/lesson/LessonJpaRepository.java +++ b/src/main/java/org/guzzing/studayserver/domain/academy/repository/lesson/LessonJpaRepository.java @@ -8,7 +8,7 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -public interface LessonJpaRepository extends JpaRepository, LessonRepository { +public interface LessonJpaRepository extends JpaRepository { @Query("select l from Lesson as l join fetch l.academy as ac where l.academy.id =:academyId") List findAllByAcademyId(@Param("academyId") Long academyId); diff --git a/src/main/java/org/guzzing/studayserver/domain/academy/repository/lesson/LessonRepository.java b/src/main/java/org/guzzing/studayserver/domain/academy/repository/lesson/LessonRepository.java index bb3515eb4..0a1beb1d9 100644 --- a/src/main/java/org/guzzing/studayserver/domain/academy/repository/lesson/LessonRepository.java +++ b/src/main/java/org/guzzing/studayserver/domain/academy/repository/lesson/LessonRepository.java @@ -24,10 +24,7 @@ public interface LessonRepository { Optional findLessonById(Long lessonId); - default Lesson getLessonById(Long lessonId) { - return findLessonById(lessonId).orElseThrow(() -> - new EntityNotFoundException(ErrorCode.NOT_FOUND_ENTITY.getMessage())); - } + Lesson getLessonById(Long lessonId); List findByIds(List lessonIds); diff --git a/src/main/java/org/guzzing/studayserver/domain/academy/repository/lesson/LessonRepositoryImpl.java b/src/main/java/org/guzzing/studayserver/domain/academy/repository/lesson/LessonRepositoryImpl.java new file mode 100644 index 000000000..2e9825fbf --- /dev/null +++ b/src/main/java/org/guzzing/studayserver/domain/academy/repository/lesson/LessonRepositoryImpl.java @@ -0,0 +1,66 @@ +package org.guzzing.studayserver.domain.academy.repository.lesson; + +import jakarta.persistence.EntityNotFoundException; +import java.util.List; +import java.util.Optional; +import org.guzzing.studayserver.domain.academy.model.Lesson; +import org.guzzing.studayserver.domain.academy.repository.dto.LessonInfoToCreateDashboard; +import org.guzzing.studayserver.global.error.response.ErrorCode; +import org.springframework.stereotype.Repository; + +@Repository +public class LessonRepositoryImpl implements LessonRepository { + + private final LessonJpaRepository lessonJpaRepository; + + public LessonRepositoryImpl(LessonJpaRepository lessonJpaRepository) { + this.lessonJpaRepository = lessonJpaRepository; + } + + @Override + public List findAllByAcademyId(Long academyId) { + return lessonJpaRepository.findAllByAcademyId(academyId); + } + + @Override + public List findAllLessonInfoByAcademyId(Long academyId) { + return lessonJpaRepository.findAllLessonInfoByAcademyId(academyId); + } + + @Override + public Lesson save(Lesson lesson) { + return lessonJpaRepository.save(lesson); + } + + @Override + public void deleteAll() { + lessonJpaRepository.deleteAll(); + } + + @Override + public boolean existsById(Long lessonId) { + return lessonJpaRepository.existsById(lessonId); + } + + @Override + public Optional findById(Long lessonId) { + return lessonJpaRepository.findById(lessonId); + } + + @Override + public Optional findLessonById(Long lessonId) { + return lessonJpaRepository.findLessonById(lessonId); + } + + @Override + public Lesson getLessonById(Long lessonId) { + return lessonJpaRepository.findLessonById(lessonId) + .orElseThrow(() -> + new EntityNotFoundException(ErrorCode.NOT_FOUND_ENTITY.getMessage())); + } + + @Override + public List findByIds(List lessonIds) { + return lessonJpaRepository.findByIds(lessonIds); + } +} diff --git a/src/main/java/org/guzzing/studayserver/domain/academy/repository/review/ReviewCountJpaRepository.java b/src/main/java/org/guzzing/studayserver/domain/academy/repository/review/ReviewCountJpaRepository.java index 883c29402..552154802 100644 --- a/src/main/java/org/guzzing/studayserver/domain/academy/repository/review/ReviewCountJpaRepository.java +++ b/src/main/java/org/guzzing/studayserver/domain/academy/repository/review/ReviewCountJpaRepository.java @@ -5,9 +5,8 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; -public interface ReviewCountJpaRepository extends JpaRepository, ReviewCountRepository { +public interface ReviewCountJpaRepository extends JpaRepository { @Query("select rc from ReviewCount rc where rc.academy.id =:academyId") Optional findByAcademyId(Long academyId); - } diff --git a/src/main/java/org/guzzing/studayserver/domain/academy/repository/review/ReviewCountRepository.java b/src/main/java/org/guzzing/studayserver/domain/academy/repository/review/ReviewCountRepository.java index d28eccc03..1540d55ab 100644 --- a/src/main/java/org/guzzing/studayserver/domain/academy/repository/review/ReviewCountRepository.java +++ b/src/main/java/org/guzzing/studayserver/domain/academy/repository/review/ReviewCountRepository.java @@ -8,10 +8,7 @@ public interface ReviewCountRepository { Optional findByAcademyId(Long academyId); - default ReviewCount getByAcademyId(Long academyId) { - return this.findByAcademyId(academyId) - .orElseThrow(() -> new EntityNotFoundException("해당 학원에 대한 리뷰 카운트가 존재하지 않습니다.")); - } + ReviewCount getByAcademyId(Long academyId); ReviewCount save(ReviewCount reviewCount); diff --git a/src/main/java/org/guzzing/studayserver/domain/academy/repository/review/ReviewCountRepositoryImpl.java b/src/main/java/org/guzzing/studayserver/domain/academy/repository/review/ReviewCountRepositoryImpl.java new file mode 100644 index 000000000..8ced60142 --- /dev/null +++ b/src/main/java/org/guzzing/studayserver/domain/academy/repository/review/ReviewCountRepositoryImpl.java @@ -0,0 +1,37 @@ +package org.guzzing.studayserver.domain.academy.repository.review; + +import jakarta.persistence.EntityNotFoundException; +import java.util.Optional; +import org.guzzing.studayserver.domain.academy.model.ReviewCount; +import org.springframework.stereotype.Repository; + +@Repository +public class ReviewCountRepositoryImpl implements ReviewCountRepository { + + private final ReviewCountJpaRepository reviewCountJpaRepository; + + public ReviewCountRepositoryImpl(ReviewCountJpaRepository reviewCountJpaRepository) { + this.reviewCountJpaRepository = reviewCountJpaRepository; + } + + @Override + public Optional findByAcademyId(Long academyId) { + return reviewCountJpaRepository.findByAcademyId(academyId); + } + + @Override + public ReviewCount getByAcademyId(Long academyId) { + return reviewCountJpaRepository.findByAcademyId(academyId) + .orElseThrow(() -> new EntityNotFoundException("해당 학원에 대한 리뷰 카운트가 존재하지 않습니다.")); + } + + @Override + public ReviewCount save(ReviewCount reviewCount) { + return reviewCountJpaRepository.save(reviewCount); + } + + @Override + public void deleteAll() { + reviewCountJpaRepository.deleteAll(); + } +} diff --git a/src/main/java/org/guzzing/studayserver/domain/auth/service/ClientService.java b/src/main/java/org/guzzing/studayserver/domain/auth/service/ClientService.java index dc3386b83..c2438fecb 100644 --- a/src/main/java/org/guzzing/studayserver/domain/auth/service/ClientService.java +++ b/src/main/java/org/guzzing/studayserver/domain/auth/service/ClientService.java @@ -14,7 +14,7 @@ public class ClientService { private final ClientStrategy clientStrategy; - private final MemberRepository memberJpaRepository; + private final MemberRepository memberRepository; private final AuthService authService; public ClientService( @@ -23,7 +23,7 @@ public ClientService( AuthService authService ) { this.clientStrategy = clientStrategy; - this.memberJpaRepository = memberJpaRepository; + this.memberRepository = memberJpaRepository; this.authService = authService; } @@ -34,8 +34,8 @@ public AuthLoginResult login(String client, String accessToken) { Member clientMember = clientProxy.getUserData(accessToken); String socialId = clientMember.getSocialId(); - Optional memberOptional = memberJpaRepository.findMemberIfExisted(socialId); - Member savedMember = memberOptional.orElseGet(() -> memberJpaRepository.save(clientMember)); + Optional memberOptional = memberRepository.findMemberIfExisted(socialId); + Member savedMember = memberOptional.orElseGet(() -> memberRepository.save(clientMember)); AuthToken newAuthToken = authService.saveAccessTokenCache(savedMember.getId(), socialId); diff --git a/src/main/java/org/guzzing/studayserver/domain/calendar/repository/academyschedule/AcademyScheduleJpaRepository.java b/src/main/java/org/guzzing/studayserver/domain/calendar/repository/academyschedule/AcademyScheduleJpaRepository.java index 638bac65b..8e66646ea 100644 --- a/src/main/java/org/guzzing/studayserver/domain/calendar/repository/academyschedule/AcademyScheduleJpaRepository.java +++ b/src/main/java/org/guzzing/studayserver/domain/calendar/repository/academyschedule/AcademyScheduleJpaRepository.java @@ -11,7 +11,7 @@ import org.springframework.data.repository.query.Param; import org.springframework.transaction.annotation.Transactional; -public interface AcademyScheduleJpaRepository extends JpaRepository, AcademyScheduleRepository { +public interface AcademyScheduleJpaRepository extends JpaRepository { AcademySchedule save(AcademySchedule academySchedule); diff --git a/src/main/java/org/guzzing/studayserver/domain/calendar/repository/academyschedule/AcademyScheduleRepositoryImpl.java b/src/main/java/org/guzzing/studayserver/domain/calendar/repository/academyschedule/AcademyScheduleRepositoryImpl.java new file mode 100644 index 000000000..8bc8c9329 --- /dev/null +++ b/src/main/java/org/guzzing/studayserver/domain/calendar/repository/academyschedule/AcademyScheduleRepositoryImpl.java @@ -0,0 +1,84 @@ +package org.guzzing.studayserver.domain.calendar.repository.academyschedule; + +import java.time.LocalDate; +import java.util.List; +import org.guzzing.studayserver.domain.calendar.model.AcademySchedule; +import org.guzzing.studayserver.domain.calendar.model.AcademyTimeTemplate; +import org.guzzing.studayserver.domain.calendar.repository.dto.AcademyCalenderDetailInfo; +import org.springframework.stereotype.Repository; + +@Repository +public class AcademyScheduleRepositoryImpl implements AcademyScheduleRepository{ + + private final AcademyScheduleJpaRepository academyScheduleJpaRepository; + + public AcademyScheduleRepositoryImpl(AcademyScheduleJpaRepository academyScheduleJpaRepository) { + this.academyScheduleJpaRepository = academyScheduleJpaRepository; + } + + @Override + public AcademySchedule save(AcademySchedule academySchedule) { + return academyScheduleJpaRepository.save(academySchedule); + } + + @Override + public List findAll() { + return academyScheduleJpaRepository.findAll(); + } + + @Override + public AcademyTimeTemplate findDistinctAcademyTimeTemplate(Long academyScheduleId) { + return academyScheduleJpaRepository.findDistinctAcademyTimeTemplate(academyScheduleId); + } + + @Override + public void deleteAllByAcademyTimeTemplateId(Long academyTimeTemplateId) { + academyScheduleJpaRepository.deleteAllByAcademyTimeTemplateId(academyTimeTemplateId); + } + + @Override + public void deleteAfterUpdatedStartDate(Long academyTimeTemplateId, LocalDate startDateOfAttendanceToUpdate) { + academyScheduleJpaRepository.deleteAfterUpdatedStartDate(academyTimeTemplateId, startDateOfAttendanceToUpdate); + } + + @Override + public List findByAcademyTimeTemplateId(Long academyTimeTemplateId) { + return academyScheduleJpaRepository.findByAcademyTimeTemplateId(academyTimeTemplateId); + } + + @Override + public void deleteById(Long academyScheduleId) { + academyScheduleJpaRepository.deleteById(academyScheduleId); + } + + @Override + public AcademyCalenderDetailInfo findTimeTemplateByChildIdAndScheduleId(Long scheduleId, Long childId) { + return academyScheduleJpaRepository.findTimeTemplateByChildIdAndScheduleId(scheduleId, childId); + } + + @Override + public List findByYearMonth(List childIds, int year, int month) { + return academyScheduleJpaRepository.findByYearMonth(childIds, year, month); + } + + @Override + public List findByDate(List childIds, LocalDate date) { + return academyScheduleJpaRepository.findByDate(childIds, date); + } + + @Override + public Long findDashboardIdByAcademyScheduleId(Long academyScheduleId) { + return academyScheduleJpaRepository.findDashboardIdByAcademyScheduleId(academyScheduleId); + } + + @Override + public LocalDate findScheduleDate(Long scheduleId) { + return academyScheduleJpaRepository.findScheduleDate(scheduleId); + } + + @Override + public List findByDate(LocalDate startDateOfAttendance, LocalDate endDateOfAttendance, + Long childId) { + return academyScheduleJpaRepository.findByDate(startDateOfAttendance, endDateOfAttendance, childId); + } +} diff --git a/src/main/java/org/guzzing/studayserver/domain/child/repository/ChildJpaRepository.java b/src/main/java/org/guzzing/studayserver/domain/child/repository/ChildJpaRepository.java new file mode 100644 index 000000000..17be3e106 --- /dev/null +++ b/src/main/java/org/guzzing/studayserver/domain/child/repository/ChildJpaRepository.java @@ -0,0 +1,12 @@ +package org.guzzing.studayserver.domain.child.repository; + +import java.util.Optional; +import org.guzzing.studayserver.domain.child.model.Child; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ChildJpaRepository extends JpaRepository { + + Optional findByIdAndMemberId(Long childId, Long memberId); + + void deleteByMemberId(final long memberId); +} diff --git a/src/main/java/org/guzzing/studayserver/domain/child/repository/ChildRepository.java b/src/main/java/org/guzzing/studayserver/domain/child/repository/ChildRepository.java index f633eafbe..b309f9364 100644 --- a/src/main/java/org/guzzing/studayserver/domain/child/repository/ChildRepository.java +++ b/src/main/java/org/guzzing/studayserver/domain/child/repository/ChildRepository.java @@ -1,12 +1,20 @@ package org.guzzing.studayserver.domain.child.repository; +import java.util.List; +import java.util.Map; import java.util.Optional; import org.guzzing.studayserver.domain.child.model.Child; import org.springframework.data.jpa.repository.JpaRepository; -public interface ChildRepository extends JpaRepository { +public interface ChildRepository { Optional findByIdAndMemberId(Long childId, Long memberId); void deleteByMemberId(final long memberId); + + Child save(Child child); + + Optional findById(Long childId); + + List findAll(); } diff --git a/src/main/java/org/guzzing/studayserver/domain/child/repository/ChildRepositoryImpl.java b/src/main/java/org/guzzing/studayserver/domain/child/repository/ChildRepositoryImpl.java new file mode 100644 index 000000000..0878c0d2d --- /dev/null +++ b/src/main/java/org/guzzing/studayserver/domain/child/repository/ChildRepositoryImpl.java @@ -0,0 +1,42 @@ +package org.guzzing.studayserver.domain.child.repository; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import org.guzzing.studayserver.domain.child.model.Child; +import org.springframework.stereotype.Repository; + +@Repository +public class ChildRepositoryImpl implements ChildRepository{ + + private final ChildJpaRepository childJpaRepository; + + public ChildRepositoryImpl(ChildJpaRepository childJpaRepository) { + this.childJpaRepository = childJpaRepository; + } + + @Override + public Optional findByIdAndMemberId(Long childId, Long memberId) { + return childJpaRepository.findByIdAndMemberId(childId, memberId); + } + + @Override + public void deleteByMemberId(long memberId) { + childJpaRepository.deleteByMemberId(memberId); + } + + @Override + public Child save(Child child) { + return childJpaRepository.save(child); + } + + @Override + public Optional findById(Long childId) { + return childJpaRepository.findById(childId); + } + + @Override + public List findAll() { + return childJpaRepository.findAll(); + } +} diff --git a/src/main/java/org/guzzing/studayserver/domain/dashboard/repository/DashboardJpaRepository.java b/src/main/java/org/guzzing/studayserver/domain/dashboard/repository/DashboardJpaRepository.java index 7bb2faa5e..eebca2f11 100644 --- a/src/main/java/org/guzzing/studayserver/domain/dashboard/repository/DashboardJpaRepository.java +++ b/src/main/java/org/guzzing/studayserver/domain/dashboard/repository/DashboardJpaRepository.java @@ -6,8 +6,7 @@ import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; -public interface DashboardJpaRepository extends - JpaRepository, DashboardRepository, DashboardQuerydslRepository { +public interface DashboardJpaRepository extends JpaRepository { @Query("SELECT dab FROM Dashboard AS dab " + "JOIN FETCH dab.dashboardSchedules dabschs " @@ -20,4 +19,7 @@ public interface DashboardJpaRepository extends where d.childId in :childIds """) void deleteByChildIds(List childIds); + + + List findAllByChildId(Long childId); } diff --git a/src/main/java/org/guzzing/studayserver/domain/dashboard/repository/DashboardQuerydslRepository.java b/src/main/java/org/guzzing/studayserver/domain/dashboard/repository/DashboardQuerydslRepository.java index 51435c7b0..9838d37e5 100644 --- a/src/main/java/org/guzzing/studayserver/domain/dashboard/repository/DashboardQuerydslRepository.java +++ b/src/main/java/org/guzzing/studayserver/domain/dashboard/repository/DashboardQuerydslRepository.java @@ -1,10 +1,25 @@ package org.guzzing.studayserver.domain.dashboard.repository; +import static org.guzzing.studayserver.domain.dashboard.model.QDashboard.dashboard; + +import com.querydsl.jpa.impl.JPAQueryFactory; import java.util.List; import org.guzzing.studayserver.domain.dashboard.model.Dashboard; +import org.springframework.stereotype.Repository; + +@Repository +public class DashboardQuerydslRepository { -public interface DashboardQuerydslRepository { + private final JPAQueryFactory jpaQueryFactory; - List findActiveOnlyByChildId(final Long childId); + public DashboardQuerydslRepository(final JPAQueryFactory jpaQueryFactory) { + this.jpaQueryFactory = jpaQueryFactory; + } + public List findActiveOnlyByChildId(Long childId) { + return jpaQueryFactory.selectFrom(dashboard) + .where(dashboard.childId.eq(childId) + .and(dashboard.isActive.isTrue())) + .fetch(); + } } diff --git a/src/main/java/org/guzzing/studayserver/domain/dashboard/repository/DashboardQuerydslRepositoryImpl.java b/src/main/java/org/guzzing/studayserver/domain/dashboard/repository/DashboardQuerydslRepositoryImpl.java deleted file mode 100644 index 52054ca99..000000000 --- a/src/main/java/org/guzzing/studayserver/domain/dashboard/repository/DashboardQuerydslRepositoryImpl.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.guzzing.studayserver.domain.dashboard.repository; - -import static org.guzzing.studayserver.domain.dashboard.model.QDashboard.dashboard; - -import com.querydsl.jpa.impl.JPAQueryFactory; -import java.util.List; -import org.guzzing.studayserver.domain.dashboard.model.Dashboard; -import org.springframework.stereotype.Repository; - -@Repository -public class DashboardQuerydslRepositoryImpl implements - DashboardQuerydslRepository { - - private final JPAQueryFactory jpaQueryFactory; - - public DashboardQuerydslRepositoryImpl(final JPAQueryFactory jpaQueryFactory) { - this.jpaQueryFactory = jpaQueryFactory; - } - - @Override - public List findActiveOnlyByChildId(Long childId) { - return jpaQueryFactory.selectFrom(dashboard) - .where(dashboard.childId.eq(childId) - .and(dashboard.isActive.isTrue())) - .fetch(); - } -} diff --git a/src/main/java/org/guzzing/studayserver/domain/dashboard/repository/DashboardRepository.java b/src/main/java/org/guzzing/studayserver/domain/dashboard/repository/DashboardRepository.java index c2ce4f7d4..bccc9cb88 100644 --- a/src/main/java/org/guzzing/studayserver/domain/dashboard/repository/DashboardRepository.java +++ b/src/main/java/org/guzzing/studayserver/domain/dashboard/repository/DashboardRepository.java @@ -3,17 +3,13 @@ import java.util.List; import java.util.Optional; import org.guzzing.studayserver.domain.dashboard.model.Dashboard; -import org.guzzing.studayserver.global.exception.DashboardException; import org.springframework.data.jpa.repository.Query; public interface DashboardRepository { Dashboard save(final Dashboard dashboard); - default Dashboard findDashboardById(final Long dashboardId) { - return this.findById(dashboardId) - .orElseThrow(() -> new DashboardException("존재하지 않는 대시보드입니다.")); - } + Dashboard findDashboardById(final Long dashboardId); Optional findById(final Long dashboardId); diff --git a/src/main/java/org/guzzing/studayserver/domain/dashboard/repository/DashboardRepositoryImpl.java b/src/main/java/org/guzzing/studayserver/domain/dashboard/repository/DashboardRepositoryImpl.java new file mode 100644 index 000000000..656a1a4cc --- /dev/null +++ b/src/main/java/org/guzzing/studayserver/domain/dashboard/repository/DashboardRepositoryImpl.java @@ -0,0 +1,61 @@ +package org.guzzing.studayserver.domain.dashboard.repository; + +import java.util.List; +import java.util.Optional; +import org.guzzing.studayserver.domain.dashboard.model.Dashboard; +import org.guzzing.studayserver.global.exception.DashboardException; +import org.springframework.stereotype.Repository; + +@Repository +public class DashboardRepositoryImpl implements DashboardRepository{ + + private final DashboardJpaRepository dashboardJpaRepository; + private final DashboardQuerydslRepository dashboardQuerydslRepository; + + public DashboardRepositoryImpl(DashboardJpaRepository dashboardJpaRepository, + DashboardQuerydslRepository dashboardQuerydslRepository) { + this.dashboardJpaRepository = dashboardJpaRepository; + this.dashboardQuerydslRepository = dashboardQuerydslRepository; + } + + @Override + public Dashboard save(Dashboard dashboard) { + return dashboardJpaRepository.save(dashboard); + } + + @Override + public Dashboard findDashboardById(Long dashboardId) { + return dashboardJpaRepository.findById(dashboardId) + .orElseThrow(() -> new DashboardException("존재하지 않는 대시보드입니다.")); + } + + @Override + public Optional findById(Long dashboardId) { + return dashboardJpaRepository.findById(dashboardId); + } + + @Override + public List findActiveOnlyByChildId(Long childId) { + return dashboardQuerydslRepository.findActiveOnlyByChildId(childId); + } + + @Override + public List findAllByChildId(Long childId) { + return dashboardJpaRepository.findAllByChildId(childId); + } + + @Override + public List findAll() { + return dashboardJpaRepository.findAll(); + } + + @Override + public List findByIds(List dashboardIds) { + return dashboardJpaRepository.findByIds(dashboardIds); + } + + @Override + public void deleteByChildIds(List childIds) { + dashboardJpaRepository.deleteByChildIds(childIds); + } +} diff --git a/src/main/java/org/guzzing/studayserver/domain/dashboard/repository/DashboardScheduleRepository.java b/src/main/java/org/guzzing/studayserver/domain/dashboard/repository/DashboardScheduleRepository.java new file mode 100644 index 000000000..00827dc21 --- /dev/null +++ b/src/main/java/org/guzzing/studayserver/domain/dashboard/repository/DashboardScheduleRepository.java @@ -0,0 +1,8 @@ +package org.guzzing.studayserver.domain.dashboard.repository; + +import java.util.List; + +public interface DashboardScheduleRepository { + + void deleteByChildIds(final List childIds); +} diff --git a/src/main/java/org/guzzing/studayserver/domain/dashboard/repository/DashboardScheduleRepositoryImpl.java b/src/main/java/org/guzzing/studayserver/domain/dashboard/repository/DashboardScheduleRepositoryImpl.java new file mode 100644 index 000000000..5e5b90e81 --- /dev/null +++ b/src/main/java/org/guzzing/studayserver/domain/dashboard/repository/DashboardScheduleRepositoryImpl.java @@ -0,0 +1,19 @@ +package org.guzzing.studayserver.domain.dashboard.repository; + +import java.util.List; +import org.springframework.stereotype.Repository; + +@Repository +public class DashboardScheduleRepositoryImpl implements DashboardScheduleRepository { + + private final DashboardScheduleJpaRepository dashboardScheduleJpaRepository; + + public DashboardScheduleRepositoryImpl(DashboardScheduleJpaRepository dashboardScheduleJpaRepository) { + this.dashboardScheduleJpaRepository = dashboardScheduleJpaRepository; + } + + @Override + public void deleteByChildIds(List childIds) { + dashboardScheduleJpaRepository.deleteByChildIds(childIds); + } +} diff --git a/src/main/java/org/guzzing/studayserver/domain/dashboard/service/DashboardService.java b/src/main/java/org/guzzing/studayserver/domain/dashboard/service/DashboardService.java index b5fc6c6fc..650278ef4 100644 --- a/src/main/java/org/guzzing/studayserver/domain/dashboard/service/DashboardService.java +++ b/src/main/java/org/guzzing/studayserver/domain/dashboard/service/DashboardService.java @@ -8,7 +8,7 @@ import org.guzzing.studayserver.domain.dashboard.model.Dashboard; import org.guzzing.studayserver.domain.dashboard.model.vo.FeeInfo; import org.guzzing.studayserver.domain.dashboard.repository.DashboardRepository; -import org.guzzing.studayserver.domain.dashboard.repository.DashboardScheduleJpaRepository; +import org.guzzing.studayserver.domain.dashboard.repository.DashboardScheduleRepository; import org.guzzing.studayserver.domain.dashboard.service.access.dto.LessonScheduleAccessResult; import org.guzzing.studayserver.domain.dashboard.service.converter.DashboardServiceConverter; import org.guzzing.studayserver.domain.dashboard.service.dto.request.DashboardPostParam; @@ -25,15 +25,15 @@ public class DashboardService { private static final String SEPARATOR = ":"; private final DashboardServiceConverter serviceConverter; private final DashboardRepository dashboardRepository; - private final DashboardScheduleJpaRepository dashboardScheduleJpaRepository; + private final DashboardScheduleRepository dashboardScheduleRepository; public DashboardService( final DashboardServiceConverter serviceConverter, final DashboardRepository dashboardRepository, - final DashboardScheduleJpaRepository dashboardScheduleJpaRepository) { + final DashboardScheduleRepository dashboardScheduleRepository) { this.serviceConverter = serviceConverter; this.dashboardRepository = dashboardRepository; - this.dashboardScheduleJpaRepository = dashboardScheduleJpaRepository; + this.dashboardScheduleRepository = dashboardScheduleRepository; } @Transactional @@ -52,7 +52,7 @@ public void deleteDashboard(final long dashboardId) { @Transactional public void removeDashboard(final List childIds) { - dashboardScheduleJpaRepository.deleteByChildIds(childIds); + dashboardScheduleRepository.deleteByChildIds(childIds); dashboardRepository.deleteByChildIds(childIds); } diff --git a/src/main/java/org/guzzing/studayserver/domain/holiday/repository/HolidayJpaRepository.java b/src/main/java/org/guzzing/studayserver/domain/holiday/repository/HolidayJpaRepository.java new file mode 100644 index 000000000..35276fb25 --- /dev/null +++ b/src/main/java/org/guzzing/studayserver/domain/holiday/repository/HolidayJpaRepository.java @@ -0,0 +1,12 @@ +package org.guzzing.studayserver.domain.holiday.repository; + +import java.util.List; +import org.guzzing.studayserver.domain.holiday.model.Holiday; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +public interface HolidayJpaRepository extends JpaRepository { + + @Query("SELECT h FROM Holiday h WHERE YEAR(h.date) = :year AND MONTH(h.date) = :month") + List findByYearMonth(int year, int month); +} diff --git a/src/main/java/org/guzzing/studayserver/domain/holiday/repository/HolidayRepository.java b/src/main/java/org/guzzing/studayserver/domain/holiday/repository/HolidayRepository.java index 4ee5e1f40..8f24389eb 100644 --- a/src/main/java/org/guzzing/studayserver/domain/holiday/repository/HolidayRepository.java +++ b/src/main/java/org/guzzing/studayserver/domain/holiday/repository/HolidayRepository.java @@ -2,11 +2,8 @@ import java.util.List; import org.guzzing.studayserver.domain.holiday.model.Holiday; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -public interface HolidayRepository extends JpaRepository { +public interface HolidayRepository { - @Query("SELECT h FROM Holiday h WHERE YEAR(h.date) = :year AND MONTH(h.date) = :month") List findByYearMonth(int year, int month); } diff --git a/src/main/java/org/guzzing/studayserver/domain/holiday/repository/HolidayRepositoryImpl.java b/src/main/java/org/guzzing/studayserver/domain/holiday/repository/HolidayRepositoryImpl.java new file mode 100644 index 000000000..e82060f5a --- /dev/null +++ b/src/main/java/org/guzzing/studayserver/domain/holiday/repository/HolidayRepositoryImpl.java @@ -0,0 +1,20 @@ +package org.guzzing.studayserver.domain.holiday.repository; + +import java.util.List; +import org.guzzing.studayserver.domain.holiday.model.Holiday; +import org.springframework.stereotype.Repository; + +@Repository +public class HolidayRepositoryImpl implements HolidayRepository { + + private final HolidayJpaRepository holidayJpaRepository; + + public HolidayRepositoryImpl(HolidayJpaRepository holidayJpaRepository) { + this.holidayJpaRepository = holidayJpaRepository; + } + + @Override + public List findByYearMonth(int year, int month) { + return holidayJpaRepository.findByYearMonth(year, month); + } +} diff --git a/src/main/java/org/guzzing/studayserver/domain/like/repository/LikeJpaRepository.java b/src/main/java/org/guzzing/studayserver/domain/like/repository/LikeJpaRepository.java index 091833c3c..f9e3dfd04 100644 --- a/src/main/java/org/guzzing/studayserver/domain/like/repository/LikeJpaRepository.java +++ b/src/main/java/org/guzzing/studayserver/domain/like/repository/LikeJpaRepository.java @@ -6,7 +6,7 @@ import org.guzzing.studayserver.domain.member.model.Member; import org.springframework.data.jpa.repository.JpaRepository; -public interface LikeJpaRepository extends JpaRepository, LikeRepository { +public interface LikeJpaRepository extends JpaRepository { List findByMember(final Member member); @@ -16,4 +16,5 @@ public interface LikeJpaRepository extends JpaRepository, LikeReposi void deleteByMemberAndAcademy(final Member member, final Academy academy); + void deleteByMember(Member member); } diff --git a/src/main/java/org/guzzing/studayserver/domain/like/repository/LikeRepositoryImpl.java b/src/main/java/org/guzzing/studayserver/domain/like/repository/LikeRepositoryImpl.java new file mode 100644 index 000000000..19da8aa5b --- /dev/null +++ b/src/main/java/org/guzzing/studayserver/domain/like/repository/LikeRepositoryImpl.java @@ -0,0 +1,57 @@ +package org.guzzing.studayserver.domain.like.repository; + +import java.util.List; +import org.guzzing.studayserver.domain.academy.model.Academy; +import org.guzzing.studayserver.domain.like.model.Like; +import org.guzzing.studayserver.domain.member.model.Member; +import org.springframework.stereotype.Repository; + +@Repository +public class LikeRepositoryImpl implements LikeRepository{ + + private final LikeJpaRepository likeJpaRepository; + + public LikeRepositoryImpl(LikeJpaRepository likeJpaRepository) { + this.likeJpaRepository = likeJpaRepository; + } + + @Override + public Like save(Like like) { + return likeJpaRepository.save(like); + } + + @Override + public void deleteById(long likeId) { + likeJpaRepository.deleteById(likeId); + } + + @Override + public void deleteByMember(Member member) { + likeJpaRepository.deleteByMember(member); + } + + @Override + public boolean existsById(long id) { + return likeJpaRepository.existsById(id); + } + + @Override + public List findByMember(Member member) { + return likeJpaRepository.findByMember(member); + } + + @Override + public long countByMember(Member member) { + return likeJpaRepository.countByMember(member); + } + + @Override + public boolean existsByMemberAndAcademy(Member member, Academy academy) { + return likeJpaRepository.existsByMemberAndAcademy(member, academy); + } + + @Override + public void deleteByMemberAndAcademy(Member member, Academy academy) { + likeJpaRepository.deleteByMemberAndAcademy(member, academy); + } +} diff --git a/src/main/java/org/guzzing/studayserver/domain/member/repository/MemberJpaRepository.java b/src/main/java/org/guzzing/studayserver/domain/member/repository/MemberJpaRepository.java new file mode 100644 index 000000000..9edf5e621 --- /dev/null +++ b/src/main/java/org/guzzing/studayserver/domain/member/repository/MemberJpaRepository.java @@ -0,0 +1,13 @@ +package org.guzzing.studayserver.domain.member.repository; + +import java.util.Optional; +import org.guzzing.studayserver.domain.member.model.Member; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +public interface MemberJpaRepository extends JpaRepository { + + @Query("select m from Member m where m.socialId= ?1") + Optional findMemberIfExisted(String socialId); + +} diff --git a/src/main/java/org/guzzing/studayserver/domain/member/repository/MemberRepository.java b/src/main/java/org/guzzing/studayserver/domain/member/repository/MemberRepository.java index 1823e4228..02185cef5 100644 --- a/src/main/java/org/guzzing/studayserver/domain/member/repository/MemberRepository.java +++ b/src/main/java/org/guzzing/studayserver/domain/member/repository/MemberRepository.java @@ -5,11 +5,15 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; -public interface MemberRepository extends JpaRepository { +public interface MemberRepository { - Member findBySocialId(String socialId); - - @Query("select m from Member m where m.socialId= ?1") Optional findMemberIfExisted(String socialId); + void deleteById(long memberId); + + Optional findById(Long memberId); + + Member save(Member clientMember); + + boolean existsById(Long memberId); } diff --git a/src/main/java/org/guzzing/studayserver/domain/member/repository/MemberRepositoryImpl.java b/src/main/java/org/guzzing/studayserver/domain/member/repository/MemberRepositoryImpl.java new file mode 100644 index 000000000..ef93674e2 --- /dev/null +++ b/src/main/java/org/guzzing/studayserver/domain/member/repository/MemberRepositoryImpl.java @@ -0,0 +1,40 @@ +package org.guzzing.studayserver.domain.member.repository; + +import java.util.Optional; +import org.guzzing.studayserver.domain.member.model.Member; +import org.springframework.stereotype.Repository; + +@Repository +public class MemberRepositoryImpl implements MemberRepository{ + + private final MemberJpaRepository memberJpaRepository; + + public MemberRepositoryImpl(MemberJpaRepository memberJpaRepository) { + this.memberJpaRepository = memberJpaRepository; + } + + @Override + public Optional findMemberIfExisted(String socialId) { + return memberJpaRepository.findMemberIfExisted(socialId); + } + + @Override + public void deleteById(long memberId) { + memberJpaRepository.deleteById(memberId); + } + + @Override + public Optional findById(Long memberId) { + return memberJpaRepository.findById(memberId); + } + + @Override + public Member save(Member member) { + return memberJpaRepository.save(member); + } + + @Override + public boolean existsById(Long memberId) { + return memberJpaRepository.existsById(memberId); + } +} diff --git a/src/main/java/org/guzzing/studayserver/domain/region/repository/RegionJpaRepository.java b/src/main/java/org/guzzing/studayserver/domain/region/repository/RegionJpaRepository.java index 2cdee20df..00d7a826d 100644 --- a/src/main/java/org/guzzing/studayserver/domain/region/repository/RegionJpaRepository.java +++ b/src/main/java/org/guzzing/studayserver/domain/region/repository/RegionJpaRepository.java @@ -8,7 +8,7 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -public interface RegionJpaRepository extends JpaRepository, RegionRepository { +public interface RegionJpaRepository extends JpaRepository { @Query("select distinct(r.address.sigungu) from Region r where r.address.sido = :sido") List findSigunguBySido(final String sido); @@ -20,7 +20,6 @@ public interface RegionJpaRepository extends JpaRepository, Region Optional findBySidoAndSigunguAndUpmyeondong(final String sido, final String sigungu, final String upmyeondong); - @Override @Query("select r from Region r where ST_Contains(r.area, :point)") Optional findByAreaContainingPoint(@Param("point") final Point point); diff --git a/src/main/java/org/guzzing/studayserver/domain/region/repository/RegionRepository.java b/src/main/java/org/guzzing/studayserver/domain/region/repository/RegionRepository.java index 6e2e066a5..3aa29df4d 100644 --- a/src/main/java/org/guzzing/studayserver/domain/region/repository/RegionRepository.java +++ b/src/main/java/org/guzzing/studayserver/domain/region/repository/RegionRepository.java @@ -1,6 +1,5 @@ package org.guzzing.studayserver.domain.region.repository; -import jakarta.persistence.EntityNotFoundException; import java.util.List; import java.util.Optional; import org.guzzing.studayserver.domain.region.model.Region; @@ -15,18 +14,11 @@ public interface RegionRepository { Optional findBySidoAndSigunguAndUpmyeondong(final String sido, final String sigungu, final String upmyeondong); - default Region getBySidoAndSigunguAndUpmyeondong(final String sido, final String sigungu, - final String upmyeondong) { - return this.findBySidoAndSigunguAndUpmyeondong(sido, sigungu, upmyeondong) - .orElseThrow(() -> new EntityNotFoundException("해당 지역에 해당하는 법정동 지역이 없습니다.")); - } + Region getBySidoAndSigunguAndUpmyeondong(final String sido, final String sigungu, final String upmyeondong); Optional findByAreaContainingPoint(final Point point); - default Region getByAreaContainingPoint(final Point point) { - return this.findByAreaContainingPoint(point) - .orElseThrow(() -> new EntityNotFoundException("해당 위경도에 해당하는 법정동 지역이 없습니다.")); - } + Region getByAreaContainingPoint(final Point point); Region save(Region region); } diff --git a/src/main/java/org/guzzing/studayserver/domain/region/repository/RegionRepositoryImpl.java b/src/main/java/org/guzzing/studayserver/domain/region/repository/RegionRepositoryImpl.java new file mode 100644 index 000000000..758cc908c --- /dev/null +++ b/src/main/java/org/guzzing/studayserver/domain/region/repository/RegionRepositoryImpl.java @@ -0,0 +1,56 @@ +package org.guzzing.studayserver.domain.region.repository; + +import jakarta.persistence.EntityNotFoundException; +import java.util.List; +import java.util.Optional; +import org.guzzing.studayserver.domain.region.model.Region; +import org.locationtech.jts.geom.Point; +import org.springframework.stereotype.Repository; + +@Repository +public class RegionRepositoryImpl implements RegionRepository { + + private final RegionJpaRepository regionJpaRepository; + + public RegionRepositoryImpl(RegionJpaRepository regionJpaRepository) { + this.regionJpaRepository = regionJpaRepository; + } + + @Override + public List findSigunguBySido(String sido) { + return regionJpaRepository.findSigunguBySido(sido); + } + + @Override + public List findUpmyeondongBySidoAndSigungu(String sido, String sigungu) { + return regionJpaRepository.findUpmyeondongBySidoAndSigungu(sido, sigungu); + } + + @Override + public Optional findBySidoAndSigunguAndUpmyeondong(String sido, String sigungu, + String upmyeondong) { + return regionJpaRepository.findBySidoAndSigunguAndUpmyeondong(sido, sigungu, upmyeondong); + } + + @Override + public Region getBySidoAndSigunguAndUpmyeondong(String sido, String sigungu, String upmyeondong) { + return regionJpaRepository.findBySidoAndSigunguAndUpmyeondong(sido, sigungu, upmyeondong) + .orElseThrow(() -> new EntityNotFoundException("해당 지역에 해당하는 법정동 지역이 없습니다.")); + } + + @Override + public Optional findByAreaContainingPoint(Point point) { + return regionJpaRepository.findByAreaContainingPoint(point); + } + + @Override + public Region getByAreaContainingPoint(Point point) { + return regionJpaRepository.findByAreaContainingPoint(point) + .orElseThrow(() -> new EntityNotFoundException("해당 위경도에 해당하는 법정동 지역이 없습니다.")); + } + + @Override + public Region save(Region region) { + return regionJpaRepository.save(region); + } +} diff --git a/src/main/java/org/guzzing/studayserver/domain/review/repository/ReviewJpaRepository.java b/src/main/java/org/guzzing/studayserver/domain/review/repository/ReviewJpaRepository.java index 597c44711..09384479c 100644 --- a/src/main/java/org/guzzing/studayserver/domain/review/repository/ReviewJpaRepository.java +++ b/src/main/java/org/guzzing/studayserver/domain/review/repository/ReviewJpaRepository.java @@ -5,7 +5,7 @@ import org.guzzing.studayserver.domain.review.model.Review; import org.springframework.data.jpa.repository.JpaRepository; -public interface ReviewJpaRepository extends JpaRepository, ReviewRepository { +public interface ReviewJpaRepository extends JpaRepository { boolean existsByMemberAndAcademy(final Member member, final Academy academy); diff --git a/src/main/java/org/guzzing/studayserver/domain/review/repository/ReviewRepositoryImpl.java b/src/main/java/org/guzzing/studayserver/domain/review/repository/ReviewRepositoryImpl.java new file mode 100644 index 000000000..d02a70bda --- /dev/null +++ b/src/main/java/org/guzzing/studayserver/domain/review/repository/ReviewRepositoryImpl.java @@ -0,0 +1,31 @@ +package org.guzzing.studayserver.domain.review.repository; + +import org.guzzing.studayserver.domain.academy.model.Academy; +import org.guzzing.studayserver.domain.member.model.Member; +import org.guzzing.studayserver.domain.review.model.Review; +import org.springframework.stereotype.Repository; + +@Repository +public class ReviewRepositoryImpl implements ReviewRepository{ + + private final ReviewJpaRepository reviewJpaRepository; + + public ReviewRepositoryImpl(ReviewJpaRepository reviewJpaRepository) { + this.reviewJpaRepository = reviewJpaRepository; + } + + @Override + public Review save(Review review) { + return reviewJpaRepository.save(review); + } + + @Override + public boolean existsByMemberAndAcademy(Member member, Academy academy) { + return reviewJpaRepository.existsByMemberAndAcademy(member, academy); + } + + @Override + public void deleteByMember(Member member) { + reviewJpaRepository.deleteByMember(member); + } +} diff --git a/src/test/java/org/guzzing/studayserver/domain/holiday/repository/HolidayRepositoryTest.java b/src/test/java/org/guzzing/studayserver/domain/holiday/repository/HolidayRepositoryTest.java index 8db454392..29551cdf1 100644 --- a/src/test/java/org/guzzing/studayserver/domain/holiday/repository/HolidayRepositoryTest.java +++ b/src/test/java/org/guzzing/studayserver/domain/holiday/repository/HolidayRepositoryTest.java @@ -14,32 +14,27 @@ import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase.Replace; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; -@DataJpaTest -@AutoConfigureTestDatabase(replace = Replace.NONE) -@Import(QuerydslTestConfig.class) +@SpringBootTest class HolidayRepositoryTest { - @Autowired - private TestEntityManager entityManager; - @Autowired private HolidayRepository holidayRepository; - @BeforeEach - void setUp() { - Holiday newYear = new Holiday(LocalDate.of(2022, 1, 1), "New Year"); - Holiday lunarNewYear = new Holiday(LocalDate.of(2022, 1, 22), "Lunar New Year"); - entityManager.persist(newYear); - entityManager.persist(lunarNewYear); - entityManager.flush(); - } + @Autowired + private HolidayJpaRepository holidayJpaRepository; @DisplayName("해당 년,월에 공휴일을 반환한다.") @Test void whenFindByYearAndMonth_thenReturnHolidays() { // Given + Holiday newYear = new Holiday(LocalDate.of(2022, 1, 1), "New Year"); + Holiday lunarNewYear = new Holiday(LocalDate.of(2022, 1, 22), "Lunar New Year"); + holidayJpaRepository.save(newYear); + holidayJpaRepository.save(lunarNewYear); + int year = 2022; int month = 1;