Skip to content

Commit e22944b

Browse files
authored
[refactor] Member의 지원자/계정 역할을 applicant로 이전 (#574)
* Applicant 도메인 기반 구조 추가 (#571) * [feat] Applicant 도메인 준비 * [ci] tmp/dev 브랜치에서 ci 활성화 (임시) * [chore] 주석 추가 및 수정 * refactor: 인증 흐름을 Member -> Applicant 기준으로 전환 (#572) * [refactor] 인증 대상 테이블을 applicant로 전환 * [Refactor] JWT claim 이름을 applicantId로 변경 * [Refactor] 일반 인증 흐름의 Member 의존을 Applicant로 변경 * [Refactor] 관리자 인증 흐름의 Member 의존을 Applicant로 변경 * [refactor] Member에서 이관 완료된 인증 엔드포인트, 로직 제거 * [chore] 함수 제거 및 주석 추가 * [refactor] 지원서 도메인 소유권을 applicant로 전환 (#573) * [refactor]: 지원서 소유자를 applicant로 전환 * [db]: 지원서 외래키를 applicant로 전환 * [test]: 지원서 테스트를 applicant 기준으로 수정 * [test]: applicant 계정 조회 쿼리 테스트 이관 * [test]: applicant repository 테스트 네이밍 정리 * [chore] 임시 dev 브랜치 ci룰 제거
1 parent 387c70c commit e22944b

75 files changed

Lines changed: 1761 additions & 1364 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/main/java/org/ject/support/admin/account/dto/AdminAccountCreateRequest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
import jakarta.validation.constraints.NotBlank;
66
import jakarta.validation.constraints.NotNull;
77
import jakarta.validation.constraints.Size;
8+
import org.ject.support.domain.applicant.entity.Applicant;
89
import org.ject.support.domain.member.MemberType;
910
import org.ject.support.domain.member.Role;
10-
import org.ject.support.domain.member.entity.Member;
1111

1212
@Schema(description = "관리자 계정 생성 요청")
1313
public record AdminAccountCreateRequest(
@@ -36,8 +36,8 @@ public record AdminAccountCreateRequest(
3636

3737
private static final long DEFAULT_ADMIN_ACCOUNT_SEMESTER_ID = 1L;
3838

39-
public Member toEntity(final String encodedPassword) {
40-
return Member.builder()
39+
public Applicant toEntity(final String encodedPassword) {
40+
return Applicant.builder()
4141
.email(email)
4242
.pin(encodedPassword)
4343
.name(normalizeName())

src/main/java/org/ject/support/admin/account/dto/AdminAccountResponse.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package org.ject.support.admin.account.dto;
22

3+
import org.ject.support.domain.applicant.dto.ApplicantAccountProjection;
34
import org.ject.support.domain.member.MemberStatus;
45
import org.ject.support.domain.member.Role;
5-
import org.ject.support.domain.member.dto.MemberAccountProjection;
66

77
public record AdminAccountResponse(
88
Long id,
@@ -12,7 +12,7 @@ public record AdminAccountResponse(
1212
MemberStatus status
1313
) {
1414

15-
public static AdminAccountResponse from(final MemberAccountProjection projection) {
15+
public static AdminAccountResponse from(final ApplicantAccountProjection projection) {
1616
return new AdminAccountResponse(
1717
projection.id(),
1818
projection.email(),

src/main/java/org/ject/support/admin/account/service/AdminAccountService.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@
1010
import org.ject.support.admin.component.AdminMemberComponent;
1111
import org.ject.support.admin.exception.AdminErrorCode;
1212
import org.ject.support.admin.exception.AdminException;
13+
import org.ject.support.domain.applicant.entity.Applicant;
14+
import org.ject.support.domain.applicant.entity.ApplicantEditor;
15+
import org.ject.support.domain.applicant.repository.ApplicantRepository;
1316
import org.ject.support.domain.member.MemberStatus;
1417
import org.ject.support.domain.member.Role;
15-
import org.ject.support.domain.member.entity.Member;
16-
import org.ject.support.domain.member.entity.MemberEditor;
17-
import org.ject.support.domain.member.repository.MemberRepository;
1818
import org.springframework.data.domain.Page;
1919
import org.springframework.data.domain.Pageable;
2020
import org.springframework.security.crypto.password.PasswordEncoder;
@@ -28,14 +28,14 @@
2828
@Transactional(readOnly = true)
2929
public class AdminAccountService {
3030

31-
private final MemberRepository memberRepository;
31+
private final ApplicantRepository applicantRepository;
3232
private final AdminMemberComponent adminMemberComponent;
3333
private final PasswordEncoder passwordEncoder;
3434

3535
public Page<AdminAccountResponse> findAccounts(final AdminAccountSearchCondition condition,
3636
final Pageable pageable) {
3737
validateBackofficeRoles(condition.roles());
38-
return memberRepository.findAccounts(condition, pageable)
38+
return applicantRepository.findAccounts(condition, pageable)
3939
.map(AdminAccountResponse::from);
4040
}
4141

@@ -45,7 +45,7 @@ public void createAccount(final AdminAccountCreateRequest request) {
4545
validateEmailUniqueness(request);
4646

4747
final String encodedPassword = passwordEncoder.encode(request.password());
48-
memberRepository.save(request.toEntity(encodedPassword));
48+
applicantRepository.save(request.toEntity(encodedPassword));
4949
}
5050

5151
@Transactional
@@ -56,29 +56,29 @@ public void updateAccount(final Long requesterId,
5656
validateNotLockingSelf(requesterId, memberId, request.active());
5757
validateNotChangingOwnAdminRole(requesterId, memberId, request.role());
5858

59-
final Member member = adminMemberComponent.getRequiredBackofficeMemberById(memberId);
59+
final Applicant applicant = adminMemberComponent.getRequiredBackofficeMemberById(memberId);
6060

6161
final MemberStatus status = request.active() ? MemberStatus.ACTIVE : MemberStatus.LOCKED;
62-
final MemberEditor editor = member.toEditor()
62+
final ApplicantEditor editor = applicant.toEditor()
6363
.name(request.normalizeName())
6464
.role(request.role())
6565
.status(status)
6666
.build();
6767

68-
member.edit(editor);
68+
applicant.edit(editor);
6969
}
7070

7171
@Transactional
7272
public void updateRole(final Long memberId, final AdminAccountRoleUpdateRequest request) {
7373
validateBackofficeRole(request.role());
7474

75-
final Member member = adminMemberComponent.getRequiredBackofficeMemberById(memberId);
75+
final Applicant applicant = adminMemberComponent.getRequiredBackofficeMemberById(memberId);
7676

77-
final MemberEditor editor = member.toEditor()
77+
final ApplicantEditor editor = applicant.toEditor()
7878
.role(request.role())
7979
.build();
8080

81-
member.edit(editor);
81+
applicant.edit(editor);
8282
}
8383

8484
@Transactional
@@ -87,10 +87,10 @@ public void updateActive(final Long requesterId,
8787
final AdminAccountActiveUpdateRequest request) {
8888
validateNotLockingSelf(requesterId, memberId, request.active());
8989

90-
final Member member = adminMemberComponent.getRequiredBackofficeMemberById(memberId);
90+
final Applicant applicant = adminMemberComponent.getRequiredBackofficeMemberById(memberId);
9191
final MemberStatus status = request.active() ? MemberStatus.ACTIVE : MemberStatus.LOCKED;
9292

93-
adminMemberComponent.changeMemberStatus(member, status);
93+
adminMemberComponent.changeMemberStatus(applicant, status);
9494
}
9595

9696
private void validateNotLockingSelf(final Long requesterId,
@@ -126,7 +126,7 @@ private void validateBackofficeRoles(final List<Role> roles) {
126126
}
127127

128128
private void validateEmailUniqueness(final AdminAccountCreateRequest request) {
129-
if (memberRepository.existsByEmail(request.email())) {
129+
if (applicantRepository.existsByEmail(request.email())) {
130130
throw new AdminException(AdminErrorCode.DUPLICATE_ADMIN_EMAIL);
131131
}
132132
}

src/main/java/org/ject/support/admin/apply/dto/AdminApplyDetailResponse.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,19 @@ public record AdminApplyDetailResponse(
2222
List<String> interestedDomains
2323
) {
2424
public static AdminApplyDetailResponse from(Apply apply) {
25-
var member = apply.getMember();
25+
var applicant = apply.getApplicant();
2626
return new AdminApplyDetailResponse(
2727
apply.getId(),
28-
member.getName(),
29-
member.getPhoneNumber(),
30-
member.getEmail(),
31-
member.getJobFamily(),
32-
Optional.ofNullable(member.getCareerDetails()).map(CareerDetails::getDescription).orElse(""),
28+
applicant.getName(),
29+
applicant.getPhoneNumber(),
30+
applicant.getEmail(),
31+
applicant.getJobFamily(),
32+
Optional.ofNullable(applicant.getCareerDetails()).map(CareerDetails::getDescription).orElse(""),
3333
apply.getRecruit().getRecruitType().name(),
3434
apply.getNote(),
35-
Optional.ofNullable(member.getRegion()).map(Region::getDescription).orElse(""),
36-
Optional.ofNullable(member.getExperiencePeriod()).map(ExperiencePeriod::getDescription).orElse(""),
37-
Optional.ofNullable(member.getInterestedDomains()).orElse(List.of())
35+
Optional.ofNullable(applicant.getRegion()).map(Region::getDescription).orElse(""),
36+
Optional.ofNullable(applicant.getExperiencePeriod()).map(ExperiencePeriod::getDescription).orElse(""),
37+
Optional.ofNullable(applicant.getInterestedDomains()).orElse(List.of())
3838
);
3939
}
4040
}

src/main/java/org/ject/support/admin/apply/dto/AdminApplyResponse.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,14 @@ public record AdminApplyResponse(
1616
String note
1717
) {
1818
public static AdminApplyResponse from(Apply apply) {
19+
var applicant = apply.getApplicant();
1920
return new AdminApplyResponse(
2021
apply.getId(),
21-
apply.getMember().getName(),
22-
apply.getMember().getPhoneNumber(),
23-
apply.getMember().getEmail(),
24-
apply.getMember().getJobFamily(),
25-
Optional.ofNullable(apply.getMember().getCareerDetails()).map(CareerDetails::getDescription).orElse(""),
22+
applicant.getName(),
23+
applicant.getPhoneNumber(),
24+
applicant.getEmail(),
25+
applicant.getJobFamily(),
26+
Optional.ofNullable(applicant.getCareerDetails()).map(CareerDetails::getDescription).orElse(""),
2627
apply.getRecruit().getRecruitType().name(),
2728
apply.getNote()
2829
);

src/main/java/org/ject/support/admin/apply/repository/AdminApplyQueryRepositoryImpl.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import static org.ject.support.domain.apply.domain.QApplicationForm.applicationForm;
44
import static org.ject.support.domain.apply.domain.QApply.apply;
55
import static org.ject.support.domain.apply.domain.QPortfolio.portfolio;
6-
import static org.ject.support.domain.member.entity.QMember.member;
6+
import static org.ject.support.domain.applicant.entity.QApplicant.applicant;
77
import static org.ject.support.domain.recruit.domain.QRecruit.recruit;
88

99
import com.querydsl.core.types.dsl.BooleanExpression;
@@ -35,12 +35,12 @@ public Page<Apply> findApplies(final AdminApplySearchCondition condition,
3535
List<Apply> content = queryFactory
3636
.selectFrom(apply)
3737
.distinct()
38-
.join(apply.member, member).fetchJoin()
38+
.join(apply.applicant, applicant).fetchJoin()
3939
.join(apply.applicationForm, applicationForm).fetchJoin()
4040
.join(apply.recruit, recruit).fetchJoin()
4141
.leftJoin(apply.applicationForm.portfolios, portfolio).fetchJoin()
4242
.where(
43-
apply.member.isDeleted.eq(false),
43+
apply.applicant.isDeleted.eq(false),
4444
eqJobFamily(condition.jobFamily()),
4545
eqApplyStatus(condition.applyStatus()),
4646
eqSemesterId(condition.semesterId()),
@@ -56,10 +56,10 @@ public Page<Apply> findApplies(final AdminApplySearchCondition condition,
5656
Long total = queryFactory
5757
.select(apply.count())
5858
.from(apply)
59-
.join(apply.member, member)
59+
.join(apply.applicant, applicant)
6060
.join(apply.recruit, recruit)
6161
.where(
62-
apply.member.isDeleted.eq(false),
62+
apply.applicant.isDeleted.eq(false),
6363
eqJobFamily(condition.jobFamily()),
6464
eqApplyStatus(condition.applyStatus()),
6565
eqSemesterId(condition.semesterId()),
@@ -76,13 +76,13 @@ public Optional<Apply> findApplyByIdByStatus(final Long applyId, final ApplyStat
7676
Apply result = queryFactory
7777
.selectFrom(apply)
7878
.distinct()
79-
.join(apply.member, member).fetchJoin()
79+
.join(apply.applicant, applicant).fetchJoin()
8080
.join(apply.applicationForm, applicationForm).fetchJoin()
8181
.join(apply.recruit, recruit).fetchJoin()
8282
.leftJoin(apply.applicationForm.portfolios, portfolio).fetchJoin()
8383
.where(
8484
apply.id.eq(applyId),
85-
apply.member.isDeleted.eq(false),
85+
apply.applicant.isDeleted.eq(false),
8686
eqApplyStatus(status)
8787
)
8888
.fetchOne();
@@ -92,7 +92,7 @@ public Optional<Apply> findApplyByIdByStatus(final Long applyId, final ApplyStat
9292

9393
private BooleanExpression eqJobFamily(final JobFamily jobFamily) {
9494
return Optional.ofNullable(jobFamily)
95-
.map(apply.member.jobFamily::eq)
95+
.map(apply.applicant.jobFamily::eq)
9696
.orElse(null);
9797
}
9898

src/main/java/org/ject/support/admin/apply/repository/AdminApplyRepository.java

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

1212
public interface AdminApplyRepository extends JpaRepository<Apply, Long>, AdminApplyQueryRepository {
1313

14-
@Query("SELECT a FROM Apply a JOIN FETCH a.member LEFT JOIN FETCH a.applicationForm WHERE a.id = :id")
15-
Optional<Apply> findByIdWithMember(@Param("id") Long id);
14+
@Query("SELECT a FROM Apply a JOIN FETCH a.applicant LEFT JOIN FETCH a.applicationForm WHERE a.id = :id")
15+
Optional<Apply> findByIdWithApplicant(@Param("id") Long id);
1616

17-
@Query("SELECT a FROM Apply a JOIN FETCH a.member LEFT JOIN FETCH a.applicationForm WHERE a.id IN :ids")
18-
List<Apply> findAllByIdWithMember(@Param("ids") List<Long> ids);
17+
@Query("SELECT a FROM Apply a JOIN FETCH a.applicant LEFT JOIN FETCH a.applicationForm WHERE a.id IN :ids")
18+
List<Apply> findAllByIdWithApplicant(@Param("ids") List<Long> ids);
1919

2020
@Modifying(clearAutomatically = true)
2121
@Query("UPDATE Apply a SET a.isDeleted = true WHERE a.id IN :ids")
2222
void deleteAllByIds(@Param("ids") Iterable<Long> ids);
2323

24-
@Query("select a from Apply a join fetch a.member m where a.id = :applyId and a.status = :status")
25-
Optional<Apply> findByIdAndStatusWithMember(@Param("applyId") Long applyId, @Param("status") ApplyStatus status);
24+
@Query("select a from Apply a join fetch a.applicant m where a.id = :applyId and a.status = :status")
25+
Optional<Apply> findByIdAndStatusWithApplicant(@Param("applyId") Long applyId, @Param("status") ApplyStatus status);
2626
}

src/main/java/org/ject/support/admin/apply/service/AdminApplyService.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@
1010
import org.ject.support.admin.apply.repository.AdminApplyRepository;
1111
import org.ject.support.common.data.PageResponse;
1212
import org.ject.support.common.util.Map2JsonSerializer;
13+
import org.ject.support.domain.applicant.entity.Applicant;
14+
import org.ject.support.domain.applicant.entity.ApplicantEditor;
1315
import org.ject.support.domain.apply.domain.Apply;
1416
import org.ject.support.domain.apply.domain.ApplyStatus;
1517
import org.ject.support.domain.apply.domain.Portfolio;
1618
import org.ject.support.domain.apply.dto.ApplyPortfolioDto;
1719
import org.ject.support.domain.apply.exception.ApplyErrorCode;
1820
import org.ject.support.domain.apply.exception.ApplyException;
1921
import org.ject.support.domain.apply.repository.ApplyRepository;
20-
import org.ject.support.domain.member.entity.Member;
21-
import org.ject.support.domain.member.entity.MemberEditor;
2222
import org.ject.support.domain.recruit.domain.Recruit;
2323
import org.ject.support.domain.recruit.exception.QuestionErrorCode;
2424
import org.ject.support.domain.recruit.exception.QuestionException;
@@ -58,17 +58,17 @@ public AdminApplyDetailResponse findApply(final Long applyId,
5858
@Transactional
5959
public void updateSubmittedApply(final Long applyId,
6060
final SubmittedApplyEditRequest request) {
61-
Apply apply = adminApplyRepository.findByIdAndStatusWithMember(applyId, ApplyStatus.SUBMITTED)
61+
Apply apply = adminApplyRepository.findByIdAndStatusWithApplicant(applyId, ApplyStatus.SUBMITTED)
6262
.orElseThrow(() -> new ApplyException(ApplyErrorCode.NOT_FOUND_APPLY));
6363

64-
Member member = apply.getMember();
65-
MemberEditor memberEditor = member.toEditor()
64+
Applicant applicant = apply.getApplicant();
65+
ApplicantEditor applicantEditor = applicant.toEditor()
6666
.name(request.name())
6767
.phoneNumber(request.phoneNumber())
6868
.email(request.email())
6969
.jobFamily(request.jobFamily())
7070
.build();
71-
member.edit(memberEditor);
71+
applicant.edit(applicantEditor);
7272

7373
Map<String, String> answers = request.answers();
7474
validateQuestions(answers, apply.getRecruit());
@@ -85,7 +85,7 @@ public void updateSubmittedApply(final Long applyId,
8585

8686
@Transactional
8787
public void deleteApply(final Long applyId) {
88-
Apply apply = adminApplyRepository.findByIdWithMember(applyId)
88+
Apply apply = adminApplyRepository.findByIdWithApplicant(applyId)
8989
.orElseThrow(() -> new ApplyException(ApplyErrorCode.NOT_FOUND_APPLY));
9090
adminApplyRepository.delete(apply);
9191
}

src/main/java/org/ject/support/admin/apply/service/ApplyPassService.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package org.ject.support.admin.apply.service;
22

33
import lombok.RequiredArgsConstructor;
4+
import org.ject.support.domain.applicant.entity.Applicant;
45
import org.ject.support.domain.apply.domain.Apply;
56
import org.ject.support.domain.apply.exception.ApplyException;
67
import org.ject.support.domain.apply.repository.ApplyRepository;
7-
import org.ject.support.domain.member.entity.Member;
88
import org.springframework.stereotype.Service;
99
import org.springframework.transaction.annotation.Transactional;
1010

@@ -21,7 +21,7 @@ public class ApplyPassService {
2121
@Transactional
2222
public int passApply(List<Long> applyIds) {
2323
// 지원 정보 조회
24-
List<Apply> applies = applyRepository.findAllByIdWithMember(applyIds);
24+
List<Apply> applies = applyRepository.findAllByIdWithApplicant(applyIds);
2525

2626
// 지원자 합격 처리
2727
applies.forEach(apply -> {
@@ -31,9 +31,9 @@ public int passApply(List<Long> applyIds) {
3131
}
3232

3333
// 지원자 role 승격
34-
Member member = apply.getMember();
35-
member.promoteToSemester();
36-
member.updateMemberType(apply.getRecruit().getRecruitType().toMemberType());
34+
Applicant applicant = apply.getApplicant();
35+
applicant.promoteToSemester();
36+
applicant.updateMemberType(apply.getRecruit().getRecruitType().toMemberType());
3737
});
3838

3939
// 승인한 구성원 수 반환

src/main/java/org/ject/support/admin/auth/service/AdminAuthService.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
import org.ject.support.admin.component.AdminMemberComponent;
77
import org.ject.support.admin.exception.AdminErrorCode;
88
import org.ject.support.admin.exception.AdminException;
9+
import org.ject.support.domain.applicant.entity.Applicant;
910
import org.ject.support.domain.member.MemberStatus;
10-
import org.ject.support.domain.member.entity.Member;
1111
import org.springframework.data.redis.core.RedisTemplate;
1212
import org.springframework.security.core.Authentication;
1313
import org.springframework.security.crypto.password.PasswordEncoder;
@@ -36,17 +36,17 @@ public class AdminAuthService {
3636
public Authentication authenticateAdmin(String email, String password) {
3737
validateLoginAttemptLimit(email);
3838

39-
Member member = adminMemberComponent.findBackofficeMemberByEmail(email)
39+
Applicant applicant = adminMemberComponent.findBackofficeMemberByEmail(email)
4040
.orElseThrow(() -> handleInvalidAdminCredentials(email));
4141

42-
if (!passwordEncoder.matches(password, member.getPin())) {
42+
if (!passwordEncoder.matches(password, applicant.getPin())) {
4343
throw handleInvalidAdminCredentials(email);
4444
}
4545

46-
checkMemberStatus(member);
46+
checkMemberStatus(applicant);
4747
clearLoginFailState(email);
4848

49-
return jwtTokenProvider.createAuthenticationByMember(member);
49+
return jwtTokenProvider.createAuthenticationByApplicant(applicant);
5050
}
5151

5252
private AdminException handleInvalidAdminCredentials(String email) {
@@ -79,8 +79,8 @@ private void clearLoginFailState(String email) {
7979
redisTemplate.delete(ADMIN_LOGIN_PASSWORD_BLOCK_KEY_PREFIX + email);
8080
}
8181

82-
private void checkMemberStatus(Member member) {
83-
if (member.getStatus() == MemberStatus.LOCKED) {
82+
private void checkMemberStatus(Applicant applicant) {
83+
if (applicant.getStatus() == MemberStatus.LOCKED) {
8484
throw new AdminException(AdminErrorCode.LOCKED_ADMIN);
8585
}
8686
}

0 commit comments

Comments
 (0)