From be67deecce482c0d0557a311f76016308b3676cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=87=E1=85=A1=E1=86=A8=E1=84=8C=E1=85=B5=E1=84=92?= =?UTF-8?q?=E1=85=A7=E1=86=A8?= Date: Wed, 13 Nov 2024 21:53:59 +0900 Subject: [PATCH 01/15] =?UTF-8?q?Test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=9A=A9=20application.yml=20=ED=8C=8C=EC=9D=BC=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 --- src/test/resources/application.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/test/resources/application.yml diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml new file mode 100644 index 0000000..aefd119 --- /dev/null +++ b/src/test/resources/application.yml @@ -0,0 +1,20 @@ +# 테스트용 환경 세팅 +spring: + h2: + console: + enabled: true + datasource: + driver-class-name: org.h2.Driver + url: jdbc:h2:mem:testdb + data: + redis: + host: localhost + port: 6379 + jpa: + hibernate: + ddl-auto: create + show-sql: true +JWT: + ACCESS_SECRET_KEY: "testAccessSecretKey" + REFRESH_SECRET_KEY: "testRefreshSecretKey" + ISSUER: "pjh5365" From 79b24c5099aba0e293cff4cf3b2deb3c848e043c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=87=E1=85=A1=E1=86=A8=E1=84=8C=E1=85=B5=E1=84=92?= =?UTF-8?q?=E1=85=A7=E1=86=A8?= Date: Wed, 13 Nov 2024 21:54:41 +0900 Subject: [PATCH 02/15] =?UTF-8?q?Feat:=20Dockerfile=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..76d419e --- /dev/null +++ b/Dockerfile @@ -0,0 +1,14 @@ +# Build +FROM eclipse-temurin:17-jdk AS build +LABEL authors="pjh5365" + +WORKDIR /src +COPY . /src +RUN ./gradlew build + +# Run +FROM eclipse-temurin:17-jre +EXPOSE 8080 +COPY --from=build /src/build/libs/*SNAPSHOT.jar work-plate.jar + +ENTRYPOINT ["java", "-jar", "work-plate.jar"] From 60316bf022c0962fb0f083bf638d55adbe872469 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=87=E1=85=A1=E1=86=A8=E1=84=8C=E1=85=B5=E1=84=92?= =?UTF-8?q?=E1=85=A7=E1=86=A8?= Date: Fri, 15 Nov 2024 20:16:11 +0900 Subject: [PATCH 03/15] =?UTF-8?q?Refactor:=20AI=20=EC=9A=94=EA=B5=AC?= =?UTF-8?q?=EC=82=AC=ED=95=AD=EC=97=90=20=EB=A7=9E=EA=B2=8C=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/domain/Experience.java | 18 --- .../auth/domain/MainExperience.java | 28 +++++ .../auth/domain/PhysicalStatus.java | 5 +- .../auth/domain/Preference.java | 18 --- .../auth/domain/SubExperience.java | 119 ++++++++++++++++++ .../auth/domain/dto/request/JoinRequest.java | 2 + .../dto/request/MemberDetailRequest.java | 14 ++- .../auth/domain/entity/MemberDetail.java | 27 ++-- .../auth/service/MemberService.java | 4 +- .../credit/domain/dto/CreditRequest.java | 3 +- .../work/domain/dto/WorkJoinRequest.java | 2 + src/main/resources/static/docs/index.html | 80 +++++++----- .../auth/controller/MemberControllerTest.java | 28 +++-- .../MemberDetailRepositoryTest.java | 23 ++-- .../auth/service/MemberServiceTest.java | 14 ++- 15 files changed, 274 insertions(+), 111 deletions(-) delete mode 100644 src/main/java/workplate/workplateserver/auth/domain/Experience.java create mode 100644 src/main/java/workplate/workplateserver/auth/domain/MainExperience.java delete mode 100644 src/main/java/workplate/workplateserver/auth/domain/Preference.java create mode 100644 src/main/java/workplate/workplateserver/auth/domain/SubExperience.java diff --git a/src/main/java/workplate/workplateserver/auth/domain/Experience.java b/src/main/java/workplate/workplateserver/auth/domain/Experience.java deleted file mode 100644 index f6436e5..0000000 --- a/src/main/java/workplate/workplateserver/auth/domain/Experience.java +++ /dev/null @@ -1,18 +0,0 @@ -package workplate.workplateserver.auth.domain; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -/** - * 기존 경력 enum - * - * @author : parkjihyeok - * @since : 2024/11/03 - */ -@Getter -@RequiredArgsConstructor -public enum Experience { - // TODO: 2024/11/3 타입에 맞게 추가하기 - TEST("테스트용"); - private final String experience; -} diff --git a/src/main/java/workplate/workplateserver/auth/domain/MainExperience.java b/src/main/java/workplate/workplateserver/auth/domain/MainExperience.java new file mode 100644 index 0000000..6ebd11f --- /dev/null +++ b/src/main/java/workplate/workplateserver/auth/domain/MainExperience.java @@ -0,0 +1,28 @@ +package workplate.workplateserver.auth.domain; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * 직종 대분류 + * + * @author : parkjihyeok + * @since : 2024/11/03 + */ +@Getter +@RequiredArgsConstructor +public enum MainExperience { + COOKING_SERVING("요리·서빙"), + PRODUCTION_TECHNICAL("생산·기술"), + DRIVING_DELIVERY_LOGISTICS("운전·배달·물류"), + CONSTRUCTION_CIVIL_ENGINEERING_LABOR("건설·토목·노무"), + DISTRIBUTION_SALES("유통·판매"), + CULTURE_LEISURE_LIFESTYLE("문화·여가·생활"), + SERVICE("서비스"), + OFFICE_ACCOUNTING_IT("사무·회계·IT"), + SALES_CONSULTING("영업·상담"), + CAREGIVING_NURSING_MEDICAL("요양·간호·의료"), + EDUCATION_INSTRUCTION("교육·강사"); + + private final String mainExperience; +} diff --git a/src/main/java/workplate/workplateserver/auth/domain/PhysicalStatus.java b/src/main/java/workplate/workplateserver/auth/domain/PhysicalStatus.java index 5b1c9ca..77bb71e 100644 --- a/src/main/java/workplate/workplateserver/auth/domain/PhysicalStatus.java +++ b/src/main/java/workplate/workplateserver/auth/domain/PhysicalStatus.java @@ -12,7 +12,8 @@ @Getter @RequiredArgsConstructor public enum PhysicalStatus { - // TODO: 2024/11/3 타입에 맞게 추가하기 - TEST("테스트용"); + NORMAL("정상"), + PRE_FRAIL("노쇠 전"), + FRAIL("노쇠"); private final String physicalStatus; } diff --git a/src/main/java/workplate/workplateserver/auth/domain/Preference.java b/src/main/java/workplate/workplateserver/auth/domain/Preference.java deleted file mode 100644 index 24c4bf8..0000000 --- a/src/main/java/workplate/workplateserver/auth/domain/Preference.java +++ /dev/null @@ -1,18 +0,0 @@ -package workplate.workplateserver.auth.domain; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -/** - * 선호하는 직종 enum - * - * @author : parkjihyeok - * @since : 2024/11/03 - */ -@Getter -@RequiredArgsConstructor -public enum Preference { - // TODO: 2024/11/3 타입에 맞게 추가하기 - TEST("테스트용"); - private final String preference; -} diff --git a/src/main/java/workplate/workplateserver/auth/domain/SubExperience.java b/src/main/java/workplate/workplateserver/auth/domain/SubExperience.java new file mode 100644 index 0000000..e4698f2 --- /dev/null +++ b/src/main/java/workplate/workplateserver/auth/domain/SubExperience.java @@ -0,0 +1,119 @@ +package workplate.workplateserver.auth.domain; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * 직종 소분류 + * + * @author : parkjihyeok + * @since : 2024/11/15 + */ +@Getter +@RequiredArgsConstructor +public enum SubExperience { + // Cooking and Serving + CHEF_COOK("주방장·조리사"), + KITCHEN_STAFF("주방·주방보조·설거지"), + SERVING_PACKAGING("서빙·포장"), + COUNTER("카운터"), + STORE_MANAGER("점장·매니저"), + OTHER_COOKING_SERVING("요리·서빙 기타"), + + // Production and Technical + TEXTILE("섬유·재단·미싱"), + PRODUCTION_MANUFACTURING("생산·제조·조립·인쇄"), + PACKAGING_INSPECTION("포장·검사"), + INSTALLATION_REPAIR("설치·수리·정비·AS"), + FARM_AGRICULTURE("농장·농사"), + METALWORK_MOLD("금속·금형"), + AUTO_REPAIR_SHIPBUILDING("자동차정비·조선·선원"), + MACHINERY_EQUIPMENT("기계·설비"), + FOOD_MANUFACTURING("농수산물 가공·식품 제조"), + OTHER_PRODUCTION_TECHNICAL("생산·기술 기타"), + + // Driving and Delivery + PARCEL_DELIVERY("택배·물류"), + CARGO_SPECIAL_VEHICLES("화물·중장비·특수차"), + INDEPENDENT_CONTRACTOR("지입·차량용역"), + BUS_TAXI_VAN("버스·택시·승합차"), + DELIVERY_MOVING("배송·이사"), + QUICK_SERVICE("배달·퀵·이륜차"), + CHAUFFEUR("승용차·대리운전"), + OTHER_DRIVING_DELIVERY("운전·배달 기타"), + + // Construction + CONSTRUCTION_FINISHING("건설마감"), + CONSTRUCTION_STRUCTURE("건설구조"), + WELDING_CUTTING("용접·절단"), + PLUMBING_FACILITIES("배관·설비"), + ELECTRICAL_MANAGEMENT("전기·조명·시설관리"), + CONSTRUCTION_SITE("건설현장"), + OTHER_CONSTRUCTION("건설·토목 기타"), + + // Sales and Distribution + MART_SUPERMARKET("마트·슈퍼"), + CONVENIENCE_STORE("편의점"), + LIVESTOCK_PRODUCE("축산·청과·농수산"), + DEPARTMENT_STORE("백화점·아울렛·쇼핑몰"), + LARGE_RETAIL_STORE("대형마트·유통점"), + CLOTHING_ACCESSORIES("의류·주얼리·잡화"), + FLORIST("꽃·화훼"), + COSMETICS_BEAUTY("화장품·뷰티·헬스스토어"), + OTHER_SALES_DISTRIBUTION("유통·판매 기타"), + + // Culture and Leisure + HOTEL_LODGING("모텔·호텔·숙박"), + SAUNA_SPA("사우나·찜질방"), + HIGHWAY_REST_STOP("고속도로 휴게소"), + SPORTS("당구장·볼링장·스포츠"), + GOLF("골프·스크린골프"), + ARCADE_PC_ROOM("오락실·PC방"), + BEAUTY("헤어·네일·피부·미용"), + PET_SHOP("반려동물·애견샵"), + STUDY_CAFE("독서실·고시원·스터디카페"), + OTHER_LIFESTYLE("문화·여가·생활 기타"), + + // Services + CLEANING_SANITATION("청소·미화·방역"), + SECURITY_GUARD("경비·보안"), + CAR_WASH_REFUELING("세차·주유"), + PARKING_MANAGEMENT("주차관리·주차도우미"), + LAUNDRY_ALTERATION("세탁·수선"), + HOUSEKEEPER_BABYSITTER("가사도우미·베이비시터"), + FUNERAL_WEDDING("상조·웨딩·연회"), + OTHER_SERVICE("서비스 기타"), + + // Office Work + ACCOUNTING_FINANCE("경리·세무·회계"), + OFFICE_PLANNING("사무·기획·관리·홍보"), + GENERAL_AFFAIRS("총무·노무·법무·인사"), + IT_DESIGN("컴퓨터·IT·디자인"), + RECEPTION_SECRETARY("안내·비서"), + OTHER_OFFICE_WORK("사무·회계·IT 기타"), + + // Sales and Consulting + INBOUND_CS("인바운드·CS"), + OUTBOUND_TM("아웃바운드·TM"), + REAL_ESTATE("부동산"), + GENERAL_SALES("일반·기술영업"), + FINANCE_INSURANCE("금융·보험·카드"), + OTHER_SALES_CONSULTING("상담·영업기타"), + + // Medical and Care + ELDERLY_CARE("요양·간병·돌봄"), + NURSING_ASSISTANT("간호조무사·간호사"), + MEDICAL_TECHNICIAN("의료기사·치료사"), + DOCTOR("의사·한의사"), + OTHER_MEDICAL_CARE("요양·간호·의료 기타"), + + // Education and Instruction + DAYCARE("어린이집·유치원"), + ENTRANCE_EXAM("입시·보습·자격증"), + PRIVATE_TUTORING("과외·공부방·학습지"), + SPORTS_INSTRUCTION("생활체육·스포츠"), + MUSIC_ART("음악·피아노·미술"), + OTHER_EDUCATION("교육·강사 기타"); + + private final String subExperience; +} diff --git a/src/main/java/workplate/workplateserver/auth/domain/dto/request/JoinRequest.java b/src/main/java/workplate/workplateserver/auth/domain/dto/request/JoinRequest.java index 583eca4..3e7d40d 100644 --- a/src/main/java/workplate/workplateserver/auth/domain/dto/request/JoinRequest.java +++ b/src/main/java/workplate/workplateserver/auth/domain/dto/request/JoinRequest.java @@ -2,6 +2,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; /** * 회원가입 요청 DTO @@ -10,6 +11,7 @@ * @since : 2024/10/31 */ @Getter +@NoArgsConstructor @AllArgsConstructor public class JoinRequest { diff --git a/src/main/java/workplate/workplateserver/auth/domain/dto/request/MemberDetailRequest.java b/src/main/java/workplate/workplateserver/auth/domain/dto/request/MemberDetailRequest.java index 08066b9..c2d474a 100644 --- a/src/main/java/workplate/workplateserver/auth/domain/dto/request/MemberDetailRequest.java +++ b/src/main/java/workplate/workplateserver/auth/domain/dto/request/MemberDetailRequest.java @@ -1,12 +1,11 @@ package workplate.workplateserver.auth.domain.dto.request; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; import lombok.AllArgsConstructor; import lombok.Getter; -import workplate.workplateserver.auth.domain.Experience; +import lombok.NoArgsConstructor; +import workplate.workplateserver.auth.domain.MainExperience; import workplate.workplateserver.auth.domain.PhysicalStatus; -import workplate.workplateserver.auth.domain.Preference; +import workplate.workplateserver.auth.domain.SubExperience; /** * 회원 상세정보 DTO @@ -15,12 +14,15 @@ * @since : 2024/10/31 */ @Getter +@NoArgsConstructor @AllArgsConstructor public class MemberDetailRequest { private String username; private int age; - private Experience experience; + private MainExperience mainExperience; + private SubExperience subExperience; + private MainExperience mainPreference; + private SubExperience subPreference; private PhysicalStatus physicalStatus; - private Preference preference; } diff --git a/src/main/java/workplate/workplateserver/auth/domain/entity/MemberDetail.java b/src/main/java/workplate/workplateserver/auth/domain/entity/MemberDetail.java index 99f2ba5..c480ccb 100644 --- a/src/main/java/workplate/workplateserver/auth/domain/entity/MemberDetail.java +++ b/src/main/java/workplate/workplateserver/auth/domain/entity/MemberDetail.java @@ -14,9 +14,10 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import workplate.workplateserver.auth.domain.Experience; +import workplate.workplateserver.auth.domain.MainExperience; import workplate.workplateserver.auth.domain.PhysicalStatus; -import workplate.workplateserver.auth.domain.Preference; +import workplate.workplateserver.auth.domain.SubExperience; +import workplate.workplateserver.auth.domain.dto.request.MemberDetailRequest; import workplate.workplateserver.common.BaseEntity; /** @@ -43,21 +44,25 @@ public class MemberDetail extends BaseEntity { private int age; @Enumerated(value = EnumType.STRING) - private Experience experience; + private MainExperience mainExperience; @Enumerated(value = EnumType.STRING) - private PhysicalStatus physicalStatus; + private SubExperience subExperience; + @Enumerated(value = EnumType.STRING) + private MainExperience mainPreference; @Enumerated(value = EnumType.STRING) - private Preference preference; + private SubExperience subPreference; + @Enumerated(value = EnumType.STRING) + private PhysicalStatus physicalStatus; - public static MemberDetail toEntity(Member member, int age, Experience experience, PhysicalStatus physicalStatus, - Preference preference) { + public static MemberDetail toEntity(Member member, MemberDetailRequest request) { return MemberDetail.builder() .member(member) - .age(age) - .experience(experience) - .physicalStatus(physicalStatus) - .preference(preference) + .age(request.getAge()) + .mainPreference(request.getMainPreference()) + .subExperience(request.getSubExperience()) + .subPreference(request.getSubPreference()) + .physicalStatus(request.getPhysicalStatus()) .build(); } } diff --git a/src/main/java/workplate/workplateserver/auth/service/MemberService.java b/src/main/java/workplate/workplateserver/auth/service/MemberService.java index bcb3ef6..09ad4b0 100644 --- a/src/main/java/workplate/workplateserver/auth/service/MemberService.java +++ b/src/main/java/workplate/workplateserver/auth/service/MemberService.java @@ -57,9 +57,7 @@ public void saveMember(JoinRequest joinRequest) { public void saveDetails(MemberDetailRequest request) { Member member = commonService.findByUsername(request.getUsername(), true); Credit credit = Credit.toEntity(member); - MemberDetail memberDetail = MemberDetail.toEntity(member, request.getAge(), request.getExperience(), - request.getPhysicalStatus(), - request.getPreference()); + MemberDetail memberDetail = MemberDetail.toEntity(member, request); memberDetailRepository.save(memberDetail); creditRepository.save(credit); } diff --git a/src/main/java/workplate/workplateserver/credit/domain/dto/CreditRequest.java b/src/main/java/workplate/workplateserver/credit/domain/dto/CreditRequest.java index e4d8323..f646648 100644 --- a/src/main/java/workplate/workplateserver/credit/domain/dto/CreditRequest.java +++ b/src/main/java/workplate/workplateserver/credit/domain/dto/CreditRequest.java @@ -3,6 +3,7 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; +import lombok.NoArgsConstructor; /** * 크레딧 증감 요청 @@ -11,6 +12,7 @@ * @since : 2024/11/13 */ @Getter +@NoArgsConstructor @AllArgsConstructor @Builder public class CreditRequest { @@ -18,5 +20,4 @@ public class CreditRequest { private String username; private Long balance; - } diff --git a/src/main/java/workplate/workplateserver/work/domain/dto/WorkJoinRequest.java b/src/main/java/workplate/workplateserver/work/domain/dto/WorkJoinRequest.java index 67456d2..8cedcc5 100644 --- a/src/main/java/workplate/workplateserver/work/domain/dto/WorkJoinRequest.java +++ b/src/main/java/workplate/workplateserver/work/domain/dto/WorkJoinRequest.java @@ -2,6 +2,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; /** * 소일거리 참가 요청 @@ -10,6 +11,7 @@ * @since : 2024/11/13 */ @Getter +@NoArgsConstructor @AllArgsConstructor public class WorkJoinRequest { diff --git a/src/main/resources/static/docs/index.html b/src/main/resources/static/docs/index.html index f04f70c..88a9a9f 100644 --- a/src/main/resources/static/docs/index.html +++ b/src/main/resources/static/docs/index.html @@ -490,7 +490,7 @@

