[더미 데이터]

INSERT IGNORE INTO region (id, name, created_at, updated_at)
VALUES (1, '서울', NOW(), NOW()),
(2, '부산', NOW(), NOW()),
(3, '인천', NOW(), NOW());

INSERT IGNORE INTO store (id, name, address, score, region_id, created_at, updated_at)
VALUES (1, 'Store 1', '서울시 서대문구 이화여대길 52', 4.5, 1, NOW(), NOW()),
(2, 'Store 2', '서울시 마포구 연남동', 3.8, 1, NOW(), NOW()),
(3, 'Store 3', '서울시 동작구 흑석동', 2.2, 1, NOW(), NOW()),
(4, '요아정', '서울시 용산구 이태원동', 4.0, 1, NOW(), NOW()),
(5, '요아정', '서울시 서대문구 이화여대길 52', 3.2, 1, NOW(), NOW()),
(6, '요아정', '서울시 강남구 대치동', 4.5, 1, NOW(), NOW());

INSERT IGNORE INTO mission (id, title, store_id, created_at, updated_at)
VALUES (1, 'Store 1-미션 1', 1, NOW(), NOW()),
(2, 'Store 1-미션 2', 1, NOW(), NOW()),
(3, 'Store 2-미션 1', 2, NOW(), NOW()),
(4, 'Store 3-미션 1', 3, NOW(), NOW());

INSERT IGNORE INTO review (id, content, score, store_id, created_at, updated_at)
VALUES (1, '너무 좋아요!', 5.0, 1, NOW(), NOW()),
(2, '분위기 짱~', 3.0, 1, NOW(), NOW()),
(3, '서비스가 좋습니다', 4.8, 2, NOW(), NOW()),
(4, '음식이 맛있고 사장님이 친절해요', 4.5, 3, NOW(), NOW());

INSERT INTO member (id, name, email, address, phone_number, created_at, updated_at)
VALUES (1, '권유민', '[email protected]', '산본', '010-2567-3221', NOW(), NOW());

INSERT INTO member_mission (id, member_id, mission_id, status, created_at, updated_at)
VALUES (1, 1, 1, 'IN_PROGRESS', NOW(), NOW()),
       (2, 1, 2, 'COMPLETED', NOW(), NOW()),
       (3, 1, 3, 'IN_PROGRESS', NOW(), NOW()),
       (4, 1, 4, 'COMPLETED', NOW(), NOW());

[🔥미션 - JPA 및 테이블 구현]

  1. N+1 문제를 해결할 수 있는 여러 가지 다른 방법들에 대해 조사한 후, [ 핵심 키워드 ] 에 정리
  2. 2주차 미션 때 했던 해당 화면들에 대해 작성했던 쿼리를 QueryDSL로 작성하여 리팩토링하기

▪️ 진행중, 진행 완료한 미션 조회 쿼리

@Repository
@RequiredArgsConstructor
public class MissionRepositoryImpl implements MissionRepositoryCustom {		
		
		private final JPAQueryFactory jpaQueryFactory;
    private final QMission mission = QMission.mission;
    private final QStore store = QStore.store;
    private final QMember member = QMember.member;
    private final QMemberMission memberMission = QMemberMission.memberMission;

		//진행중 미션 조회 
    @Override
    public List<Mission> findInProgressMissions(Long memberId, Long cursor) {
        return jpaQueryFactory
                .selectFrom(mission)
                .join(mission.store, store).fetchJoin()
                .join(memberMission).on(memberMission.mission.eq(mission))
                .join(member).on(memberMission.member.eq(member))
                .where(
                        member.id.eq(memberId),
                        memberMission.status.eq(MissionStatus.IN_PROGRESS),
                        mission.id.lt(cursor)
                )
                .orderBy(mission.id.desc())
                .limit(10)
                .fetch();
    }

		//진행완료 미션 조회
    @Override
    public List<Mission> findCompletedMissions(Long memberId, Long cursor) {
        return jpaQueryFactory
                .selectFrom(mission)
                .join(mission.store, store).fetchJoin()
                .join(memberMission).on(memberMission.mission.eq(mission))
                .join(member).on(memberMission.member.eq(member))
                .where(
                        member.id.eq(memberId),
                        memberMission.status.eq(MissionStatus.COMPLETED),
                        mission.id.lt(cursor)
                )
                .orderBy(mission.id.desc())
                .limit(10)
                .fetch();
    }
}

image.png

image.png

▪️ 마이페이지(멤버) 조회 쿼리

@Repository
@RequiredArgsConstructor
public class MemberRepositoryImpl implements MemberRepositoryCustom {

    private final JPAQueryFactory jpaQueryFactory;
    private final QMember member = QMember.member;

    @Override
    public Member findMemberById(Long memberId) {
        return jpaQueryFactory
                .selectFrom(member)
                .where(member.id.eq(memberId))
                .fetchOne();
    }
	}