From 1a82abeec0b6c63948931befb3f191881361fa9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B7=9C=EB=B2=94?= Date: Tue, 25 Apr 2023 14:48:25 +0900 Subject: [PATCH 01/10] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3d44b8a..a520749 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@

Infra Structure

- +

From 0a6946efb7e0c80c90efe75a3332daf2a8b7f88c Mon Sep 17 00:00:00 2001 From: kyubeom Date: Tue, 25 Apr 2023 21:05:08 +0900 Subject: [PATCH 02/10] =?UTF-8?q?#118=20QueryDSL=20=EC=A0=81=EC=9A=A9=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - QueryDSL Gradle 적용 완료하였습니다. --- .idea/compiler.xml | 10 ++++++++++ build.gradle | 25 +++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 25c9aa8..9ef9951 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -6,6 +6,16 @@ + + + + + + + + + + diff --git a/build.gradle b/build.gradle index 5c13c04..578a7ac 100644 --- a/build.gradle +++ b/build.gradle @@ -49,8 +49,33 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'io.micrometer:micrometer-core' implementation 'io.micrometer:micrometer-registry-prometheus' + + //QueryDSL + implementation "com.querydsl:querydsl-jpa" + implementation "com.querydsl:querydsl-core" + implementation "com.querydsl:querydsl-collections" + annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" // querydsl JPAAnnotationProcessor 사용 지정 + annotationProcessor "jakarta.annotation:jakarta.annotation-api" // java.lang.NoClassDefFoundError (javax.annotation.Generated) 대응 코드 + annotationProcessor "jakarta.persistence:jakarta.persistence-api" // java.lang.NoClassDefFoundError (javax.annotation.Entity) 대응 코드 } tasks.named('test') { useJUnitPlatform() } +// Querydsl 설정부 +def generated = 'build/generated' + +// querydsl QClass 파일 생성 위치를 지정 +tasks.withType(JavaCompile) { + options.getGeneratedSourceOutputDirectory().set(file(generated)) +} + +// java source set 에 querydsl QClass 위치 추가 +sourceSets { + main.java.srcDirs += [ generated ] +} + +// gradle clean 시에 QClass 디렉토리 삭제 +clean { + delete file(generated) +} \ No newline at end of file From 2a6cb141c603ecb0e5794098234e35cfbb0f6805 Mon Sep 17 00:00:00 2001 From: dldmsql Date: Thu, 27 Apr 2023 10:28:25 +0900 Subject: [PATCH 03/10] =?UTF-8?q?querydsl=20config=20=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit querydsl 사용을 위한 설정 파일을 작성 --- .../global/config/QueryDslConfig.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/main/java/com/example/myongsick/global/config/QueryDslConfig.java diff --git a/src/main/java/com/example/myongsick/global/config/QueryDslConfig.java b/src/main/java/com/example/myongsick/global/config/QueryDslConfig.java new file mode 100644 index 0000000..a61d081 --- /dev/null +++ b/src/main/java/com/example/myongsick/global/config/QueryDslConfig.java @@ -0,0 +1,19 @@ +package com.example.myongsick.global.config; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class QueryDslConfig { + + @PersistenceContext + private EntityManager em; + + @Bean + public JPAQueryFactory jpaQueryFactory(EntityManager em) { + return new JPAQueryFactory(em); + } +} From a03383676a2b148a7ecf0ec072d26a0ba4064701 Mon Sep 17 00:00:00 2001 From: dldmsql Date: Thu, 27 Apr 2023 10:30:29 +0900 Subject: [PATCH 04/10] =?UTF-8?q?=EC=B0=9C=EA=BD=81=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=9D=91=EB=8B=B5=20DTO=EB=A5=BC=20Q=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=EB=A1=9C=20=EC=82=AC=EC=9A=A9=EC=9D=84=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @QueryProjection 어노테이션을 통한 생성자를 이용한 객체 생성 방식으로 매핑 --- .../domain/scrap/dto/ScrapCountResponse.java | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/example/myongsick/domain/scrap/dto/ScrapCountResponse.java b/src/main/java/com/example/myongsick/domain/scrap/dto/ScrapCountResponse.java index e20380e..2250d81 100644 --- a/src/main/java/com/example/myongsick/domain/scrap/dto/ScrapCountResponse.java +++ b/src/main/java/com/example/myongsick/domain/scrap/dto/ScrapCountResponse.java @@ -1,17 +1,14 @@ package com.example.myongsick.domain.scrap.dto; +import com.querydsl.core.annotations.QueryProjection; import io.swagger.annotations.ApiModel; -import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.Setter; @Getter -@Setter @Builder @NoArgsConstructor -@AllArgsConstructor @ApiModel(description = "찜꽁 리스트 응답 객체 ( + 찜꽁수 포함 )") public class ScrapCountResponse { @@ -20,12 +17,28 @@ public class ScrapCountResponse { private String name; private String category; private String address; + private String contact; private String urlAddress; private String distance; - private String contact; private String latitude; private String longitude; private int scrapCount; + @QueryProjection + public ScrapCountResponse(Long storeId, String code, String name, String category, String address, + String contact, String urlAddress, String distance, String latitude, String longitude, + int scrapCount) { + this.storeId = storeId; + this.code = code; + this.name = name; + this.category = category; + this.address = address; + this.contact = contact; + this.urlAddress = urlAddress; + this.distance = distance; + this.latitude = latitude; + this.longitude = longitude; + this.scrapCount = scrapCount; + } public static ScrapCountResponse toDto(CountResponse countResponse) { return ScrapCountResponse.builder() From 9c8de0283211688ce1bcc92a89a8ca985bbbbe93 Mon Sep 17 00:00:00 2001 From: dldmsql Date: Thu, 27 Apr 2023 10:31:35 +0900 Subject: [PATCH 05/10] =?UTF-8?q?=EB=A7=9B=EC=A7=91=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EC=8B=9C,=20=EC=B0=9C=EA=BD=81=20=EC=88=98=20=ED=8F=AC?= =?UTF-8?q?=ED=95=A8=20=EA=B0=80=EA=B2=8C=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EC=BF=BC=EB=A6=AC=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 동적 정렬(인기순, 거리순) 적용 --- .../repository/ScrapRepositoryCustom.java | 10 +++ .../scrap/repository/ScrapRepositoryImpl.java | 64 +++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 src/main/java/com/example/myongsick/domain/scrap/repository/ScrapRepositoryCustom.java create mode 100644 src/main/java/com/example/myongsick/domain/scrap/repository/ScrapRepositoryImpl.java diff --git a/src/main/java/com/example/myongsick/domain/scrap/repository/ScrapRepositoryCustom.java b/src/main/java/com/example/myongsick/domain/scrap/repository/ScrapRepositoryCustom.java new file mode 100644 index 0000000..3da9624 --- /dev/null +++ b/src/main/java/com/example/myongsick/domain/scrap/repository/ScrapRepositoryCustom.java @@ -0,0 +1,10 @@ +package com.example.myongsick.domain.scrap.repository; + +import com.example.myongsick.domain.scrap.dto.ScrapCountResponse; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.repository.query.Param; + +public interface ScrapRepositoryCustom { + Page findAllByCampusWithPaging(@Param("campus") String campus, Pageable pageable); +} diff --git a/src/main/java/com/example/myongsick/domain/scrap/repository/ScrapRepositoryImpl.java b/src/main/java/com/example/myongsick/domain/scrap/repository/ScrapRepositoryImpl.java new file mode 100644 index 0000000..01747c4 --- /dev/null +++ b/src/main/java/com/example/myongsick/domain/scrap/repository/ScrapRepositoryImpl.java @@ -0,0 +1,64 @@ +package com.example.myongsick.domain.scrap.repository; + +import static com.example.myongsick.domain.scrap.entity.QScrap.scrap; +import static com.example.myongsick.domain.scrap.entity.QStore.store; + +import com.example.myongsick.domain.scrap.dto.QScrapCountResponse; +import com.example.myongsick.domain.scrap.dto.ScrapCountResponse; +import com.example.myongsick.domain.scrap.entity.CampusType; +import com.example.myongsick.domain.scrap.entity.Store; +import com.querydsl.core.types.Order; +import com.querydsl.core.types.OrderSpecifier; +import com.querydsl.core.types.dsl.PathBuilder; +import com.querydsl.jpa.impl.JPAQueryFactory; +import java.util.ArrayList; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Repository; + +@Repository +@RequiredArgsConstructor +public class ScrapRepositoryImpl implements ScrapRepositoryCustom{ + private final JPAQueryFactory jpaQueryFactory; + + @Override + public Page findAllByCampusWithPaging(String campus, Pageable pageable) { + List result = jpaQueryFactory.select(new QScrapCountResponse(store.id.as("storeId"), store.code, store.name, store.category, store.address, store.contact, store.urlAddress, store.distance, store.latitude, store.longitude, store.scrapList.size().as("scrapCount"))) + .from(store) + .where(store.campus.eq(CampusType.valueOf(campus))) + .groupBy(store.code) + .orderBy(getOrderSpecifier(pageable.getSort()).stream().toArray(OrderSpecifier[]::new)) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); + + Long count = jpaQueryFactory + .select(scrap.count()) + .from(scrap) + .fetchOne(); + + return new PageImpl<>(result, pageable, count); + } + + private List getOrderSpecifier(Sort sort) { + List orderSpecifiers = new ArrayList<>(); + sort.stream() + .forEach(order -> { + Order direction = order.isAscending() ? Order.ASC : Order.DESC; + String property = order.getProperty(); + if(property.equals("scrapCount")) { + orderSpecifiers.add(new OrderSpecifier(direction, store.scrapList.size())); + } else if(property.equals("distance")) { + orderSpecifiers.add(new OrderSpecifier(direction, store.distance.castToNum(Long.class))); + } else { + PathBuilder orderByExpression = new PathBuilder(Store.class, "store"); + orderSpecifiers.add(new OrderSpecifier(direction, orderByExpression.get(property))); + } + }); + return orderSpecifiers; + } +} From 01dbdaecf107b3c9f3d6923671e600bc7ec64d29 Mon Sep 17 00:00:00 2001 From: dldmsql Date: Thu, 27 Apr 2023 10:32:07 +0900 Subject: [PATCH 06/10] =?UTF-8?q?=EB=A7=9B=EC=A7=91=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EC=8B=9C,=20=EC=B0=9C=EA=BD=81=20=EC=88=98=20=ED=8F=AC?= =?UTF-8?q?=ED=95=A8=20=EA=B0=80=EA=B2=8C=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EC=BF=BC=EB=A6=AC=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기존에 호출하던 조회 쿼리 함수는 주석으로 대체 --- .../example/myongsick/domain/scrap/service/ScrapService.java | 1 - .../myongsick/domain/scrap/service/ScrapServiceImpl.java | 5 ++++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/myongsick/domain/scrap/service/ScrapService.java b/src/main/java/com/example/myongsick/domain/scrap/service/ScrapService.java index fc58fbd..a2f3598 100644 --- a/src/main/java/com/example/myongsick/domain/scrap/service/ScrapService.java +++ b/src/main/java/com/example/myongsick/domain/scrap/service/ScrapService.java @@ -3,7 +3,6 @@ import com.example.myongsick.domain.scrap.dto.ScrapCountResponse; import com.example.myongsick.domain.scrap.dto.ScrapRequest; import com.example.myongsick.domain.scrap.dto.ScrapResponse; -import java.util.Optional; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; diff --git a/src/main/java/com/example/myongsick/domain/scrap/service/ScrapServiceImpl.java b/src/main/java/com/example/myongsick/domain/scrap/service/ScrapServiceImpl.java index ecbd245..474f18e 100644 --- a/src/main/java/com/example/myongsick/domain/scrap/service/ScrapServiceImpl.java +++ b/src/main/java/com/example/myongsick/domain/scrap/service/ScrapServiceImpl.java @@ -10,6 +10,7 @@ import com.example.myongsick.domain.scrap.exception.NotFoundScrapException; import com.example.myongsick.domain.scrap.exception.NotFoundStoreException; import com.example.myongsick.domain.scrap.repository.ScrapRepository; +import com.example.myongsick.domain.scrap.repository.ScrapRepositoryCustom; import com.example.myongsick.domain.scrap.repository.StoreRepository; import com.example.myongsick.domain.user.entity.User; import com.example.myongsick.domain.user.exception.NotFoundUserException; @@ -39,6 +40,7 @@ public class ScrapServiceImpl implements ScrapService{ private final UserRepository userRepository; private final ScrapRepository scrapRepository; private final StoreRepository storeRepository; + private final ScrapRepositoryCustom scrapRepositoryCustom; @Value("${kakao.rest-key}") private String kakaoRestKey; @@ -80,7 +82,8 @@ public void deleteScrap(Long scrapId) { @Override public Page getScrapCount(String campus, Pageable pageable) { - return scrapRepository.findAllCustom(campus, pageable).map(ScrapCountResponse::toDto); +// return scrapRepositoryCustom.findAllCustom(campus, pageable).map(ScrapCountResponse::toDto); + return scrapRepositoryCustom.findAllByCampusWithPaging(campus, pageable); } @Transactional From 65cbce8250e4fa50ac7d30b6713b174d607cbdc2 Mon Sep 17 00:00:00 2001 From: dldmsql Date: Thu, 27 Apr 2023 10:43:31 +0900 Subject: [PATCH 07/10] =?UTF-8?q?=EB=A7=9B=EC=A7=91=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EC=8B=9C,=20=EC=B0=9C=EA=BD=81=20=EC=88=98=20=ED=8F=AC?= =?UTF-8?q?=ED=95=A8=20=EA=B0=80=EA=B2=8C=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EB=8B=A8=EC=9D=BC=20=EC=A1=B0=ED=9A=8C=20=EC=BF=BC=EB=A6=AC=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 가게 pk를 통해 데이터 단일 조회 --- .../domain/scrap/repository/ScrapRepositoryCustom.java | 2 ++ .../domain/scrap/repository/ScrapRepositoryImpl.java | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/src/main/java/com/example/myongsick/domain/scrap/repository/ScrapRepositoryCustom.java b/src/main/java/com/example/myongsick/domain/scrap/repository/ScrapRepositoryCustom.java index 3da9624..3fd8c9b 100644 --- a/src/main/java/com/example/myongsick/domain/scrap/repository/ScrapRepositoryCustom.java +++ b/src/main/java/com/example/myongsick/domain/scrap/repository/ScrapRepositoryCustom.java @@ -7,4 +7,6 @@ public interface ScrapRepositoryCustom { Page findAllByCampusWithPaging(@Param("campus") String campus, Pageable pageable); + + ScrapCountResponse findByIdCustom(Long storeId); } diff --git a/src/main/java/com/example/myongsick/domain/scrap/repository/ScrapRepositoryImpl.java b/src/main/java/com/example/myongsick/domain/scrap/repository/ScrapRepositoryImpl.java index 01747c4..41442e1 100644 --- a/src/main/java/com/example/myongsick/domain/scrap/repository/ScrapRepositoryImpl.java +++ b/src/main/java/com/example/myongsick/domain/scrap/repository/ScrapRepositoryImpl.java @@ -44,6 +44,14 @@ public Page findAllByCampusWithPaging(String campus, Pageabl return new PageImpl<>(result, pageable, count); } + @Override + public ScrapCountResponse findByIdCustom(Long storeId) { + return jpaQueryFactory.select(new QScrapCountResponse(store.id.as("storeId"), store.code, store.name, store.category, store.address, store.contact, store.urlAddress, store.distance, store.latitude, store.longitude, store.scrapList.size().as("scrapCount"))) + .from(store) + .where(store.id.eq(storeId)) + .fetchOne(); + } + private List getOrderSpecifier(Sort sort) { List orderSpecifiers = new ArrayList<>(); sort.stream() From f7a29d7f855a234793fe40d4f9cf1457f2cba6b4 Mon Sep 17 00:00:00 2001 From: dldmsql Date: Thu, 27 Apr 2023 10:44:03 +0900 Subject: [PATCH 08/10] =?UTF-8?q?=EB=A7=9B=EC=A7=91=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EC=8B=9C,=20=EC=B0=9C=EA=BD=81=20=EC=88=98=20=ED=8F=AC?= =?UTF-8?q?=ED=95=A8=20=EA=B0=80=EA=B2=8C=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EB=8B=A8=EC=9D=BC=20=EC=A1=B0=ED=9A=8C=20=EC=BF=BC=EB=A6=AC=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기존 조회 쿼리 주석으로 대체 및 null 체크 조건문 추가 --- .../myongsick/domain/scrap/service/ScrapServiceImpl.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/myongsick/domain/scrap/service/ScrapServiceImpl.java b/src/main/java/com/example/myongsick/domain/scrap/service/ScrapServiceImpl.java index 474f18e..06a7eb2 100644 --- a/src/main/java/com/example/myongsick/domain/scrap/service/ScrapServiceImpl.java +++ b/src/main/java/com/example/myongsick/domain/scrap/service/ScrapServiceImpl.java @@ -116,6 +116,11 @@ public void updateStore() { @Override public ScrapCountResponse getStoreOne(Long storeId) { - return storeRepository.findByIdCustom(storeId).map(ScrapCountResponse::toDto).orElseThrow(NotFoundStoreException::new); +// return storeRepository.findByIdCustom(storeId).map(ScrapCountResponse::toDto).orElseThrow(NotFoundStoreException::new); + ScrapCountResponse scrapCountResponse = scrapRepositoryCustom.findByIdCustom(storeId); + if( scrapCountResponse == null ) { + throw new NotFoundStoreException(); + } + return scrapCountResponse; } } From 3924d26c8cd2a527a1029160831c78e6d0732ab9 Mon Sep 17 00:00:00 2001 From: dldmsql Date: Thu, 27 Apr 2023 10:58:33 +0900 Subject: [PATCH 09/10] =?UTF-8?q?=EA=B0=80=EA=B2=8C=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EB=8B=A8=EC=9D=BC=20=EC=A1=B0=ED=9A=8C=20=EC=BF=BC?= =?UTF-8?q?=EB=A6=AC=20=ED=95=A8=EC=88=98=20null=20=EC=B2=B4=ED=81=AC=20?= =?UTF-8?q?=EB=B0=A9=EC=8B=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit if문 처리에서 optional 방식으로 변경 --- .../domain/scrap/repository/ScrapRepositoryCustom.java | 3 ++- .../domain/scrap/repository/ScrapRepositoryImpl.java | 7 ++++--- .../myongsick/domain/scrap/service/ScrapServiceImpl.java | 6 +----- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/example/myongsick/domain/scrap/repository/ScrapRepositoryCustom.java b/src/main/java/com/example/myongsick/domain/scrap/repository/ScrapRepositoryCustom.java index 3fd8c9b..3eb4b9e 100644 --- a/src/main/java/com/example/myongsick/domain/scrap/repository/ScrapRepositoryCustom.java +++ b/src/main/java/com/example/myongsick/domain/scrap/repository/ScrapRepositoryCustom.java @@ -1,6 +1,7 @@ package com.example.myongsick.domain.scrap.repository; import com.example.myongsick.domain.scrap.dto.ScrapCountResponse; +import java.util.Optional; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.repository.query.Param; @@ -8,5 +9,5 @@ public interface ScrapRepositoryCustom { Page findAllByCampusWithPaging(@Param("campus") String campus, Pageable pageable); - ScrapCountResponse findByIdCustom(Long storeId); + Optional findByIdCustom(Long storeId); } diff --git a/src/main/java/com/example/myongsick/domain/scrap/repository/ScrapRepositoryImpl.java b/src/main/java/com/example/myongsick/domain/scrap/repository/ScrapRepositoryImpl.java index 41442e1..a1379f0 100644 --- a/src/main/java/com/example/myongsick/domain/scrap/repository/ScrapRepositoryImpl.java +++ b/src/main/java/com/example/myongsick/domain/scrap/repository/ScrapRepositoryImpl.java @@ -13,6 +13,7 @@ import com.querydsl.jpa.impl.JPAQueryFactory; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; @@ -45,11 +46,11 @@ public Page findAllByCampusWithPaging(String campus, Pageabl } @Override - public ScrapCountResponse findByIdCustom(Long storeId) { - return jpaQueryFactory.select(new QScrapCountResponse(store.id.as("storeId"), store.code, store.name, store.category, store.address, store.contact, store.urlAddress, store.distance, store.latitude, store.longitude, store.scrapList.size().as("scrapCount"))) + public Optional findByIdCustom(Long storeId) { + return Optional.ofNullable(jpaQueryFactory.select(new QScrapCountResponse(store.id.as("storeId"), store.code, store.name, store.category, store.address, store.contact, store.urlAddress, store.distance, store.latitude, store.longitude, store.scrapList.size().as("scrapCount"))) .from(store) .where(store.id.eq(storeId)) - .fetchOne(); + .fetchOne()); } private List getOrderSpecifier(Sort sort) { diff --git a/src/main/java/com/example/myongsick/domain/scrap/service/ScrapServiceImpl.java b/src/main/java/com/example/myongsick/domain/scrap/service/ScrapServiceImpl.java index 06a7eb2..08f0f25 100644 --- a/src/main/java/com/example/myongsick/domain/scrap/service/ScrapServiceImpl.java +++ b/src/main/java/com/example/myongsick/domain/scrap/service/ScrapServiceImpl.java @@ -117,10 +117,6 @@ public void updateStore() { @Override public ScrapCountResponse getStoreOne(Long storeId) { // return storeRepository.findByIdCustom(storeId).map(ScrapCountResponse::toDto).orElseThrow(NotFoundStoreException::new); - ScrapCountResponse scrapCountResponse = scrapRepositoryCustom.findByIdCustom(storeId); - if( scrapCountResponse == null ) { - throw new NotFoundStoreException(); - } - return scrapCountResponse; + return scrapRepositoryCustom.findByIdCustom(storeId).orElseThrow(NotFoundStoreException::new); } } From 6603276e56aa94016a6704833dab3fb00e506781 Mon Sep 17 00:00:00 2001 From: kyubeom Date: Tue, 6 Jun 2023 21:23:09 +0900 Subject: [PATCH 10/10] =?UTF-8?q?#122=20=EB=A1=9C=EA=B7=B8=20=EB=AA=A8?= =?UTF-8?q?=EB=8B=88=ED=84=B0=EB=A7=81=20=EA=B5=AC=EC=B6=95=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - prod 환경에서 /var/log/app 경로에 저장합니다. --- build.gradle | 1 + src/main/resources/application-dev.yml | 8 +++- src/main/resources/application-prod.yml | 8 +++- src/main/resources/application.yml | 2 +- src/main/resources/logback-spring.xml | 59 +++++++++++++++++++++++++ 5 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/logback-spring.xml diff --git a/build.gradle b/build.gradle index 5c13c04..60065e1 100644 --- a/build.gradle +++ b/build.gradle @@ -28,6 +28,7 @@ dependencies { runtimeOnly 'mysql:mysql-connector-java' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test:2.7.4' + implementation 'org.springframework.boot:spring-boot-starter-logging' // mongo // implementation 'org.springframework.boot:spring-boot-starter-data-mongodb' diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 621940a..7cefb65 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -5,4 +5,10 @@ spring: url: ENC(jV5Al684UF9ZuGwX0AJ4KaAl2djrcg5+mZe+QMgY1i2Afu6rtj0Cmrj52fkzjiQAP3b31dyhrLvggD+Mold//xi+7WPdEEu7AjoO1XGbMNl5uf5hKMhUh5pmZDpCkubJgj/VFoVUe4s=) username: ENC(W14O0+528BmR05t/tOqkJA==) password: ENC(8K7aplBAKgyNF7OuP11M6cXlCT1zLzm4) - driver-class-name: com.mysql.cj.jdbc.Driver \ No newline at end of file + driver-class-name: com.mysql.cj.jdbc.Driver +log: + config: + path: ./logs + filename: app-dev + maxHistory: 7 # 7일 + totalSizeCap: 10MB # 로그 파일 사이즈 \ No newline at end of file diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index a186cb4..fb2f503 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -5,4 +5,10 @@ spring: url: ENC(rMxUsofvraIkaMgSRzwu8g6UfnSv1t+I57CAt4Id+qR0Woi/yGJ/dAyT6+KqF/McGN7uSI8aYef1DuWJu13N+1iHbFTfQZbDNalt8A3Lm4MwU0MxUA7o0qf+DU0043KdS8wag3pNGwA=) username: ENC(AtyIP2KxL11MVrdq2yBI9Q==) password: ENC(dc0+G3VP0z9eZQ+vZZg49KFbrCubCsQj) - driver-class-name: com.mysql.cj.jdbc.Driver \ No newline at end of file + driver-class-name: com.mysql.cj.jdbc.Driver +log: + config: + path: /var/log/app + filename: app-dev + maxHistory: 3 # 3일 + totalSizeCap: 50MB # 로그 파일 사이즈 \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index fb00f58..e1788ef 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -55,4 +55,4 @@ spring: --- spring: profiles: - active: local + active: local \ No newline at end of file diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..ae5e0fa --- /dev/null +++ b/src/main/resources/logback-spring.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + + + + + + + ${LOG_PATH}/${LOG_FILE_NAME}.log + + + ${FILE_LOG_PATTERN} + + + + ${LOG_PATH}/${LOG_FILE_NAME}.%d{yyyy-MM-dd}.log + ${LOG_MAX_HISTORY} + ${LOG_TOTAL_SIZE_CAP} + + + + + + + + + + + + + + + + + \ No newline at end of file