diff --git a/src/main/java/com/dnd/gongmuin/member/domain/JobCategory.java b/src/main/java/com/dnd/gongmuin/member/domain/JobCategory.java index a56e95e3..3b0b3dbd 100644 --- a/src/main/java/com/dnd/gongmuin/member/domain/JobCategory.java +++ b/src/main/java/com/dnd/gongmuin/member/domain/JobCategory.java @@ -12,7 +12,51 @@ @RequiredArgsConstructor public enum JobCategory { - GAS("가스"); // TODO: 7/20/24 필드 추가 + GME("일반기계"), + AM("농업기계"), + ELEC("전자"), + TEXT("섬유"), + GCE("일반화공"), + + ME("기계"), + HT("난방"), + TM("열관리"), + OP("운전"), + + SM("경비관리"), + + BME("의공"), + ENV("환경"), + PH("보건"), + SAN("위생"), + PHARM("약무"), + PATH("병리"), + RAD("방사선"), + RT("재활치료"), + MR("의무기록"), + + NA("간호조무"), + CK("조리"), + + IA("조사사무"), + CM("법정경위"), + CW("사무"), + AS("행정사무"), + CA("법원사무"), + SG("속기"), + + VI("영상"), + EO("전기 운영"), + + CO("교정"), + AD("행정"), + TX("세무"), + ST("통계"), + AU("감사"), + EA("교육행정"), + LB("사서"), + CS("관세"), + SW("사회복지"); private final String label; diff --git a/src/main/java/com/dnd/gongmuin/member/domain/JobGroup.java b/src/main/java/com/dnd/gongmuin/member/domain/JobGroup.java index bc9a5484..ef22a358 100644 --- a/src/main/java/com/dnd/gongmuin/member/domain/JobGroup.java +++ b/src/main/java/com/dnd/gongmuin/member/domain/JobGroup.java @@ -13,9 +13,14 @@ @RequiredArgsConstructor public enum JobGroup { - ENGINEERING("공업"), - ADMINISTRATION("행정"), - MACHINE("기계"); + ENG("공업"), + ME("기계"), + CSM("법원경비관리"), + PH("보건"), + PHH("보건위생"), + JA("사법행정사무"), + ICT("정보통신"), + AD("행정"); private final String label; diff --git a/src/main/java/com/dnd/gongmuin/member/domain/Member.java b/src/main/java/com/dnd/gongmuin/member/domain/Member.java index 08160293..1eb57471 100644 --- a/src/main/java/com/dnd/gongmuin/member/domain/Member.java +++ b/src/main/java/com/dnd/gongmuin/member/domain/Member.java @@ -5,6 +5,7 @@ import static lombok.AccessLevel.*; import java.util.Random; + import com.dnd.gongmuin.common.entity.TimeBaseEntity; import com.dnd.gongmuin.common.exception.runtime.ValidationException; import com.dnd.gongmuin.member.exception.MemberErrorCode; @@ -23,41 +24,31 @@ @NoArgsConstructor(access = PROTECTED) public class Member extends TimeBaseEntity { - + @Column(name = "profile_image_no", nullable = false) + private final int profileImageNo = setRandomNumber(); @Id @GeneratedValue(strategy = IDENTITY) @Column(name = "member_id") private Long id; - @Column(name = "nickname") private String nickname; - @Column(name = "social_name", nullable = false) private String socialName; - @Enumerated(STRING) @Column(name = "job_group") private JobGroup jobGroup; - @Enumerated(STRING) @Column(name = "job_category") private JobCategory jobCategory; - @Column(name = "social_email", nullable = false) private String socialEmail; - @Column(name = "official_email") private String officialEmail; - @Column(name = "credit", nullable = false) private int credit; - @Column(name = "role", nullable = false) private String role; - @Column(name = "profile_image_no", nullable = false) - private final int profileImageNo = setRandomNumber(); - @Builder(access = PRIVATE) private Member(String nickname, String socialName, JobGroup jobGroup, JobCategory jobCategory, String socialEmail, String officialEmail, int credit, String role) { diff --git a/src/main/java/com/dnd/gongmuin/question_post/controller/QuestionPostController.java b/src/main/java/com/dnd/gongmuin/question_post/controller/QuestionPostController.java index 6d16904c..ed83c24c 100644 --- a/src/main/java/com/dnd/gongmuin/question_post/controller/QuestionPostController.java +++ b/src/main/java/com/dnd/gongmuin/question_post/controller/QuestionPostController.java @@ -55,7 +55,7 @@ public ResponseEntity getQuestionPostById( @AuthenticationPrincipal Member member ) { QuestionPostDetailResponse response = - questionPostService.getQuestionPostById(questionPostId,member); + questionPostService.getQuestionPostById(questionPostId, member); return ResponseEntity.ok(response); } diff --git a/src/main/java/com/dnd/gongmuin/security/handler/CustomAccessDeniedHandler.java b/src/main/java/com/dnd/gongmuin/security/handler/CustomAccessDeniedHandler.java index c1347b1d..0181ca55 100644 --- a/src/main/java/com/dnd/gongmuin/security/handler/CustomAccessDeniedHandler.java +++ b/src/main/java/com/dnd/gongmuin/security/handler/CustomAccessDeniedHandler.java @@ -25,29 +25,6 @@ public class CustomAccessDeniedHandler implements AccessDeniedHandler { private static final String ROLE_GUEST = "ROLE_GUEST"; private static final String ROLE_USER = "ROLE_USER"; - @Override - public void handle(HttpServletRequest request, HttpServletResponse response, - AccessDeniedException accessDeniedException) throws IOException, ServletException { - // 현재 인증된 사용자 정보 가져오기 - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - - // 사용자 권한에 따라 다른 응답 제공 - if (!Objects.isNull(accessDeniedException)) { - if (!matchAuthenticationFromRole(authentication, ROLE_USER)) { - // ROLE_USER 권한이 없는 경우 - setUpResponse(response, SecurityErrorCode.FORBIDDEN_USER); - } else if (!matchAuthenticationFromRole(authentication, ROLE_GUEST)) { - // ROLE_GUEST 권한이 없는 경우 - setUpResponse(response, SecurityErrorCode.FORBIDDEN_GUEST); - } else { - // 기타 권한이 없는 경우 - setUpResponse(response, SecurityErrorCode.FORBIDDEN_MISMATCH); - } - } else { - setUpResponse(response, SecurityErrorCode.FORBIDDEN_MISMATCH); - } - } - private static boolean matchAuthenticationFromRole(Authentication authentication, String role) { String authRole = authentication.getAuthorities().stream() .map(GrantedAuthority::getAuthority) @@ -74,4 +51,27 @@ private static void setUpResponse( response.getWriter().write(jsonResponse); } + + @Override + public void handle(HttpServletRequest request, HttpServletResponse response, + AccessDeniedException accessDeniedException) throws IOException, ServletException { + // 현재 인증된 사용자 정보 가져오기 + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + // 사용자 권한에 따라 다른 응답 제공 + if (!Objects.isNull(accessDeniedException)) { + if (!matchAuthenticationFromRole(authentication, ROLE_USER)) { + // ROLE_USER 권한이 없는 경우 + setUpResponse(response, SecurityErrorCode.FORBIDDEN_USER); + } else if (!matchAuthenticationFromRole(authentication, ROLE_GUEST)) { + // ROLE_GUEST 권한이 없는 경우 + setUpResponse(response, SecurityErrorCode.FORBIDDEN_GUEST); + } else { + // 기타 권한이 없는 경우 + setUpResponse(response, SecurityErrorCode.FORBIDDEN_MISMATCH); + } + } else { + setUpResponse(response, SecurityErrorCode.FORBIDDEN_MISMATCH); + } + } } diff --git a/src/test/java/com/dnd/gongmuin/auth/controller/AuthControllerTest.java b/src/test/java/com/dnd/gongmuin/auth/controller/AuthControllerTest.java index 290799da..9118f151 100644 --- a/src/test/java/com/dnd/gongmuin/auth/controller/AuthControllerTest.java +++ b/src/test/java/com/dnd/gongmuin/auth/controller/AuthControllerTest.java @@ -25,7 +25,7 @@ import jakarta.servlet.http.Cookie; @DisplayName("[AuthController] 통합테스트") -public class AuthControllerTest extends ApiTestSupport { +class AuthControllerTest extends ApiTestSupport { @Autowired private MemberRepository memberRepository; @@ -64,7 +64,7 @@ void checkNickName() throws Exception { @Test void signUp() throws Exception { // given - AdditionalInfoRequest request = new AdditionalInfoRequest("dsaf@korea.kr", "회원", "공업", "가스"); + AdditionalInfoRequest request = new AdditionalInfoRequest("dsaf@korea.kr", "회원", "공업", "일반기계"); Member savedMember = memberRepository.save(MemberFixture.member3()); AuthInfo authInfo = AuthInfo.of( diff --git a/src/test/java/com/dnd/gongmuin/auth/service/AuthServiceTest.java b/src/test/java/com/dnd/gongmuin/auth/service/AuthServiceTest.java index 8e60e20b..407ead0e 100644 --- a/src/test/java/com/dnd/gongmuin/auth/service/AuthServiceTest.java +++ b/src/test/java/com/dnd/gongmuin/auth/service/AuthServiceTest.java @@ -1,7 +1,5 @@ package com.dnd.gongmuin.auth.service; -import static com.dnd.gongmuin.member.domain.JobCategory.*; -import static com.dnd.gongmuin.member.domain.JobGroup.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.BDDMockito.*; @@ -31,6 +29,8 @@ import com.dnd.gongmuin.auth.repository.AuthRepository; import com.dnd.gongmuin.common.fixture.AuthFixture; import com.dnd.gongmuin.common.fixture.MemberFixture; +import com.dnd.gongmuin.member.domain.JobCategory; +import com.dnd.gongmuin.member.domain.JobGroup; import com.dnd.gongmuin.member.domain.Member; import com.dnd.gongmuin.member.repository.MemberRepository; import com.dnd.gongmuin.member.service.MemberService; @@ -144,12 +144,12 @@ void isDuplicatedNickname() { @Test void signUp() { // given - AdditionalInfoRequest request = new AdditionalInfoRequest("abc123@korea.com", "김신규", "공업", "가스"); + AdditionalInfoRequest request = new AdditionalInfoRequest("abc123@korea.com", "김신규", "공업", "일반기계"); MockHttpServletResponse mockResponse = new MockHttpServletResponse(); Member member1 = MemberFixture.member3(); given(memberRepository.findBySocialEmail(member1.getSocialEmail())).willReturn( - Optional.ofNullable(member1)); + Optional.of(member1)); // when authService.signUp(request, member1.getSocialEmail(), mockResponse); @@ -159,8 +159,8 @@ void signUp() { .containsExactlyInAnyOrder( "abc123@korea.com", "김신규", - GAS, - ENGINEERING + JobGroup.ENG, + JobCategory.GME ); } diff --git a/src/test/java/com/dnd/gongmuin/common/fixture/MemberFixture.java b/src/test/java/com/dnd/gongmuin/common/fixture/MemberFixture.java index 2f690bdb..bf8dad0f 100644 --- a/src/test/java/com/dnd/gongmuin/common/fixture/MemberFixture.java +++ b/src/test/java/com/dnd/gongmuin/common/fixture/MemberFixture.java @@ -18,8 +18,8 @@ public static Member member() { return Member.of( "김회원", "회원123", - JobGroup.ENGINEERING, - JobCategory.GAS, + JobGroup.ENG, + JobCategory.ME, "KAKAO123/gongmuin@daum.net", "gongmuin@korea.kr", 10000, @@ -31,8 +31,8 @@ public static Member member2() { return Member.of( "회원", "소셜회원", - JobGroup.ENGINEERING, - JobCategory.GAS, + JobGroup.ENG, + JobCategory.ME, "KAKAO123/member2@daum.net", "member2@korea.kr", 20000, @@ -53,8 +53,8 @@ public static Member member4() { return Member.of( "회원", "소셜회원", - JobGroup.ADMINISTRATION, - JobCategory.GAS, + JobGroup.AD, + JobCategory.ME, "KAKAO1234/member2@daum.net", "member@korea.kr", 20000, @@ -66,8 +66,8 @@ public static Member member(Long memberId) { Member member = Member.of( "김회원", "회원123", - JobGroup.ENGINEERING, - JobCategory.GAS, + JobGroup.ENG, + JobCategory.ME, "KAKAO123/gongmuin@daum.net", "gongmuin@korea.kr", 10000, diff --git a/src/test/java/com/dnd/gongmuin/common/support/ApiTestSupport.java b/src/test/java/com/dnd/gongmuin/common/support/ApiTestSupport.java index a290db06..95ba1283 100644 --- a/src/test/java/com/dnd/gongmuin/common/support/ApiTestSupport.java +++ b/src/test/java/com/dnd/gongmuin/common/support/ApiTestSupport.java @@ -34,9 +34,9 @@ public abstract class ApiTestSupport extends TestContainerSupport { @Autowired protected ObjectMapper objectMapper; @Autowired - private TokenProvider tokenProvider; - @Autowired protected CookieUtil cookieUtil; + @Autowired + private TokenProvider tokenProvider; protected String toJson(Object object) throws JsonProcessingException { return objectMapper.writeValueAsString(object); diff --git a/src/test/java/com/dnd/gongmuin/member/controller/MemberControllerTest.java b/src/test/java/com/dnd/gongmuin/member/controller/MemberControllerTest.java index 5e73b3ac..78820fe9 100644 --- a/src/test/java/com/dnd/gongmuin/member/controller/MemberControllerTest.java +++ b/src/test/java/com/dnd/gongmuin/member/controller/MemberControllerTest.java @@ -67,7 +67,7 @@ void getMemberProfile() throws Exception { .andExpect(status().isOk()) .andExpect(jsonPath("nickname").value("김회원")) .andExpect(jsonPath("jobGroup").value("공업")) - .andExpect(jsonPath("jobCategory").value("가스")) + .andExpect(jsonPath("jobCategory").value("기계")) .andExpect(jsonPath("credit").value(10000)); } @@ -75,7 +75,7 @@ void getMemberProfile() throws Exception { @Test void updateMemberProfile() throws Exception { // given - UpdateMemberProfileRequest request = new UpdateMemberProfileRequest("박회원", "행정", "가스"); + UpdateMemberProfileRequest request = new UpdateMemberProfileRequest("박회원", "행정", "세무"); // when // then mockMvc.perform(patch("/api/members/profile/edit") @@ -86,7 +86,7 @@ void updateMemberProfile() throws Exception { .andExpect(status().isOk()) .andExpect(jsonPath("nickname").value("박회원")) .andExpect(jsonPath("jobGroup").value("행정")) - .andExpect(jsonPath("jobCategory").value("가스")) + .andExpect(jsonPath("jobCategory").value("세무")) .andExpect(jsonPath("credit").value(10000)); } diff --git a/src/test/java/com/dnd/gongmuin/member/domain/MemberTest.java b/src/test/java/com/dnd/gongmuin/member/domain/MemberTest.java index c60aed11..836e5456 100644 --- a/src/test/java/com/dnd/gongmuin/member/domain/MemberTest.java +++ b/src/test/java/com/dnd/gongmuin/member/domain/MemberTest.java @@ -1,7 +1,5 @@ package com.dnd.gongmuin.member.domain; -import static com.dnd.gongmuin.member.domain.JobCategory.*; -import static com.dnd.gongmuin.member.domain.JobGroup.*; import static org.assertj.core.api.Assertions.*; import org.junit.jupiter.api.DisplayName; @@ -31,7 +29,10 @@ void updateAdditionalInfo() { Member member = MemberFixture.member3(); // when - member.updateAdditionalInfo("김회원", "abcd@korea.kr", ENGINEERING, GAS); + member.updateAdditionalInfo("김회원", + "abcd@korea.kr", + JobGroup.ME, + JobCategory.ME); // then assertThat(member).extracting("nickname", "officialEmail") diff --git a/src/test/java/com/dnd/gongmuin/member/service/MemberServiceTest.java b/src/test/java/com/dnd/gongmuin/member/service/MemberServiceTest.java index 05fc4e16..8c1d3716 100644 --- a/src/test/java/com/dnd/gongmuin/member/service/MemberServiceTest.java +++ b/src/test/java/com/dnd/gongmuin/member/service/MemberServiceTest.java @@ -109,7 +109,7 @@ void getMemberProfileThrowException() { void updateMemberProfile() { // given Member member = MemberFixture.member(); - UpdateMemberProfileRequest request = new UpdateMemberProfileRequest("박회원", "공업", "가스"); + UpdateMemberProfileRequest request = new UpdateMemberProfileRequest("박회원", "공업", "일반기계"); given(memberRepository.findByOfficialEmail(anyString())).willReturn(member); diff --git a/src/test/java/com/dnd/gongmuin/question_post/controller/QuestionPostControllerTest.java b/src/test/java/com/dnd/gongmuin/question_post/controller/QuestionPostControllerTest.java index 51871f76..277cffb1 100644 --- a/src/test/java/com/dnd/gongmuin/question_post/controller/QuestionPostControllerTest.java +++ b/src/test/java/com/dnd/gongmuin/question_post/controller/QuestionPostControllerTest.java @@ -246,7 +246,7 @@ void updateQuestionPost() throws Exception { questionPost.getContent() + "ts", null, questionPost.getReward() + 1000, - JobGroup.ADMINISTRATION.getLabel() + JobGroup.AD.getLabel() ); mockMvc.perform(patch("/api/question-posts/{questionPostId}/edit", questionPost.getId()) .content(toJson(request)) diff --git a/src/test/java/com/dnd/gongmuin/question_post/service/QuestionPostServiceTest.java b/src/test/java/com/dnd/gongmuin/question_post/service/QuestionPostServiceTest.java index 7ea65702..402bd296 100644 --- a/src/test/java/com/dnd/gongmuin/question_post/service/QuestionPostServiceTest.java +++ b/src/test/java/com/dnd/gongmuin/question_post/service/QuestionPostServiceTest.java @@ -93,11 +93,13 @@ void getQuestionPostById_noInteraction() { .willReturn(Optional.of(questionPost)); given(interactionRepository - .existsByQuestionPostIdAndMemberIdAndTypeAndIsInteractedTrue(questionPostId, member.getId(), InteractionType.SAVED)) + .existsByQuestionPostIdAndMemberIdAndTypeAndIsInteractedTrue(questionPostId, member.getId(), + InteractionType.SAVED)) .willReturn(false); given(interactionRepository - .existsByQuestionPostIdAndMemberIdAndTypeAndIsInteractedTrue(questionPostId, member.getId(), InteractionType.RECOMMEND)) + .existsByQuestionPostIdAndMemberIdAndTypeAndIsInteractedTrue(questionPostId, member.getId(), + InteractionType.RECOMMEND)) .willReturn(false); //when @@ -160,10 +162,12 @@ void getQuestionPostById_my_interaction() { .willReturn(Optional.of(questionPost)); given(interactionRepository - .existsByQuestionPostIdAndMemberIdAndTypeAndIsInteractedTrue(questionPostId, member.getId(), InteractionType.SAVED)) + .existsByQuestionPostIdAndMemberIdAndTypeAndIsInteractedTrue(questionPostId, member.getId(), + InteractionType.SAVED)) .willReturn(false); given(interactionRepository - .existsByQuestionPostIdAndMemberIdAndTypeAndIsInteractedTrue(questionPostId, member.getId(), InteractionType.RECOMMEND)) + .existsByQuestionPostIdAndMemberIdAndTypeAndIsInteractedTrue(questionPostId, member.getId(), + InteractionType.RECOMMEND)) .willReturn(true); InteractionCount recommendCount