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

Perf: 검색 & 필터 기능 최적화 #72

Merged
merged 8 commits into from
Dec 2, 2024
24 changes: 22 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,12 @@ dependencies {

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'

implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"

implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0'

implementation 'com.mysql:mysql-connector-j'
Expand All @@ -41,11 +47,10 @@ dependencies {
implementation 'io.micrometer:micrometer-registry-prometheus'

compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'

runtimeOnly 'com.mysql:mysql-connector-j'

annotationProcessor 'org.projectlombok:lombok'

testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'

Expand All @@ -64,6 +69,21 @@ tasks.register('copySecret', Copy) {
into './src/main/resources'
}

def generated = 'src/main/generated'

tasks.withType(JavaCompile).configureEach {
options.generatedSourceOutputDirectory = file(generated)
}

sourceSets {
main.java.srcDirs += [ generated ]
}

clean {
delete file(generated)
}


tasks.named("jar") {
enabled = false;
}
39 changes: 39 additions & 0 deletions src/main/generated/matal/bookmark/domain/QBaseTimeEntity.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package matal.bookmark.domain;

import static com.querydsl.core.types.PathMetadataFactory.*;

import com.querydsl.core.types.dsl.*;

import com.querydsl.core.types.PathMetadata;
import javax.annotation.processing.Generated;
import com.querydsl.core.types.Path;


/**
* QBaseTimeEntity is a Querydsl query type for BaseTimeEntity
*/
@Generated("com.querydsl.codegen.DefaultSupertypeSerializer")
public class QBaseTimeEntity extends EntityPathBase<BaseTimeEntity> {

private static final long serialVersionUID = -869513386L;

public static final QBaseTimeEntity baseTimeEntity = new QBaseTimeEntity("baseTimeEntity");

public final DateTimePath<java.time.LocalDateTime> createdDate = createDateTime("createdDate", java.time.LocalDateTime.class);

public final DateTimePath<java.time.LocalDateTime> modifiedDate = createDateTime("modifiedDate", java.time.LocalDateTime.class);

public QBaseTimeEntity(String variable) {
super(BaseTimeEntity.class, forVariable(variable));
}

public QBaseTimeEntity(Path<? extends BaseTimeEntity> path) {
super(path.getType(), path.getMetadata());
}

public QBaseTimeEntity(PathMetadata metadata) {
super(BaseTimeEntity.class, metadata);
}

}

62 changes: 62 additions & 0 deletions src/main/generated/matal/bookmark/domain/QBookmark.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package matal.bookmark.domain;

import static com.querydsl.core.types.PathMetadataFactory.*;

import com.querydsl.core.types.dsl.*;

import com.querydsl.core.types.PathMetadata;
import javax.annotation.processing.Generated;
import com.querydsl.core.types.Path;
import com.querydsl.core.types.dsl.PathInits;


/**
* QBookmark is a Querydsl query type for Bookmark
*/
@Generated("com.querydsl.codegen.DefaultEntitySerializer")
public class QBookmark extends EntityPathBase<Bookmark> {

private static final long serialVersionUID = -1958618741L;

private static final PathInits INITS = PathInits.DIRECT2;

public static final QBookmark bookmark = new QBookmark("bookmark");

public final QBaseTimeEntity _super = new QBaseTimeEntity(this);

public final NumberPath<Long> bookmarkId = createNumber("bookmarkId", Long.class);

//inherited
public final DateTimePath<java.time.LocalDateTime> createdDate = _super.createdDate;

public final matal.member.domain.QMember member;

//inherited
public final DateTimePath<java.time.LocalDateTime> modifiedDate = _super.modifiedDate;

public final matal.store.domain.QStore store;

public QBookmark(String variable) {
this(Bookmark.class, forVariable(variable), INITS);
}

public QBookmark(Path<? extends Bookmark> path) {
this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS));
}

public QBookmark(PathMetadata metadata) {
this(metadata, PathInits.getFor(metadata, INITS));
}

public QBookmark(PathMetadata metadata, PathInits inits) {
this(Bookmark.class, metadata, inits);
}

public QBookmark(Class<? extends Bookmark> type, PathMetadata metadata, PathInits inits) {
super(type, metadata, inits);
this.member = inits.isInitialized("member") ? new matal.member.domain.QMember(forProperty("member")) : null;
this.store = inits.isInitialized("store") ? new matal.store.domain.QStore(forProperty("store")) : null;
}

}

45 changes: 45 additions & 0 deletions src/main/generated/matal/member/domain/QMember.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package matal.member.domain;

import static com.querydsl.core.types.PathMetadataFactory.*;

import com.querydsl.core.types.dsl.*;

import com.querydsl.core.types.PathMetadata;
import javax.annotation.processing.Generated;
import com.querydsl.core.types.Path;


/**
* QMember is a Querydsl query type for Member
*/
@Generated("com.querydsl.codegen.DefaultEntitySerializer")
public class QMember extends EntityPathBase<Member> {

private static final long serialVersionUID = 341805907L;

public static final QMember member = new QMember("member1");

public final StringPath email = createString("email");

public final NumberPath<Long> id = createNumber("id", Long.class);

public final StringPath nickname = createString("nickname");

public final StringPath password = createString("password");

public final EnumPath<Role> role = createEnum("role", Role.class);

public QMember(String variable) {
super(Member.class, forVariable(variable));
}

public QMember(Path<? extends Member> path) {
super(path.getType(), path.getMetadata());
}

public QMember(PathMetadata metadata) {
super(Member.class, metadata);
}

}

