Skip to content

Commit bbc5826

Browse files
committed
Enable JPA auditing and add member-related improvements
Moved @EnableJpaAuditing to a dedicated configuration class for clarity. Updated the `MemberResponse` class to use a `from` method with protected access for the constructor. Added unit tests for `MemberRestController` to validate member retrieval by code.
1 parent 8ccdcfb commit bbc5826

File tree

5 files changed

+66
-6
lines changed

5 files changed

+66
-6
lines changed

spring-boot/src/main/java/com/mpc/springboot/Application.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import org.springframework.boot.autoconfigure.SpringBootApplication;
55
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
66

7-
@EnableJpaAuditing
87
@SpringBootApplication
98
public class Application {
109

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.mpc.springboot.config.audit;
2+
3+
import org.springframework.context.annotation.Configuration;
4+
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
5+
6+
@EnableJpaAuditing
7+
@Configuration
8+
public class AuditingConfiguration {
9+
}

spring-boot/src/main/java/com/mpc/springboot/member/application/dto/MemberResponse.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,15 @@
33
import com.mpc.springboot.member.domain.entity.Member;
44
import com.mpc.springboot.member.domain.vo.MemberCode;
55
import com.mpc.springboot.member.domain.vo.MemberName;
6-
import lombok.Getter;
7-
import lombok.RequiredArgsConstructor;
6+
import lombok.*;
87

98
@Getter
10-
@RequiredArgsConstructor
9+
@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
1110
public class MemberResponse {
1211
private final MemberCode code;
1312
private final MemberName name;
1413

15-
public static MemberResponse of(Member member) {
14+
public static MemberResponse from(Member member) {
1615
return new MemberResponse(member.getCode(), member.getName());
1716
}
1817
}

spring-boot/src/main/java/com/mpc/springboot/member/application/service/MemberService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public class MemberService {
1919
public MemberResponse getMemberBy(MemberCode code) {
2020
Member member = memberRepository.findMemberBy(code)
2121
.orElseThrow(MemberNotFoundException::new);
22-
return MemberResponse.of(member);
22+
return MemberResponse.from(member);
2323
}
2424

2525
@Transactional
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.mpc.springboot.member.presentation.controller;
2+
3+
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
4+
import org.springframework.test.context.bean.override.mockito.MockitoBean;
5+
import com.mpc.springboot.member.application.dto.MemberResponse;
6+
import com.mpc.springboot.member.application.service.MemberService;
7+
import com.mpc.springboot.member.domain.entity.Member;
8+
import com.mpc.springboot.member.domain.repository.MemberRepository;
9+
import com.mpc.springboot.member.domain.vo.MemberCode;
10+
import com.mpc.springboot.member.domain.vo.MemberName;
11+
import com.mpc.springboot.shared.AbstractControllerTest;
12+
import org.junit.jupiter.api.DisplayName;
13+
import org.junit.jupiter.api.Test;
14+
15+
import static org.mockito.ArgumentMatchers.any;
16+
import static org.mockito.BDDMockito.given;
17+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
18+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
19+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
20+
21+
@WebMvcTest(MemberRestController.class)
22+
class MemberRestControllerTest extends AbstractControllerTest {
23+
24+
@MockitoBean
25+
private MemberService memberService;
26+
27+
/**
28+
* @see MemberRestController#getMemberBy(MemberCode)
29+
*/
30+
@DisplayName("회원 조회: 회원 코드로 조회")
31+
@Test
32+
void getMemberBy() throws Exception {
33+
// given
34+
MemberCode code = MemberCode.of("M0000003");
35+
MemberName name = MemberName.of("John", "Doe");
36+
Member member = Member.of(code, name);
37+
MemberResponse memberResponse = MemberResponse.from(member);
38+
given(memberService.getMemberBy(any())).willReturn(memberResponse);
39+
40+
// when & then
41+
mockMvc.perform(get("/api/v1/members/{code}", code.getValue()))
42+
.andExpect(status().isOk())
43+
.andExpect(jsonPath("$.code.value").value(code.getValue()))
44+
.andExpect(jsonPath("$.name.firstName").value(name.getFirstName()))
45+
.andExpect(jsonPath("$.name.lastName").value(name.getLastName()))
46+
.andExpect(jsonPath("$.name.fullName").value(name.getFullName()));
47+
48+
}
49+
50+
@Test
51+
void createMember() {
52+
}
53+
}

0 commit comments

Comments
 (0)