From e95e9526de74e836426b920408da24d878a74147 Mon Sep 17 00:00:00 2001 From: jaejae-yoo Date: Mon, 8 Aug 2022 19:03:25 +0900 Subject: [PATCH 1/6] =?UTF-8?q?refactor:=20=EC=8A=A4=ED=84=B0=EB=94=94=20I?= =?UTF-8?q?D=EA=B0=80=20=EB=B9=84=EC=96=B4=EC=9E=88=EB=8A=94=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0,=20findStudyOwnerWithTags=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=EC=97=90=EC=84=9C=20=EB=B9=88=20Map=EC=9D=84=20?= =?UTF-8?q?=EB=B0=94=EB=A1=9C=20=EB=B0=98=ED=99=98=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/woowacourse/moamoa/study/query/MyStudyDao.java | 5 +++++ .../woowacourse/moamoa/study/query/MyStudyDaoTest.java | 10 ++++++++++ 2 files changed, 15 insertions(+) diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/query/MyStudyDao.java b/backend/src/main/java/com/woowacourse/moamoa/study/query/MyStudyDao.java index f46f5c86a..9222fead6 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/query/MyStudyDao.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/query/MyStudyDao.java @@ -7,6 +7,7 @@ import com.woowacourse.moamoa.tag.query.response.TagSummaryData; import java.util.ArrayList; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -75,6 +76,10 @@ public List findMyStudyByMemberId(Long id) { } public Map findStudyOwnerWithTags(List studyIds) { + if (studyIds.isEmpty()) { + return new HashMap<>(); + } + List ids = studyIds.stream() .map(Object::toString) .collect(Collectors.toList()); diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/query/MyStudyDaoTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/query/MyStudyDaoTest.java index 38de2a52f..cbce59214 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/query/MyStudyDaoTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/query/MyStudyDaoTest.java @@ -4,6 +4,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; +import com.woowacourse.moamoa.study.query.data.StudyOwnerAndTagsData; import java.util.List; import com.woowacourse.moamoa.common.RepositoryTest; @@ -11,6 +12,7 @@ import java.time.LocalDateTime; +import java.util.Map; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -100,4 +102,12 @@ void getMyStudies() { tuple("React 스터디", PREPARE, 4, 5, "2021-11-10", "2021-12-08") ); } + + @DisplayName("스터디 ID가 비어있을 경우, 스터디 방장과 Tags의 빈 맵을 반환한다.") + @Test + void findStudyOwnerWithTags() { + final Map studyOwnerWithTags = myStudyDao.findStudyOwnerWithTags(List.of()); + + assertThat(studyOwnerWithTags.size()).isZero(); + } } From 53e801a302d6d67dedfa4a3d0583a904498edcf2 Mon Sep 17 00:00:00 2001 From: jaejae-yoo Date: Tue, 9 Aug 2022 00:00:21 +0900 Subject: [PATCH 2/6] =?UTF-8?q?fix:=20=EC=8A=A4=ED=84=B0=EB=94=94=EC=97=90?= =?UTF-8?q?=20=ED=83=9C=EA=B7=B8=EA=B0=80=20=EC=97=86=EB=8A=94=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20=EB=B0=9C=EC=83=9D=ED=96=88=EB=8D=98=20NPE=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moamoa/study/query/MyStudyDao.java | 50 +++++++++++++++---- .../moamoa/study/service/MyStudyService.java | 18 ++++++- .../tag/query/response/TagSummaryData.java | 2 + .../moamoa/study/query/MyStudyDaoTest.java | 19 +++++-- .../study/service/MyStudyServiceTest.java | 40 +++++++++++++-- 5 files changed, 107 insertions(+), 22 deletions(-) diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/query/MyStudyDao.java b/backend/src/main/java/com/woowacourse/moamoa/study/query/MyStudyDao.java index 9222fead6..4eab523bb 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/query/MyStudyDao.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/query/MyStudyDao.java @@ -3,7 +3,6 @@ import com.woowacourse.moamoa.member.query.data.MemberData; import com.woowacourse.moamoa.study.domain.StudyStatus; import com.woowacourse.moamoa.study.query.data.MyStudySummaryData; -import com.woowacourse.moamoa.study.query.data.StudyOwnerAndTagsData; import com.woowacourse.moamoa.tag.query.response.TagSummaryData; import java.util.ArrayList; @@ -41,8 +40,8 @@ public class MyStudyDao { currentMemberCount, maxMemberCount, startDate, endDate); }; - private static final ResultSetExtractor> OWNER_WITH_TAG_ROW_MAPPER = rs -> { - Map result = new LinkedHashMap<>(); + private static final ResultSetExtractor> OWNER_ROW_MAPPER = rs -> { + Map result = new LinkedHashMap<>(); Long studyId; while (rs.next()) { @@ -54,14 +53,26 @@ public class MyStudyDao { String imageUrl = rs.getString("image_url"); String profileUrl = rs.getString("profile_url"); - result.put(studyId, new StudyOwnerAndTagsData(new MemberData(githubId, username, imageUrl, profileUrl), - new ArrayList<>())); + result.put(studyId, new MemberData(githubId, username, imageUrl, profileUrl)); + } + } + return result; + }; + + private static final ResultSetExtractor>> TAG_ROW_MAPPER = rs -> { + Map> result = new LinkedHashMap<>(); + + while (rs.next()) { + Long studyId = rs.getLong("study.id"); + + if (!result.containsKey(studyId)) { + result.put(studyId, new ArrayList<>()); } final Long tagId = rs.getLong("tag.id"); final String tagName = rs.getString("tag.name"); - result.get(studyId) - .addTag(new TagSummaryData(tagId, tagName)); + + result.get(studyId).add(new TagSummaryData(tagId, tagName)); } return result; }; @@ -75,7 +86,7 @@ public List findMyStudyByMemberId(Long id) { return jdbcTemplate.query(sql, Map.of("id", id), MY_STUDY_SUMMARY_ROW_MAPPER); } - public Map findStudyOwnerWithTags(List studyIds) { + public Map findOwners(List studyIds) { if (studyIds.isEmpty()) { return new HashMap<>(); } @@ -86,12 +97,29 @@ public Map findStudyOwnerWithTags(List studyI SqlParameterSource parameters = new MapSqlParameterSource("ids", ids); - String sql = "SELECT study.id, member.github_id, member.username, member.image_url, member.profile_url, tag.id, tag.name " + String sql = "SELECT study.id, member.github_id, member.username, member.image_url, member.profile_url " + "FROM study JOIN member ON member.id = study.owner_id " - + "JOIN study_tag ON study.id = study_tag.study_id " + + "WHERE study.id IN (:ids)"; + + return jdbcTemplate.query(sql, parameters, OWNER_ROW_MAPPER); + } + + public Map> findTags(List studyIds) { + if (studyIds.isEmpty()) { + return new HashMap<>(); + } + + List ids = studyIds.stream() + .map(Object::toString) + .collect(Collectors.toList()); + + SqlParameterSource parameters = new MapSqlParameterSource("ids", ids); + + String sql = "SELECT study.id, tag.id, tag.name " + + "FROM study JOIN study_tag ON study.id = study_tag.study_id " + "JOIN tag ON tag.id = study_tag.tag_id " + "WHERE study.id IN (:ids)"; - return jdbcTemplate.query(sql, parameters, OWNER_WITH_TAG_ROW_MAPPER); + return jdbcTemplate.query(sql, parameters, TAG_ROW_MAPPER); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/service/MyStudyService.java b/backend/src/main/java/com/woowacourse/moamoa/study/service/MyStudyService.java index 684d058a0..c861bfb80 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/service/MyStudyService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/service/MyStudyService.java @@ -2,6 +2,7 @@ import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.member.domain.repository.MemberRepository; +import com.woowacourse.moamoa.member.query.data.MemberData; import com.woowacourse.moamoa.study.domain.Study; import com.woowacourse.moamoa.study.domain.repository.StudyRepository; import com.woowacourse.moamoa.study.query.MyStudyDao; @@ -13,6 +14,8 @@ import com.woowacourse.moamoa.study.query.data.MyStudySummaryData; import com.woowacourse.moamoa.study.service.response.MyStudiesResponse; +import com.woowacourse.moamoa.tag.query.response.TagSummaryData; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -43,9 +46,20 @@ public MyStudiesResponse getStudies(final Long githubId) { .map(MyStudySummaryData::getId) .collect(Collectors.toList()); - final Map studyOwnerWithTags = myStudyDao.findStudyOwnerWithTags(studyIds); + Map ownerWithTags = getOwnerWithTags(studyIds); - return new MyStudiesResponse(mapToResponse(myStudySummaryData, studyOwnerWithTags)); + return new MyStudiesResponse(mapToResponse(myStudySummaryData, ownerWithTags)); + } + + private Map getOwnerWithTags(final List studyIds) { + final Map owners = myStudyDao.findOwners(studyIds); + final Map> tags = myStudyDao.findTags(studyIds); + + Map result = new HashMap<>(); + for (Long id : studyIds) { + result.put(id, new StudyOwnerAndTagsData(owners.get(id), tags.get(id))); + } + return result; } private List mapToResponse(final List myStudySummaryData, diff --git a/backend/src/main/java/com/woowacourse/moamoa/tag/query/response/TagSummaryData.java b/backend/src/main/java/com/woowacourse/moamoa/tag/query/response/TagSummaryData.java index 24dc98745..b98c2a4c9 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/tag/query/response/TagSummaryData.java +++ b/backend/src/main/java/com/woowacourse/moamoa/tag/query/response/TagSummaryData.java @@ -4,11 +4,13 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.ToString; @NoArgsConstructor @AllArgsConstructor @Getter @EqualsAndHashCode +@ToString public class TagSummaryData { private Long id; diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/query/MyStudyDaoTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/query/MyStudyDaoTest.java index cbce59214..ee0ffa388 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/query/MyStudyDaoTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/query/MyStudyDaoTest.java @@ -4,7 +4,8 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; -import com.woowacourse.moamoa.study.query.data.StudyOwnerAndTagsData; +import com.woowacourse.moamoa.member.query.data.MemberData; +import com.woowacourse.moamoa.tag.query.response.TagSummaryData; import java.util.List; import com.woowacourse.moamoa.common.RepositoryTest; @@ -103,11 +104,19 @@ void getMyStudies() { ); } - @DisplayName("스터디 ID가 비어있을 경우, 스터디 방장과 Tags의 빈 맵을 반환한다.") + @DisplayName("스터디 ID가 비어있을 경우, 스터디 방장 빈 맵을 반환한다.") @Test - void findStudyOwnerWithTags() { - final Map studyOwnerWithTags = myStudyDao.findStudyOwnerWithTags(List.of()); + void findStudyOwnersByEmptyStudyId() { + final Map owners = myStudyDao.findOwners(List.of()); - assertThat(studyOwnerWithTags.size()).isZero(); + assertThat(owners.size()).isZero(); + } + + @DisplayName("스터디 ID가 비어있을 경우, 스터디 태그 빈 맵을 반환한다.") + @Test + void findStudyTagsByEmptyStudyId() { + final Map> tags = myStudyDao.findTags(List.of()); + + assertThat(tags.size()).isZero(); } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/service/MyStudyServiceTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/service/MyStudyServiceTest.java index e9d0234f4..fd886d97a 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/service/MyStudyServiceTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/service/MyStudyServiceTest.java @@ -80,7 +80,6 @@ void setUp() { jdbcTemplate.update("INSERT INTO tag(id, name, description, category_id) VALUES (4, 'FE', '프론트엔드', 2)"); jdbcTemplate.update("INSERT INTO tag(id, name, description, category_id) VALUES (5, 'React', '리액트', 3)"); - jdbcTemplate.update("INSERT INTO study_tag(study_id, tag_id) VALUES (1, 1)"); jdbcTemplate.update("INSERT INTO study_tag(study_id, tag_id) VALUES (1, 2)"); jdbcTemplate.update("INSERT INTO study_tag(study_id, tag_id) VALUES (1, 3)"); @@ -94,18 +93,16 @@ void setUp() { jdbcTemplate.update("INSERT INTO study_tag(study_id, tag_id) VALUES (4, 2)"); jdbcTemplate.update("INSERT INTO study_tag(study_id, tag_id) VALUES (4, 3)"); - jdbcTemplate.update("INSERT INTO study_tag(study_id, tag_id) VALUES (7, 2)"); - jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (1, 3)"); jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (1, 4)"); - jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (2, 1)"); jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (2, 2)"); jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (2, 4)"); jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (3, 3)"); jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (3, 4)"); + jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (7, 1)"); jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (7, 2)"); } @@ -150,6 +147,41 @@ void findMyStudies() { assertThat(tags).hasSize(4); } + @DisplayName("태그가 없는 스터디를 조회한다.") + @Test + void findMyStudiesWithoutTags() { + final MyStudiesResponse myStudiesResponse = myStudyService.getStudies(1L); + + final List owners = myStudiesResponse.getStudies() + .stream() + .map(MyStudyResponse::getOwner) + .collect(toList()); + + final List> tags = myStudiesResponse.getStudies() + .stream() + .map(MyStudyResponse::getTags) + .collect(toList()); + + final List studies = myStudiesResponse.getStudies(); + + assertThat(studies) + .hasSize(1) + .filteredOn(study -> study.getId() != null) + .extracting("title", "studyStatus", "currentMemberCount", "maxMemberCount") + .contains( + tuple("OS 스터디", PREPARE, 1, 6) + ); + + assertThat(owners) + .hasSize(1) + .extracting("githubId", "username", "imageUrl", "profileUrl") + .contains( + tuple(4L, "verus", "https://image", "github.com") + ); + + assertThat(tags.get(0)).isNull(); + } + @DisplayName("존재하지 않은 내가 참여한 스터디 조회 시 예외 발생") @Test void getMyStudyNotExistUser() { From 50edfbcb82cc1206942a4ef2d0554fa42f72e4b3 Mon Sep 17 00:00:00 2001 From: jaejae-yoo Date: Tue, 9 Aug 2022 00:39:07 +0900 Subject: [PATCH 3/6] =?UTF-8?q?fix:=20=EB=82=B4=EA=B0=80=20=EC=B0=B8?= =?UTF-8?q?=EC=97=AC=ED=95=9C=20=EC=8A=A4=ED=84=B0=EB=94=94=20JOIN=20?= =?UTF-8?q?=EC=BF=BC=EB=A6=AC=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moamoa/study/query/MyStudyDao.java | 2 +- .../controller/MyStudyControllerTest.java | 36 +++++++++++++------ .../moamoa/study/query/MyStudyDaoTest.java | 7 ++-- 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/query/MyStudyDao.java b/backend/src/main/java/com/woowacourse/moamoa/study/query/MyStudyDao.java index 4eab523bb..0e6db89b7 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/query/MyStudyDao.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/query/MyStudyDao.java @@ -80,7 +80,7 @@ public class MyStudyDao { public List findMyStudyByMemberId(Long id) { String sql = "SELECT DISTINCT study.id, study.title, study.study_status, study.current_member_count, " + "study.max_member_count, study.start_date, study.end_date " - + "FROM study_member JOIN study ON study_member.study_id = study.id " + + "FROM study LEFT JOIN study_member ON study_member.study_id = study.id " + "WHERE study_member.member_id = :id OR study.owner_id = :id"; return jdbcTemplate.query(sql, Map.of("id", id), MY_STUDY_SUMMARY_ROW_MAPPER); diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/controller/MyStudyControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/controller/MyStudyControllerTest.java index 0c751ea63..4e58488ec 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/controller/MyStudyControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/controller/MyStudyControllerTest.java @@ -55,17 +55,23 @@ void setUp() { final LocalDateTime now = LocalDateTime.now(); jdbcTemplate.update("INSERT INTO study(id, title, excerpt, thumbnail, recruitment_status, study_status, description, current_member_count, max_member_count, created_at, start_date, owner_id) " - + "VALUES (1, 'Java 스터디', '자바 설명', 'java thumbnail', 'RECRUITMENT_START', 'PREPARE', '그린론의 우당탕탕 자바 스터디입니다.', 3, 10, '" + now + "', '2021-12-08', 2)"); + + "VALUES (1, 'Java 스터디', '자바 설명', 'java thumbnail', 'RECRUITMENT_START', 'PREPARE', '그린론의 우당탕탕 자바 스터디입니다.', 3, 10, '" + + now + "', '2021-12-08', 2)"); jdbcTemplate.update("INSERT INTO study(id, title, excerpt, thumbnail, recruitment_status, study_status, description, current_member_count, max_member_count, created_at, enrollment_end_date, start_date, end_date, owner_id) " - + "VALUES (2, 'React 스터디', '리액트 설명', 'react thumbnail', 'RECRUITMENT_START', 'PREPARE', '디우의 뤼액트 스터디입니다.', 4, 5, '" + now + "', '2021-11-09', '2021-11-10', '2021-12-08', 3)"); + + "VALUES (2, 'React 스터디', '리액트 설명', 'react thumbnail', 'RECRUITMENT_START', 'PREPARE', '디우의 뤼액트 스터디입니다.', 4, 5, '" + + now + "', '2021-11-09', '2021-11-10', '2021-12-08', 3)"); jdbcTemplate.update("INSERT INTO study(id, title, excerpt, thumbnail, recruitment_status, study_status, description, current_member_count, max_member_count, created_at, start_date, owner_id) " - + "VALUES (3, 'javaScript 스터디', '자바스크립트 설명', 'javascript thumbnail', 'RECRUITMENT_START', 'PREPARE', '그린론의 자바스크립트 접해보기', 3, 20, '" + now + "', '2022-08-03', 2)"); + + "VALUES (3, 'javaScript 스터디', '자바스크립트 설명', 'javascript thumbnail', 'RECRUITMENT_START', 'PREPARE', '그린론의 자바스크립트 접해보기', 3, 20, '" + + now + "', '2022-08-03', 2)"); jdbcTemplate.update("INSERT INTO study(id, title, excerpt, thumbnail, recruitment_status, study_status, description, max_member_count, created_at, start_date, owner_id) " - + "VALUES (4, 'HTTP 스터디', 'HTTP 설명', 'http thumbnail', 'RECRUITMENT_END', 'PREPARE', '디우의 HTTP 정복하기', 5, '" + now + "', '2022-08-03', 3)"); + + "VALUES (4, 'HTTP 스터디', 'HTTP 설명', 'http thumbnail', 'RECRUITMENT_END', 'PREPARE', '디우의 HTTP 정복하기', 5, '" + + now + "', '2022-08-03', 3)"); jdbcTemplate.update("INSERT INTO study(id, title, excerpt, thumbnail, recruitment_status, study_status, description, current_member_count, created_at, owner_id, start_date) " - + "VALUES (5, '알고리즘 스터디', '알고리즘 설명', 'algorithm thumbnail', 'RECRUITMENT_END', 'PREPARE', '알고리즘을 TDD로 풀자의 베루스입니다.', 1, '" + now + "', 4, '2021-12-06')"); + + "VALUES (5, '알고리즘 스터디', '알고리즘 설명', 'algorithm thumbnail', 'RECRUITMENT_END', 'PREPARE', '알고리즘을 TDD로 풀자의 베루스입니다.', 1, '" + + now + "', 4, '2021-12-06')"); jdbcTemplate.update("INSERT INTO study(id, title, excerpt, thumbnail, recruitment_status, study_status, description, current_member_count, created_at, owner_id, start_date, enrollment_end_date, end_date) " - + "VALUES (6, 'Linux 스터디', '리눅스 설명', 'linux thumbnail', 'RECRUITMENT_END', 'PREPARE', 'Linux를 공부하자의 베루스입니다.', 1, '" + now + "', 4, '2021-12-06', '2021-12-07', '2022-01-07')"); + + "VALUES (6, 'Linux 스터디', '리눅스 설명', 'linux thumbnail', 'RECRUITMENT_END', 'PREPARE', 'Linux를 공부하자의 베루스입니다.', 1, '" + + now + "', 4, '2021-12-06', '2021-12-07', '2022-01-07')"); jdbcTemplate.update("INSERT INTO category(id, name) VALUES (1, 'generation')"); jdbcTemplate.update("INSERT INTO category(id, name) VALUES (2, 'area')"); @@ -110,12 +116,14 @@ void getMyStudies() { assertThat(myStudies.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(myStudies.getBody()).isNotNull(); assertThat(myStudies.getBody().getStudies()) - .hasSize(3) + .hasSize(5) .extracting("id", "title", "studyStatus", "currentMemberCount", "maxMemberCount") .containsExactlyElementsOf(List.of( tuple(1L, "Java 스터디", PREPARE, 3, 10), tuple(2L, "React 스터디", PREPARE, 4, 5), - tuple(3L, "javaScript 스터디", PREPARE, 3, 20)) + tuple(3L, "javaScript 스터디", PREPARE, 3, 20), + tuple(5L, "알고리즘 스터디", PREPARE, 1, 0), + tuple(6L, "Linux 스터디", PREPARE, 1, 0)) ); final List owners = myStudies.getBody() @@ -125,13 +133,15 @@ void getMyStudies() { .collect(Collectors.toList()); assertThat(owners) - .hasSize(3) + .hasSize(5) .extracting("githubId", "username", "imageUrl", "profileUrl") .containsExactlyElementsOf(List.of( tuple(2L, "greenlawn", "https://image", "github.com"), tuple(3L, "dwoo", "https://image", "github.com"), - tuple(2L, "greenlawn", "https://image", "github.com")) - ); + tuple(2L, "greenlawn", "https://image", "github.com"), + tuple(4L, "verus", "https://image", "github.com"), + tuple(4L, "verus", "https://image", "github.com") + )); final List> tags = myStudies.getBody() .getStudies() @@ -160,5 +170,9 @@ void getMyStudies() { .extracting("id", "name") .contains(tuple(2L, "4기"), tuple(4L, "FE")); + + assertThat(tags.get(3)).isNull(); + + assertThat(tags.get(4)).isNull(); } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/query/MyStudyDaoTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/query/MyStudyDaoTest.java index ee0ffa388..01a6623d8 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/query/MyStudyDaoTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/query/MyStudyDaoTest.java @@ -51,6 +51,9 @@ void initDataBase() { + "VALUES (5, '알고리즘 스터디', '알고리즘 설명', 'algorithm thumbnail', 'RECRUITMENT_END', 'PREPARE', '알고리즘을 TDD로 풀자의 베루스입니다.', 1, '" + now + "', 4, '2021-12-06')"); jdbcTemplate.update("INSERT INTO study(id, title, excerpt, thumbnail, recruitment_status, study_status, description, current_member_count, created_at, owner_id, start_date, enrollment_end_date, end_date) " + "VALUES (6, 'Linux 스터디', '리눅스 설명', 'linux thumbnail', 'RECRUITMENT_END', 'PREPARE', 'Linux를 공부하자의 베루스입니다.', 1, '" + now + "', 4, '2021-12-06', '2021-12-07', '2022-01-07')"); + jdbcTemplate.update("INSERT INTO study(id, title, excerpt, thumbnail, recruitment_status, study_status, description, current_member_count, created_at, owner_id, start_date, enrollment_end_date, end_date) " + + "VALUES (7, 'OS 스터디', 'OS 설명', 'os thumbnail', 'RECRUITMENT_END', 'PREPARE', 'OS를 공부하자의 그린론입니다.', 1, '" + now + "', 2, '2021-12-06', '2021-12-07', '2022-01-07')"); + jdbcTemplate.update("INSERT INTO category(id, name) VALUES (1, 'generation')"); jdbcTemplate.update("INSERT INTO category(id, name) VALUES (2, 'area')"); @@ -93,14 +96,14 @@ void getMyStudies() { final List studySummaryData = myStudyDao.findMyStudyByMemberId(2L); assertThat(studySummaryData) - .hasSize(3) + .hasSize(4) .filteredOn(myStudySummaryData -> myStudySummaryData.getId() != null) .extracting("title", "studyStatus", "currentMemberCount", "maxMemberCount", "startDate", "endDate") .contains( tuple("Java 스터디", PREPARE, 3, 10, "2021-12-08", null), tuple("javaScript 스터디" ,PREPARE, 3, 20, "2022-08-03", null), tuple("React 스터디", PREPARE, 4, 5, "2021-11-10", "2021-12-08"), - tuple("React 스터디", PREPARE, 4, 5, "2021-11-10", "2021-12-08") + tuple("OS 스터디", PREPARE, 1, 0, "2021-12-06", "2022-01-07") ); } From b40424a99ca9fd4a4a186b73e0f7c04332145d79 Mon Sep 17 00:00:00 2001 From: jaejae-yoo Date: Wed, 10 Aug 2022 10:42:39 +0900 Subject: [PATCH 4/6] =?UTF-8?q?refactor:=20tags=EA=B0=80=20=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20=EB=B9=88=20=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EB=A5=BC=20=EB=B0=98=ED=99=98=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moamoa/study/query/data/StudyOwnerAndTagsData.java | 4 ---- .../moamoa/study/service/MyStudyService.java | 10 ++++++++++ .../moamoa/study/controller/MyStudyControllerTest.java | 4 ++-- .../moamoa/study/service/MyStudyServiceTest.java | 2 +- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/query/data/StudyOwnerAndTagsData.java b/backend/src/main/java/com/woowacourse/moamoa/study/query/data/StudyOwnerAndTagsData.java index d176c4238..9fe08143d 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/query/data/StudyOwnerAndTagsData.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/query/data/StudyOwnerAndTagsData.java @@ -14,8 +14,4 @@ public class StudyOwnerAndTagsData { private MemberData owner; private List tags; - - public void addTag(TagSummaryData tagSummaryData) { - this.tags.add(tagSummaryData); - } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/service/MyStudyService.java b/backend/src/main/java/com/woowacourse/moamoa/study/service/MyStudyService.java index c861bfb80..6037bf18b 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/service/MyStudyService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/service/MyStudyService.java @@ -55,8 +55,18 @@ private Map getOwnerWithTags(final List study final Map owners = myStudyDao.findOwners(studyIds); final Map> tags = myStudyDao.findTags(studyIds); + return mapOwnerWithTags(studyIds, owners, tags); + } + + private Map mapOwnerWithTags(final List studyIds, + final Map owners, + final Map> tags) { Map result = new HashMap<>(); for (Long id : studyIds) { + if (tags.get(id) == null) { + result.put(id, new StudyOwnerAndTagsData(owners.get(id), List.of())); + continue; + } result.put(id, new StudyOwnerAndTagsData(owners.get(id), tags.get(id))); } return result; diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/controller/MyStudyControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/controller/MyStudyControllerTest.java index 4e58488ec..e8dc9abc3 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/controller/MyStudyControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/controller/MyStudyControllerTest.java @@ -171,8 +171,8 @@ void getMyStudies() { .contains(tuple(2L, "4기"), tuple(4L, "FE")); - assertThat(tags.get(3)).isNull(); + assertThat(tags.get(3).size()).isZero(); - assertThat(tags.get(4)).isNull(); + assertThat(tags.get(4).size()).isZero(); } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/service/MyStudyServiceTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/service/MyStudyServiceTest.java index fd886d97a..046127b84 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/service/MyStudyServiceTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/service/MyStudyServiceTest.java @@ -179,7 +179,7 @@ void findMyStudiesWithoutTags() { tuple(4L, "verus", "https://image", "github.com") ); - assertThat(tags.get(0)).isNull(); + assertThat(tags.get(0).size()).isZero(); } @DisplayName("존재하지 않은 내가 참여한 스터디 조회 시 예외 발생") From 63a913016adf8021e4bc8ef07a50c53bd3033615 Mon Sep 17 00:00:00 2001 From: jaejae-yoo Date: Wed, 10 Aug 2022 17:11:09 +0900 Subject: [PATCH 5/6] =?UTF-8?q?refactor:=20tags=20null=EC=9D=B8=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=20=EB=B9=88=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/woowacourse/moamoa/study/query/MyStudyDao.java | 2 +- .../moamoa/study/query/data/MyStudySummaryData.java | 2 ++ .../moamoa/study/service/response/MyStudiesResponse.java | 8 +++++++- .../moamoa/study/service/response/MyStudyResponse.java | 4 ++++ .../test/study/GettingMyStudiesAcceptanceTest.java | 8 +++++--- .../moamoa/study/controller/MyStudyControllerTest.java | 4 ++-- .../woowacourse/moamoa/study/query/MyStudyDaoTest.java | 2 +- 7 files changed, 22 insertions(+), 8 deletions(-) diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/query/MyStudyDao.java b/backend/src/main/java/com/woowacourse/moamoa/study/query/MyStudyDao.java index 0e6db89b7..6779e7f76 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/query/MyStudyDao.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/query/MyStudyDao.java @@ -32,7 +32,7 @@ public class MyStudyDao { final String title = rs.getString("title"); final String studyStatus = rs.getString("study_status"); final int currentMemberCount = rs.getInt("current_member_count"); - final int maxMemberCount = rs.getInt("max_member_count"); + final Integer maxMemberCount = rs.getObject("max_member_count", Integer.class); final String startDate = rs.getString("start_date"); final String endDate = rs.getString("end_date"); diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/query/data/MyStudySummaryData.java b/backend/src/main/java/com/woowacourse/moamoa/study/query/data/MyStudySummaryData.java index 636ae23af..a8aa1acda 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/query/data/MyStudySummaryData.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/query/data/MyStudySummaryData.java @@ -2,11 +2,13 @@ import com.woowacourse.moamoa.study.domain.StudyStatus; import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; @NoArgsConstructor @AllArgsConstructor +@EqualsAndHashCode @Getter public class MyStudySummaryData { diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/service/response/MyStudiesResponse.java b/backend/src/main/java/com/woowacourse/moamoa/study/service/response/MyStudiesResponse.java index c93d39f10..72d5b3678 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/service/response/MyStudiesResponse.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/service/response/MyStudiesResponse.java @@ -2,11 +2,17 @@ import java.util.List; import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.ToString; @AllArgsConstructor +@NoArgsConstructor +@EqualsAndHashCode @Getter +@ToString public class MyStudiesResponse { - private final List studies; + private List studies; } diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/service/response/MyStudyResponse.java b/backend/src/main/java/com/woowacourse/moamoa/study/service/response/MyStudyResponse.java index 56ee8b3a0..6772893d1 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/service/response/MyStudyResponse.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/service/response/MyStudyResponse.java @@ -6,12 +6,16 @@ import com.woowacourse.moamoa.tag.query.response.TagSummaryData; import java.util.List; import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.ToString; @NoArgsConstructor @AllArgsConstructor @Getter +@EqualsAndHashCode +@ToString public class MyStudyResponse { private Long id; diff --git a/backend/src/test/java/com/woowacourse/acceptance/test/study/GettingMyStudiesAcceptanceTest.java b/backend/src/test/java/com/woowacourse/acceptance/test/study/GettingMyStudiesAcceptanceTest.java index 12b8ff32f..0c6dbfb26 100644 --- a/backend/src/test/java/com/woowacourse/acceptance/test/study/GettingMyStudiesAcceptanceTest.java +++ b/backend/src/test/java/com/woowacourse/acceptance/test/study/GettingMyStudiesAcceptanceTest.java @@ -11,10 +11,13 @@ import static com.woowacourse.acceptance.fixture.StudyFixtures.리액트_스터디_제목; import static com.woowacourse.acceptance.fixture.StudyFixtures.자바_스터디_제목; import static com.woowacourse.acceptance.fixture.TagFixtures.BE_태그_ID; +import static com.woowacourse.acceptance.fixture.TagFixtures.BE_태그_설명; +import static com.woowacourse.acceptance.fixture.TagFixtures.BE_태그명; import static com.woowacourse.acceptance.fixture.TagFixtures.리액트_태그_ID; import static com.woowacourse.acceptance.fixture.TagFixtures.리액트_태그_설명; import static com.woowacourse.acceptance.fixture.TagFixtures.자바_태그_ID; import static com.woowacourse.acceptance.fixture.TagFixtures.자바_태그_설명; +import static com.woowacourse.acceptance.fixture.TagFixtures.자바_태그명; import static com.woowacourse.acceptance.steps.LoginSteps.그린론이; import static com.woowacourse.acceptance.steps.LoginSteps.디우가; import static com.woowacourse.moamoa.study.domain.StudyStatus.IN_PROGRESS; @@ -49,7 +52,6 @@ public class GettingMyStudiesAcceptanceTest extends AcceptanceTest { - @Disabled // 그린론이 해결할 버그 관련 인수 테스트 @DisplayName("내가 참여한 스터디를 조회한다.") @Test void getMyStudies() { @@ -75,10 +77,10 @@ void getMyStudies() { new MyStudySummaryData(자바_스터디_ID, 자바_스터디_제목, IN_PROGRESS, 1, null, 지금.toString(), null), new MemberData(그린론_깃허브_ID, 그린론_이름, 그린론_이미지_URL, 그린론_프로필_URL), - List.of(new TagSummaryData(자바_태그_ID, 자바_태그_설명), new TagSummaryData(리액트_태그_ID, 리액트_태그_설명))); + List.of(new TagSummaryData(자바_태그_ID, 자바_태그명), new TagSummaryData(BE_태그_ID, BE_태그명))); MyStudyResponse expectedReact = new MyStudyResponse( - new MyStudySummaryData(리액트_스터디_ID, 리액트_스터디_제목, StudyStatus.PREPARE, 1, + new MyStudySummaryData(리액트_스터디_ID, 리액트_스터디_제목, StudyStatus.PREPARE, 2, null, 지금.plusDays(10).toString(), null), new MemberData(디우_깃허브_ID, 디우_이름, 디우_이미지_URL, 디우_프로필_URL), List.of()); diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/controller/MyStudyControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/controller/MyStudyControllerTest.java index b4584dcb4..6d93be425 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/controller/MyStudyControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/controller/MyStudyControllerTest.java @@ -112,8 +112,8 @@ void getMyStudies() { tuple(1L, "Java 스터디", PREPARE, 3, 10), tuple(2L, "React 스터디", PREPARE, 4, 5), tuple(3L, "javaScript 스터디", PREPARE, 3, 20), - tuple(5L, "알고리즘 스터디", PREPARE, 1, 0), - tuple(6L, "Linux 스터디", PREPARE, 1, 0)) + tuple(5L, "알고리즘 스터디", PREPARE, 1, null), + tuple(6L, "Linux 스터디", PREPARE, 1, null)) ); final List owners = myStudies.getBody() diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/query/MyStudyDaoTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/query/MyStudyDaoTest.java index 608a0a63f..e027cbe9c 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/query/MyStudyDaoTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/query/MyStudyDaoTest.java @@ -93,7 +93,7 @@ void getMyStudies() { tuple("Java 스터디", PREPARE, 3, 10, "2021-12-08", null), tuple("javaScript 스터디" ,PREPARE, 3, 20, "2022-08-03", null), tuple("React 스터디", PREPARE, 4, 5, "2021-11-10", "2021-12-08"), - tuple("OS 스터디", PREPARE, 1, 0, "2021-12-06", "2022-01-07") + tuple("OS 스터디", PREPARE, 1, null, "2021-12-06", "2022-01-07") ); } From a04a51536051eef30d6cbabada2d98dbb7f17dca Mon Sep 17 00:00:00 2001 From: jaejae-yoo Date: Wed, 10 Aug 2022 17:21:15 +0900 Subject: [PATCH 6/6] =?UTF-8?q?refactor:=20ids=20String=20=EB=B3=80?= =?UTF-8?q?=ED=99=98=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/woowacourse/moamoa/study/query/MyStudyDao.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/query/MyStudyDao.java b/backend/src/main/java/com/woowacourse/moamoa/study/query/MyStudyDao.java index 6779e7f76..924bcb3d3 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/query/MyStudyDao.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/query/MyStudyDao.java @@ -91,11 +91,7 @@ public Map findOwners(List studyIds) { return new HashMap<>(); } - List ids = studyIds.stream() - .map(Object::toString) - .collect(Collectors.toList()); - - SqlParameterSource parameters = new MapSqlParameterSource("ids", ids); + SqlParameterSource parameters = new MapSqlParameterSource("ids", studyIds); String sql = "SELECT study.id, member.github_id, member.username, member.image_url, member.profile_url " + "FROM study JOIN member ON member.id = study.owner_id "