요청

HTTP request
-
POST /api/join?_csrf=QsE6JKQlHZIiU8HPOYZmNGwJHQc0clQ0ae2hjrzFgOfI3TyXI_kMEJ0QJaQPZKf3CqtSDQhqMD8GQ2QZDN_E7YijtYWs7Vin HTTP/1.1
+
POST /api/join?_csrf=uqGwVr5ZRkFGB1PDZT5OiMVU0jpDbCBYYDbvR2T-R8Q_DWeS3JmIbtg6d3BrYmXxAxN6vKFt_wN3CUN1VgDbJAbJJaVdbgKg HTTP/1.1
 Content-Type: application/json;charset=UTF-8
 Content-Length: 75
 Host: localhost:8080
@@ -606,7 +606,7 @@ 

요청

HTTP request
-
POST /api/join?_csrf=U9yI2-54Q6c8Ts98IiUY_jcQcR3l1qwoaYbxhgHhgYRQRACrMOWw7tcaIJQRLKoZEggsmlYkXCSD580FXLbIv2DZ57ZnfTXP HTTP/1.1
+
POST /api/join?_csrf=nHAt8mXu5LrBXuVeaBu2HIYegvQHhqbJ9_PMyGVbGoI4V6oh-kcfkVOM1Ivsad09WjaCL-V_r81iv5LkxcqvqwM5LudeYMgR HTTP/1.1
 Content-Type: application/json;charset=UTF-8
 Content-Length: 75
 Host: localhost:8080
@@ -722,17 +722,19 @@ 

요청

HTTP request
-
POST /api/member?_csrf=ypKKXvLvUxriu6QobHxkW-WEvnAQ-pgBTh3lFWvpcmPXMYbB8_O_OpffMSvPiJNOVVFQYoCzk0l0zPwsK3zQd17eFFXmBuT5 HTTP/1.1
+
POST /api/member?_csrf=P36JFwmul7Teu6P8UCzcJ0IGpZJZa_KevzzOcfMTJZpZhciWW0ixLzmY9oHzisfFZgHoF3dkiPA4WMezjAqoE8QmE686tKmg HTTP/1.1
 Content-Type: application/json;charset=UTF-8
-Content-Length: 120
+Content-Length: 246
 Host: localhost:8080
 
 {
   "username" : "testId",
   "age" : 70,
-  "experience" : "TEST",
-  "physicalStatus" : "TEST",
-  "preference" : "TEST"
+  "mainExperience" : "OFFICE_ACCOUNTING_IT",
+  "subExperience" : "ACCOUNTING_FINANCE",
+  "mainPreference" : "OFFICE_ACCOUNTING_IT",
+  "subPreference" : "ACCOUNTING_FINANCE",
+  "physicalStatus" : "NORMAL"
 }
@@ -764,19 +766,29 @@
Request fields

나이

-

experience

+

mainExperience

String

-

일 경험

+

일 경험 (대분류)

-

physicalStatus

+

subExperience

String

-

건강 상태

+

일 경험 (소분류)

+ + +

mainPreference

+

String

+

선호 직종 (대분류)

-

preference

+

subPreference

String

-

선호 직종

+

선호 직종 (소분류)

+ + +

physicalStatus

+

String

+

건강 상태

@@ -850,17 +862,19 @@

요청

HTTP request
-
POST /api/member?_csrf=YTAh2WzfOOjSLVashUr_Rip1Y_-_oqUiLFtvbygcWRaQOcmJUQESvV7sXY3_TmKVvGfLJBhCTp2IlpIPG2wLChF_O3ClWqqx HTTP/1.1
+
POST /api/member?_csrf=pZ25SF_D7mKw0dsGee1kXmL8WR_Yu2nru0qP64U_vwS7vPnDlquILDv0i1Od4bkxH8BQOlGddCa6iAjG2im_ieYKjGffiJv0 HTTP/1.1
 Content-Type: application/json;charset=UTF-8
-Content-Length: 120
+Content-Length: 246
 Host: localhost:8080
 
 {
   "username" : "testId",
   "age" : 70,
-  "experience" : "TEST",
-  "physicalStatus" : "TEST",
-  "preference" : "TEST"
+  "mainExperience" : "OFFICE_ACCOUNTING_IT",
+  "subExperience" : "ACCOUNTING_FINANCE",
+  "mainPreference" : "OFFICE_ACCOUNTING_IT",
+  "subPreference" : "ACCOUNTING_FINANCE",
+  "physicalStatus" : "NORMAL"
 }
@@ -892,19 +906,29 @@
Request fields

나이

-

experience

+

mainExperience

String

-

일 경험

+

일 경험 (대분류)

-

physicalStatus

+

subExperience

String

-

건강 상태

+

일 경험 (소분류)

+ + +

mainPreference

+

String

+

선호 직종 (대분류)

-

preference

+

subPreference

String

-

선호 직종

+

선호 직종 (소분류)

+ + +

physicalStatus

+

String

+

건강 상태

@@ -1485,7 +1509,7 @@

요청

HTTP request
-
PATCH /api/credits/plus?_csrf=p-sx8nx0iFNeVfUDDu9YOv9kAe5_7_Rc2eqMT7vW5sREQQL1lo1QkEQV7GJzN8Y3O8JsXptXLNZIi8Jx7Nq7K4Lg1KFxIDaR HTTP/1.1
+
PATCH /api/credits/plus?_csrf=FTufPolFbnQWgcjDW8jT-Zkka5uhtYIsfBvR-8aKTSGi-mnJJQuoCbgjChI7sK6lY-Xnz6oTRvnHgbABSCrnmv--ekKRzFys HTTP/1.1
 Content-Type: application/json;charset=UTF-8
 Content-Length: 47
 Host: localhost:8080
@@ -1608,7 +1632,7 @@ 

요청

HTTP request
-
PATCH /api/credits/minus?_csrf=JKkbsJeB-Sz-w-AC7kxVC2Sk-t2H4JN9m31Sli7D3L8hFxgoRpF9gKW3nU_TptExj2FhM12R1-Xi06ZQoklgpB_wvooWI3tK HTTP/1.1
+
PATCH /api/credits/minus?_csrf=RIhdRhgUX7s9SaRUFcBJ4rkdcDr5ESnv0ZSbEQORawtiuuyFJ-xrdSAjbd0Qe5E2Ie19gY4qXQOaIBrC5_etJzuoXmhRgoq8 HTTP/1.1
 Content-Type: application/json;charset=UTF-8
 Content-Length: 47
 Host: localhost:8080
@@ -2005,7 +2029,7 @@ 

요청

HTTP request
-
POST /api/works-join?_csrf=Yt9bTYD94jclNSw3axkWxVEAKuhXyyf6cHKZ-iBXsJ4HdKyUW-9tfrjK0A8IVB5VXjQipzI1B4pk80XXR0qrnxJkhak0EJjx HTTP/1.1
+
POST /api/works-join?_csrf=aLTWfYjPQd7xySlQdXuyQQ-JWy5_zEjlcqFBU1-hVLp8xZ2lUdLmTun_cunc_hBoEFaGcWztdk9N-ivIF5YkZm_EMo9Fof6c HTTP/1.1
 Content-Type: application/json;charset=UTF-8
 Content-Length: 44
 Host: localhost:8080
