From 99546f7d5ed608b44a03a933a3bd401bacb5114a Mon Sep 17 00:00:00 2001 From: ekgns33 Date: Thu, 18 Jul 2024 00:54:32 +0900 Subject: [PATCH 01/13] =?UTF-8?q?feat=20:=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20api=20=EA=B6=8C=ED=95=9C=20=EC=88=98=EC=A0=95,=20?= =?UTF-8?q?=EC=97=94=EB=93=9C=ED=8F=AC=EC=9D=B8=ED=8A=B8=20prefix=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/configs/SecurityConfig.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/gdsc/konkuk/platformcore/global/configs/SecurityConfig.java b/src/main/java/gdsc/konkuk/platformcore/global/configs/SecurityConfig.java index e8ef71d..b93c9d7 100644 --- a/src/main/java/gdsc/konkuk/platformcore/global/configs/SecurityConfig.java +++ b/src/main/java/gdsc/konkuk/platformcore/global/configs/SecurityConfig.java @@ -2,10 +2,9 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; -import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; @@ -22,16 +21,16 @@ public class SecurityConfig { private final CustomAuthenticationSuccessHandler customAuthenticationSuccessHandler; private final CustomAuthenticationFailureHandler customAuthenticationFailureHandler; - + private static final String API_PREFIX = "/api/v1"; @Bean public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception { httpSecurity .addFilterBefore(new SecurityContextPersistenceFilter(), BasicAuthenticationFilter.class) .authorizeHttpRequests(authorize -> authorize - .requestMatchers("/docs/**").permitAll() - .requestMatchers("/admin").hasRole("ADMIN") - .requestMatchers("/member").hasRole("MEMBER") + .requestMatchers(apiPath("/docs/**")).permitAll() + .requestMatchers(HttpMethod.POST, apiPath("/members")).permitAll() + .requestMatchers(apiPath("/admin/**")).hasRole("ADMIN") .anyRequest().authenticated()) .formLogin(login -> login @@ -56,4 +55,8 @@ public SecurityFilterChain swaggerFilterchain(HttpSecurity httpSecurity) throws public BCryptPasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } + + private String apiPath(String path) { + return API_PREFIX + path; + } } From 3e330f6bfaba26496400d9717cc3c930d2315e0b Mon Sep 17 00:00:00 2001 From: ekgns33 Date: Thu, 18 Jul 2024 00:56:30 +0900 Subject: [PATCH 02/13] =?UTF-8?q?feat=20:=20=EC=97=90=EB=9F=AC=EC=BD=94?= =?UTF-8?q?=EB=93=9C,=20=EC=BB=A4=EC=8A=A4=ED=85=80=20=EC=97=90=EB=9F=AC?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80,=20=EC=A0=84=EC=97=AD=20=ED=95=B8?= =?UTF-8?q?=EB=93=A4=EB=9F=AC=EC=97=90=20=EB=A1=9C=EC=A7=81=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exceptions/UserAlreadyExistException.java | 15 +++++++++++++++ .../global/controller/GlobalExceptionHandler.java | 7 +++++++ .../platformcore/global/exceptions/ErrorCode.java | 4 +++- 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 src/main/java/gdsc/konkuk/platformcore/application/member/exceptions/UserAlreadyExistException.java diff --git a/src/main/java/gdsc/konkuk/platformcore/application/member/exceptions/UserAlreadyExistException.java b/src/main/java/gdsc/konkuk/platformcore/application/member/exceptions/UserAlreadyExistException.java new file mode 100644 index 0000000..aa38f08 --- /dev/null +++ b/src/main/java/gdsc/konkuk/platformcore/application/member/exceptions/UserAlreadyExistException.java @@ -0,0 +1,15 @@ +package gdsc.konkuk.platformcore.application.member.exceptions; + +import gdsc.konkuk.platformcore.global.exceptions.BusinessException; +import gdsc.konkuk.platformcore.global.exceptions.ErrorCode; + +public class UserAlreadyExistException extends BusinessException { + + protected UserAlreadyExistException(ErrorCode errorCode, String logMessage) { + super(errorCode, logMessage); + } + + public static UserAlreadyExistException of(ErrorCode errorCode) { + return new UserAlreadyExistException(errorCode, errorCode.getLogMessage()); + } +} diff --git a/src/main/java/gdsc/konkuk/platformcore/global/controller/GlobalExceptionHandler.java b/src/main/java/gdsc/konkuk/platformcore/global/controller/GlobalExceptionHandler.java index aaebbca..51a814b 100644 --- a/src/main/java/gdsc/konkuk/platformcore/global/controller/GlobalExceptionHandler.java +++ b/src/main/java/gdsc/konkuk/platformcore/global/controller/GlobalExceptionHandler.java @@ -5,6 +5,7 @@ import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; +import gdsc.konkuk.platformcore.application.member.exceptions.UserAlreadyExistException; import gdsc.konkuk.platformcore.global.exceptions.BusinessException; import gdsc.konkuk.platformcore.global.exceptions.ErrorCode; import gdsc.konkuk.platformcore.global.responses.ErrorResponse; @@ -14,6 +15,12 @@ @RestControllerAdvice public class GlobalExceptionHandler { + @ExceptionHandler(UserAlreadyExistException.class) + protected ResponseEntity handleUserAlreadyExistException(final UserAlreadyExistException e) { + log.error("UserAlreadyExistException Caught! [{}]", e.getLogMessage()); + final ErrorResponse response = ErrorResponse.of(e.getMessage(), e.getLogMessage()); + return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST); + } @ExceptionHandler(BusinessException.class) protected ResponseEntity handleBusinessException(final BusinessException e) { diff --git a/src/main/java/gdsc/konkuk/platformcore/global/exceptions/ErrorCode.java b/src/main/java/gdsc/konkuk/platformcore/global/exceptions/ErrorCode.java index 67018f8..882f515 100644 --- a/src/main/java/gdsc/konkuk/platformcore/global/exceptions/ErrorCode.java +++ b/src/main/java/gdsc/konkuk/platformcore/global/exceptions/ErrorCode.java @@ -10,7 +10,9 @@ public enum ErrorCode { INTERNAL_SERVER_ERROR("서버 오류입니다. 잠시후 재시도 해주세요", "[ERROR] : 예상치못한 에러 발생", 500), USER_NOT_FOUND("사용자가 존재하지 않습니다. 다시 입력해주세요", "[ERROR] : 사용자 정보를 찾을 수 없음", 404), INVALID_USER_INFO("사용자 정보가 올바르지 않습니다. 다시 입력해주세요", "[ERROR] : 사용자 정보가 올바르지 않음", 400), - DEACTIVATED_USER("탈퇴한 사용자입니다. 다시 확인해주세요", "[ERROR] : 탈퇴한 사용자", 400); + DEACTIVATED_USER("비활성화된 사용자입니다. 다시 확인해주세요", "[ERROR] : 탈퇴한 사용자", 400), + USER_ALREADY_EXISTS("이미 존재하는 사용자입니다.", "[ERROR] : 이미 존재하는 사용자", 400); + private final String message; private final String logMessage; private final int statusCode; From 66e36963a5e1e0262fce4943cdb07e998cc87fa1 Mon Sep 17 00:00:00 2001 From: ekgns33 Date: Thu, 18 Jul 2024 00:57:45 +0900 Subject: [PATCH 03/13] =?UTF-8?q?feat=20:=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20DTO=EC=B6=94=EA=B0=80,=20=EB=A9=A4=EB=B2=84=20?= =?UTF-8?q?=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exceptions/MemberRegisterRequest.java | 28 +++++++++++++++++++ .../controller/member/MemberController.java | 27 ++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 src/main/java/gdsc/konkuk/platformcore/application/member/exceptions/MemberRegisterRequest.java create mode 100644 src/main/java/gdsc/konkuk/platformcore/controller/member/MemberController.java diff --git a/src/main/java/gdsc/konkuk/platformcore/application/member/exceptions/MemberRegisterRequest.java b/src/main/java/gdsc/konkuk/platformcore/application/member/exceptions/MemberRegisterRequest.java new file mode 100644 index 0000000..5b89d73 --- /dev/null +++ b/src/main/java/gdsc/konkuk/platformcore/application/member/exceptions/MemberRegisterRequest.java @@ -0,0 +1,28 @@ +package gdsc.konkuk.platformcore.application.member.exceptions; + +import gdsc.konkuk.platformcore.domain.member.entity.Member; +import gdsc.konkuk.platformcore.domain.member.entity.MemberRole; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class MemberRegisterRequest { + private String memberId; + private String password; + private String name; + private String email; + private MemberRole memberRole; + private int batch; + + public static Member toEntity(MemberRegisterRequest request) { + return Member.builder() + .memberId(request.getMemberId()) + .password(request.getPassword()) + .name(request.getName()) + .email(request.getEmail()) + .role(request.getMemberRole()) + .batch(request.getBatch()) + .build(); + } +} diff --git a/src/main/java/gdsc/konkuk/platformcore/controller/member/MemberController.java b/src/main/java/gdsc/konkuk/platformcore/controller/member/MemberController.java new file mode 100644 index 0000000..f9c5b13 --- /dev/null +++ b/src/main/java/gdsc/konkuk/platformcore/controller/member/MemberController.java @@ -0,0 +1,27 @@ +package gdsc.konkuk.platformcore.controller.member; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import gdsc.konkuk.platformcore.application.member.exceptions.MemberRegisterRequest; +import gdsc.konkuk.platformcore.application.member.MemberService; +import gdsc.konkuk.platformcore.global.responses.SuccessResponse; +import lombok.RequiredArgsConstructor; + +@RestController +@RequestMapping("/api/v1/members") +@RequiredArgsConstructor +public class MemberController { + + private final MemberService memberService; + + @PostMapping("") + public ResponseEntity signup(@RequestBody MemberRegisterRequest registerRequest) { + memberService.register(registerRequest); + return ResponseEntity.status(201).body(SuccessResponse.messageOnly()); + } + +} From f396c5d477c789e80ca86bc9aeeb452d921f877d Mon Sep 17 00:00:00 2001 From: ekgns33 Date: Thu, 18 Jul 2024 00:58:21 +0900 Subject: [PATCH 04/13] =?UTF-8?q?feat=20:=20=EB=A9=A4=EB=B2=84=20=EC=84=9C?= =?UTF-8?q?=EB=B9=84=EC=8A=A4=20=EC=B6=94=EA=B0=80,=20=ED=9A=8C=EC=9B=90?= =?UTF-8?q?=EA=B0=80=EC=9E=85=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/member/MemberService.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/main/java/gdsc/konkuk/platformcore/application/member/MemberService.java diff --git a/src/main/java/gdsc/konkuk/platformcore/application/member/MemberService.java b/src/main/java/gdsc/konkuk/platformcore/application/member/MemberService.java new file mode 100644 index 0000000..38e9cf0 --- /dev/null +++ b/src/main/java/gdsc/konkuk/platformcore/application/member/MemberService.java @@ -0,0 +1,39 @@ +package gdsc.konkuk.platformcore.application.member; + +import java.util.Optional; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import gdsc.konkuk.platformcore.application.member.exceptions.MemberRegisterRequest; +import gdsc.konkuk.platformcore.application.member.exceptions.UserAlreadyExistException; +import gdsc.konkuk.platformcore.domain.member.entity.Member; +import gdsc.konkuk.platformcore.domain.member.repository.MemberRepository; +import gdsc.konkuk.platformcore.global.exceptions.ErrorCode; +import gdsc.konkuk.platformcore.global.responses.SuccessResponse; +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class MemberService { + + private final MemberRepository memberRepository; + + private boolean checkMemberAlreadyExist(String memberId) { + Optional member = memberRepository.findByMemberId(memberId); + return member.isPresent(); + } + + @Transactional + public SuccessResponse register(MemberRegisterRequest registerRequest) { + + if(checkMemberAlreadyExist(registerRequest.getMemberId())) { + throw UserAlreadyExistException.of(ErrorCode.USER_ALREADY_EXISTS); + } + + memberRepository.save(MemberRegisterRequest.toEntity(registerRequest)); + + return SuccessResponse.messageOnly(); + } +} From d66dfe4f13f99556632199f7f392713b04bc9998 Mon Sep 17 00:00:00 2001 From: ekgns33 Date: Thu, 18 Jul 2024 01:00:08 +0900 Subject: [PATCH 05/13] =?UTF-8?q?test=20:=20=EC=BB=A8=ED=8A=B8=EB=A1=A4?= =?UTF-8?q?=EB=9F=AC=20=ED=85=8C=EC=8A=A4=ED=8A=B8,=20=EC=9C=A0=EB=8B=9B?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/member/MemberServiceTest.java | 83 +++++++++++ .../member/MemberControllerTest.java | 138 ++++++++++++++++++ 2 files changed, 221 insertions(+) create mode 100644 src/test/java/gdsc/konkuk/platformcore/application/member/MemberServiceTest.java create mode 100644 src/test/java/gdsc/konkuk/platformcore/controller/member/MemberControllerTest.java diff --git a/src/test/java/gdsc/konkuk/platformcore/application/member/MemberServiceTest.java b/src/test/java/gdsc/konkuk/platformcore/application/member/MemberServiceTest.java new file mode 100644 index 0000000..72e5724 --- /dev/null +++ b/src/test/java/gdsc/konkuk/platformcore/application/member/MemberServiceTest.java @@ -0,0 +1,83 @@ +package gdsc.konkuk.platformcore.application.member; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.BDDMockito.*; + +import java.util.Optional; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.transaction.annotation.Transactional; + +import gdsc.konkuk.platformcore.application.member.exceptions.MemberRegisterRequest; +import gdsc.konkuk.platformcore.application.member.exceptions.UserAlreadyExistException; +import gdsc.konkuk.platformcore.domain.member.entity.MemberRole; +import gdsc.konkuk.platformcore.domain.member.repository.MemberRepository; +import gdsc.konkuk.platformcore.global.responses.SuccessResponse; + +class MemberServiceTest { + + private MemberService subject; + + @Mock + private MemberRepository memberRepository; + + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + subject = new MemberService(memberRepository); + } + + @Test + @DisplayName("새로운 멤버 회원가입 성공") + @Transactional + void should_success_when_newMember_register() { + //given + MemberRegisterRequest memberRegisterRequest = + MemberRegisterRequest.builder() + .memberId("202011288") + .password("password") + .email("example@konkuk.ac.kr") + .name("홍길동") + .memberRole(MemberRole.MEMBER) + .batch(2024) + .build(); + given(memberRepository.findByMemberId(any())).willReturn(Optional.empty()); + //when + SuccessResponse expected = SuccessResponse.messageOnly(); + SuccessResponse actual = subject.register(memberRegisterRequest); + //then + assertEquals(expected.isSuccess(), actual.isSuccess()); + assertEquals(expected.getData(), actual.getData()); + } + + @Test + @DisplayName("이미 존재하는 멤버 회원가입 실패") + @Transactional + void should_fail_when_already_exist_member_register() { + //given + MemberRegisterRequest memberRegisterRequest = + MemberRegisterRequest.builder() + .memberId("202011288") + .password("password") + .email("example@konkuk.ac.kr") + .name("홍길동") + .memberRole(MemberRole.MEMBER) + .batch(2024) + .build(); + given(memberRepository.findByMemberId(any())) + .willReturn(Optional.of(MemberRegisterRequest + .toEntity(memberRegisterRequest))); + + //then + assertThrows(UserAlreadyExistException.class, () -> { + //when + subject.register(memberRegisterRequest); + }); + } +} \ No newline at end of file diff --git a/src/test/java/gdsc/konkuk/platformcore/controller/member/MemberControllerTest.java b/src/test/java/gdsc/konkuk/platformcore/controller/member/MemberControllerTest.java new file mode 100644 index 0000000..0e718da --- /dev/null +++ b/src/test/java/gdsc/konkuk/platformcore/controller/member/MemberControllerTest.java @@ -0,0 +1,138 @@ +package gdsc.konkuk.platformcore.controller.member; + +import static com.epages.restdocs.apispec.ResourceDocumentation.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.BDDMockito.*; +import static org.springframework.http.MediaType.*; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.*; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.*; +import static org.springframework.restdocs.payload.PayloadDocumentation.*; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*; +import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.*; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.restdocs.RestDocumentationContextProvider; +import org.springframework.restdocs.RestDocumentationExtension; +import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import com.epages.restdocs.apispec.ResourceSnippetParameters; +import com.fasterxml.jackson.databind.ObjectMapper; + +import gdsc.konkuk.platformcore.application.member.exceptions.MemberRegisterRequest; +import gdsc.konkuk.platformcore.application.member.MemberService; +import gdsc.konkuk.platformcore.application.member.exceptions.UserAlreadyExistException; +import gdsc.konkuk.platformcore.domain.member.entity.MemberRole; +import gdsc.konkuk.platformcore.global.responses.SuccessResponse; + +@SpringBootTest +@ExtendWith({RestDocumentationExtension.class}) +class MemberControllerTest { + + MockMvc mockMvc; + + @MockBean + private MemberService memberService; + + @Autowired + private ObjectMapper objectMapper; + + @BeforeEach + void setUp(WebApplicationContext webApplicationContext, RestDocumentationContextProvider restDocumentation) { + MockitoAnnotations.openMocks(this); + mockMvc = MockMvcBuilders + .webAppContextSetup(webApplicationContext) + .apply(springSecurity()) + .apply(documentationConfiguration(restDocumentation)) + .build(); + } + + @Test + @DisplayName("새로운 멤버 회원 가입 성공") + void should_success_when_newMember() throws Exception { + //given + MemberRegisterRequest memberRegisterRequest = + MemberRegisterRequest.builder() + .memberId("202011288") + .password("password") + .email("example@konkuk.ac.kr") + .name("홍길동") + .memberRole(MemberRole.MEMBER) + .batch(2024) + .build(); + + given(memberService.register(any(MemberRegisterRequest.class))).willReturn(SuccessResponse.messageOnly()); + //when + mockMvc.perform( + RestDocumentationRequestBuilders.post("/api/v1/members") + .contentType(APPLICATION_JSON) + .content(objectMapper.writeValueAsString(memberRegisterRequest)) + .with(csrf()) + + ) + + .andExpect(status().isCreated()) + .andDo(print()) + .andDo( + document("member/register", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + resource(ResourceSnippetParameters.builder() + .description("새로운 멤버 회원 가입 성공") + .tag("member") + .requestFields( + fieldWithPath("memberId").description("회원 아이디"), + fieldWithPath("password").description("비밀번호"), + fieldWithPath("email").description("이메일"), + fieldWithPath("name").description("이름"), + fieldWithPath("memberRole").description("멤버 권한"), + fieldWithPath("batch").description("배치") + ) + .responseFields( + fieldWithPath("success").description(true), + fieldWithPath("message").description("회원 가입 성공"), + fieldWithPath("data").description("null") + ) + .build() + ) + ) + ); + } + + @Test + @DisplayName("이미 존재하는 유저 회원 가입 실패") + void should_fail_when_existingMember() throws Exception { + //given + MemberRegisterRequest memberRegisterRequest = + MemberRegisterRequest.builder() + .memberId("202011288") + .password("password") + .email("example@konkuk.ac.kr") + .name("홍길동") + .memberRole(MemberRole.MEMBER) + .batch(2024) + .build(); + + given(memberService.register(any(MemberRegisterRequest.class))).willThrow(UserAlreadyExistException.class); + //when + mockMvc.perform( + RestDocumentationRequestBuilders.post("/api/v1/members") + .contentType(APPLICATION_JSON) + .content(objectMapper.writeValueAsString(memberRegisterRequest)) + .with(csrf()) + ) + .andExpect(status().isBadRequest()) + .andDo(print()); + } +} \ No newline at end of file From 6d4cd4d1a9c998eeabbe026cf61484c4c576677e Mon Sep 17 00:00:00 2001 From: ekgns33 Date: Thu, 18 Jul 2024 01:30:00 +0900 Subject: [PATCH 06/13] =?UTF-8?q?feat=20:=20=EC=9C=A0=EC=A0=80=20=EB=B9=84?= =?UTF-8?q?=EB=B0=80=EB=B2=88=ED=98=B8=20=EC=95=94=ED=98=B8=ED=99=94=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/member/MemberService.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/gdsc/konkuk/platformcore/application/member/MemberService.java b/src/main/java/gdsc/konkuk/platformcore/application/member/MemberService.java index 38e9cf0..cb48e41 100644 --- a/src/main/java/gdsc/konkuk/platformcore/application/member/MemberService.java +++ b/src/main/java/gdsc/konkuk/platformcore/application/member/MemberService.java @@ -2,10 +2,10 @@ import java.util.Optional; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import gdsc.konkuk.platformcore.application.member.exceptions.MemberRegisterRequest; import gdsc.konkuk.platformcore.application.member.exceptions.UserAlreadyExistException; import gdsc.konkuk.platformcore.domain.member.entity.Member; import gdsc.konkuk.platformcore.domain.member.repository.MemberRepository; @@ -18,6 +18,7 @@ @Transactional(readOnly = true) public class MemberService { + private final PasswordEncoder passwordEncoder; private final MemberRepository memberRepository; private boolean checkMemberAlreadyExist(String memberId) { @@ -32,7 +33,16 @@ public SuccessResponse register(MemberRegisterRequest registerRequest) { throw UserAlreadyExistException.of(ErrorCode.USER_ALREADY_EXISTS); } - memberRepository.save(MemberRegisterRequest.toEntity(registerRequest)); + Member member = Member.builder() + .memberId(registerRequest.getMemberId()) + .password(passwordEncoder.encode(registerRequest.getPassword())) + .name(registerRequest.getName()) + .email(registerRequest.getEmail()) + .role(registerRequest.getMemberRole()) + .batch(registerRequest.getBatch()) + .build(); + + memberRepository.save(member); return SuccessResponse.messageOnly(); } From 083a6db23561672f1af2f1508361610e1025d9a9 Mon Sep 17 00:00:00 2001 From: ekgns33 Date: Thu, 18 Jul 2024 01:35:13 +0900 Subject: [PATCH 07/13] =?UTF-8?q?rename=20:=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=9C=84=EC=B9=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/{exceptions => }/MemberRegisterRequest.java | 2 +- .../konkuk/platformcore/controller/member/MemberController.java | 2 +- .../platformcore/controller/member/MemberControllerTest.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename src/main/java/gdsc/konkuk/platformcore/application/member/{exceptions => }/MemberRegisterRequest.java (91%) diff --git a/src/main/java/gdsc/konkuk/platformcore/application/member/exceptions/MemberRegisterRequest.java b/src/main/java/gdsc/konkuk/platformcore/application/member/MemberRegisterRequest.java similarity index 91% rename from src/main/java/gdsc/konkuk/platformcore/application/member/exceptions/MemberRegisterRequest.java rename to src/main/java/gdsc/konkuk/platformcore/application/member/MemberRegisterRequest.java index 5b89d73..a282201 100644 --- a/src/main/java/gdsc/konkuk/platformcore/application/member/exceptions/MemberRegisterRequest.java +++ b/src/main/java/gdsc/konkuk/platformcore/application/member/MemberRegisterRequest.java @@ -1,4 +1,4 @@ -package gdsc.konkuk.platformcore.application.member.exceptions; +package gdsc.konkuk.platformcore.application.member; import gdsc.konkuk.platformcore.domain.member.entity.Member; import gdsc.konkuk.platformcore.domain.member.entity.MemberRole; diff --git a/src/main/java/gdsc/konkuk/platformcore/controller/member/MemberController.java b/src/main/java/gdsc/konkuk/platformcore/controller/member/MemberController.java index f9c5b13..6c2a69d 100644 --- a/src/main/java/gdsc/konkuk/platformcore/controller/member/MemberController.java +++ b/src/main/java/gdsc/konkuk/platformcore/controller/member/MemberController.java @@ -6,7 +6,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import gdsc.konkuk.platformcore.application.member.exceptions.MemberRegisterRequest; +import gdsc.konkuk.platformcore.application.member.MemberRegisterRequest; import gdsc.konkuk.platformcore.application.member.MemberService; import gdsc.konkuk.platformcore.global.responses.SuccessResponse; import lombok.RequiredArgsConstructor; diff --git a/src/test/java/gdsc/konkuk/platformcore/controller/member/MemberControllerTest.java b/src/test/java/gdsc/konkuk/platformcore/controller/member/MemberControllerTest.java index 0e718da..259c244 100644 --- a/src/test/java/gdsc/konkuk/platformcore/controller/member/MemberControllerTest.java +++ b/src/test/java/gdsc/konkuk/platformcore/controller/member/MemberControllerTest.java @@ -30,7 +30,7 @@ import com.epages.restdocs.apispec.ResourceSnippetParameters; import com.fasterxml.jackson.databind.ObjectMapper; -import gdsc.konkuk.platformcore.application.member.exceptions.MemberRegisterRequest; +import gdsc.konkuk.platformcore.application.member.MemberRegisterRequest; import gdsc.konkuk.platformcore.application.member.MemberService; import gdsc.konkuk.platformcore.application.member.exceptions.UserAlreadyExistException; import gdsc.konkuk.platformcore.domain.member.entity.MemberRole; From b64fae84fde5d8d994bfc5aa806095588cc5a28d Mon Sep 17 00:00:00 2001 From: ekgns33 Date: Thu, 18 Jul 2024 01:35:59 +0900 Subject: [PATCH 08/13] =?UTF-8?q?test=20:=20=EC=95=94=ED=98=B8=ED=99=94=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/member/MemberServiceTest.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/test/java/gdsc/konkuk/platformcore/application/member/MemberServiceTest.java b/src/test/java/gdsc/konkuk/platformcore/application/member/MemberServiceTest.java index 72e5724..bbf1edf 100644 --- a/src/test/java/gdsc/konkuk/platformcore/application/member/MemberServiceTest.java +++ b/src/test/java/gdsc/konkuk/platformcore/application/member/MemberServiceTest.java @@ -11,9 +11,9 @@ import org.junit.jupiter.api.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.transaction.annotation.Transactional; -import gdsc.konkuk.platformcore.application.member.exceptions.MemberRegisterRequest; import gdsc.konkuk.platformcore.application.member.exceptions.UserAlreadyExistException; import gdsc.konkuk.platformcore.domain.member.entity.MemberRole; import gdsc.konkuk.platformcore.domain.member.repository.MemberRepository; @@ -26,11 +26,14 @@ class MemberServiceTest { @Mock private MemberRepository memberRepository; + @Mock + private PasswordEncoder passwordEncoder; + @BeforeEach void setUp() { MockitoAnnotations.openMocks(this); - subject = new MemberService(memberRepository); + subject = new MemberService(passwordEncoder, memberRepository); } @Test @@ -48,6 +51,7 @@ void should_success_when_newMember_register() { .batch(2024) .build(); given(memberRepository.findByMemberId(any())).willReturn(Optional.empty()); + given(passwordEncoder.encode(any())).willReturn("password"); //when SuccessResponse expected = SuccessResponse.messageOnly(); SuccessResponse actual = subject.register(memberRegisterRequest); From 630a7c86e01122611aedc5c3452f76a8459b89be Mon Sep 17 00:00:00 2001 From: ekgns33 Date: Sat, 20 Jul 2024 21:18:36 +0900 Subject: [PATCH 09/13] =?UTF-8?q?rename=20:=20DTO=20=EC=BB=A8=ED=8A=B8?= =?UTF-8?q?=EB=A1=A4=EB=9F=AC=20=ED=8C=A8=ED=82=A4=EC=A7=80=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/MemberRegisterRequest.java | 12 ++++++++---- .../application/member/MemberServiceTest.java | 7 +------ .../controller/member/MemberControllerTest.java | 5 ----- 3 files changed, 9 insertions(+), 15 deletions(-) rename src/main/java/gdsc/konkuk/platformcore/{application => controller}/member/MemberRegisterRequest.java (74%) diff --git a/src/main/java/gdsc/konkuk/platformcore/application/member/MemberRegisterRequest.java b/src/main/java/gdsc/konkuk/platformcore/controller/member/MemberRegisterRequest.java similarity index 74% rename from src/main/java/gdsc/konkuk/platformcore/application/member/MemberRegisterRequest.java rename to src/main/java/gdsc/konkuk/platformcore/controller/member/MemberRegisterRequest.java index a282201..2d15f14 100644 --- a/src/main/java/gdsc/konkuk/platformcore/application/member/MemberRegisterRequest.java +++ b/src/main/java/gdsc/konkuk/platformcore/controller/member/MemberRegisterRequest.java @@ -1,18 +1,23 @@ -package gdsc.konkuk.platformcore.application.member; +package gdsc.konkuk.platformcore.controller.member; import gdsc.konkuk.platformcore.domain.member.entity.Member; -import gdsc.konkuk.platformcore.domain.member.entity.MemberRole; +import jakarta.validation.constraints.NotEmpty; import lombok.Builder; import lombok.Getter; +import lombok.Setter; @Getter +@Setter @Builder public class MemberRegisterRequest { + @NotEmpty private String memberId; + @NotEmpty private String password; + @NotEmpty private String name; + @NotEmpty private String email; - private MemberRole memberRole; private int batch; public static Member toEntity(MemberRegisterRequest request) { @@ -21,7 +26,6 @@ public static Member toEntity(MemberRegisterRequest request) { .password(request.getPassword()) .name(request.getName()) .email(request.getEmail()) - .role(request.getMemberRole()) .batch(request.getBatch()) .build(); } diff --git a/src/test/java/gdsc/konkuk/platformcore/application/member/MemberServiceTest.java b/src/test/java/gdsc/konkuk/platformcore/application/member/MemberServiceTest.java index bbf1edf..b0ac620 100644 --- a/src/test/java/gdsc/konkuk/platformcore/application/member/MemberServiceTest.java +++ b/src/test/java/gdsc/konkuk/platformcore/application/member/MemberServiceTest.java @@ -12,10 +12,9 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.transaction.annotation.Transactional; import gdsc.konkuk.platformcore.application.member.exceptions.UserAlreadyExistException; -import gdsc.konkuk.platformcore.domain.member.entity.MemberRole; +import gdsc.konkuk.platformcore.controller.member.MemberRegisterRequest; import gdsc.konkuk.platformcore.domain.member.repository.MemberRepository; import gdsc.konkuk.platformcore.global.responses.SuccessResponse; @@ -38,7 +37,6 @@ void setUp() { @Test @DisplayName("새로운 멤버 회원가입 성공") - @Transactional void should_success_when_newMember_register() { //given MemberRegisterRequest memberRegisterRequest = @@ -47,7 +45,6 @@ void should_success_when_newMember_register() { .password("password") .email("example@konkuk.ac.kr") .name("홍길동") - .memberRole(MemberRole.MEMBER) .batch(2024) .build(); given(memberRepository.findByMemberId(any())).willReturn(Optional.empty()); @@ -62,7 +59,6 @@ void should_success_when_newMember_register() { @Test @DisplayName("이미 존재하는 멤버 회원가입 실패") - @Transactional void should_fail_when_already_exist_member_register() { //given MemberRegisterRequest memberRegisterRequest = @@ -71,7 +67,6 @@ void should_fail_when_already_exist_member_register() { .password("password") .email("example@konkuk.ac.kr") .name("홍길동") - .memberRole(MemberRole.MEMBER) .batch(2024) .build(); given(memberRepository.findByMemberId(any())) diff --git a/src/test/java/gdsc/konkuk/platformcore/controller/member/MemberControllerTest.java b/src/test/java/gdsc/konkuk/platformcore/controller/member/MemberControllerTest.java index 259c244..02ba01f 100644 --- a/src/test/java/gdsc/konkuk/platformcore/controller/member/MemberControllerTest.java +++ b/src/test/java/gdsc/konkuk/platformcore/controller/member/MemberControllerTest.java @@ -30,10 +30,8 @@ import com.epages.restdocs.apispec.ResourceSnippetParameters; import com.fasterxml.jackson.databind.ObjectMapper; -import gdsc.konkuk.platformcore.application.member.MemberRegisterRequest; import gdsc.konkuk.platformcore.application.member.MemberService; import gdsc.konkuk.platformcore.application.member.exceptions.UserAlreadyExistException; -import gdsc.konkuk.platformcore.domain.member.entity.MemberRole; import gdsc.konkuk.platformcore.global.responses.SuccessResponse; @SpringBootTest @@ -68,7 +66,6 @@ void should_success_when_newMember() throws Exception { .password("password") .email("example@konkuk.ac.kr") .name("홍길동") - .memberRole(MemberRole.MEMBER) .batch(2024) .build(); @@ -96,7 +93,6 @@ void should_success_when_newMember() throws Exception { fieldWithPath("password").description("비밀번호"), fieldWithPath("email").description("이메일"), fieldWithPath("name").description("이름"), - fieldWithPath("memberRole").description("멤버 권한"), fieldWithPath("batch").description("배치") ) .responseFields( @@ -120,7 +116,6 @@ void should_fail_when_existingMember() throws Exception { .password("password") .email("example@konkuk.ac.kr") .name("홍길동") - .memberRole(MemberRole.MEMBER) .batch(2024) .build(); From 83f4b5cae5c474d33fb8061389fee78188010b3d Mon Sep 17 00:00:00 2001 From: ekgns33 Date: Sat, 20 Jul 2024 21:19:48 +0900 Subject: [PATCH 10/13] =?UTF-8?q?refactor=20:=20=EB=A7=A4=EC=A7=81?= =?UTF-8?q?=EB=84=98=EB=B2=84=20=EC=82=AD=EC=A0=9C,=20HttpStatus=EC=82=AC?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platformcore/controller/member/MemberController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/gdsc/konkuk/platformcore/controller/member/MemberController.java b/src/main/java/gdsc/konkuk/platformcore/controller/member/MemberController.java index 6c2a69d..256e65a 100644 --- a/src/main/java/gdsc/konkuk/platformcore/controller/member/MemberController.java +++ b/src/main/java/gdsc/konkuk/platformcore/controller/member/MemberController.java @@ -1,12 +1,12 @@ package gdsc.konkuk.platformcore.controller.member; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import gdsc.konkuk.platformcore.application.member.MemberRegisterRequest; import gdsc.konkuk.platformcore.application.member.MemberService; import gdsc.konkuk.platformcore.global.responses.SuccessResponse; import lombok.RequiredArgsConstructor; @@ -18,10 +18,10 @@ public class MemberController { private final MemberService memberService; - @PostMapping("") + @PostMapping() public ResponseEntity signup(@RequestBody MemberRegisterRequest registerRequest) { memberService.register(registerRequest); - return ResponseEntity.status(201).body(SuccessResponse.messageOnly()); + return ResponseEntity.status(HttpStatus.CREATED).body(SuccessResponse.messageOnly()); } } From 86e38425f4d89a1345409e31ef500e2f63790e5a Mon Sep 17 00:00:00 2001 From: ekgns33 Date: Sat, 20 Jul 2024 21:54:24 +0900 Subject: [PATCH 11/13] =?UTF-8?q?refactor=20:=20=EA=B8=B0=EC=A1=B4=20Error?= =?UTF-8?q?Code=EB=A5=BC=20=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4?= =?UTF-8?q?=ED=99=94,=20=EB=8F=84=EB=A9=94=EC=9D=B8=EB=A7=88=EB=8B=A4=20?= =?UTF-8?q?=EC=97=90=EB=9F=AC=EC=BD=94=EB=93=9C=20=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/exceptions/MemberErrorCode.java | 37 +++++++++++++++++++ .../global/exceptions/CustomErrorCode.java | 10 +++++ .../global/exceptions/ErrorCode.java | 25 ------------- .../global/exceptions/GlobalErrorCode.java | 37 +++++++++++++++++++ 4 files changed, 84 insertions(+), 25 deletions(-) create mode 100644 src/main/java/gdsc/konkuk/platformcore/application/member/exceptions/MemberErrorCode.java create mode 100644 src/main/java/gdsc/konkuk/platformcore/global/exceptions/CustomErrorCode.java delete mode 100644 src/main/java/gdsc/konkuk/platformcore/global/exceptions/ErrorCode.java create mode 100644 src/main/java/gdsc/konkuk/platformcore/global/exceptions/GlobalErrorCode.java diff --git a/src/main/java/gdsc/konkuk/platformcore/application/member/exceptions/MemberErrorCode.java b/src/main/java/gdsc/konkuk/platformcore/application/member/exceptions/MemberErrorCode.java new file mode 100644 index 0000000..417570c --- /dev/null +++ b/src/main/java/gdsc/konkuk/platformcore/application/member/exceptions/MemberErrorCode.java @@ -0,0 +1,37 @@ +package gdsc.konkuk.platformcore.application.member.exceptions; + +import gdsc.konkuk.platformcore.global.exceptions.CustomErrorCode; +import lombok.Getter; + +@Getter +public enum MemberErrorCode implements CustomErrorCode { + + USER_NOT_FOUND("사용자가 존재하지 않습니다. 다시 입력해주세요", "[ERROR] : 사용자 정보를 찾을 수 없음"), + INVALID_USER_INFO("사용자 정보가 올바르지 않습니다. 다시 입력해주세요", "[ERROR] : 사용자 정보가 올바르지 않음"), + DEACTIVATED_USER("비활성화된 사용자입니다. 다시 확인해주세요", "[ERROR] : 탈퇴한 사용자"), + USER_ALREADY_EXISTS("이미 존재하는 사용자입니다.", "[ERROR] : 이미 존재하는 사용자"); + + private final String message; + private final String logMessage; + + MemberErrorCode(String message, String logMessage) { + this.message = message; + this.logMessage = logMessage; + } + + + @Override + public String getLogMessage() { + return this.logMessage; + } + + @Override + public String getName() { + return this.name(); + } + + @Override + public String getMessage() { + return this.message; + } +} diff --git a/src/main/java/gdsc/konkuk/platformcore/global/exceptions/CustomErrorCode.java b/src/main/java/gdsc/konkuk/platformcore/global/exceptions/CustomErrorCode.java new file mode 100644 index 0000000..ba4bd4d --- /dev/null +++ b/src/main/java/gdsc/konkuk/platformcore/global/exceptions/CustomErrorCode.java @@ -0,0 +1,10 @@ +package gdsc.konkuk.platformcore.global.exceptions; + +public interface CustomErrorCode { + + String getLogMessage(); + + String getName(); + + String getMessage(); +} diff --git a/src/main/java/gdsc/konkuk/platformcore/global/exceptions/ErrorCode.java b/src/main/java/gdsc/konkuk/platformcore/global/exceptions/ErrorCode.java deleted file mode 100644 index 882f515..0000000 --- a/src/main/java/gdsc/konkuk/platformcore/global/exceptions/ErrorCode.java +++ /dev/null @@ -1,25 +0,0 @@ -package gdsc.konkuk.platformcore.global.exceptions; - -import lombok.Getter; -import lombok.ToString; - -@Getter -@ToString -public enum ErrorCode { - - INTERNAL_SERVER_ERROR("서버 오류입니다. 잠시후 재시도 해주세요", "[ERROR] : 예상치못한 에러 발생", 500), - USER_NOT_FOUND("사용자가 존재하지 않습니다. 다시 입력해주세요", "[ERROR] : 사용자 정보를 찾을 수 없음", 404), - INVALID_USER_INFO("사용자 정보가 올바르지 않습니다. 다시 입력해주세요", "[ERROR] : 사용자 정보가 올바르지 않음", 400), - DEACTIVATED_USER("비활성화된 사용자입니다. 다시 확인해주세요", "[ERROR] : 탈퇴한 사용자", 400), - USER_ALREADY_EXISTS("이미 존재하는 사용자입니다.", "[ERROR] : 이미 존재하는 사용자", 400); - - private final String message; - private final String logMessage; - private final int statusCode; - - ErrorCode(String message, String logMessage, int statusCode) { - this.message = message; - this.logMessage = logMessage; - this.statusCode = statusCode; - } -} diff --git a/src/main/java/gdsc/konkuk/platformcore/global/exceptions/GlobalErrorCode.java b/src/main/java/gdsc/konkuk/platformcore/global/exceptions/GlobalErrorCode.java new file mode 100644 index 0000000..e1c08be --- /dev/null +++ b/src/main/java/gdsc/konkuk/platformcore/global/exceptions/GlobalErrorCode.java @@ -0,0 +1,37 @@ +package gdsc.konkuk.platformcore.global.exceptions; + +import lombok.Getter; + +@Getter +public enum GlobalErrorCode implements CustomErrorCode{ + + // DTO Validation에서 발생한 에러 처리를 위한 코드 + ARGUMENT_NOT_VALID("잘못된 입력입니다. 다시 확인해주세요", "[ERROR] : 400 컨트롤러 벨리데이션 실패 잘못된 인자"), + + NOT_FOUND("찾을 수 없습니다. 다시 확인해주세요", "[ERROR] : 404 에러 발생"), + INTERNAL_SERVER_ERROR("서버 오류입니다. 잠시후 재시도 해주세요", "[ERROR] : 500 예상치못한 에러 발생"); + + private final String message; + private final String logMessage; + + + GlobalErrorCode(String message, String logMessage) { + this.message = message; + this.logMessage = logMessage; + } + + @Override + public String getLogMessage() { + return this.logMessage; + } + + @Override + public String getName() { + return this.name(); + } + + @Override + public String getMessage() { + return this.message; + } +} From 3a2b5d278fd7c42bd1a0c78a8473ec45862081c5 Mon Sep 17 00:00:00 2001 From: ekgns33 Date: Sat, 20 Jul 2024 22:10:57 +0900 Subject: [PATCH 12/13] =?UTF-8?q?refactor=20:=20=EC=97=90=EB=9F=AC?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EC=BD=94=EB=93=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CustomAuthenticationFailureHandler.java | 7 ++--- .../auth/CustomUserDetailsService.java | 8 +++--- .../exceptions/InvalidUserInfoException.java | 17 ----------- .../application/member/MemberService.java | 28 ++++++++----------- .../exceptions/UserAlreadyExistException.java | 6 ++-- .../controller/GlobalExceptionHandler.java | 16 +++-------- .../global/exceptions/BusinessException.java | 9 ++---- .../global/responses/ErrorResponse.java | 8 +++--- 8 files changed, 31 insertions(+), 68 deletions(-) delete mode 100644 src/main/java/gdsc/konkuk/platformcore/application/auth/exceptions/InvalidUserInfoException.java diff --git a/src/main/java/gdsc/konkuk/platformcore/application/auth/CustomAuthenticationFailureHandler.java b/src/main/java/gdsc/konkuk/platformcore/application/auth/CustomAuthenticationFailureHandler.java index 02e3a39..3ad4994 100644 --- a/src/main/java/gdsc/konkuk/platformcore/application/auth/CustomAuthenticationFailureHandler.java +++ b/src/main/java/gdsc/konkuk/platformcore/application/auth/CustomAuthenticationFailureHandler.java @@ -8,9 +8,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; -import gdsc.konkuk.platformcore.global.exceptions.ErrorCode; +import gdsc.konkuk.platformcore.application.member.exceptions.MemberErrorCode; import gdsc.konkuk.platformcore.global.responses.ErrorResponse; -import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; @@ -23,9 +22,9 @@ public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationF @Override public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws - IOException, ServletException { + IOException { - ErrorResponse errorResponse = ErrorResponse.of(ErrorCode.INVALID_USER_INFO); + ErrorResponse errorResponse = ErrorResponse.of(MemberErrorCode.INVALID_USER_INFO); response.setContentType("application/json"); response.setCharacterEncoding("UTF-8"); response.setStatus(HttpServletResponse.SC_BAD_REQUEST); diff --git a/src/main/java/gdsc/konkuk/platformcore/application/auth/CustomUserDetailsService.java b/src/main/java/gdsc/konkuk/platformcore/application/auth/CustomUserDetailsService.java index 901cbc5..5d49c9b 100644 --- a/src/main/java/gdsc/konkuk/platformcore/application/auth/CustomUserDetailsService.java +++ b/src/main/java/gdsc/konkuk/platformcore/application/auth/CustomUserDetailsService.java @@ -5,10 +5,10 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; -import gdsc.konkuk.platformcore.application.auth.exceptions.InvalidUserInfoException; +import gdsc.konkuk.platformcore.application.member.exceptions.MemberErrorCode; import gdsc.konkuk.platformcore.domain.member.entity.Member; import gdsc.konkuk.platformcore.domain.member.repository.MemberRepository; -import gdsc.konkuk.platformcore.global.exceptions.ErrorCode; +import gdsc.konkuk.platformcore.global.exceptions.BusinessException; import lombok.RequiredArgsConstructor; @Service @@ -21,8 +21,8 @@ public class CustomUserDetailsService implements UserDetailsService { public UserDetails loadUserByUsername(String memberId) throws UsernameNotFoundException { Member member = memberRepository.findByMemberId(memberId) - .orElseThrow(()-> InvalidUserInfoException.of(ErrorCode.USER_NOT_FOUND)); - + .orElseThrow(()-> BusinessException.of(MemberErrorCode.USER_NOT_FOUND)); + return new CustomUserDetails(member); } } diff --git a/src/main/java/gdsc/konkuk/platformcore/application/auth/exceptions/InvalidUserInfoException.java b/src/main/java/gdsc/konkuk/platformcore/application/auth/exceptions/InvalidUserInfoException.java deleted file mode 100644 index ecee3f1..0000000 --- a/src/main/java/gdsc/konkuk/platformcore/application/auth/exceptions/InvalidUserInfoException.java +++ /dev/null @@ -1,17 +0,0 @@ -package gdsc.konkuk.platformcore.application.auth.exceptions; - -import gdsc.konkuk.platformcore.global.exceptions.BusinessException; -import gdsc.konkuk.platformcore.global.exceptions.ErrorCode; - -public class InvalidUserInfoException extends BusinessException { - - private InvalidUserInfoException(String message, String logMessage) { - super(message, logMessage); - } - - public static InvalidUserInfoException of(ErrorCode errorCode) { - return new InvalidUserInfoException(errorCode.getMessage(), errorCode.getLogMessage()); - } - -} - diff --git a/src/main/java/gdsc/konkuk/platformcore/application/member/MemberService.java b/src/main/java/gdsc/konkuk/platformcore/application/member/MemberService.java index cb48e41..d961ae7 100644 --- a/src/main/java/gdsc/konkuk/platformcore/application/member/MemberService.java +++ b/src/main/java/gdsc/konkuk/platformcore/application/member/MemberService.java @@ -6,10 +6,11 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import gdsc.konkuk.platformcore.application.member.exceptions.MemberErrorCode; import gdsc.konkuk.platformcore.application.member.exceptions.UserAlreadyExistException; +import gdsc.konkuk.platformcore.controller.member.MemberRegisterRequest; import gdsc.konkuk.platformcore.domain.member.entity.Member; import gdsc.konkuk.platformcore.domain.member.repository.MemberRepository; -import gdsc.konkuk.platformcore.global.exceptions.ErrorCode; import gdsc.konkuk.platformcore.global.responses.SuccessResponse; import lombok.RequiredArgsConstructor; @@ -21,29 +22,22 @@ public class MemberService { private final PasswordEncoder passwordEncoder; private final MemberRepository memberRepository; - private boolean checkMemberAlreadyExist(String memberId) { - Optional member = memberRepository.findByMemberId(memberId); - return member.isPresent(); - } - @Transactional public SuccessResponse register(MemberRegisterRequest registerRequest) { if(checkMemberAlreadyExist(registerRequest.getMemberId())) { - throw UserAlreadyExistException.of(ErrorCode.USER_ALREADY_EXISTS); + throw UserAlreadyExistException.of(MemberErrorCode.USER_ALREADY_EXISTS); } - Member member = Member.builder() - .memberId(registerRequest.getMemberId()) - .password(passwordEncoder.encode(registerRequest.getPassword())) - .name(registerRequest.getName()) - .email(registerRequest.getEmail()) - .role(registerRequest.getMemberRole()) - .batch(registerRequest.getBatch()) - .build(); - - memberRepository.save(member); + String encodedPassword = passwordEncoder.encode(registerRequest.getPassword()); + registerRequest.setPassword(encodedPassword); + memberRepository.save(MemberRegisterRequest.toEntity(registerRequest)); return SuccessResponse.messageOnly(); } + + private boolean checkMemberAlreadyExist(String memberId) { + Optional member = memberRepository.findByMemberId(memberId); + return member.isPresent(); + } } diff --git a/src/main/java/gdsc/konkuk/platformcore/application/member/exceptions/UserAlreadyExistException.java b/src/main/java/gdsc/konkuk/platformcore/application/member/exceptions/UserAlreadyExistException.java index aa38f08..899c3af 100644 --- a/src/main/java/gdsc/konkuk/platformcore/application/member/exceptions/UserAlreadyExistException.java +++ b/src/main/java/gdsc/konkuk/platformcore/application/member/exceptions/UserAlreadyExistException.java @@ -1,15 +1,15 @@ package gdsc.konkuk.platformcore.application.member.exceptions; import gdsc.konkuk.platformcore.global.exceptions.BusinessException; -import gdsc.konkuk.platformcore.global.exceptions.ErrorCode; +import gdsc.konkuk.platformcore.global.exceptions.CustomErrorCode; public class UserAlreadyExistException extends BusinessException { - protected UserAlreadyExistException(ErrorCode errorCode, String logMessage) { + protected UserAlreadyExistException(CustomErrorCode errorCode, String logMessage) { super(errorCode, logMessage); } - public static UserAlreadyExistException of(ErrorCode errorCode) { + public static UserAlreadyExistException of(CustomErrorCode errorCode) { return new UserAlreadyExistException(errorCode, errorCode.getLogMessage()); } } diff --git a/src/main/java/gdsc/konkuk/platformcore/global/controller/GlobalExceptionHandler.java b/src/main/java/gdsc/konkuk/platformcore/global/controller/GlobalExceptionHandler.java index 51a814b..e08ffde 100644 --- a/src/main/java/gdsc/konkuk/platformcore/global/controller/GlobalExceptionHandler.java +++ b/src/main/java/gdsc/konkuk/platformcore/global/controller/GlobalExceptionHandler.java @@ -5,9 +5,8 @@ import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; -import gdsc.konkuk.platformcore.application.member.exceptions.UserAlreadyExistException; import gdsc.konkuk.platformcore.global.exceptions.BusinessException; -import gdsc.konkuk.platformcore.global.exceptions.ErrorCode; +import gdsc.konkuk.platformcore.global.exceptions.GlobalErrorCode; import gdsc.konkuk.platformcore.global.responses.ErrorResponse; import lombok.extern.slf4j.Slf4j; @@ -15,24 +14,17 @@ @RestControllerAdvice public class GlobalExceptionHandler { - @ExceptionHandler(UserAlreadyExistException.class) - protected ResponseEntity handleUserAlreadyExistException(final UserAlreadyExistException e) { - log.error("UserAlreadyExistException Caught! [{}]", e.getLogMessage()); - final ErrorResponse response = ErrorResponse.of(e.getMessage(), e.getLogMessage()); - return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST); - } - @ExceptionHandler(BusinessException.class) protected ResponseEntity handleBusinessException(final BusinessException e) { - log.error("BusinessException Caught! [{}]", e.getLogMessage()); + log.error("BusinessException Caught! [{}]", e.getLogMessage(), e); final ErrorResponse response = ErrorResponse.of(e.getMessage(), e.getLogMessage()); return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST); } @ExceptionHandler(Exception.class) protected ResponseEntity handleException(Exception e) { - log.error("Exception Uncaught! [{}]", e.getCause().toString()); - final ErrorResponse response = ErrorResponse.of(ErrorCode.INTERNAL_SERVER_ERROR); + log.error("Exception Uncaught!", e); + final ErrorResponse response = ErrorResponse.of(GlobalErrorCode.INTERNAL_SERVER_ERROR); return new ResponseEntity<>(response, HttpStatus.INTERNAL_SERVER_ERROR); } } diff --git a/src/main/java/gdsc/konkuk/platformcore/global/exceptions/BusinessException.java b/src/main/java/gdsc/konkuk/platformcore/global/exceptions/BusinessException.java index 4fa4daf..c38563c 100644 --- a/src/main/java/gdsc/konkuk/platformcore/global/exceptions/BusinessException.java +++ b/src/main/java/gdsc/konkuk/platformcore/global/exceptions/BusinessException.java @@ -7,17 +7,12 @@ public class BusinessException extends RuntimeException{ private final String logMessage; - protected BusinessException(String message, String logMessage) { - super(message); - this.logMessage = logMessage; - } - - protected BusinessException(ErrorCode errorCode, String logMessage) { + protected BusinessException(CustomErrorCode errorCode, String logMessage) { super(errorCode.getMessage()); this.logMessage = logMessage; } - public static BusinessException of(ErrorCode errorCode) { + public static BusinessException of(CustomErrorCode errorCode) { return new BusinessException(errorCode, errorCode.getLogMessage()); } diff --git a/src/main/java/gdsc/konkuk/platformcore/global/responses/ErrorResponse.java b/src/main/java/gdsc/konkuk/platformcore/global/responses/ErrorResponse.java index 4287781..9022c28 100644 --- a/src/main/java/gdsc/konkuk/platformcore/global/responses/ErrorResponse.java +++ b/src/main/java/gdsc/konkuk/platformcore/global/responses/ErrorResponse.java @@ -1,6 +1,6 @@ package gdsc.konkuk.platformcore.global.responses; -import gdsc.konkuk.platformcore.global.exceptions.ErrorCode; +import gdsc.konkuk.platformcore.global.exceptions.CustomErrorCode; import lombok.Getter; @Getter @@ -13,12 +13,12 @@ private ErrorResponse(final String message, final String errorCode) { this.errorCode = errorCode; } - private ErrorResponse(final ErrorCode errorCode) { + private ErrorResponse(final CustomErrorCode errorCode) { super(false, errorCode.getMessage()); - this.errorCode = errorCode.name(); + this.errorCode = errorCode.getName(); } - public static ErrorResponse of(ErrorCode errorCode) { + public static ErrorResponse of(CustomErrorCode errorCode) { return new ErrorResponse(errorCode); } From 650e1b9e60ad0ecfcac58fa13d6125b17e589984 Mon Sep 17 00:00:00 2001 From: ekgns33 Date: Sat, 20 Jul 2024 22:11:25 +0900 Subject: [PATCH 13/13] =?UTF-8?q?chore=20:=20spring-validation=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index 94fa59f..efb52d4 100644 --- a/build.gradle +++ b/build.gradle @@ -41,6 +41,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-security:2.3.3.RELEASE' + implementation 'org.springframework.boot:spring-boot-starter-validation' compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' annotationProcessor 'org.projectlombok:lombok'