Skip to content

Commit 031d65a

Browse files
authored
[FEAT] 지원서 프로필 작성 단계에서 거주지역 추가 (#349)
* feat: 거주 지역 정보를 위한 Region enum 클래스 추가 * feat: Member 엔티티에 Region 필드 추가 및 관련 로직 반영 * feat: MemberEditRequest에 Region 필드 추가 및 유효성 검증 로직 반영 * feat: MemberRegisterRequest에 Region 필드 추가 및 유효성 검증 로직 반영 * feat: MemberDetailResponse에 Region 필드 추가 및 매핑 로직 반영 * feat: MemberManagementService에서 Member 생성 시 Region 필드 매핑 로직 추가 * feat: ApplyProfileRequest에 Region 필드 추가 및 유효성 검증 로직 반영 * feat: ApplyRepository에 memberId 중복 여부 확인 메서드 추가 * feat: ApplyService에 Region 필드 매핑 로직 추가 및 applyRepository 중복 확인 로직 개선 * test: Member 관련 테스트에 Region 필드 검증 로직 추가 * test: MemberManagementControllerTest에 Region 필드 관련 테스트 추가 * test: MemberManagementServiceTest에 Region 필드 관련 테스트 추가 * test: ApplyServiceTest에 Region 필드 관련 테스트 로직 추가 * test: MemberManagementControllerTest에 Region 필드 관련 테스트 추가 * chore: member 테이블에 region 컬럼 추가 * refactor: ApplyService의 중복 확인 로직 리팩토링 및 불필요한 코드 제거 * chore: apply 테이블에 member_id와 recruit_id에 대한 유니크 제약 조건 추가 * fix: ApplyService에 멱등성 보 로직 추가 * test: ApplyServiceTest에 applyRepository의 존재 여부 검증 로직 추가
1 parent b95c432 commit 031d65a

16 files changed

Lines changed: 109 additions & 24 deletions

File tree

src/main/java/org/ject/support/domain/admin/dto/MemberDetailResponse.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import lombok.Builder;
44
import org.ject.support.domain.member.JobFamily;
5+
import org.ject.support.domain.member.Region;
56
import org.ject.support.domain.member.Role;
67
import org.ject.support.domain.member.entity.Member;
78
import org.ject.support.domain.recruit.domain.Semester;
@@ -14,6 +15,7 @@ public record MemberDetailResponse(
1415
String phoneNumber,
1516
String email,
1617
JobFamily jobFamily,
18+
Region region,
1719
String semesterName
1820
) {
1921
public static MemberDetailResponse toResponse(
@@ -27,6 +29,7 @@ public static MemberDetailResponse toResponse(
2729
.phoneNumber(member.getPhoneNumber())
2830
.email(member.getEmail())
2931
.jobFamily(member.getJobFamily())
32+
.region(member.getRegion())
3033
.semesterName(semester.getName().replaceAll("\\D", ""))
3134
.build();
3235
}

src/main/java/org/ject/support/domain/admin/dto/MemberEditRequest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import jakarta.validation.constraints.Pattern;
88
import lombok.Builder;
99
import org.ject.support.domain.member.JobFamily;
10+
import org.ject.support.domain.member.Region;
1011
import org.ject.support.domain.member.Role;
1112

1213
@Builder
@@ -21,6 +22,8 @@ public record MemberEditRequest(
2122
String email,
2223
@NotNull(message = "포지션은 필수입니다.")
2324
JobFamily jobFamily,
25+
@NotNull(message = "거주 지역을 선택해주세요")
26+
Region region,
2427
@Schema(description = "기수 이름", example = "1기")
2528
@Pattern(regexp = "^\\d+기$", message = "숫자+'기' 형식으로 입력해주세요", flags = Pattern.Flag.CANON_EQ)
2629
String semesterName

src/main/java/org/ject/support/domain/admin/dto/MemberRegisterRequest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import jakarta.validation.constraints.Pattern;
88
import jakarta.validation.constraints.Pattern.Flag;
99
import org.ject.support.domain.member.JobFamily;
10+
import org.ject.support.domain.member.Region;
1011
import org.ject.support.domain.member.Role;
1112
import org.ject.support.domain.member.entity.Member;
1213
import org.ject.support.domain.recruit.domain.Semester;
@@ -22,6 +23,9 @@ public record MemberRegisterRequest(
2223
String email,
2324
@NotNull(message = "포지션은 필수입니다.")
2425
JobFamily jobFamily,
26+
27+
@NotNull(message = "거주 지역을 선택해주세요")
28+
Region region,
2529
@NotNull(message = "기수는 필수입니다.")
2630
@Schema(description = "기수 이름", example = "1기")
2731
@Pattern(regexp = "^\\d+기$", message = "숫자+'기' 형식으로 입력해주세요", flags = Flag.CANON_EQ)
@@ -34,6 +38,7 @@ public Member toEntity(Semester semester) {
3438
.phoneNumber(this.phoneNumber)
3539
.email(this.email)
3640
.jobFamily(this.jobFamily)
41+
.region(this.region)
3742
.semesterId(semester.getId())
3843
.build();
3944
}

src/main/java/org/ject/support/domain/admin/service/MemberManagementService.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ public void editMember(final Long memberId,
8484
.phoneNumber(request.phoneNumber())
8585
.email(request.email())
8686
.jobFamily(request.jobFamily())
87+
.region(request.region())
8788
.role(request.role())
8889
.build();
8990

src/main/java/org/ject/support/domain/apply/dto/ApplyProfileRequest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.ject.support.domain.member.JobFamily;
1111

1212
import java.util.List;
13+
import org.ject.support.domain.member.Region;
1314

1415
public record ApplyProfileRequest(
1516
@NotBlank(message = "이름을 입력해주세요")
@@ -22,6 +23,9 @@ public record ApplyProfileRequest(
2223
@NotNull(message = "포지션을 선택해주세요")
2324
JobFamily jobFamily,
2425

26+
@NotNull(message = "거주 지역을 선택해주세요")
27+
Region region,
28+
2529
@NotNull(message = "지원자 신분을 선택해주세요")
2630
CareerDetails careerDetails,
2731

src/main/java/org/ject/support/domain/apply/repository/ApplyRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
public interface ApplyRepository extends JpaRepository<Apply, Long>, ApplyQueryRepository {
1313

14+
boolean existsByMemberId(Long memberId);
15+
1416
@Query("select a from Apply a where a.member.id = :memberId")
1517
Optional<Apply> findByMemberId(Long memberId);
1618

src/main/java/org/ject/support/domain/apply/service/ApplyService.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.ject.support.domain.recruit.exception.RecruitErrorCode;
3737
import org.ject.support.domain.recruit.exception.RecruitException;
3838
import org.ject.support.domain.recruit.repository.RecruitRepository;
39+
import org.springframework.dao.DataIntegrityViolationException;
3940
import org.springframework.stereotype.Service;
4041
import org.springframework.transaction.annotation.Transactional;
4142

@@ -190,6 +191,7 @@ public void saveProfile(Long memberId, ApplyProfileRequest request) {
190191
.name(request.name())
191192
.phoneNumber(request.phoneNumber())
192193
.jobFamily(request.jobFamily())
194+
.region(request.region())
193195
.careerDetails(request.careerDetails())
194196
.experiencePeriod(request.experiencePeriod())
195197
.interestedDomains(request.interestedDomains())
@@ -199,11 +201,15 @@ public void saveProfile(Long memberId, ApplyProfileRequest request) {
199201
}
200202

201203
private void createApplyIfNotExists(Member member, JobFamily jobFamily) {
202-
applyRepository.findByMemberId(member.getId()).orElseGet(() -> {
203-
var recruit = getPeriodRecruit(jobFamily);
204-
var newApply = Apply.createApply(member, recruit);
205-
return applyRepository.save(newApply);
206-
});
204+
if (!applyRepository.existsByMemberId(member.getId())) {
205+
try {
206+
var recruit = getPeriodRecruit(jobFamily);
207+
var newApply = Apply.createApply(member, recruit);
208+
applyRepository.save(newApply);
209+
} catch (DataIntegrityViolationException e) {
210+
log.warn("지원서 생성 중 레이스 컨디션 발생. memberId: {}. 이미 지원서가 존재합니다.", member.getId());
211+
}
212+
}
207213
}
208214

209215
private void validateQuestions(final Map<String, String> answers, final Recruit recruit) {
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package org.ject.support.domain.member;
2+
3+
import lombok.Getter;
4+
import lombok.RequiredArgsConstructor;
5+
6+
@Getter
7+
@RequiredArgsConstructor
8+
public enum Region {
9+
SEOUL("서울"),
10+
GYEONGGI("경기"),
11+
INCHEON("인천"),
12+
BUSAN("부산"),
13+
DAEGU("대구"),
14+
DAEJEON("대전"),
15+
GWANGJU("광주"),
16+
ULSAN("울산"),
17+
SEJONG("세종"),
18+
GANGWON("강원"),
19+
CHUNGBUK("충북"),
20+
CHUNGNAM("충남"),
21+
JEONBUK("전북"),
22+
JEONNAM("전남"),
23+
GYEONGBUK("경북"),
24+
GYEONGNAM("경남"),
25+
JEJU("제주"),
26+
OVERSEAS("해외");
27+
28+
private final String description;
29+
}

src/main/java/org/ject/support/domain/member/entity/Member.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.ject.support.domain.member.ExperiencePeriod;
2626
import org.ject.support.domain.member.JobFamily;
2727
import org.ject.support.domain.member.MemberStatus;
28+
import org.ject.support.domain.member.Region;
2829
import org.ject.support.domain.member.Role;
2930

3031
import java.util.ArrayList;
@@ -58,6 +59,10 @@ public class Member extends BaseTimeEntity {
5859
@Column(columnDefinition = "varchar(45)")
5960
private JobFamily jobFamily;
6061

62+
@Enumerated(EnumType.STRING)
63+
@Column(length = 30)
64+
private Region region;
65+
6166
@Enumerated(EnumType.STRING)
6267
@Column(length = 30)
6368
private CareerDetails careerDetails;
@@ -115,6 +120,7 @@ public MemberEditor.MemberEditorBuilder toEditor() {
115120
.email(this.email)
116121
.semesterId(this.semesterId)
117122
.jobFamily(this.jobFamily)
123+
.region(this.region)
118124
.experiencePeriod(this.experiencePeriod)
119125
.careerDetails(this.careerDetails)
120126
.interestedDomains(this.interestedDomains)
@@ -127,6 +133,7 @@ public void edit(MemberEditor editor) {
127133
this.email = editor.email();
128134
this.semesterId = editor.semesterId();
129135
this.jobFamily = editor.jobFamily();
136+
this.region = editor.region();
130137
this.experiencePeriod = editor.experiencePeriod();
131138
this.careerDetails = editor.careerDetails();
132139
this.interestedDomains = editor.interestedDomains();
@@ -137,6 +144,7 @@ public void deleteProfile() {
137144
this.name = null;
138145
this.phoneNumber = null;
139146
this.jobFamily = null;
147+
this.region = null;
140148
this.careerDetails = null;
141149
this.experiencePeriod = null;
142150
this.interestedDomains.clear();
Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,25 @@
11
package org.ject.support.domain.member.entity;
22

3-
import java.util.List;
43
import lombok.Builder;
54
import org.ject.support.domain.member.CareerDetails;
65
import org.ject.support.domain.member.ExperiencePeriod;
76
import org.ject.support.domain.member.JobFamily;
7+
import org.ject.support.domain.member.Region;
88
import org.ject.support.domain.member.Role;
99

10+
import java.util.List;
11+
1012
@Builder
11-
public record MemberEditor (
12-
String name,
13-
String phoneNumber,
14-
String email,
15-
Long semesterId,
16-
JobFamily jobFamily,
17-
ExperiencePeriod experiencePeriod,
18-
CareerDetails careerDetails,
19-
List<String> interestedDomains,
20-
Role role
13+
public record MemberEditor(
14+
String name,
15+
String phoneNumber,
16+
String email,
17+
Long semesterId,
18+
JobFamily jobFamily,
19+
Region region,
20+
ExperiencePeriod experiencePeriod,
21+
CareerDetails careerDetails,
22+
List<String> interestedDomains,
23+
Role role
2124
) {
2225
}

0 commit comments

Comments
 (0)