Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,11 @@ dependencies {
implementation 'org.quartz-scheduler:quartz:2.3.2'
implementation 'org.springframework.boot:spring-boot-starter-quartz'

// query DSL
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
}

tasks.named('test') {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.example.univeus.common.config;

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

@Configuration
public class QueryDslConfig {

@PersistenceContext
private EntityManager entityManager;

@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(entityManager);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Table(indexes = {
@Index(name = "idx_category_id", columnList = "meeting_category, id")
@Index(name = "idx_category_id", columnList = "meeting_category, id DESC")
})
public class MeetingPost extends BaseEntity {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.example.univeus.domain.meeting.repository;

import com.example.univeus.domain.meeting.model.MeetingPost;
import com.example.univeus.domain.meeting.repository.custom.MainPageRepositoryCustom;
import org.springframework.data.jpa.repository.JpaRepository;

public interface MainPageRepository extends JpaRepository<MeetingPost, Long>, MainPageRepositoryCustom {
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.example.univeus.domain.meeting.repository;

import com.example.univeus.domain.meeting.model.MeetingCategory;
import com.example.univeus.domain.meeting.model.MeetingPost;
import jakarta.persistence.LockModeType;
import java.util.List;
Expand Down Expand Up @@ -38,26 +37,4 @@ public interface MeetingPostRepository extends JpaRepository<MeetingPost, Long>

@Deprecated
Page<MeetingPost> findAllByOrderByIdDesc(Pageable pageable);

@Query(
"SELECT p FROM MeetingPost p " +
"WHERE (:category IS NULL OR p.meetingCategory = :category) " +
"ORDER BY p.id DESC"
)
Page<MeetingPost> findByCategoryAndOffset(
@Param("category") MeetingCategory category,
Pageable pageable
);

@Query(
"SELECT p FROM MeetingPost p " +
"WHERE (:category IS NULL OR p.meetingCategory = :category) " +
"AND (:cursorId IS NULL OR p.id < :cursorId) " +
"ORDER BY p.id DESC " +
"LIMIT 20"
)
List<MeetingPost> findByCategoryAndOptionalCursor(
@Param("category") MeetingCategory category,
@Param("cursorId") Long cursorId
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.example.univeus.domain.meeting.repository.custom;

import com.example.univeus.domain.meeting.model.MeetingCategory;
import com.example.univeus.domain.meeting.model.MeetingPost;
import java.util.List;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

public interface MainPageRepositoryCustom {
List<MeetingPost> findByCategoryAndOptionalCursor(MeetingCategory category, Long cursorId);

Page<MeetingPost> findByCategoryAndOffset(MeetingCategory category, Pageable pageable);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package com.example.univeus.domain.meeting.repository.custom;

import static com.example.univeus.domain.meeting.model.QMeetingPost.meetingPost;

import com.example.univeus.domain.meeting.model.MeetingCategory;
import com.example.univeus.domain.meeting.model.MeetingPost;
import com.querydsl.core.BooleanBuilder;
import com.querydsl.jpa.impl.JPAQueryFactory;
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.stereotype.Repository;

@Repository
@RequiredArgsConstructor
public class MainPageRepositoryCustomImpl implements MainPageRepositoryCustom {
private final JPAQueryFactory queryFactory;

@Override
public List<MeetingPost> findByCategoryAndOptionalCursor(MeetingCategory category, Long cursorId) {
BooleanBuilder builder = new BooleanBuilder();

if (category != null) {
builder.and(meetingPost.meetingCategory.eq(category));
}

if (cursorId != null) {
builder.and(meetingPost.id.lt(cursorId));
}

return queryFactory
.selectFrom(meetingPost)
.where(builder)
.orderBy(meetingPost.id.desc())
.limit(20)
.fetch();
}

@Override
public Page<MeetingPost> findByCategoryAndOffset(
MeetingCategory category,
Pageable pageable
) {
BooleanBuilder builder = new BooleanBuilder();

if (category != null) {
builder.and(meetingPost.meetingCategory.eq(category));
}

List<MeetingPost> content = queryFactory
.selectFrom(meetingPost)
.where(builder)
.orderBy(meetingPost.id.desc())
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.fetch();

long total = queryFactory
.select(meetingPost.count())
.from(meetingPost)
.where(builder)
.stream().count();

return new PageImpl<>(content, pageable, total);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

import com.example.univeus.domain.meeting.model.MeetingCategory;
import com.example.univeus.domain.meeting.model.MeetingPost;
import com.example.univeus.domain.meeting.repository.MeetingPostRepository;
import com.example.univeus.domain.meeting.repository.MainPageRepository;
import com.example.univeus.domain.meeting.service.dto.mapper.MainPageMapper;
import com.example.univeus.presentation.meeting.dto.response.MainPageResponse.MainPageDetail;
import java.util.List;
Expand All @@ -18,11 +18,11 @@
@RequiredArgsConstructor
public class MainPageServiceImpl implements MainPageService {
private static final Integer SIZE = 20;
private final MeetingPostRepository meetingPostRepository;
private final MainPageRepository mainPageRepository;

@Override
public MainPage getMainPage(Long cursor, MeetingCategory meetingCategory) {
List<MeetingPost> meetingPosts = meetingPostRepository.findByCategoryAndOptionalCursor(meetingCategory,
List<MeetingPost> meetingPosts = mainPageRepository.findByCategoryAndOptionalCursor(meetingCategory,
cursor);

List<MainPageDetail> mainPages = meetingPosts.stream().map(MainPageMapper::toMainPageDetail).toList();
Expand All @@ -40,7 +40,7 @@ public MainPage getMainPageOffset(String category, int page) {
Pageable pageable = PageRequest.of(page, SIZE);
MeetingCategory meetingCategory = (!category.equals("none")) ? MeetingCategory.of(category) : null;

Page<MeetingPost> meetingPostPage = meetingPostRepository.findByCategoryAndOffset(meetingCategory, pageable);
Page<MeetingPost> meetingPostPage = mainPageRepository.findByCategoryAndOffset(meetingCategory, pageable);
List<MainPageDetail> mainPages = meetingPostPage.stream().map(MainPageMapper::toMainPageDetail).toList();

boolean hasNext = meetingPostPage.hasNext();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package com.example.univeus.domain.meeting.service.dto.mapper;

import com.example.univeus.domain.meeting.model.MeetingPost;
import com.example.univeus.domain.meeting.model.MeetingPostImage;
import com.example.univeus.domain.member.model.Member;
import com.example.univeus.presentation.meeting.dto.response.MainPageResponse.MainPageDetail;
import com.example.univeus.presentation.member.dto.request.MemberDto.Profile;
import java.util.List;

public class MainPageMapper {

Expand All @@ -13,6 +15,13 @@ public static MainPageDetail toMainPageDetail(MeetingPost meetingPost) {
writer.getNickname(), writer.getDepartment().getDepartment(),
writer.getGender().getGender(), writer.getStudentId());

List<MeetingPostImage> images = meetingPost.getImages();
String thumbNail = "none";

if (images.size() != 0) {
thumbNail = images.get(0).getUri();
}

return new MainPageDetail(
meetingPost.getTitle(),
meetingPost.getJoinLimit(),
Expand All @@ -21,6 +30,7 @@ public static MainPageDetail toMainPageDetail(MeetingPost meetingPost) {
meetingPost.getPostDeadLine().getPostDeadline(),
meetingPost.getMeetingSchedule().getMeetingSchedule(),
meetingPost.getMeetingCategory(),
profile);
profile,
thumbNail);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@ public record MainPageDetail(
LocalDateTime postDeadline,
LocalDateTime meetingSchedule,
MeetingCategory meetingCategory,
MemberDto.Profile writer
MemberDto.Profile writer,

String thumbNail
) {
}
}
45 changes: 45 additions & 0 deletions src/test/java/com/example/univeus/common/QueryDslTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.example.univeus.common;

import com.example.univeus.domain.member.model.Member;
import com.example.univeus.domain.member.model.QMember;
import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.transaction.annotation.Transactional;

@SpringBootTest
@Transactional
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
public class QueryDslTest {

@Autowired
EntityManager em;


@Test
void queryDsl_테스트() {
// given
Member member = new Member(
null,
"testEmail",
null,
null,
null,
null,
null,
null
);

em.persist(member);
JPAQueryFactory query = new JPAQueryFactory(em);
QMember qMember = QMember.member;

Member findMember = query.selectFrom(qMember).fetchFirst();

Assertions.assertThat(findMember).isEqualTo(member);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import static org.junit.jupiter.api.Assertions.*;

import com.example.univeus.common.QueryDslTest;
import com.example.univeus.common.config.QueryDslConfig;
import com.example.univeus.domain.auth.model.RefreshToken;
import com.example.univeus.domain.member.model.Department;
import com.example.univeus.domain.member.model.Gender;
Expand All @@ -11,8 +13,10 @@
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.context.annotation.Import;

@DataJpaTest
@Import(QueryDslConfig.class)
class RefreshTokenRepositoryTest {

@Autowired
Expand Down