@@ -2113,7 +2137,7 @@ 
Response fields
diff --git a/src/test/java/workplate/workplateserver/auth/controller/MemberControllerTest.java b/src/test/java/workplate/workplateserver/auth/controller/MemberControllerTest.java index c661c11..e46b643 100644 --- a/src/test/java/workplate/workplateserver/auth/controller/MemberControllerTest.java +++ b/src/test/java/workplate/workplateserver/auth/controller/MemberControllerTest.java @@ -24,9 +24,9 @@ import com.google.gson.Gson; -import workplate.workplateserver.auth.domain.Experience; +import workplate.workplateserver.auth.domain.MainExperience; import workplate.workplateserver.auth.domain.PhysicalStatus; -import workplate.workplateserver.auth.domain.Preference; +import workplate.workplateserver.auth.domain.SubExperience; import workplate.workplateserver.auth.domain.dto.request.JoinRequest; import workplate.workplateserver.auth.domain.dto.request.MemberDetailRequest; import workplate.workplateserver.auth.domain.jwt.JwtTokenProvider; @@ -141,7 +141,9 @@ void joinFailTest() throws Exception { @WithMockUser void addDetailTest() throws Exception { // Given - MemberDetailRequest request = new MemberDetailRequest("testId", 70, Experience.TEST, PhysicalStatus.TEST, Preference.TEST); + MemberDetailRequest request = new MemberDetailRequest("testId", 70, MainExperience.OFFICE_ACCOUNTING_IT, + SubExperience.ACCOUNTING_FINANCE, MainExperience.OFFICE_ACCOUNTING_IT, SubExperience.ACCOUNTING_FINANCE, + PhysicalStatus.NORMAL); // When mockMvc.perform(post("/api/member") @@ -163,9 +165,11 @@ void addDetailTest() throws Exception { requestFields( fieldWithPath("username").description("가입한 아이디"), fieldWithPath("age").description("나이"), - fieldWithPath("experience").description("일 경험"), - fieldWithPath("physicalStatus").description("건강 상태"), - fieldWithPath("preference").description("선호 직종") + fieldWithPath("mainExperience").description("일 경험 (대분류)"), + fieldWithPath("subExperience").description("일 경험 (소분류)"), + fieldWithPath("mainPreference").description("선호 직종 (대분류)"), + fieldWithPath("subPreference").description("선호 직종 (소분류)"), + fieldWithPath("physicalStatus").description("건강 상태") ), responseFields( fieldWithPath("success").description("성공여부"), @@ -181,7 +185,9 @@ void addDetailTest() throws Exception { @WithMockUser void addDetailFailTest() throws Exception { // Given - MemberDetailRequest request = new MemberDetailRequest("testId", 70, Experience.TEST, PhysicalStatus.TEST, Preference.TEST); + MemberDetailRequest request = new MemberDetailRequest("testId", 70, MainExperience.OFFICE_ACCOUNTING_IT, + SubExperience.ACCOUNTING_FINANCE, MainExperience.OFFICE_ACCOUNTING_IT, SubExperience.ACCOUNTING_FINANCE, + PhysicalStatus.NORMAL); doThrow(new UsernameNotFoundException("회원정보를 찾을 수 없습니다.")).when(memberService).saveDetails(any()); // When @@ -204,9 +210,11 @@ void addDetailFailTest() throws Exception { requestFields( fieldWithPath("username").description("가입한 아이디"), fieldWithPath("age").description("나이"), - fieldWithPath("experience").description("일 경험"), - fieldWithPath("physicalStatus").description("건강 상태"), - fieldWithPath("preference").description("선호 직종") + fieldWithPath("mainExperience").description("일 경험 (대분류)"), + fieldWithPath("subExperience").description("일 경험 (소분류)"), + fieldWithPath("mainPreference").description("선호 직종 (대분류)"), + fieldWithPath("subPreference").description("선호 직종 (소분류)"), + fieldWithPath("physicalStatus").description("건강 상태") ), responseFields( fieldWithPath("success").description("성공여부"), diff --git a/src/test/java/workplate/workplateserver/auth/repository/MemberDetailRepositoryTest.java b/src/test/java/workplate/workplateserver/auth/repository/MemberDetailRepositoryTest.java index 5bfa986..8767836 100644 --- a/src/test/java/workplate/workplateserver/auth/repository/MemberDetailRepositoryTest.java +++ b/src/test/java/workplate/workplateserver/auth/repository/MemberDetailRepositoryTest.java @@ -4,16 +4,16 @@ import java.util.Optional; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.transaction.annotation.Transactional; -import workplate.workplateserver.auth.domain.Experience; +import workplate.workplateserver.auth.domain.MainExperience; import workplate.workplateserver.auth.domain.PhysicalStatus; -import workplate.workplateserver.auth.domain.Preference; +import workplate.workplateserver.auth.domain.SubExperience; +import workplate.workplateserver.auth.domain.dto.request.MemberDetailRequest; import workplate.workplateserver.auth.domain.entity.Member; import workplate.workplateserver.auth.domain.entity.MemberDetail; @@ -37,7 +37,10 @@ class MemberDetailRepositoryTest { @DisplayName("회원 상세정보 저장 테스트") void saveTest() { // Given - MemberDetail md = MemberDetail.toEntity(member, 10, Experience.TEST, PhysicalStatus.TEST, Preference.TEST); + MemberDetailRequest request = new MemberDetailRequest("testId", 70, MainExperience.OFFICE_ACCOUNTING_IT, + SubExperience.ACCOUNTING_FINANCE, MainExperience.OFFICE_ACCOUNTING_IT, SubExperience.ACCOUNTING_FINANCE, + PhysicalStatus.NORMAL); + MemberDetail md = MemberDetail.toEntity(member, request); memberDetailRepository.save(md); // When @@ -46,8 +49,8 @@ void saveTest() { // Then assertAll( () -> assertEquals(md.getAge(), result.getAge()), - () -> assertEquals(md.getPreference(), result.getPreference()), - () -> assertEquals(md.getExperience(), result.getExperience()), + () -> assertEquals(md.getMainExperience(), result.getMainExperience()), + () -> assertEquals(md.getSubExperience(), result.getSubExperience()), () -> assertEquals(md.getPhysicalStatus(), result.getPhysicalStatus()) ); } @@ -56,13 +59,17 @@ void saveTest() { @DisplayName("회원 상세정보 삭제 테스트") void deleteTest() { // Given - MemberDetail md = MemberDetail.toEntity(member, 10, Experience.TEST, PhysicalStatus.TEST, Preference.TEST); + MemberDetailRequest request = new MemberDetailRequest("testId", 70, MainExperience.OFFICE_ACCOUNTING_IT, + SubExperience.ACCOUNTING_FINANCE, MainExperience.OFFICE_ACCOUNTING_IT, SubExperience.ACCOUNTING_FINANCE, + PhysicalStatus.NORMAL); + MemberDetail md = MemberDetail.toEntity(member, request); memberDetailRepository.save(md); // When memberDetailRepository.deleteById(md.getId()); // Then - assertEquals(Optional.empty(), memberDetailRepository.findById(md.getId()));; + assertEquals(Optional.empty(), memberDetailRepository.findById(md.getId())); + ; } } diff --git a/src/test/java/workplate/workplateserver/auth/service/MemberServiceTest.java b/src/test/java/workplate/workplateserver/auth/service/MemberServiceTest.java index 0854146..59688c7 100644 --- a/src/test/java/workplate/workplateserver/auth/service/MemberServiceTest.java +++ b/src/test/java/workplate/workplateserver/auth/service/MemberServiceTest.java @@ -3,8 +3,6 @@ import static org.junit.jupiter.api.Assertions.*; import static org.mockito.BDDMockito.*; -import java.util.Optional; - import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -14,9 +12,9 @@ import org.springframework.security.access.AccessDeniedException; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import workplate.workplateserver.auth.domain.Experience; +import workplate.workplateserver.auth.domain.MainExperience; import workplate.workplateserver.auth.domain.PhysicalStatus; -import workplate.workplateserver.auth.domain.Preference; +import workplate.workplateserver.auth.domain.SubExperience; import workplate.workplateserver.auth.domain.dto.request.JoinRequest; import workplate.workplateserver.auth.domain.dto.request.MemberDetailRequest; import workplate.workplateserver.auth.domain.entity.Member; @@ -81,7 +79,9 @@ void saveMemberFailTest() { @DisplayName("회원 상세정보 저장 테스트") void saveDetailsTest() { // Given - MemberDetailRequest memberDetailRequest = new MemberDetailRequest("testId", 10, Experience.TEST, PhysicalStatus.TEST, Preference.TEST); + MemberDetailRequest memberDetailRequest = new MemberDetailRequest("testId", 70, MainExperience.OFFICE_ACCOUNTING_IT, + SubExperience.ACCOUNTING_FINANCE, MainExperience.OFFICE_ACCOUNTING_IT, SubExperience.ACCOUNTING_FINANCE, + PhysicalStatus.NORMAL); Member m = Member.toEntity("testId", "name", "pw"); given(commonService.findByUsername("testId", true)).willReturn(m); @@ -97,7 +97,9 @@ void saveDetailsTest() { @DisplayName("회원 상세정보 저장 실패 테스트") void saveDetailsFailTest() { // Given - MemberDetailRequest memberDetailRequest = new MemberDetailRequest("testId", 10, Experience.TEST, PhysicalStatus.TEST, Preference.TEST); + MemberDetailRequest memberDetailRequest = new MemberDetailRequest("testId", 70, MainExperience.OFFICE_ACCOUNTING_IT, + SubExperience.ACCOUNTING_FINANCE, MainExperience.OFFICE_ACCOUNTING_IT, SubExperience.ACCOUNTING_FINANCE, + PhysicalStatus.NORMAL); Member m = Member.toEntity("testId", "name", "pw"); given(commonService.findByUsername("testId", true)).willThrow(AccessDeniedException.class); From c46795b058ef4ccda01a527c1831473c5d8c842c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=87=E1=85=A1=E1=86=A8=E1=84=8C=E1=85=B5=E1=84=92?= =?UTF-8?q?=E1=85=A7=E1=86=A8?= Date: Fri, 15 Nov 2024 20:34:23 +0900 Subject: [PATCH 04/15] =?UTF-8?q?Fix:=20H2=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workplate/workplateserver/config/SecurityConfig.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/workplate/workplateserver/config/SecurityConfig.java b/src/main/java/workplate/workplateserver/config/SecurityConfig.java index 31a9775..d50257b 100644 --- a/src/main/java/workplate/workplateserver/config/SecurityConfig.java +++ b/src/main/java/workplate/workplateserver/config/SecurityConfig.java @@ -46,12 +46,8 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth -> auth .requestMatchers("/", "/api/join", "/api/login").permitAll() - // h2 허용 - .requestMatchers(PathRequest.toH2Console()).permitAll() .anyRequest().authenticated() - ) - // h2 허용 - .headers(headers -> headers.frameOptions(HeadersConfigurer.FrameOptionsConfig::sameOrigin)); + ); http .csrf(AbstractHttpConfigurer::disable) .formLogin(AbstractHttpConfigurer::disable) From d798481ed5df3dd3ff71ebe9b5730173debd2529 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=87=E1=85=A1=E1=86=A8=E1=84=8C=E1=85=B5=E1=84=92?= =?UTF-8?q?=E1=85=A7=E1=86=A8?= Date: Fri, 15 Nov 2024 21:41:23 +0900 Subject: [PATCH 05/15] =?UTF-8?q?Refactor:=20=EC=8B=9D=EB=8B=B9=20ID?= =?UTF-8?q?=EB=A5=BC=20=EB=B0=98=ED=99=98=ED=95=98=EB=8F=84=EB=A1=9D=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 --- .../domain/dto/RestaurantResponse.java | 2 ++ src/main/resources/static/docs/index.html | 24 ++++++++++++------- .../controller/RestaurantControllerTest.java | 7 +++--- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/main/java/workplate/workplateserver/restaurant/domain/dto/RestaurantResponse.java b/src/main/java/workplate/workplateserver/restaurant/domain/dto/RestaurantResponse.java index 7724373..3a20b3d 100644 --- a/src/main/java/workplate/workplateserver/restaurant/domain/dto/RestaurantResponse.java +++ b/src/main/java/workplate/workplateserver/restaurant/domain/dto/RestaurantResponse.java @@ -17,12 +17,14 @@ @Builder public class RestaurantResponse { + private Long id; private String name; private RestaurantType restaurantType; private String location; public static RestaurantResponse toDto(Restaurant restaurant) { return RestaurantResponse.builder() + .id(restaurant.getId()) .name(restaurant.getName()) .restaurantType(restaurant.getRestaurantType()) .location(restaurant.getLocation()) diff --git a/src/main/resources/static/docs/index.html b/src/main/resources/static/docs/index.html index 88a9a9f..7ccf90f 100644 --- a/src/main/resources/static/docs/index.html +++ b/src/main/resources/static/docs/index.html @@ -490,7 +490,7 @@

요청

HTTP request
-
POST /api/join?_csrf=uqGwVr5ZRkFGB1PDZT5OiMVU0jpDbCBYYDbvR2T-R8Q_DWeS3JmIbtg6d3BrYmXxAxN6vKFt_wN3CUN1VgDbJAbJJaVdbgKg HTTP/1.1
+
POST /api/join?_csrf=-dJzoZRZOcl1jUZhGlz02rdthVfFxZ4PniloKq6CtI9KjTTAm7EQx_ZuDKxYuiRSK3HA645dqG718q0ir08JTpfkg7osuVH1 HTTP/1.1
 Content-Type: application/json;charset=UTF-8
 Content-Length: 75
 Host: localhost:8080
@@ -606,7 +606,7 @@ 

요청

HTTP request
-
POST /api/join?_csrf=nHAt8mXu5LrBXuVeaBu2HIYegvQHhqbJ9_PMyGVbGoI4V6oh-kcfkVOM1Ivsad09WjaCL-V_r81iv5LkxcqvqwM5LudeYMgR HTTP/1.1
+
POST /api/join?_csrf=PWJJKxoqAdveUEd5iHwnB-7oMLuocxIv8U8To0Zz4o-2TwNmXFVxTX9MZe_zMyQb7lETNtzZHYOQFioClC13wSVE1r3XKzRV HTTP/1.1
 Content-Type: application/json;charset=UTF-8
 Content-Length: 75
 Host: localhost:8080
@@ -722,7 +722,7 @@ 

요청

HTTP request
-
POST /api/member?_csrf=P36JFwmul7Teu6P8UCzcJ0IGpZJZa_KevzzOcfMTJZpZhciWW0ixLzmY9oHzisfFZgHoF3dkiPA4WMezjAqoE8QmE686tKmg HTTP/1.1
+
POST /api/member?_csrf=CR5ulv898F-KA6KY0_0eZ-iqkZv5jasMl-PifkxMrJoVUCQoPXoNr8YIkmenZsGr4tAqBd7LvKPO7pMhr4bTTS9-nqxwY0VK HTTP/1.1
 Content-Type: application/json;charset=UTF-8
 Content-Length: 246
 Host: localhost:8080
@@ -862,7 +862,7 @@ 

요청

HTTP request
-
POST /api/member?_csrf=pZ25SF_D7mKw0dsGee1kXmL8WR_Yu2nru0qP64U_vwS7vPnDlquILDv0i1Od4bkxH8BQOlGddCa6iAjG2im_ieYKjGffiJv0 HTTP/1.1
+
POST /api/member?_csrf=2T9T3-6-DoED7rqX1pr1M9ptQahXXGn-Kw0dI2Titoperiv6711l69eLaLYuiN-j4LfBA78ObJBjaQ_TSjh_QgGH0-s_yB-Z HTTP/1.1
 Content-Type: application/json;charset=UTF-8
 Content-Length: 246
 Host: localhost:8080
@@ -1048,21 +1048,24 @@ 
HTTP response
Pragma: no-cache Expires: 0 X-Frame-Options: DENY -Content-Length: 549 +Content-Length: 597 { "success" : true, "message" : "요청이 성공적으로 처리되었습니다.", "data" : { "content" : [ { + "id" : 1, "name" : "가식당", "restaurantType" : "KOREAN_FOOD", "location" : "서울" }, { + "id" : 2, "name" : "나식당", "restaurantType" : "WESTERN_FOOD", "location" : "부산" }, { + "id" : 3, "name" : "다식당", "restaurantType" : "JAPANESE_FOOD", "location" : "울산" @@ -1109,6 +1112,11 @@
Response fields

처리 결과

+

data.content[].id

+

Number

+

식당 ID값

+ +

data.content[].name

String

식당 이름

@@ -1509,7 +1517,7 @@

요청

HTTP request
-
PATCH /api/credits/plus?_csrf=FTufPolFbnQWgcjDW8jT-Zkka5uhtYIsfBvR-8aKTSGi-mnJJQuoCbgjChI7sK6lY-Xnz6oTRvnHgbABSCrnmv--ekKRzFys HTTP/1.1
+
PATCH /api/credits/plus?_csrf=OFFE9v05I9XfORET58w-q3F8VmdrI4jzxi1nZZH7MLTv4I7VW2YlkJ9fFeXyXyQiheEKnxBLewUNRure8k8DBvXPUYLd0-2w HTTP/1.1
 Content-Type: application/json;charset=UTF-8
 Content-Length: 47
 Host: localhost:8080
@@ -1632,7 +1640,7 @@ 

요청

HTTP request
-
PATCH /api/credits/minus?_csrf=RIhdRhgUX7s9SaRUFcBJ4rkdcDr5ESnv0ZSbEQORawtiuuyFJ-xrdSAjbd0Qe5E2Ie19gY4qXQOaIBrC5_etJzuoXmhRgoq8 HTTP/1.1
+
PATCH /api/credits/minus?_csrf=LtLFEdWDMRTG_SSim1JWHSNs3d0YB43y2pdfiRShwnyl7TR9HLT1KOW3VyTrmxDGqH9iJBFY8LwgNL3f7K5rvCaU9hrBiAAf HTTP/1.1
 Content-Type: application/json;charset=UTF-8
 Content-Length: 47
 Host: localhost:8080
@@ -2029,7 +2037,7 @@ 

요청

HTTP request
-
POST /api/works-join?_csrf=aLTWfYjPQd7xySlQdXuyQQ-JWy5_zEjlcqFBU1-hVLp8xZ2lUdLmTun_cunc_hBoEFaGcWztdk9N-ivIF5YkZm_EMo9Fof6c HTTP/1.1
+
POST /api/works-join?_csrf=AmjKMkGaDULjULqwXDWuc02uO5f9THaGNvtAOcKMQkG2CpKdMFr-V3D_PyTONY2DZBiaEn-bFq_JfkGrBppxDvXtI3WPafCr HTTP/1.1
 Content-Type: application/json;charset=UTF-8
 Content-Length: 44
 Host: localhost:8080
diff --git a/src/test/java/workplate/workplateserver/restaurant/controller/RestaurantControllerTest.java b/src/test/java/workplate/workplateserver/restaurant/controller/RestaurantControllerTest.java
index 53d7b99..2a8c7fd 100644
--- a/src/test/java/workplate/workplateserver/restaurant/controller/RestaurantControllerTest.java
+++ b/src/test/java/workplate/workplateserver/restaurant/controller/RestaurantControllerTest.java
@@ -67,9 +67,9 @@ class RestaurantControllerTest {
 	void findAllByPage() throws Exception {
 		// Given
 		Pageable pageable = PageRequest.of(1, 3);
-		RestaurantResponse r1 = new RestaurantResponse("가식당", RestaurantType.KOREAN_FOOD, "서울");
-		RestaurantResponse r2 = new RestaurantResponse("나식당", RestaurantType.WESTERN_FOOD, "부산");
-		RestaurantResponse r3 = new RestaurantResponse("다식당", RestaurantType.JAPANESE_FOOD, "울산");
+		RestaurantResponse r1 = new RestaurantResponse(1L, "가식당", RestaurantType.KOREAN_FOOD, "서울");
+		RestaurantResponse r2 = new RestaurantResponse(2L, "나식당", RestaurantType.WESTERN_FOOD, "부산");
+		RestaurantResponse r3 = new RestaurantResponse(3L, "다식당", RestaurantType.JAPANESE_FOOD, "울산");
 		PageResponse response = new PageResponse<>(List.of(r1, r2, r3));
 		given(restaurantService.findRestaurant(any())).willReturn(response);
 
@@ -92,6 +92,7 @@ void findAllByPage() throws Exception {
 								fieldWithPath("success").description("성공여부"),
 								fieldWithPath("message").description("응답 메시지"),
 								fieldWithPath("data").description("처리 결과"),
+								fieldWithPath("data.content[].id").description("식당 ID값"),
 								fieldWithPath("data.content[].name").description("식당 이름"),
 								fieldWithPath("data.content[].restaurantType").description(
 										"식당 종류 (KOREAN_FOOD, WESTERN_FOOD, JAPANESE_FOOD 등)"),

From ed1231b4bc8b03b5b0611cd5e38540d7de251421 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E1=84=87=E1=85=A1=E1=86=A8=E1=84=8C=E1=85=B5=E1=84=92?=
 =?UTF-8?q?=E1=85=A7=E1=86=A8?= 
Date: Sat, 16 Nov 2024 17:21:45 +0900
Subject: [PATCH 06/15] =?UTF-8?q?Refactor:=20AI=20=EC=9A=94=EA=B5=AC?=
 =?UTF-8?q?=EC=82=AC=ED=95=AD=EC=97=90=20=EB=A7=9E=EC=B6=B0=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

---
 .../work/domain/dto/WorkResponse.java         |  6 +++
 .../work/domain/entity/Work.java              | 15 +++++-
 src/main/resources/static/docs/index.html     | 54 ++++++++++++++-----
 .../work/controller/WorkControllerTest.java   | 16 ++++--
 4 files changed, 72 insertions(+), 19 deletions(-)

diff --git a/src/main/java/workplate/workplateserver/work/domain/dto/WorkResponse.java b/src/main/java/workplate/workplateserver/work/domain/dto/WorkResponse.java
index d5d65dd..5f16c63 100644
--- a/src/main/java/workplate/workplateserver/work/domain/dto/WorkResponse.java
+++ b/src/main/java/workplate/workplateserver/work/domain/dto/WorkResponse.java
@@ -3,6 +3,8 @@
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Getter;
+import workplate.workplateserver.auth.domain.MainExperience;
+import workplate.workplateserver.auth.domain.SubExperience;
 import workplate.workplateserver.work.domain.entity.Work;
 
 /**
@@ -19,12 +21,16 @@ public class WorkResponse {
 	private String workName;
 	private String workDetail;
 	private Long workCredit;
+	private MainExperience mainCategory;
+	private SubExperience subCategory;
 
 	public static WorkResponse toDto(Work work) {
 		return WorkResponse.builder()
 				.workName(work.getWorkName())
 				.workDetail(work.getWorkDetail())
 				.workCredit(work.getWorkCredit())
+				.mainCategory(work.getMainCategory())
+				.subCategory(work.getSubCategory())
 				.build();
 	}
 }
diff --git a/src/main/java/workplate/workplateserver/work/domain/entity/Work.java b/src/main/java/workplate/workplateserver/work/domain/entity/Work.java
index 1a5098b..11f0e6e 100644
--- a/src/main/java/workplate/workplateserver/work/domain/entity/Work.java
+++ b/src/main/java/workplate/workplateserver/work/domain/entity/Work.java
@@ -2,6 +2,8 @@
 
 import jakarta.persistence.Column;
 import jakarta.persistence.Entity;
+import jakarta.persistence.EnumType;
+import jakarta.persistence.Enumerated;
 import jakarta.persistence.GeneratedValue;
 import jakarta.persistence.GenerationType;
 import jakarta.persistence.Id;
@@ -10,6 +12,8 @@
 import lombok.Builder;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
+import workplate.workplateserver.auth.domain.MainExperience;
+import workplate.workplateserver.auth.domain.SubExperience;
 import workplate.workplateserver.common.BaseEntity;
 
 /**
@@ -35,12 +39,21 @@ public class Work extends BaseEntity {
 	private String workDetail;
 	@Column(name = "work_credit")
 	private Long workCredit;
+	@Column(name = "work_main_category")
+	@Enumerated(EnumType.STRING)
+	private MainExperience mainCategory;
+	@Column(name = "work_sub_category")
+	@Enumerated(EnumType.STRING)
+	private SubExperience subCategory;
 
-	public static Work toEntity(String workName, String workDetail, Long workCredit) {
+	public static Work toEntity(String workName, String workDetail, Long workCredit, MainExperience mainCategory,
+			SubExperience subCategory) {
 		return Work.builder()
 				.workName(workName)
 				.workDetail(workDetail)
 				.workCredit(workCredit)
+				.mainCategory(mainCategory)
+				.subCategory(subCategory)
 				.build();
 	}
 }
diff --git a/src/main/resources/static/docs/index.html b/src/main/resources/static/docs/index.html
index 7ccf90f..2701b94 100644
--- a/src/main/resources/static/docs/index.html
+++ b/src/main/resources/static/docs/index.html
@@ -490,7 +490,7 @@ 

요청

HTTP request
-
POST /api/join?_csrf=-dJzoZRZOcl1jUZhGlz02rdthVfFxZ4PniloKq6CtI9KjTTAm7EQx_ZuDKxYuiRSK3HA645dqG718q0ir08JTpfkg7osuVH1 HTTP/1.1
+
POST /api/join?_csrf=PgIVII1UGSy-VgyBIBIGTa1dWM46uJ4ZGHdIY9I6EJszZnmjBjchRr0yfBuTYW7nRD8yeJw7da9cjq80KUQrUeQNKaJSBUzC HTTP/1.1
 Content-Type: application/json;charset=UTF-8
 Content-Length: 75
 Host: localhost:8080
@@ -606,7 +606,7 @@ 

요청

HTTP request
-
POST /api/join?_csrf=PWJJKxoqAdveUEd5iHwnB-7oMLuocxIv8U8To0Zz4o-2TwNmXFVxTX9MZe_zMyQb7lETNtzZHYOQFioClC13wSVE1r3XKzRV HTTP/1.1
+
POST /api/join?_csrf=W-QQiuAMvzJ8R4RLrtawe4gwfv9ZPmY3wgmrj27vemXqocL4aNYm7tE9jFdRJuUvmPuEHexWU8dvWl4a-znOtwyNTVDTxKGd HTTP/1.1
 Content-Type: application/json;charset=UTF-8
 Content-Length: 75
 Host: localhost:8080
@@ -722,7 +722,7 @@ 

요청

HTTP request
-
POST /api/member?_csrf=CR5ulv898F-KA6KY0_0eZ-iqkZv5jasMl-PifkxMrJoVUCQoPXoNr8YIkmenZsGr4tAqBd7LvKPO7pMhr4bTTS9-nqxwY0VK HTTP/1.1
+
POST /api/member?_csrf=kmlxlZyRuwrIyGn0zbMmqnILmlAemcnMXx2Qn0BYNeNE5msYqgpE9q2ki2zl-1rB_p4Smhc7t2kprv7hZiz0pnRsVIV0hVJ8 HTTP/1.1
 Content-Type: application/json;charset=UTF-8
 Content-Length: 246
 Host: localhost:8080
@@ -862,7 +862,7 @@ 

요청

HTTP request
-
POST /api/member?_csrf=2T9T3-6-DoED7rqX1pr1M9ptQahXXGn-Kw0dI2Titoperiv6711l69eLaLYuiN-j4LfBA78ObJBjaQ_TSjh_QgGH0-s_yB-Z HTTP/1.1
+
POST /api/member?_csrf=23Cny2COxXGIMijWKGtj-mXdNUI13SxniQulHeXvQME_TJ0p4kmT-lbrp0WlUR3lTEZXy13rGHsA5RlK6miReIaNdPUHL6RK HTTP/1.1
 Content-Type: application/json;charset=UTF-8
 Content-Length: 246
 Host: localhost:8080
@@ -1517,7 +1517,7 @@ 

요청

HTTP request
-
PATCH /api/credits/plus?_csrf=OFFE9v05I9XfORET58w-q3F8VmdrI4jzxi1nZZH7MLTv4I7VW2YlkJ9fFeXyXyQiheEKnxBLewUNRure8k8DBvXPUYLd0-2w HTTP/1.1
+
PATCH /api/credits/plus?_csrf=qmt_Za8wsOh3pBq84WDkNp731oPvmLzVTO5mr8Dx5RfiDEDKz1JNVJxShthanSLZ2U3QAa7F-7rcoYz4ddheyvXB0SSEOyPy HTTP/1.1
 Content-Type: application/json;charset=UTF-8
 Content-Length: 47
 Host: localhost:8080
@@ -1640,7 +1640,7 @@ 

요청

HTTP request
-
PATCH /api/credits/minus?_csrf=LtLFEdWDMRTG_SSim1JWHSNs3d0YB43y2pdfiRShwnyl7TR9HLT1KOW3VyTrmxDGqH9iJBFY8LwgNL3f7K5rvCaU9hrBiAAf HTTP/1.1
+
PATCH /api/credits/minus?_csrf=p3QgOoesv8lpAyBdnDtNeGxiJbc16bjauYGOLlwM5weJ3Ic4nkJFDLaZ3KtEYkFlqRZ5HFlWCNUN3933gbG4T2xq3jG-7bEO HTTP/1.1
 Content-Type: application/json;charset=UTF-8
 Content-Length: 47
 Host: localhost:8080
@@ -1809,7 +1809,7 @@ 
HTTP response
Pragma: no-cache Expires: 0 X-Frame-Options: DENY -Content-Length: 611 +Content-Length: 833 { "success" : true, @@ -1818,15 +1818,21 @@
HTTP response
"content" : [ { "workName" : "경비", "workDetail" : "병원을 경비합니다.", - "workCredit" : 10000 + "workCredit" : 10000, + "mainCategory" : "SERVICE", + "subCategory" : "SECURITY_GUARD" }, { "workName" : "주간경비", "workDetail" : "병원을 주간에 경비합니다.", - "workCredit" : 11000 + "workCredit" : 11000, + "mainCategory" : "SERVICE", + "subCategory" : "SECURITY_GUARD" }, { "workName" : "야간경비", "workDetail" : "병원을 야간에 경비합니다.", - "workCredit" : 12000 + "workCredit" : 12000, + "mainCategory" : "SERVICE", + "subCategory" : "SECURITY_GUARD" } ], "pageNum" : 0, "pageSize" : 0, @@ -1885,6 +1891,16 @@
Response fields

소일거리 시급

+

data.content[].mainCategory

+

String

+

소일거리 메인카테고리

+ + +

data.content[].subCategory

+

String

+

소일거리 서브카테고리

+ +

data.pageNum

Number

현재 페이지 번호

@@ -1964,7 +1980,7 @@
HTTP response
Pragma: no-cache Expires: 0 X-Frame-Options: DENY -Content-Length: 207 +Content-Length: 277 { "success" : true, @@ -1972,7 +1988,9 @@
HTTP response
"data" : { "workName" : "경비", "workDetail" : "병원을 경비합니다.", - "workCredit" : 10000 + "workCredit" : 10000, + "mainCategory" : "SERVICE", + "subCategory" : "SECURITY_GUARD" } }
@@ -2024,6 +2042,16 @@
Response fields

Number

소일거리 시급

+ +

data.mainCategory

+

String

+

소일거리 메인카테고리

+ + +

data.subCategory

+

String

+

소일거리 서브카테고리

+
@@ -2037,7 +2065,7 @@

요청

HTTP request
-
POST /api/works-join?_csrf=AmjKMkGaDULjULqwXDWuc02uO5f9THaGNvtAOcKMQkG2CpKdMFr-V3D_PyTONY2DZBiaEn-bFq_JfkGrBppxDvXtI3WPafCr HTTP/1.1
+
POST /api/works-join?_csrf=VfS28BzkEMe7ffCLHNMv4hLSGkSzyV528VPtXQigV_4EjobsZMOHliiGJ_CWTcm6JP4bh3bjN32C8TpbxWLVZGyQZs5m6LDY HTTP/1.1
 Content-Type: application/json;charset=UTF-8
 Content-Length: 44
 Host: localhost:8080
diff --git a/src/test/java/workplate/workplateserver/work/controller/WorkControllerTest.java b/src/test/java/workplate/workplateserver/work/controller/WorkControllerTest.java
index 32c052f..4b38938 100644
--- a/src/test/java/workplate/workplateserver/work/controller/WorkControllerTest.java
+++ b/src/test/java/workplate/workplateserver/work/controller/WorkControllerTest.java
@@ -29,6 +29,8 @@
 
 import com.google.gson.Gson;
 
+import workplate.workplateserver.auth.domain.MainExperience;
+import workplate.workplateserver.auth.domain.SubExperience;
 import workplate.workplateserver.auth.domain.entity.Member;
 import workplate.workplateserver.auth.domain.jwt.JwtTokenProvider;
 import workplate.workplateserver.auth.domain.jwt.repository.JwtAccessTokenRepository;
@@ -74,9 +76,9 @@ class WorkControllerTest {
 	@WithMockUser
 	void findAllTest() throws Exception {
 		// Given
-		WorkResponse r1 = new WorkResponse("경비", "병원을 경비합니다.", 10000L);
-		WorkResponse r2 = new WorkResponse("주간경비", "병원을 주간에 경비합니다.", 11000L);
-		WorkResponse r3 = new WorkResponse("야간경비", "병원을 야간에 경비합니다.", 12000L);
+		WorkResponse r1 = new WorkResponse("경비", "병원을 경비합니다.", 10000L, MainExperience.SERVICE, SubExperience.SECURITY_GUARD);
+		WorkResponse r2 = new WorkResponse("주간경비", "병원을 주간에 경비합니다.", 11000L, MainExperience.SERVICE, SubExperience.SECURITY_GUARD);
+		WorkResponse r3 = new WorkResponse("야간경비", "병원을 야간에 경비합니다.", 12000L, MainExperience.SERVICE, SubExperience.SECURITY_GUARD);
 		PageResponse response = new PageResponse<>(List.of(r1, r2, r3));
 		given(workService.findAll(any())).willReturn(response);
 
@@ -102,6 +104,8 @@ void findAllTest() throws Exception {
 								fieldWithPath("data.content[].workName").description("소일거리 이름"),
 								fieldWithPath("data.content[].workDetail").description("소일거리 상세 내용"),
 								fieldWithPath("data.content[].workCredit").description("소일거리 시급"),
+								fieldWithPath("data.content[].mainCategory").description("소일거리 메인카테고리"),
+								fieldWithPath("data.content[].subCategory").description("소일거리 서브카테고리"),
 								fieldWithPath("data.pageNum").description("현재 페이지 번호"),
 								fieldWithPath("data.pageSize").description("페이지 당 항목 수"),
 								fieldWithPath("data.totalPages").description("총 페이지 수"),
@@ -117,7 +121,7 @@ void findAllTest() throws Exception {
 	@WithMockUser
 	void findByIdTest() throws Exception {
 		// Given
-		WorkResponse r1 = new WorkResponse("경비", "병원을 경비합니다.", 10000L);
+		WorkResponse r1 = new WorkResponse("경비", "병원을 경비합니다.", 10000L, MainExperience.SERVICE, SubExperience.SECURITY_GUARD);
 		given(workService.findById(1L)).willReturn(r1);
 
 		// When
@@ -140,7 +144,9 @@ void findByIdTest() throws Exception {
 								fieldWithPath("data").description("처리 결과"),
 								fieldWithPath("data.workName").description("소일거리 이름"),
 								fieldWithPath("data.workDetail").description("소일거리 상세 내용"),
-								fieldWithPath("data.workCredit").description("소일거리 시급")
+								fieldWithPath("data.workCredit").description("소일거리 시급"),
+								fieldWithPath("data.mainCategory").description("소일거리 메인카테고리"),
+								fieldWithPath("data.subCategory").description("소일거리 서브카테고리")
 						)));
 		// Then
 	}

From 0e5796fdf06a5fa65120a15be0e575ea258003f7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E1=84=87=E1=85=A1=E1=86=A8=E1=84=8C=E1=85=B5=E1=84=92?=
 =?UTF-8?q?=E1=85=A7=E1=86=A8?= 
Date: Mon, 18 Nov 2024 11:28:34 +0900
Subject: [PATCH 07/15] =?UTF-8?q?Refactor:=20AI=20=EC=9A=94=EA=B5=AC?=
 =?UTF-8?q?=EC=82=AC=ED=95=AD=EC=97=90=20=EB=A7=9E=EB=8F=84=EB=A1=9D=20?=
 =?UTF-8?q?=EC=88=98=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../restaurant/domain/entity/Restaurant.java      |  1 -
 .../work/domain/dto/WorkResponse.java             |  5 +++++
 .../workplateserver/work/domain/entity/Work.java  | 15 +++++++++++----
 3 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/src/main/java/workplate/workplateserver/restaurant/domain/entity/Restaurant.java b/src/main/java/workplate/workplateserver/restaurant/domain/entity/Restaurant.java
index 4f8839d..60f3241 100644
--- a/src/main/java/workplate/workplateserver/restaurant/domain/entity/Restaurant.java
+++ b/src/main/java/workplate/workplateserver/restaurant/domain/entity/Restaurant.java
@@ -30,7 +30,6 @@ public class Restaurant extends BaseEntity {
 
 	@Id
 	@GeneratedValue(strategy = GenerationType.IDENTITY)
-	@Column(name = "restaurant_id")
 	private Long id;
 	@Column(name = "restaurant_name")
 	private String name;
diff --git a/src/main/java/workplate/workplateserver/work/domain/dto/WorkResponse.java b/src/main/java/workplate/workplateserver/work/domain/dto/WorkResponse.java
index 5f16c63..6832423 100644
--- a/src/main/java/workplate/workplateserver/work/domain/dto/WorkResponse.java
+++ b/src/main/java/workplate/workplateserver/work/domain/dto/WorkResponse.java
@@ -4,6 +4,7 @@
 import lombok.Builder;
 import lombok.Getter;
 import workplate.workplateserver.auth.domain.MainExperience;
+import workplate.workplateserver.auth.domain.PhysicalStatus;
 import workplate.workplateserver.auth.domain.SubExperience;
 import workplate.workplateserver.work.domain.entity.Work;
 
@@ -21,16 +22,20 @@ public class WorkResponse {
 	private String workName;
 	private String workDetail;
 	private Long workCredit;
+	private String location;
 	private MainExperience mainCategory;
 	private SubExperience subCategory;
+	private PhysicalStatus physicalStatus;
 
 	public static WorkResponse toDto(Work work) {
 		return WorkResponse.builder()
 				.workName(work.getWorkName())
 				.workDetail(work.getWorkDetail())
 				.workCredit(work.getWorkCredit())
+				.location(work.getLocation())
 				.mainCategory(work.getMainCategory())
 				.subCategory(work.getSubCategory())
+				.physicalStatus(work.getPhysicalStatus())
 				.build();
 	}
 }
diff --git a/src/main/java/workplate/workplateserver/work/domain/entity/Work.java b/src/main/java/workplate/workplateserver/work/domain/entity/Work.java
index 11f0e6e..016d29f 100644
--- a/src/main/java/workplate/workplateserver/work/domain/entity/Work.java
+++ b/src/main/java/workplate/workplateserver/work/domain/entity/Work.java
@@ -13,6 +13,7 @@
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import workplate.workplateserver.auth.domain.MainExperience;
+import workplate.workplateserver.auth.domain.PhysicalStatus;
 import workplate.workplateserver.auth.domain.SubExperience;
 import workplate.workplateserver.common.BaseEntity;
 
@@ -39,21 +40,27 @@ public class Work extends BaseEntity {
 	private String workDetail;
 	@Column(name = "work_credit")
 	private Long workCredit;
-	@Column(name = "work_main_category")
+	private String location;
+	@Column(name = "main_category")
 	@Enumerated(EnumType.STRING)
 	private MainExperience mainCategory;
-	@Column(name = "work_sub_category")
+	@Column(name = "sub_category")
 	@Enumerated(EnumType.STRING)
 	private SubExperience subCategory;
+	@Column(name = "physical_status")
+	@Enumerated(EnumType.STRING)
+	private PhysicalStatus physicalStatus;
 
-	public static Work toEntity(String workName, String workDetail, Long workCredit, MainExperience mainCategory,
-			SubExperience subCategory) {
+	public static Work toEntity(String workName, String workDetail, Long workCredit, String location,
+			MainExperience mainCategory, SubExperience subCategory, PhysicalStatus physicalStatus) {
 		return Work.builder()
 				.workName(workName)
 				.workDetail(workDetail)
 				.workCredit(workCredit)
+				.location(location)
 				.mainCategory(mainCategory)
 				.subCategory(subCategory)
+				.physicalStatus(physicalStatus)
 				.build();
 	}
 }

From 0e96d4b2ddaac8899649789b30bcd3cd17bafc3d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E1=84=87=E1=85=A1=E1=86=A8=E1=84=8C=E1=85=B5=E1=84=92?=
 =?UTF-8?q?=E1=85=A7=E1=86=A8?= 
Date: Mon, 18 Nov 2024 13:51:28 +0900
Subject: [PATCH 08/15] =?UTF-8?q?Test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?=
 =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../work/controller/WorkControllerTest.java         | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/src/test/java/workplate/workplateserver/work/controller/WorkControllerTest.java b/src/test/java/workplate/workplateserver/work/controller/WorkControllerTest.java
index 4b38938..71cfb5c 100644
--- a/src/test/java/workplate/workplateserver/work/controller/WorkControllerTest.java
+++ b/src/test/java/workplate/workplateserver/work/controller/WorkControllerTest.java
@@ -30,6 +30,7 @@
 import com.google.gson.Gson;
 
 import workplate.workplateserver.auth.domain.MainExperience;
+import workplate.workplateserver.auth.domain.PhysicalStatus;
 import workplate.workplateserver.auth.domain.SubExperience;
 import workplate.workplateserver.auth.domain.entity.Member;
 import workplate.workplateserver.auth.domain.jwt.JwtTokenProvider;
@@ -76,9 +77,9 @@ class WorkControllerTest {
 	@WithMockUser
 	void findAllTest() throws Exception {
 		// Given
-		WorkResponse r1 = new WorkResponse("경비", "병원을 경비합니다.", 10000L, MainExperience.SERVICE, SubExperience.SECURITY_GUARD);
-		WorkResponse r2 = new WorkResponse("주간경비", "병원을 주간에 경비합니다.", 11000L, MainExperience.SERVICE, SubExperience.SECURITY_GUARD);
-		WorkResponse r3 = new WorkResponse("야간경비", "병원을 야간에 경비합니다.", 12000L, MainExperience.SERVICE, SubExperience.SECURITY_GUARD);
+		WorkResponse r1 = new WorkResponse("경비", "병원을 경비합니다.", 10000L, "서울", MainExperience.SERVICE, SubExperience.SECURITY_GUARD, PhysicalStatus.NORMAL);
+		WorkResponse r2 = new WorkResponse("주간경비", "병원을 주간에 경비합니다.", 11000L, "서울", MainExperience.SERVICE, SubExperience.SECURITY_GUARD, PhysicalStatus.NORMAL);
+		WorkResponse r3 = new WorkResponse("야간경비", "병원을 야간에 경비합니다.", 12000L, "서울", MainExperience.SERVICE, SubExperience.SECURITY_GUARD, PhysicalStatus.NORMAL);
 		PageResponse response = new PageResponse<>(List.of(r1, r2, r3));
 		given(workService.findAll(any())).willReturn(response);
 
@@ -104,6 +105,8 @@ void findAllTest() throws Exception {
 								fieldWithPath("data.content[].workName").description("소일거리 이름"),
 								fieldWithPath("data.content[].workDetail").description("소일거리 상세 내용"),
 								fieldWithPath("data.content[].workCredit").description("소일거리 시급"),
+								fieldWithPath("data.content[].location").description("소일거리 위치"),
+								fieldWithPath("data.content[].physicalStatus").description("소일거리 건강상태"),
 								fieldWithPath("data.content[].mainCategory").description("소일거리 메인카테고리"),
 								fieldWithPath("data.content[].subCategory").description("소일거리 서브카테고리"),
 								fieldWithPath("data.pageNum").description("현재 페이지 번호"),
@@ -121,7 +124,7 @@ void findAllTest() throws Exception {
 	@WithMockUser
 	void findByIdTest() throws Exception {
 		// Given
-		WorkResponse r1 = new WorkResponse("경비", "병원을 경비합니다.", 10000L, MainExperience.SERVICE, SubExperience.SECURITY_GUARD);
+		WorkResponse r1 = new WorkResponse("경비", "병원을 경비합니다.", 10000L, "서울", MainExperience.SERVICE, SubExperience.SECURITY_GUARD, PhysicalStatus.NORMAL);
 		given(workService.findById(1L)).willReturn(r1);
 
 		// When
@@ -145,6 +148,8 @@ void findByIdTest() throws Exception {
 								fieldWithPath("data.workName").description("소일거리 이름"),
 								fieldWithPath("data.workDetail").description("소일거리 상세 내용"),
 								fieldWithPath("data.workCredit").description("소일거리 시급"),
+								fieldWithPath("data.location").description("소일거리 위치"),
+								fieldWithPath("data.physicalStatus").description("소일거리 건강상태"),
 								fieldWithPath("data.mainCategory").description("소일거리 메인카테고리"),
 								fieldWithPath("data.subCategory").description("소일거리 서브카테고리")
 						)));

From 50fba0fe17eaa07a8f3ff58864d2a00d9ce28c1f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E1=84=87=E1=85=A1=E1=86=A8=E1=84=8C=E1=85=B5=E1=84=92?=
 =?UTF-8?q?=E1=85=A7=E1=86=A8?= 
Date: Mon, 18 Nov 2024 15:27:08 +0900
Subject: [PATCH 09/15] =?UTF-8?q?Refactor:=20=ED=9A=8C=EC=9B=90=20?=
 =?UTF-8?q?=EC=83=81=EC=84=B8=EC=A0=95=EB=B3=B4=20=ED=95=84=EB=93=9C=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

---
 .../dto/request/MemberDetailRequest.java      |  1 +
 .../auth/domain/entity/MemberDetail.java      |  2 +
 src/main/resources/static/docs/index.html     | 70 +++++++++++++++----
 .../auth/controller/MemberControllerTest.java |  6 +-
 .../MemberDetailRepositoryTest.java           |  4 +-
 .../auth/service/MemberServiceTest.java       |  4 +-
 6 files changed, 66 insertions(+), 21 deletions(-)

diff --git a/src/main/java/workplate/workplateserver/auth/domain/dto/request/MemberDetailRequest.java b/src/main/java/workplate/workplateserver/auth/domain/dto/request/MemberDetailRequest.java
index c2d474a..2dfb343 100644
--- a/src/main/java/workplate/workplateserver/auth/domain/dto/request/MemberDetailRequest.java
+++ b/src/main/java/workplate/workplateserver/auth/domain/dto/request/MemberDetailRequest.java
@@ -20,6 +20,7 @@ public class MemberDetailRequest {
 
 	private String username;
 	private int age;
+	private String location;
 	private MainExperience mainExperience;
 	private SubExperience subExperience;
 	private MainExperience mainPreference;
diff --git a/src/main/java/workplate/workplateserver/auth/domain/entity/MemberDetail.java b/src/main/java/workplate/workplateserver/auth/domain/entity/MemberDetail.java
index c480ccb..22ed7fa 100644
--- a/src/main/java/workplate/workplateserver/auth/domain/entity/MemberDetail.java
+++ b/src/main/java/workplate/workplateserver/auth/domain/entity/MemberDetail.java
@@ -42,6 +42,7 @@ public class MemberDetail extends BaseEntity {
 	private Member member;
 
 	private int age;
+	private String location;
 
 	@Enumerated(value = EnumType.STRING)
 	private MainExperience mainExperience;
@@ -59,6 +60,7 @@ public static MemberDetail toEntity(Member member, MemberDetailRequest request)
 		return MemberDetail.builder()
 				.member(member)
 				.age(request.getAge())
+				.location(request.getLocation())
 				.mainPreference(request.getMainPreference())
 				.subExperience(request.getSubExperience())
 				.subPreference(request.getSubPreference())
diff --git a/src/main/resources/static/docs/index.html b/src/main/resources/static/docs/index.html
index 2701b94..d8cd47a 100644
--- a/src/main/resources/static/docs/index.html
+++ b/src/main/resources/static/docs/index.html
@@ -490,7 +490,7 @@ 

요청

HTTP request
-
POST /api/join?_csrf=PgIVII1UGSy-VgyBIBIGTa1dWM46uJ4ZGHdIY9I6EJszZnmjBjchRr0yfBuTYW7nRD8yeJw7da9cjq80KUQrUeQNKaJSBUzC HTTP/1.1
+
POST /api/join?_csrf=bqhELrQg8rMlPCHc5hRoR90wycusUS5HCAHl66JUF6RF1V6CCMl1FtBCw4IICRK40TlccrxR5KrONRdqbDGE3ZM2dMJx7Gy6 HTTP/1.1
 Content-Type: application/json;charset=UTF-8
 Content-Length: 75
 Host: localhost:8080
@@ -606,7 +606,7 @@ 

요청

HTTP request
-
POST /api/join?_csrf=W-QQiuAMvzJ8R4RLrtawe4gwfv9ZPmY3wgmrj27vemXqocL4aNYm7tE9jFdRJuUvmPuEHexWU8dvWl4a-znOtwyNTVDTxKGd HTTP/1.1
+
POST /api/join?_csrf=OQwBqMC9Zq0gPljoFGTxo3gZ9odv-9Dxw4nTIlcrtmj-QzUQWz40zaaJV88NWmnZLEnFm0sh2-ZeybXcobjnQDVIhgyaIgFz HTTP/1.1
 Content-Type: application/json;charset=UTF-8
 Content-Length: 75
 Host: localhost:8080
@@ -722,14 +722,15 @@ 

요청

HTTP request
-
POST /api/member?_csrf=kmlxlZyRuwrIyGn0zbMmqnILmlAemcnMXx2Qn0BYNeNE5msYqgpE9q2ki2zl-1rB_p4Smhc7t2kprv7hZiz0pnRsVIV0hVJ8 HTTP/1.1
+
POST /api/member?_csrf=BWhNzdUUTn22CwSqrR5lQ7yf8jmjMNmiC9VL6452FVcMQPaXNQwpr-QseEybM2adnzNRcYim3wHCUu-Pb7cojrtOJG80I8L1 HTTP/1.1
 Content-Type: application/json;charset=UTF-8
-Content-Length: 246
+Content-Length: 271
 Host: localhost:8080
 
 {
   "username" : "testId",
   "age" : 70,
+  "location" : "서울",
   "mainExperience" : "OFFICE_ACCOUNTING_IT",
   "subExperience" : "ACCOUNTING_FINANCE",
   "mainPreference" : "OFFICE_ACCOUNTING_IT",
@@ -766,6 +767,11 @@ 
Request fields

나이

+

location

+

String

+

사는 곳

+ +

mainExperience

String

일 경험 (대분류)

@@ -862,14 +868,15 @@

요청

HTTP request
-
POST /api/member?_csrf=23Cny2COxXGIMijWKGtj-mXdNUI13SxniQulHeXvQME_TJ0p4kmT-lbrp0WlUR3lTEZXy13rGHsA5RlK6miReIaNdPUHL6RK HTTP/1.1
+
POST /api/member?_csrf=TwYTRFEJo6f4F80Cw0vd-QJfs-x2UO18aFi_uSChCqqLYCQqLWVxIDI-wpbVdq9mpWbpyDZuno1PaIlRXG-KiRDAO5y-VxEb HTTP/1.1
 Content-Type: application/json;charset=UTF-8
-Content-Length: 246
+Content-Length: 271
 Host: localhost:8080
 
 {
   "username" : "testId",
   "age" : 70,
+  "location" : "서울",
   "mainExperience" : "OFFICE_ACCOUNTING_IT",
   "subExperience" : "ACCOUNTING_FINANCE",
   "mainPreference" : "OFFICE_ACCOUNTING_IT",
@@ -906,6 +913,11 @@ 
Request fields

나이

+

location

+

String

+

사는 곳

+ +

mainExperience

String

일 경험 (대분류)

@@ -1517,7 +1529,7 @@

요청

HTTP request
-
PATCH /api/credits/plus?_csrf=qmt_Za8wsOh3pBq84WDkNp731oPvmLzVTO5mr8Dx5RfiDEDKz1JNVJxShthanSLZ2U3QAa7F-7rcoYz4ddheyvXB0SSEOyPy HTTP/1.1
+
PATCH /api/credits/plus?_csrf=QbEDpbZd4ASyJ6pIeBMxr8zgRCYmIBhWvh5p_XdvTQfPqO9TdNVik9Rt12WfQZorST4Fy66FaUcUQ3p7iHsPzUBcf2T2mNY2 HTTP/1.1
 Content-Type: application/json;charset=UTF-8
 Content-Length: 47
 Host: localhost:8080
@@ -1640,7 +1652,7 @@ 

요청

HTTP request
-
PATCH /api/credits/minus?_csrf=p3QgOoesv8lpAyBdnDtNeGxiJbc16bjauYGOLlwM5weJ3Ic4nkJFDLaZ3KtEYkFlqRZ5HFlWCNUN3933gbG4T2xq3jG-7bEO HTTP/1.1
+
PATCH /api/credits/minus?_csrf=EPL_pCkP5EtZpHW_WmNLGCghJe8MK2JqzufU2LtTiLOBLKMJdJeclho9hXJ0xxHaaE5_ek5CCI1qGVNH-dOw4dgyu4u1TZtt HTTP/1.1
 Content-Type: application/json;charset=UTF-8
 Content-Length: 47
 Host: localhost:8080
@@ -1809,7 +1821,7 @@ 
HTTP response
Pragma: no-cache Expires: 0 X-Frame-Options: DENY -Content-Length: 833 +Content-Length: 1025 { "success" : true, @@ -1819,20 +1831,26 @@
HTTP response
"workName" : "경비", "workDetail" : "병원을 경비합니다.", "workCredit" : 10000, + "location" : "서울", "mainCategory" : "SERVICE", - "subCategory" : "SECURITY_GUARD" + "subCategory" : "SECURITY_GUARD", + "physicalStatus" : "NORMAL" }, { "workName" : "주간경비", "workDetail" : "병원을 주간에 경비합니다.", "workCredit" : 11000, + "location" : "서울", "mainCategory" : "SERVICE", - "subCategory" : "SECURITY_GUARD" + "subCategory" : "SECURITY_GUARD", + "physicalStatus" : "NORMAL" }, { "workName" : "야간경비", "workDetail" : "병원을 야간에 경비합니다.", "workCredit" : 12000, + "location" : "서울", "mainCategory" : "SERVICE", - "subCategory" : "SECURITY_GUARD" + "subCategory" : "SECURITY_GUARD", + "physicalStatus" : "NORMAL" } ], "pageNum" : 0, "pageSize" : 0, @@ -1891,6 +1909,16 @@
Response fields

소일거리 시급

+

data.content[].location

+

String

+

소일거리 위치

+ + +

data.content[].physicalStatus

+

String

+

소일거리 건강상태

+ +

data.content[].mainCategory

String

소일거리 메인카테고리

@@ -1980,7 +2008,7 @@
HTTP response
Pragma: no-cache Expires: 0 X-Frame-Options: DENY -Content-Length: 277 +Content-Length: 337 { "success" : true, @@ -1989,8 +2017,10 @@
HTTP response
"workName" : "경비", "workDetail" : "병원을 경비합니다.", "workCredit" : 10000, + "location" : "서울", "mainCategory" : "SERVICE", - "subCategory" : "SECURITY_GUARD" + "subCategory" : "SECURITY_GUARD", + "physicalStatus" : "NORMAL" } }
@@ -2043,6 +2073,16 @@
Response fields

소일거리 시급

+

data.location

+

String

+

소일거리 위치

+ + +

data.physicalStatus

+

String

+

소일거리 건강상태

+ +

data.mainCategory

String

소일거리 메인카테고리

@@ -2065,7 +2105,7 @@

요청

HTTP request
-
POST /api/works-join?_csrf=VfS28BzkEMe7ffCLHNMv4hLSGkSzyV528VPtXQigV_4EjobsZMOHliiGJ_CWTcm6JP4bh3bjN32C8TpbxWLVZGyQZs5m6LDY HTTP/1.1
+
POST /api/works-join?_csrf=le1PZX052-Z25fmXFhLnnWHpTbPWbjmbh1T3T-MS7WTvBQ15rdV7VEQLvdBb1pqlcD_TrwLaYNG1CAu25DKVd9px3FHeND1N HTTP/1.1
 Content-Type: application/json;charset=UTF-8
 Content-Length: 44
 Host: localhost:8080
diff --git a/src/test/java/workplate/workplateserver/auth/controller/MemberControllerTest.java b/src/test/java/workplate/workplateserver/auth/controller/MemberControllerTest.java
index e46b643..635ca33 100644
--- a/src/test/java/workplate/workplateserver/auth/controller/MemberControllerTest.java
+++ b/src/test/java/workplate/workplateserver/auth/controller/MemberControllerTest.java
@@ -141,7 +141,7 @@ void joinFailTest() throws Exception {
 	@WithMockUser
 	void addDetailTest() throws Exception {
 		// Given
-		MemberDetailRequest request = new MemberDetailRequest("testId", 70, MainExperience.OFFICE_ACCOUNTING_IT,
+		MemberDetailRequest request = new MemberDetailRequest("testId", 70, "서울", MainExperience.OFFICE_ACCOUNTING_IT,
 				SubExperience.ACCOUNTING_FINANCE, MainExperience.OFFICE_ACCOUNTING_IT, SubExperience.ACCOUNTING_FINANCE,
 				PhysicalStatus.NORMAL);
 
@@ -165,6 +165,7 @@ void addDetailTest() throws Exception {
 						requestFields(
 								fieldWithPath("username").description("가입한 아이디"),
 								fieldWithPath("age").description("나이"),
+								fieldWithPath("location").description("사는 곳"),
 								fieldWithPath("mainExperience").description("일 경험 (대분류)"),
 								fieldWithPath("subExperience").description("일 경험 (소분류)"),
 								fieldWithPath("mainPreference").description("선호 직종 (대분류)"),
@@ -185,7 +186,7 @@ void addDetailTest() throws Exception {
 	@WithMockUser
 	void addDetailFailTest() throws Exception {
 		// Given
-		MemberDetailRequest request = new MemberDetailRequest("testId", 70, MainExperience.OFFICE_ACCOUNTING_IT,
+		MemberDetailRequest request = new MemberDetailRequest("testId", 70, "서울", MainExperience.OFFICE_ACCOUNTING_IT,
 				SubExperience.ACCOUNTING_FINANCE, MainExperience.OFFICE_ACCOUNTING_IT, SubExperience.ACCOUNTING_FINANCE,
 				PhysicalStatus.NORMAL);
 		doThrow(new UsernameNotFoundException("회원정보를 찾을 수 없습니다.")).when(memberService).saveDetails(any());
@@ -210,6 +211,7 @@ void addDetailFailTest() throws Exception {
 						requestFields(
 								fieldWithPath("username").description("가입한 아이디"),
 								fieldWithPath("age").description("나이"),
+								fieldWithPath("location").description("사는 곳"),
 								fieldWithPath("mainExperience").description("일 경험 (대분류)"),
 								fieldWithPath("subExperience").description("일 경험 (소분류)"),
 								fieldWithPath("mainPreference").description("선호 직종 (대분류)"),
diff --git a/src/test/java/workplate/workplateserver/auth/repository/MemberDetailRepositoryTest.java b/src/test/java/workplate/workplateserver/auth/repository/MemberDetailRepositoryTest.java
index 8767836..8ecd4b4 100644
--- a/src/test/java/workplate/workplateserver/auth/repository/MemberDetailRepositoryTest.java
+++ b/src/test/java/workplate/workplateserver/auth/repository/MemberDetailRepositoryTest.java
@@ -37,7 +37,7 @@ class MemberDetailRepositoryTest {
 	@DisplayName("회원 상세정보 저장 테스트")
 	void saveTest() {
 		// Given
-		MemberDetailRequest request = new MemberDetailRequest("testId", 70, MainExperience.OFFICE_ACCOUNTING_IT,
+		MemberDetailRequest request = new MemberDetailRequest("testId", 70, "서울", MainExperience.OFFICE_ACCOUNTING_IT,
 				SubExperience.ACCOUNTING_FINANCE, MainExperience.OFFICE_ACCOUNTING_IT, SubExperience.ACCOUNTING_FINANCE,
 				PhysicalStatus.NORMAL);
 		MemberDetail md = MemberDetail.toEntity(member, request);
@@ -59,7 +59,7 @@ void saveTest() {
 	@DisplayName("회원 상세정보 삭제 테스트")
 	void deleteTest() {
 		// Given
-		MemberDetailRequest request = new MemberDetailRequest("testId", 70, MainExperience.OFFICE_ACCOUNTING_IT,
+		MemberDetailRequest request = new MemberDetailRequest("testId", 70,  "서울", MainExperience.OFFICE_ACCOUNTING_IT,
 				SubExperience.ACCOUNTING_FINANCE, MainExperience.OFFICE_ACCOUNTING_IT, SubExperience.ACCOUNTING_FINANCE,
 				PhysicalStatus.NORMAL);
 		MemberDetail md = MemberDetail.toEntity(member, request);
diff --git a/src/test/java/workplate/workplateserver/auth/service/MemberServiceTest.java b/src/test/java/workplate/workplateserver/auth/service/MemberServiceTest.java
index 59688c7..2f6fb19 100644
--- a/src/test/java/workplate/workplateserver/auth/service/MemberServiceTest.java
+++ b/src/test/java/workplate/workplateserver/auth/service/MemberServiceTest.java
@@ -79,7 +79,7 @@ void saveMemberFailTest() {
 	@DisplayName("회원 상세정보 저장 테스트")
 	void saveDetailsTest() {
 	    // Given
-		MemberDetailRequest memberDetailRequest = new MemberDetailRequest("testId", 70, MainExperience.OFFICE_ACCOUNTING_IT,
+		MemberDetailRequest memberDetailRequest = new MemberDetailRequest("testId", 70, "서울", MainExperience.OFFICE_ACCOUNTING_IT,
 				SubExperience.ACCOUNTING_FINANCE, MainExperience.OFFICE_ACCOUNTING_IT, SubExperience.ACCOUNTING_FINANCE,
 				PhysicalStatus.NORMAL);
 		Member m = Member.toEntity("testId", "name", "pw");
@@ -97,7 +97,7 @@ void saveDetailsTest() {
 	@DisplayName("회원 상세정보 저장 실패 테스트")
 	void saveDetailsFailTest() {
 		// Given
-		MemberDetailRequest memberDetailRequest = new MemberDetailRequest("testId", 70, MainExperience.OFFICE_ACCOUNTING_IT,
+		MemberDetailRequest memberDetailRequest = new MemberDetailRequest("testId", 70, "서울", MainExperience.OFFICE_ACCOUNTING_IT,
 				SubExperience.ACCOUNTING_FINANCE, MainExperience.OFFICE_ACCOUNTING_IT, SubExperience.ACCOUNTING_FINANCE,
 				PhysicalStatus.NORMAL);
 		Member m = Member.toEntity("testId", "name", "pw");

From 1a3c142fb079a9aca5f6c64ba5b67d016abdf349 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E1=84=87=E1=85=A1=E1=86=A8=E1=84=8C=E1=85=B5=E1=84=92?=
 =?UTF-8?q?=E1=85=A7=E1=86=A8?= 
Date: Tue, 19 Nov 2024 18:18:55 +0900
Subject: [PATCH 10/15] =?UTF-8?q?Refactor:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?=
 =?UTF-8?q?=20=ED=99=98=EA=B2=BD=20=EA=B0=84=20=EB=AA=A8=EB=93=A0=20?=
 =?UTF-8?q?=EC=9A=94=EC=B2=AD=20=ED=97=88=EC=9A=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/workplate/workplateserver/config/SecurityConfig.java  | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/main/java/workplate/workplateserver/config/SecurityConfig.java b/src/main/java/workplate/workplateserver/config/SecurityConfig.java
index d50257b..dc081a6 100644
--- a/src/main/java/workplate/workplateserver/config/SecurityConfig.java
+++ b/src/main/java/workplate/workplateserver/config/SecurityConfig.java
@@ -46,10 +46,11 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
 		http
 				.authorizeHttpRequests(auth -> auth
 						.requestMatchers("/", "/api/join", "/api/login").permitAll()
-						.anyRequest().authenticated()
+						.anyRequest().permitAll()
 				);
 		http
 				.csrf(AbstractHttpConfigurer::disable)
+				.cors(AbstractHttpConfigurer::disable)
 				.formLogin(AbstractHttpConfigurer::disable)
 				.httpBasic(AbstractHttpConfigurer::disable)
 				.addFilterAt(loginFilter(), UsernamePasswordAuthenticationFilter.class) // 로그인 필터 변경

From a55e83693132ab6e96517f2a839b754b743208c6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E1=84=87=E1=85=A1=E1=86=A8=E1=84=8C=E1=85=B5=E1=84=92?=
 =?UTF-8?q?=E1=85=A7=E1=86=A8?= 
Date: Tue, 19 Nov 2024 19:39:11 +0900
Subject: [PATCH 11/15] =?UTF-8?q?Feat:=20=EC=97=90=EB=9F=AC=20=EB=B0=9C?=
 =?UTF-8?q?=EC=83=9D=20=EC=8B=9C=20CORS=20=EC=84=A4=EC=A0=95=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

---
 .../workplateserver/common/ControllerAdvice.java   | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/src/main/java/workplate/workplateserver/common/ControllerAdvice.java b/src/main/java/workplate/workplateserver/common/ControllerAdvice.java
index 309aff9..c1fdf21 100644
--- a/src/main/java/workplate/workplateserver/common/ControllerAdvice.java
+++ b/src/main/java/workplate/workplateserver/common/ControllerAdvice.java
@@ -6,6 +6,7 @@
 import org.springframework.web.bind.annotation.ExceptionHandler;
 import org.springframework.web.bind.annotation.RestControllerAdvice;
 
+import jakarta.servlet.http.HttpServletResponse;
 import lombok.extern.slf4j.Slf4j;
 
 /**
@@ -18,15 +19,24 @@
 @RestControllerAdvice
 public class ControllerAdvice {
 
+	private void addCorsHeaders(HttpServletResponse response) {
+		response.setHeader("Access-Control-Allow-Origin", "*");
+		response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
+		response.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type");
+		response.setHeader("Access-Control-Allow-Credentials", "true");
+	}
+
 	@ExceptionHandler(Exception.class)
-	public ResponseEntity> common(Exception e) {
+	public ResponseEntity> common(Exception e, HttpServletResponse response) {
+		addCorsHeaders(response); // CORS 헤더 추가
 		log.error("[밥상일터]: 예상치 못한 예외가 발생하였습니다. 예외내용 = {}", e.getMessage());
 		return ResponseEntity.status(HttpStatus.BAD_REQUEST)
 				.body(ApiResponse.failure("관리자에게 문의해주세요."));
 	}
 
 	@ExceptionHandler({IllegalArgumentException.class, AccessDeniedException.class})
-	public ResponseEntity> illegalArgument(Exception e) {
+	public ResponseEntity> illegalArgument(Exception e, HttpServletResponse response) {
+		addCorsHeaders(response); // CORS 헤더 추가
 		return ResponseEntity.status(HttpStatus.BAD_REQUEST)
 				.body(ApiResponse.failure(e.getMessage()));
 	}

From 302a239cee88ffc0deb007f1bd5d25263876217c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E1=84=87=E1=85=A1=E1=86=A8=E1=84=8C=E1=85=B5=E1=84=92?=
 =?UTF-8?q?=E1=85=A7=E1=86=A8?= 
Date: Tue, 19 Nov 2024 19:39:33 +0900
Subject: [PATCH 12/15] =?UTF-8?q?Refactor:=20=ED=9A=8C=EC=9B=90=20?=
 =?UTF-8?q?=EC=83=81=EC=84=B8=20=EC=A0=95=EB=B3=B4=20=EC=9E=85=EB=A0=A5=20?=
 =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../workplateserver/auth/domain/entity/MemberDetail.java       | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/main/java/workplate/workplateserver/auth/domain/entity/MemberDetail.java b/src/main/java/workplate/workplateserver/auth/domain/entity/MemberDetail.java
index 22ed7fa..215ecda 100644
--- a/src/main/java/workplate/workplateserver/auth/domain/entity/MemberDetail.java
+++ b/src/main/java/workplate/workplateserver/auth/domain/entity/MemberDetail.java
@@ -62,8 +62,9 @@ public static MemberDetail toEntity(Member member, MemberDetailRequest request)
 				.age(request.getAge())
 				.location(request.getLocation())
 				.mainPreference(request.getMainPreference())
-				.subExperience(request.getSubExperience())
 				.subPreference(request.getSubPreference())
+				.mainExperience(request.getMainExperience())
+				.subExperience(request.getSubExperience())
 				.physicalStatus(request.getPhysicalStatus())
 				.build();
 	}

From 4d47a1064a2a7d887e6b3dc6286ac5230a6205d9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E1=84=87=E1=85=A1=E1=86=A8=E1=84=8C=E1=85=B5=E1=84=92?=
 =?UTF-8?q?=E1=85=A7=E1=86=A8?= 
Date: Tue, 19 Nov 2024 20:00:26 +0900
Subject: [PATCH 13/15] =?UTF-8?q?Refactor:=20CORS=20=EC=84=A4=EC=A0=95=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

---
 .../workplateserver/config/CorsConfig.java    | 32 +++++++++++++++++++
 .../config/SecurityConfig.java                |  6 ++--
 2 files changed, 35 insertions(+), 3 deletions(-)
 create mode 100644 src/main/java/workplate/workplateserver/config/CorsConfig.java

diff --git a/src/main/java/workplate/workplateserver/config/CorsConfig.java b/src/main/java/workplate/workplateserver/config/CorsConfig.java
new file mode 100644
index 0000000..605284e
--- /dev/null
+++ b/src/main/java/workplate/workplateserver/config/CorsConfig.java
@@ -0,0 +1,32 @@
+package workplate.workplateserver.config;
+
+import java.util.List;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.CorsConfigurationSource;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+
+/**
+ * CORS 설정
+ *
+ * @author : parkjihyeok
+ * @since : 2024/11/19
+ */
+@Configuration
+public class CorsConfig {
+
+	@Bean
+	public CorsConfigurationSource corsConfigurationSource() {
+		CorsConfiguration configuration = new CorsConfiguration();
+		configuration.setAllowedOriginPatterns(List.of("*")); // 모든 도메인 허용
+		configuration.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "OPTIONS"));
+		configuration.setAllowedHeaders(List.of("*")); // 모든 헤더 허용
+		configuration.setAllowCredentials(true); // 자격 증명 허용
+
+		UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+		source.registerCorsConfiguration("/**", configuration);
+		return source;
+	}
+}
diff --git a/src/main/java/workplate/workplateserver/config/SecurityConfig.java b/src/main/java/workplate/workplateserver/config/SecurityConfig.java
index dc081a6..c33c63d 100644
--- a/src/main/java/workplate/workplateserver/config/SecurityConfig.java
+++ b/src/main/java/workplate/workplateserver/config/SecurityConfig.java
@@ -1,16 +1,15 @@
 package workplate.workplateserver.config;
 
-import org.springframework.boot.autoconfigure.security.servlet.PathRequest;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
 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.annotation.web.configurers.HeadersConfigurer;
 import org.springframework.security.config.http.SessionCreationPolicy;
 import org.springframework.security.web.SecurityFilterChain;
 import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
+import org.springframework.web.cors.CorsConfigurationSource;
 
 import lombok.RequiredArgsConstructor;
 import workplate.workplateserver.auth.domain.filter.LoginFilter;
@@ -31,6 +30,7 @@ public class SecurityConfig {
 	private final AuthenticationConfiguration authenticationConfiguration;
 	private final LoginSuccessHandler loginSuccessHandler;
 	private final JwtFilter jwtFilter;
+	private final CorsConfigurationSource corsConfigurationSource;
 
 	@Bean
 	public LoginFilter loginFilter() throws Exception {
@@ -50,7 +50,7 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
 				);
 		http
 				.csrf(AbstractHttpConfigurer::disable)
-				.cors(AbstractHttpConfigurer::disable)
+				.cors(cors -> cors.configurationSource(corsConfigurationSource))
 				.formLogin(AbstractHttpConfigurer::disable)
 				.httpBasic(AbstractHttpConfigurer::disable)
 				.addFilterAt(loginFilter(), UsernamePasswordAuthenticationFilter.class) // 로그인 필터 변경

From c93d6d058ea77fa7709eeb89fd2c465c7b44a277 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E1=84=87=E1=85=A1=E1=86=A8=E1=84=8C=E1=85=B5=E1=84=92?=
 =?UTF-8?q?=E1=85=A7=E1=86=A8?= 
Date: Tue, 19 Nov 2024 20:06:13 +0900
Subject: [PATCH 14/15] =?UTF-8?q?Fix:=20CORS=20=EC=84=A4=EC=A0=95=20?=
 =?UTF-8?q?=EC=A0=84=EC=9C=BC=EB=A1=9C=20=EB=A1=A4=EB=B0=B1=20+=20CORS=20?=
 =?UTF-8?q?=EC=A0=95=EC=83=81=20=EC=9E=91=EB=8F=99=EC=9D=84=20=EC=9C=84?=
 =?UTF-8?q?=ED=95=B4=20=EB=AA=A8=EB=93=A0=20=EC=9D=91=EB=8B=B5=EC=9D=80=20?=
 =?UTF-8?q?200=EC=9D=84=20=EA=B8=B0=EB=B0=98=EC=9C=BC=EB=A1=9C=20=EC=84=A4?=
 =?UTF-8?q?=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../common/ControllerAdvice.java              | 14 ++------
 .../workplateserver/config/CorsConfig.java    | 32 -------------------
 .../config/SecurityConfig.java                |  4 +--
 3 files changed, 3 insertions(+), 47 deletions(-)
 delete mode 100644 src/main/java/workplate/workplateserver/config/CorsConfig.java

diff --git a/src/main/java/workplate/workplateserver/common/ControllerAdvice.java b/src/main/java/workplate/workplateserver/common/ControllerAdvice.java
index c1fdf21..dff9299 100644
--- a/src/main/java/workplate/workplateserver/common/ControllerAdvice.java
+++ b/src/main/java/workplate/workplateserver/common/ControllerAdvice.java
@@ -18,26 +18,16 @@
 @Slf4j
 @RestControllerAdvice
 public class ControllerAdvice {
-
-	private void addCorsHeaders(HttpServletResponse response) {
-		response.setHeader("Access-Control-Allow-Origin", "*");
-		response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
-		response.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type");
-		response.setHeader("Access-Control-Allow-Credentials", "true");
-	}
-
 	@ExceptionHandler(Exception.class)
 	public ResponseEntity> common(Exception e, HttpServletResponse response) {
-		addCorsHeaders(response); // CORS 헤더 추가
 		log.error("[밥상일터]: 예상치 못한 예외가 발생하였습니다. 예외내용 = {}", e.getMessage());
-		return ResponseEntity.status(HttpStatus.BAD_REQUEST)
+		return ResponseEntity.status(HttpStatus.OK)
 				.body(ApiResponse.failure("관리자에게 문의해주세요."));
 	}
 
 	@ExceptionHandler({IllegalArgumentException.class, AccessDeniedException.class})
 	public ResponseEntity> illegalArgument(Exception e, HttpServletResponse response) {
-		addCorsHeaders(response); // CORS 헤더 추가
-		return ResponseEntity.status(HttpStatus.BAD_REQUEST)
+		return ResponseEntity.status(HttpStatus.OK)
 				.body(ApiResponse.failure(e.getMessage()));
 	}
 
diff --git a/src/main/java/workplate/workplateserver/config/CorsConfig.java b/src/main/java/workplate/workplateserver/config/CorsConfig.java
deleted file mode 100644
index 605284e..0000000
--- a/src/main/java/workplate/workplateserver/config/CorsConfig.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package workplate.workplateserver.config;
-
-import java.util.List;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.cors.CorsConfiguration;
-import org.springframework.web.cors.CorsConfigurationSource;
-import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
-
-/**
- * CORS 설정
- *
- * @author : parkjihyeok
- * @since : 2024/11/19
- */
-@Configuration
-public class CorsConfig {
-
-	@Bean
-	public CorsConfigurationSource corsConfigurationSource() {
-		CorsConfiguration configuration = new CorsConfiguration();
-		configuration.setAllowedOriginPatterns(List.of("*")); // 모든 도메인 허용
-		configuration.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "OPTIONS"));
-		configuration.setAllowedHeaders(List.of("*")); // 모든 헤더 허용
-		configuration.setAllowCredentials(true); // 자격 증명 허용
-
-		UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
-		source.registerCorsConfiguration("/**", configuration);
-		return source;
-	}
-}
diff --git a/src/main/java/workplate/workplateserver/config/SecurityConfig.java b/src/main/java/workplate/workplateserver/config/SecurityConfig.java
index c33c63d..31383a4 100644
--- a/src/main/java/workplate/workplateserver/config/SecurityConfig.java
+++ b/src/main/java/workplate/workplateserver/config/SecurityConfig.java
@@ -9,7 +9,6 @@
 import org.springframework.security.config.http.SessionCreationPolicy;
 import org.springframework.security.web.SecurityFilterChain;
 import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
-import org.springframework.web.cors.CorsConfigurationSource;
 
 import lombok.RequiredArgsConstructor;
 import workplate.workplateserver.auth.domain.filter.LoginFilter;
@@ -30,7 +29,6 @@ public class SecurityConfig {
 	private final AuthenticationConfiguration authenticationConfiguration;
 	private final LoginSuccessHandler loginSuccessHandler;
 	private final JwtFilter jwtFilter;
-	private final CorsConfigurationSource corsConfigurationSource;
 
 	@Bean
 	public LoginFilter loginFilter() throws Exception {
@@ -50,7 +48,7 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
 				);
 		http
 				.csrf(AbstractHttpConfigurer::disable)
-				.cors(cors -> cors.configurationSource(corsConfigurationSource))
+				.cors(AbstractHttpConfigurer::disable)
 				.formLogin(AbstractHttpConfigurer::disable)
 				.httpBasic(AbstractHttpConfigurer::disable)
 				.addFilterAt(loginFilter(), UsernamePasswordAuthenticationFilter.class) // 로그인 필터 변경

From 6be2fa489d4be5d083c09e9c9452106fcd09b3c7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E1=84=87=E1=85=A1=E1=86=A8=E1=84=8C=E1=85=B5=E1=84=92?=
 =?UTF-8?q?=E1=85=A7=E1=86=A8?= 
Date: Tue, 19 Nov 2024 20:11:40 +0900
Subject: [PATCH 15/15] =?UTF-8?q?Test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?=
 =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../workplateserver/auth/controller/MemberControllerTest.java | 4 ++--
 .../restaurant/controller/RestaurantControllerTest.java       | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/test/java/workplate/workplateserver/auth/controller/MemberControllerTest.java b/src/test/java/workplate/workplateserver/auth/controller/MemberControllerTest.java
index 635ca33..9ae0684 100644
--- a/src/test/java/workplate/workplateserver/auth/controller/MemberControllerTest.java
+++ b/src/test/java/workplate/workplateserver/auth/controller/MemberControllerTest.java
@@ -110,7 +110,7 @@ void joinFailTest() throws Exception {
 						.with(csrf())
 						.contentType(MediaType.APPLICATION_JSON)
 						.content(gson.toJson(request)))
-				.andExpect(status().isBadRequest())
+				.andExpect(status().isOk())
 				.andExpect(content().contentType(MediaType.APPLICATION_JSON))
 				.andExpect(jsonPath("$.success").value(false))
 				.andExpect(jsonPath("$.message").value("요청에 실패했습니다."))
@@ -196,7 +196,7 @@ void addDetailFailTest() throws Exception {
 						.with(csrf())
 						.contentType(MediaType.APPLICATION_JSON)
 						.content(gson.toJson(request)))
-				.andExpect(status().isBadRequest())
+				.andExpect(status().isOk())
 				.andExpect(content().contentType(MediaType.APPLICATION_JSON))
 				.andExpect(jsonPath("$.success").value(false))
 				.andExpect(jsonPath("$.message").value("요청에 실패했습니다."))
diff --git a/src/test/java/workplate/workplateserver/restaurant/controller/RestaurantControllerTest.java b/src/test/java/workplate/workplateserver/restaurant/controller/RestaurantControllerTest.java
index 2a8c7fd..cee1d7e 100644
--- a/src/test/java/workplate/workplateserver/restaurant/controller/RestaurantControllerTest.java
+++ b/src/test/java/workplate/workplateserver/restaurant/controller/RestaurantControllerTest.java
@@ -160,7 +160,7 @@ void findDetailFail() throws Exception {
 
 		// When
 		mockMvc.perform(get("/api/restaurants/{id}", 10L))
-				.andExpect(status().isBadRequest())
+				.andExpect(status().isOk())
 				.andExpect(content().contentType(MediaType.APPLICATION_JSON))
 				.andExpect(jsonPath("$.success").value(false))
 				.andExpect(jsonPath("$.message").value("요청에 실패했습니다."))