91 changes: 91 additions & 0 deletions src/main/generated/matal/store/domain/QStore.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package matal.store.domain;

import static com.querydsl.core.types.PathMetadataFactory.*;

import com.querydsl.core.types.dsl.*;

import com.querydsl.core.types.PathMetadata;
import javax.annotation.processing.Generated;
import com.querydsl.core.types.Path;


/**
* QStore is a Querydsl query type for Store
*/
@Generated("com.querydsl.codegen.DefaultEntitySerializer")
public class QStore extends EntityPathBase<Store> {

private static final long serialVersionUID = -524743609L;

public static final QStore store = new QStore("store");

public final StringPath address = createString("address");

public final StringPath businessHours = createString("businessHours");

public final StringPath category = createString("category");

public final StringPath imageUrls = createString("imageUrls");

public final BooleanPath isParking = createBoolean("isParking");

public final BooleanPath isPetFriendly = createBoolean("isPetFriendly");

public final BooleanPath isSoloDining = createBoolean("isSoloDining");

public final BooleanPath isWaiting = createBoolean("isWaiting");

public final StringPath keyword = createString("keyword");

public final NumberPath<Double> latitude = createNumber("latitude", Double.class);

public final NumberPath<Double> longitude = createNumber("longitude", Double.class);

public final StringPath mainMenu = createString("mainMenu");

public final StringPath name = createString("name");

public final StringPath nearbyStation = createString("nearbyStation");

public final StringPath negativeKeywords = createString("negativeKeywords");

public final NumberPath<Double> negativeRatio = createNumber("negativeRatio", Double.class);

public final NumberPath<Double> neutralRatio = createNumber("neutralRatio", Double.class);

public final StringPath parkingTip = createString("parkingTip");

public final StringPath phone = createString("phone");

public final StringPath positiveKeywords = createString("positiveKeywords");

public final NumberPath<Double> positiveRatio = createNumber("positiveRatio", Double.class);

public final NumberPath<Double> rating = createNumber("rating", Double.class);

public final StringPath recommendedMenu = createString("recommendedMenu");

public final NumberPath<Long> reviewsCount = createNumber("reviewsCount", Long.class);

public final StringPath reviewSummary = createString("reviewSummary");

public final NumberPath<Long> storeId = createNumber("storeId", Long.class);

public final StringPath storeLink = createString("storeLink");

public final StringPath waitingTip = createString("waitingTip");

public QStore(String variable) {
super(Store.class, forVariable(variable));
}

public QStore(Path<? extends Store> path) {
super(path.getType(), path.getMetadata());
}

public QStore(PathMetadata metadata) {
super(Store.class, metadata);
}

}

21 changes: 21 additions & 0 deletions src/main/java/matal/global/config/QueryDslConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package matal.global.config;

import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class QueryDslConfig {

private final EntityManager entityManager;

public QueryDslConfig(EntityManager entityManager) {
this.entityManager = entityManager;
}

@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(entityManager);
}
}
14 changes: 10 additions & 4 deletions src/main/java/matal/store/controller/StoreController.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,11 @@
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import java.util.List;
import lombok.RequiredArgsConstructor;
import matal.global.exception.BadRequestException;
import matal.global.exception.ErrorResponse;
import matal.global.exception.ResponseCode;
import matal.store.dto.RestPage;
import matal.store.dto.request.StoreSearchFilterRequestDto;
import matal.store.dto.response.StoreListResponseDto;
Expand Down Expand Up @@ -61,9 +64,12 @@ public ResponseEntity<StoreResponseDto> getStoreDetail(@PathVariable Long id) {
})
public ResponseEntity<RestPage<StoreListResponseDto>> getStoreAll(
@RequestParam(name = "page", defaultValue = "0") int page,
@RequestParam(name = "orderByRating", required = false) String orderByRating,
@RequestParam(name = "orderByPositiveRatio", required = false) String orderByPositiveRatio) {
RestPage<StoreListResponseDto> storeListResponse = storeService.findAll(page, orderByRating, orderByPositiveRatio);
@RequestParam(name = "sortTarget", required = false, defaultValue = "rating") String sortTarget) {

List<String> validaString = List.of("rating", "positive_ratio");
if(!validaString.contains(sortTarget))
throw new BadRequestException(ResponseCode.STORE_BAD_REQUEST);
RestPage<StoreListResponseDto> storeListResponse = storeService.findAll(page, sortTarget);
return ResponseEntity.ok().body(storeListResponse);
}

Expand All @@ -75,7 +81,7 @@ public ResponseEntity<RestPage<StoreListResponseDto>> getStoreAll(
@ApiResponse(responseCode = "404", description = "실패"),
})
private ResponseEntity<RestPage<StoreListResponseDto>> getStoreTop() {
RestPage<StoreListResponseDto> storeListResponse = storeService.findTop();
RestPage<StoreListResponseDto> storeListResponse = storeService.findTop10Stores();
return ResponseEntity.ok().body(storeListResponse);
}
}
Loading