Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import inha.gdgoc.global.config.jwt.TokenProvider;
import inha.gdgoc.global.config.jwt.TokenProvider.CustomUserDetails;
import inha.gdgoc.global.security.AccessGuard;
import inha.gdgoc.global.util.MajorNormalizer;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.time.Duration;
Expand Down Expand Up @@ -51,6 +52,7 @@ public class AuthService {
private final StringRedisTemplate redisTemplate;
private final AccessGuard accessGuard;
private final PasswordEncoder passwordEncoder;
private final MajorNormalizer majorNormalizer;

@Value("${google.client-id}")
private String googleClientId;
Expand Down Expand Up @@ -112,7 +114,7 @@ public LoginSuccessResponse signup(SignupRequest request) {
.email(request.getEmail())
.name(request.getName())
.studentId(request.getStudentId())
.major(request.getMajor())
.major(majorNormalizer.normalize(request.getMajor()))
.phoneNumber(cleanPhone)
.image(request.getImage())
// Role(GUEST), Status(PENDING) ๋“ฑ์€ User ์—”ํ‹ฐํ‹ฐ ์ƒ์„ฑ์ž์—์„œ ๊ธฐ๋ณธ๊ฐ’ ์ฒ˜๋ฆฌ๋จ
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import inha.gdgoc.domain.game.dto.response.GameUserResponse;
import inha.gdgoc.domain.game.entity.GameUser;
import inha.gdgoc.domain.game.repository.GameUserRepository;
import inha.gdgoc.global.util.MajorNormalizer;
import jakarta.transaction.Transactional;
import java.time.LocalDate;
import java.time.LocalDateTime;
Expand All @@ -18,11 +19,18 @@
public class GameUserService {

private final GameUserRepository gameUserRepository;
private final MajorNormalizer majorNormalizer;

@Transactional
public List<GameUserResponse> saveGameResultAndGetRanking(GameUserRequest gameUserRequest) {
// ์œ ์ € ์ •๋ณด ์ €์žฅ
GameUser gameUser = gameUserRequest.toEntity();
GameUser gameUser = GameUser.builder()
.name(gameUserRequest.getName())
.major(majorNormalizer.normalize(gameUserRequest.getMajor()))
.studentId(gameUserRequest.getStudentId())
.phoneNumber(gameUserRequest.getPhoneNumber())
.typingSpeed(gameUserRequest.getTypingSpeed())
.build();
gameUserRepository.save(gameUser);

return findUserRankings();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import inha.gdgoc.domain.user.repository.UserRepository;
import inha.gdgoc.global.exception.BusinessException;
import inha.gdgoc.global.exception.GlobalErrorCode;
import inha.gdgoc.global.util.MajorNormalizer;
import java.time.Instant;
import java.util.List;
import lombok.RequiredArgsConstructor;
Expand All @@ -33,6 +34,7 @@ public class RecruitCoreApplicationService {
private final RecruitCoreApplicationRepository repository;
private final UserRepository userRepository;
private final RecruitCoreSessionResolver recruitCoreSessionResolver;
private final MajorNormalizer majorNormalizer;

@Transactional(readOnly = true)
public RecruitCoreApplicantDetailResponse getApplicantDetail(Long id) {
Expand Down Expand Up @@ -82,7 +84,7 @@ public RecruitCoreApplicationCreateResponse submit(Long userId, RecruitCoreAppli
.name(request.snapshot().name())
.studentId(request.snapshot().studentId())
.phone(cleanPhone)
.major(request.snapshot().major())
.major(majorNormalizer.normalize(request.snapshot().major()))
.email(request.snapshot().email())
.team(request.team())
.motivation(request.motivation())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import inha.gdgoc.domain.recruit.member.enums.AdmissionSemester;
import inha.gdgoc.domain.recruit.member.enums.EnrolledClassification;
import inha.gdgoc.domain.recruit.member.enums.Gender;
import inha.gdgoc.global.util.MajorNormalizer;
import java.time.LocalDate;
import lombok.AllArgsConstructor;
import lombok.Builder;
Expand All @@ -27,7 +28,7 @@ public class RecruitMemberRequest {
private String major;
private Boolean isPayed;

public RecruitMember toEntity(AdmissionSemester admissionSemester) {
public RecruitMember toEntity(AdmissionSemester admissionSemester, MajorNormalizer majorNormalizer) {
String cleanPhone = phoneNumber.replaceAll("[^0-9]", "");
return RecruitMember.builder()
.name(name)
Expand All @@ -37,7 +38,7 @@ public RecruitMember toEntity(AdmissionSemester admissionSemester) {
.email(email)
.gender(Gender.fromType(gender))
.birth(birth)
.major(major)
.major(majorNormalizer.normalize(major))
.isPayed(false)
.admissionSemester(admissionSemester)
.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import inha.gdgoc.domain.recruit.member.repository.RecruitMemberMemoRepository;
import inha.gdgoc.domain.recruit.member.repository.RecruitMemberRepository;
import inha.gdgoc.global.util.SemesterCalculator;
import inha.gdgoc.global.util.MajorNormalizer;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
Expand All @@ -41,6 +42,7 @@ public class RecruitMemberService {
private final ObjectMapper objectMapper;
private final SemesterCalculator semesterCalculator;
private final S3Service s3Service;
private final MajorNormalizer majorNormalizer;

@Transactional
public void addRecruitMember(Map<String, Object> requestPayload, MultipartFile file) {
Expand All @@ -63,7 +65,7 @@ public void addRecruitMember(Map<String, Object> requestPayload, MultipartFile f
}

RecruitMember member = memberRequest
.toEntity(semesterCalculator.currentSemester());
.toEntity(semesterCalculator.currentSemester(), majorNormalizer);
recruitMemberRepository.save(member);

List<Answer> answerEntities = answers.entrySet().stream()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import inha.gdgoc.domain.user.entity.User;
import inha.gdgoc.domain.user.exception.UserException;
import inha.gdgoc.domain.user.repository.UserRepository;
import inha.gdgoc.global.util.MajorNormalizer;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -22,6 +23,7 @@
public class UserService {

private final UserRepository userRepository;
private final MajorNormalizer majorNormalizer;

public CheckDuplicatedEmailResponse isExistsByEmail(CheckDuplicatedEmailRequest request) {
return new CheckDuplicatedEmailResponse(userRepository.existsByEmail(request.email()));
Expand All @@ -35,7 +37,7 @@ public User findUserById(Long userId) {
public FindIdResponse findId(FindIdRequest findIdRequest) {
Optional<User> user = userRepository.findByNameAndMajorAndPhoneNumber(
findIdRequest.getName(),
findIdRequest.getMajor(),
majorNormalizer.normalize(findIdRequest.getMajor()),
findIdRequest.getPhoneNumber()
);

Expand Down
125 changes: 125 additions & 0 deletions src/main/java/inha/gdgoc/global/util/MajorNormalizer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
package inha.gdgoc.global.util;

import java.util.Map;
import java.util.Set;
import org.springframework.stereotype.Component;

@Component
public class MajorNormalizer {

private static final Map<String, String> LABEL_TO_CODE = Map.ofEntries(
Map.entry("์ธ๊ณต์ง€๋Šฅ๊ณตํ•™๊ณผ", "AIE"),
Map.entry("๋ฐ์ดํ„ฐ์‚ฌ์ด์–ธ์Šคํ•™๊ณผ", "DSE"),
Map.entry("์Šค๋งˆํŠธ๋ชจ๋นŒ๋ฆฌํ‹ฐ๊ณตํ•™๊ณผ", "SME"),
Map.entry("๋””์ž์ธํ…Œํฌ๋†€๋กœ์ง€ํ•™๊ณผ", "DTE"),
Map.entry("์ปดํ“จํ„ฐ๊ณตํ•™๊ณผ", "CSE"),
Map.entry("๊ธฐ๊ณ„๊ณตํ•™๊ณผ", "ME"),
Map.entry("ํ•ญ๊ณต์šฐ์ฃผ๊ณตํ•™๊ณผ", "AAE"),
Map.entry("์กฐ์„ ํ•ด์–‘๊ณตํ•™๊ณผ", "NAE"),
Map.entry("์‚ฐ์—…๊ฒฝ์˜๊ณตํ•™๊ณผ", "IME"),
Map.entry("ํ™”ํ•™๊ณตํ•™๊ณผ", "CHE"),
Map.entry("๊ณ ๋ถ„์ž๊ณตํ•™๊ณผ", "PSE"),
Map.entry("์‹ ์†Œ์žฌ๊ณตํ•™๊ณผ", "MSE"),
Map.entry("์‚ฌํšŒ์ธํ”„๋ผ๊ณตํ•™๊ณผ", "CIE"),
Map.entry("ํ™˜๊ฒฝ๊ณตํ•™๊ณผ", "ENVE"),
Map.entry("๊ณต๊ฐ„์ •๋ณด๊ณตํ•™๊ณผ", "GIE"),
Map.entry("๊ฑด์ถ•ํ•™๋ถ€(๊ฑด์ถ•๊ณตํ•™)", "ACE"),
Map.entry("๊ฑด์ถ•ํ•™๋ถ€(๊ฑด์ถ•ํ•™)", "ARCH"),
Map.entry("์—๋„ˆ์ง€์ž์›๊ณตํ•™๊ณผ", "ERE"),
Map.entry("์œตํ•ฉ๊ธฐ์ˆ ๊ฒฝ์˜ํ•™๋ถ€", "MOT"),
Map.entry("์ „๊ธฐ์ „์ž๊ณตํ•™๋ถ€", "EEE"),
Map.entry("๋ฐ˜๋„์ฒด์‹œ์Šคํ…œ๊ณตํ•™๊ณผ", "SSE"),
Map.entry("์ด์ฐจ์ „์ง€์œตํ•ฉํ•™๊ณผ", "BCE"),
Map.entry("์ˆ˜ํ•™๊ณผ", "MATH"),
Map.entry("ํ†ต๊ณ„ํ•™๊ณผ", "STAT"),
Map.entry("๋ฌผ๋ฆฌํ•™๊ณผ", "PHYS"),
Map.entry("ํ™”ํ•™๊ณผ", "CHEM"),
Map.entry("ํ•ด์–‘๊ณผํ•™๊ณผ", "OCS"),
Map.entry("์‹ํ’ˆ์˜์–‘ํ•™๊ณผ", "FNS"),
Map.entry("๊ฒฝ์˜ํ•™๋ถ€(๊ฒฝ์˜ํ•™๊ณผ)", "BUS"),
Map.entry("๊ฒฝ์˜ํ•™๋ถ€(ํŒŒ์ด๋‚ธ์Šค๊ฒฝ์˜ํ•™๊ณผ)", "FIN"),
Map.entry("์•„ํƒœ๋ฌผ๋ฅ˜ํ•™๋ถ€", "APL"),
Map.entry("๊ตญ์ œํ†ต์ƒํ•™๊ณผ", "ITC"),
Map.entry("์กฐํ˜•์˜ˆ์ˆ ํ•™๊ณผ", "FINEART"),
Map.entry("๋””์ž์ธ์œตํ•ฉํ•™๊ณผ", "ID"),
Map.entry("์Šคํฌ์ธ ๊ณผํ•™๊ณผ", "SPORTS"),
Map.entry("์—ฐ๊ทน์˜ํ™”ํ•™๊ณผ", "TFA"),
Map.entry("์˜๋ฅ˜๋””์ž์ธํ•™๊ณผ", "FD"),
Map.entry("ํ–‰์ •ํ•™๊ณผ", "PAD"),
Map.entry("์ •์น˜์™ธ๊ตํ•™๊ณผ", "POL"),
Map.entry("๋ฏธ๋””์–ด์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ํ•™๊ณผ", "MCS"),
Map.entry("๊ฒฝ์ œํ•™๊ณผ", "ECON"),
Map.entry("์†Œ๋น„์žํ•™๊ณผ", "CONS"),
Map.entry("์•„๋™์‹ฌ๋ฆฌํ•™๊ณผ", "CPSY"),
Map.entry("์‚ฌํšŒ๋ณต์ง€ํ•™๊ณผ", "SW"),
Map.entry("์ž์œ ์ „๊ณต์œตํ•ฉํ•™๋ถ€", "ULS"),
Map.entry("๊ณตํ•™์œตํ•ฉํ•™๋ถ€", "ECS"),
Map.entry("์ž์—ฐ๊ณผํ•™์œตํ•ฉํ•™๋ถ€", "NCS"),
Map.entry("๊ฒฝ์˜์œตํ•ฉํ•™๋ถ€", "BCONV"),
Map.entry("์‚ฌํšŒ๊ณผํ•™์œตํ•ฉํ•™๋ถ€", "SCS"),
Map.entry("์ธ๋ฌธ์œตํ•ฉํ•™๋ถ€", "HCS"),
Map.entry("ํ•œ๊ตญ์–ด๋ฌธํ•™๊ณผ", "KLL"),
Map.entry("์‚ฌํ•™๊ณผ", "HIST"),
Map.entry("์ฒ ํ•™๊ณผ", "PHIL"),
Map.entry("์ค‘๊ตญํ•™๊ณผ", "CHIN"),
Map.entry("์ผ๋ณธ์–ธ์–ด๋ฌธํ™”ํ•™๊ณผ", "JLC"),
Map.entry("์˜๋ฏธ์œ ๋Ÿฝ์ธ๋ฌธ์œตํ•ฉํ•™๋ถ€", "ELH"),
Map.entry("๋ฌธํ™”์ฝ˜ํ…์ธ ๋ฌธํ™”๊ฒฝ์˜ํ•™๊ณผ", "CCM"),
Map.entry("๋ฉ”์นดํŠธ๋กœ๋‹‰์Šค๊ณตํ•™๊ณผ", "MTE"),
Map.entry("์†Œํ”„ํŠธ์›จ์–ด์œตํ•ฉ๊ณตํ•™๊ณผ", "SWE"),
Map.entry("์‚ฐ์—…๊ฒฝ์˜ํ•™๊ณผ", "IMGT"),
Map.entry("๊ธˆ์œตํˆฌ์žํ•™๊ณผ", "FI"),
Map.entry("์ƒ๋ช…๊ณตํ•™๊ณผ", "BIOE"),
Map.entry("๋ฐ”์ด์˜ค์ œ์•ฝ๊ณตํ•™๊ณผ", "BPE"),
Map.entry("์ƒ๋ช…๊ณผํ•™๊ณผ", "BIOS"),
Map.entry("์ฒจ๋‹จ๋ฐ”์ด์˜ค์˜์•ฝํ•™๊ณผ", "ABM"),
Map.entry("๋ฐ”์ด์˜ค์‹ํ’ˆ๊ณตํ•™๊ณผ", "BFE"),
Map.entry("IBTํ•™๊ณผ", "IBT"),
Map.entry("ISEํ•™๊ณผ", "ISE"),
Map.entry("KLCํ•™๊ณผ", "KLC"),
Map.entry("์˜์˜ˆ๊ณผ", "PREMED"),
Map.entry("์˜ํ•™๊ณผ", "MED"),
Map.entry("๊ฐ„ํ˜ธํ•™๊ณผ", "NURS"),
Map.entry("๊ตญ์–ด๊ต์œก๊ณผ", "KOR_EDU"),
Map.entry("์˜์–ด๊ต์œก๊ณผ", "ENG_EDU"),
Map.entry("์‚ฌํšŒ๊ต์œก๊ณผ", "SOC_EDU"),
Map.entry("๊ต์œกํ•™๊ณผ", "EDU"),
Map.entry("์ฒด์œก๊ต์œก๊ณผ", "PE_EDU"),
Map.entry("์ˆ˜ํ•™๊ต์œก๊ณผ", "MATH_EDU")
);

private static final Map<String, String> ALIASES = Map.ofEntries(
Map.entry("์Šค๋งˆํŠธ๋ชจ๋นŒ๋ฆฌํ‹ฐ๋†€ํ•™๊ณผ", "SME"),
Map.entry("๊ฑด์ถ•๊ณตํ•™์ „๊ณต", "ACE"),
Map.entry("๊ฑด์ถ•ํ•™์ „๊ณต(5๋…„์ œ)", "ARCH"),
Map.entry("๊ฒฝ์˜ํ•™๊ณผ", "BUS"),
Map.entry("ํŒŒ์ด๋‚ธ์Šค๊ฒฝ์˜ํ•™๊ณผ", "FIN"),
Map.entry("ํŒŒ์ด๋‚ธ์Šค๊ฒฝ์˜ํ•™๋ถ€(๊ฒฝ์˜ํ•™๊ณผ)", "FIN"),
Map.entry("๋ฌธํ™”์ฝ˜ํ…์ธ ๋ฌธํ™”๊ฒฝ์˜ํ•™๋ถ€(๊ฒฝ์˜ํ•™๊ณผ)", "CCM"),
Map.entry("๋ฌธํ™”์ปจํ…์ธ ๊ฒฝ์˜ํ•™๊ณผ", "CCM")
);

private static final Set<String> KNOWN_CODES = Set.copyOf(LABEL_TO_CODE.values());

public String normalize(String major) {
if (major == null) {
return null;
}

String trimmed = major.trim();
if (trimmed.isBlank()) {
return trimmed;
}

if (KNOWN_CODES.contains(trimmed)) {
return trimmed;
}

String fromLabel = LABEL_TO_CODE.get(trimmed);
if (fromLabel != null) {
return fromLabel;
}

return ALIASES.getOrDefault(trimmed, trimmed);
}
}
Loading
Loading