Skip to content

Commit 90583c6

Browse files
7zrvleebs0521
authored andcommitted
Feature/69 기관 프로필 조회 컨트롤러 구현 (#74)
* feat: 기관 프로필 조회 컨트롤러 구현 - 기관 프로필 조회 엔드포인트를 위한 컨트롤러 구현 - center의 PK값에 columnDefinition = "BINARY(16)" 옵션을 넣어 타입을 더 명시적으로 나타냄 - 테스트 코드 작성및 검증완료 * feat: 기관 프로필 조회 컨트롤러 구현 - 기관 프로필 조회 엔드포인트를 위한 컨트롤러 구현 - center의 PK값에 columnDefinition = "BINARY(16)" 옵션을 넣어 타입을 더 명시적으로 나타냄 - 테스트 코드 작성및 검증완료 * chore: 코드 리뷰 사항 반영 - 예외 메세지 변경 - 컨트롤러와 API 엔드포인트에 스웨거 어노테이션 추가 - 응답 DTO에 스웨거 스키마 추 * fix: 테스트 코드 수정 - CenterQueryApiControllerTest 예외 테스트의 예외 메세지를 수정
1 parent f15bedd commit 90583c6

File tree

6 files changed

+162
-2
lines changed

6 files changed

+162
-2
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.somemore.center.controller;
2+
3+
import com.somemore.center.dto.response.CenterProfileResponseDto;
4+
import com.somemore.center.usecase.query.CenterQueryUseCase;
5+
import com.somemore.global.common.response.ApiResponse;
6+
import io.swagger.v3.oas.annotations.Operation;
7+
import io.swagger.v3.oas.annotations.tags.Tag;
8+
import lombok.RequiredArgsConstructor;
9+
import org.springframework.web.bind.annotation.GetMapping;
10+
import org.springframework.web.bind.annotation.PathVariable;
11+
import org.springframework.web.bind.annotation.RequestMapping;
12+
import org.springframework.web.bind.annotation.RestController;
13+
14+
import java.util.UUID;
15+
16+
@RequiredArgsConstructor
17+
@RestController
18+
@RequestMapping("/api/center")
19+
@Tag(name = "Center Query API", description = "기관 관련 조회 API를 제공합니다.")
20+
public class CenterQueryApiController {
21+
22+
private final CenterQueryUseCase centerQueryUseCase;
23+
24+
@Operation(summary = "기관 프로필 조회 API")
25+
@GetMapping("/profile/{centerId}")
26+
public ApiResponse<CenterProfileResponseDto> getCenterProfile(@PathVariable UUID centerId) {
27+
28+
CenterProfileResponseDto responseDto = centerQueryUseCase.getCenterProfileByCenterId(centerId);
29+
30+
return ApiResponse.ok(200, responseDto, "기관 프로필 조회 성공");
31+
}
32+
}

src/main/java/com/somemore/center/domain/Center.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class Center extends BaseEntity {
1414

1515
@Id
1616
@GeneratedValue(strategy = GenerationType.UUID)
17-
@Column(nullable = false, length = 16)
17+
@Column(nullable = false, columnDefinition = "BINARY(16)")
1818
private UUID id;
1919

2020
@Column(name = "name", nullable = false)

src/main/java/com/somemore/center/dto/response/CenterProfileResponseDto.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.fasterxml.jackson.databind.annotation.JsonNaming;
55
import com.somemore.center.domain.Center;
66
import com.somemore.center.domain.PreferItem;
7+
import io.swagger.v3.oas.annotations.media.Schema;
78
import lombok.Builder;
89

910
import java.util.List;
@@ -12,12 +13,25 @@
1213
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
1314
@Builder
1415
public record CenterProfileResponseDto(
16+
@Schema(description = "센터 ID", example = "123e4567-e89b-12d3-a456-426614174000")
1517
UUID centerId,
18+
19+
@Schema(description = "센터 이름", example = "서울 도서관")
1620
String name,
21+
22+
@Schema(description = "연락처", example = "010-1234-5678")
1723
String contactNumber,
24+
25+
@Schema(description = "센터 이미지 URL", example = "https://example.com/images/center.jpg")
1826
String imgUrl,
27+
28+
@Schema(description = "센터 소개", example = "저희 도서관은 유명해요")
1929
String introduce,
30+
31+
@Schema(description = "센터 홈페이지 링크", example = "https://fitnesscenter.com")
2032
String homepageLink,
33+
34+
@Schema(description = "선호 물품 리스트")
2135
List<PreferItemResponseDto> preferItems
2236
) {
2337
public static CenterProfileResponseDto of(Center center, List<PreferItemResponseDto> preferItemDtos) {

src/main/java/com/somemore/global/exception/ExceptionMessage.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
@Getter
99
public enum ExceptionMessage {
1010

11-
NOT_EXISTS_CENTER("존재하지 않는 기관 ID 입니다."),
11+
NOT_EXISTS_CENTER("존재하지 않는 기관 입니다."),
1212
NOT_EXISTS_COMMUNITY_BOARD("존재하지 않는 게시글 입니다."),
1313
UNAUTHORIZED_COMMUNITY_BOARD("해당 게시글에 권한이 없습니다."),
1414
NOT_EXISTS_COMMUNITY_COMMENT("존재하지 않는 댓글 입니다."),
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.somemore;
2+
3+
4+
import com.fasterxml.jackson.databind.ObjectMapper;
5+
import org.springframework.beans.factory.annotation.Autowired;
6+
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
7+
import org.springframework.boot.test.context.SpringBootTest;
8+
import org.springframework.test.context.ActiveProfiles;
9+
import org.springframework.test.web.servlet.MockMvc;
10+
11+
@ActiveProfiles("test")
12+
@SpringBootTest
13+
@AutoConfigureMockMvc
14+
public abstract class ControllerTestSupport {
15+
16+
@Autowired
17+
protected MockMvc mockMvc;
18+
19+
@Autowired
20+
protected ObjectMapper objectMapper;
21+
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package com.somemore.center.controller;
2+
3+
import com.somemore.ControllerTestSupport;
4+
import com.somemore.center.dto.response.CenterProfileResponseDto;
5+
import com.somemore.center.usecase.query.CenterQueryUseCase;
6+
import com.somemore.global.exception.BadRequestException;
7+
import org.junit.jupiter.api.BeforeEach;
8+
import org.junit.jupiter.api.DisplayName;
9+
import org.junit.jupiter.api.Test;
10+
import org.springframework.boot.test.mock.mockito.MockBean;
11+
import org.springframework.http.MediaType;
12+
13+
import java.util.List;
14+
import java.util.UUID;
15+
16+
import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_CENTER;
17+
import static org.mockito.Mockito.*;
18+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
19+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
20+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
21+
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
22+
23+
class CenterQueryApiControllerTest extends ControllerTestSupport {
24+
25+
@MockBean
26+
protected CenterQueryUseCase centerQueryUseCase;
27+
28+
private UUID centerId;
29+
private CenterProfileResponseDto responseDto;
30+
31+
@BeforeEach
32+
void setUp() {
33+
centerId = UUID.randomUUID();
34+
responseDto = CenterProfileResponseDto.builder()
35+
.centerId(centerId)
36+
.name("Test Center")
37+
.contactNumber("010-1234-5678")
38+
.imgUrl("http://example.com/image.jpg")
39+
.introduce("This is a test center.")
40+
.homepageLink("http://example.com")
41+
.preferItems(List.of())
42+
.build();
43+
}
44+
45+
@DisplayName("기관 ID로 기관 프로필을 조회할 수 있다. (controller)")
46+
@Test
47+
void getCenterProfile() throws Exception {
48+
// given
49+
when(centerQueryUseCase.getCenterProfileByCenterId(centerId)).thenReturn(responseDto);
50+
51+
// when // then
52+
mockMvc.perform(
53+
get("/api/center/profile/{centerId}", centerId)
54+
.contentType(MediaType.APPLICATION_JSON)
55+
)
56+
.andDo(print())
57+
.andExpect(status().isOk())
58+
.andExpect(jsonPath("$.code").value("200"))
59+
.andExpect(jsonPath("$.message").value("기관 프로필 조회 성공"))
60+
.andExpect(jsonPath("$.data.center_id").value(centerId.toString())) // center_id로 수정
61+
.andExpect(jsonPath("$.data.name").value("Test Center"))
62+
.andExpect(jsonPath("$.data.contact_number").value("010-1234-5678")) // contact_number로 수정
63+
.andExpect(jsonPath("$.data.img_url").value("http://example.com/image.jpg")) // img_url로 수정
64+
.andExpect(jsonPath("$.data.introduce").value("This is a test center."))
65+
.andExpect(jsonPath("$.data.homepage_link").value("http://example.com")) // homepage_link로 수정
66+
.andExpect(jsonPath("$.data.prefer_items").isArray()); // prefer_items로 수정
67+
68+
verify(centerQueryUseCase, times(1)).getCenterProfileByCenterId(centerId);
69+
}
70+
71+
@DisplayName("존재하지 않는 기관 ID로 조회 시 예외가 발생한다. (controller)")
72+
@Test
73+
void getCenterProfile_NotFound() throws Exception {
74+
// given
75+
UUID nonExistentCenterId = UUID.randomUUID();
76+
when(centerQueryUseCase.getCenterProfileByCenterId(nonExistentCenterId))
77+
.thenThrow(new BadRequestException(NOT_EXISTS_CENTER.getMessage()));
78+
79+
// when // then
80+
mockMvc.perform(
81+
get("/api/center/profile/{centerId}", nonExistentCenterId)
82+
.contentType(MediaType.APPLICATION_JSON)
83+
)
84+
.andDo(print())
85+
.andExpect(status().isBadRequest())
86+
.andExpect(jsonPath("$.status").value("400"))
87+
.andExpect(jsonPath("$.detail").value("존재하지 않는 기관 입니다."));
88+
89+
verify(centerQueryUseCase, times(1)).getCenterProfileByCenterId(nonExistentCenterId);
90+
}
91+
92+
}
93+

0 commit comments

Comments
 (0)