From e2c965fd230134f3784d8eff2e7bc4f688f5b2c9 Mon Sep 17 00:00:00 2001 From: chominju Date: Wed, 9 Jul 2025 18:50:38 +0900 Subject: [PATCH 1/4] =?UTF-8?q?MOSU-62=20feat:=20=EC=8B=A0=EC=B2=AD=20?= =?UTF-8?q?=EC=8B=9C=20=ED=95=99=EA=B5=90=20=EA=B2=80=EC=A6=9D=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/ApplicationService.java | 48 +++++++++---------- .../ApplicationSchoolJpaRepository.java | 4 +- .../domain/school/SchoolJpaRepository.java | 4 ++ 3 files changed, 27 insertions(+), 29 deletions(-) diff --git a/src/main/java/life/mosu/mosuserver/application/application/ApplicationService.java b/src/main/java/life/mosu/mosuserver/application/application/ApplicationService.java index b969be97..b14f826b 100644 --- a/src/main/java/life/mosu/mosuserver/application/application/ApplicationService.java +++ b/src/main/java/life/mosu/mosuserver/application/application/ApplicationService.java @@ -3,14 +3,12 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; -import java.util.stream.Collectors; import life.mosu.mosuserver.domain.application.AdmissionTicketImageJpaEntity; import life.mosu.mosuserver.domain.application.AdmissionTicketImageJpaRepository; import life.mosu.mosuserver.domain.application.ApplicationJpaEntity; import life.mosu.mosuserver.domain.application.ApplicationJpaRepository; import life.mosu.mosuserver.domain.application.ApplicationSchoolJpaRepository; import life.mosu.mosuserver.domain.applicationschool.ApplicationSchoolJpaEntity; -import life.mosu.mosuserver.domain.school.AddressJpaVO; import life.mosu.mosuserver.domain.school.SchoolJpaEntity; import life.mosu.mosuserver.domain.school.SchoolJpaRepository; import life.mosu.mosuserver.global.exception.CustomRuntimeException; @@ -38,38 +36,36 @@ public class ApplicationService { // 신청 @Transactional public ApplicationResponse apply(Long userId, ApplicationRequest request) { - Set schools = request.schools(); - List schoolEntities = new ArrayList<>(); + Set schoolRequests = request.schools(); + List savedEntities = new ArrayList<>(); - Set schoolIds = schools.stream() - .map(ApplicationSchoolRequest::schoolId) - .collect(Collectors.toSet()); - - if (applicationSchoolJpaRepository.existsByUserIdAndSchoolIdIn(userId, schoolIds)) { - throw new CustomRuntimeException(ErrorCode.APPLICATION_SCHOOL_ALREADY_APPLIED); - } - - ApplicationJpaEntity application = request.toEntity(userId); - ApplicationJpaEntity applicationJpaEntity = applicationJpaRepository.save(application); - Long applicationId = applicationJpaEntity.getId(); + ApplicationJpaEntity application = applicationJpaRepository.save(request.toEntity(userId)); + Long applicationId = application.getId(); admissionTicketImageJpaRepository.save( createAdmissionTicketImageIfPresent(request.admissionTicket(), applicationId)); - schools.forEach(applicationSchoolRequest -> { - SchoolJpaEntity school = schoolJpaRepository.findById( - applicationSchoolRequest.schoolId()) + for (ApplicationSchoolRequest schoolRequest : schoolRequests) { + Long schoolId = schoolJpaRepository.findBySchoolNameAndAreaAndExamDate( + schoolRequest.schoolName(), + schoolRequest.validatedArea(schoolRequest.area()), + schoolRequest.examDate()) + .orElseThrow(() -> new CustomRuntimeException(ErrorCode.SCHOOL_NOT_FOUND)) + .getId(); + + if (applicationSchoolJpaRepository.existsByUserIdAndSchoolId(userId, schoolId)) { + throw new CustomRuntimeException(ErrorCode.APPLICATION_SCHOOL_ALREADY_APPLIED); + } + + SchoolJpaEntity school = schoolJpaRepository.findById(schoolId) .orElseThrow(() -> new CustomRuntimeException(ErrorCode.SCHOOL_NOT_FOUND)); - AddressJpaVO address = school.getAddress(); - ApplicationSchoolJpaEntity applicationSchoolJpaEntity = applicationSchoolRequest.toEntity( - userId, applicationId, address); - ApplicationSchoolJpaEntity saved = applicationSchoolJpaRepository.save( - applicationSchoolJpaEntity); - schoolEntities.add(saved); - }); + ApplicationSchoolJpaEntity applicationSchool = schoolRequest.toEntity(userId, + applicationId, school); + savedEntities.add(applicationSchoolJpaRepository.save(applicationSchool)); + } - return ApplicationResponse.of(applicationId, schoolEntities); + return ApplicationResponse.of(applicationId, savedEntities); } diff --git a/src/main/java/life/mosu/mosuserver/domain/application/ApplicationSchoolJpaRepository.java b/src/main/java/life/mosu/mosuserver/domain/application/ApplicationSchoolJpaRepository.java index 34167b99..4d8711b4 100644 --- a/src/main/java/life/mosu/mosuserver/domain/application/ApplicationSchoolJpaRepository.java +++ b/src/main/java/life/mosu/mosuserver/domain/application/ApplicationSchoolJpaRepository.java @@ -1,6 +1,5 @@ package life.mosu.mosuserver.domain.application; -import java.util.Collection; import java.util.List; import life.mosu.mosuserver.domain.applicationschool.ApplicationSchoolJpaEntity; import org.springframework.data.jpa.repository.JpaRepository; @@ -8,8 +7,7 @@ public interface ApplicationSchoolJpaRepository extends JpaRepository { - - boolean existsByUserIdAndSchoolIdIn(Long userId, Collection schoolIds); + boolean existsByUserIdAndSchoolId(Long userId, Long schoolId); List findAllByApplicationId(Long applicationId); diff --git a/src/main/java/life/mosu/mosuserver/domain/school/SchoolJpaRepository.java b/src/main/java/life/mosu/mosuserver/domain/school/SchoolJpaRepository.java index a034cbf6..ff9facf9 100644 --- a/src/main/java/life/mosu/mosuserver/domain/school/SchoolJpaRepository.java +++ b/src/main/java/life/mosu/mosuserver/domain/school/SchoolJpaRepository.java @@ -1,7 +1,11 @@ package life.mosu.mosuserver.domain.school; +import java.time.LocalDate; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; public interface SchoolJpaRepository extends JpaRepository { + Optional findBySchoolNameAndAreaAndExamDate(String schoolName, Area area, + LocalDate examDate); } From cdade1e8553422034cee5d1b6ec1a773fddafa6d Mon Sep 17 00:00:00 2001 From: chominju Date: Wed, 9 Jul 2025 18:52:01 +0900 Subject: [PATCH 2/4] =?UTF-8?q?MOSU-62=20remove:=20ApplicationSchoolReques?= =?UTF-8?q?t=20schoolId=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/ApplicationSchoolRequest.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/main/java/life/mosu/mosuserver/presentation/application/dto/ApplicationSchoolRequest.java b/src/main/java/life/mosu/mosuserver/presentation/application/dto/ApplicationSchoolRequest.java index 9418a42f..efaa2315 100644 --- a/src/main/java/life/mosu/mosuserver/presentation/application/dto/ApplicationSchoolRequest.java +++ b/src/main/java/life/mosu/mosuserver/presentation/application/dto/ApplicationSchoolRequest.java @@ -8,14 +8,12 @@ import life.mosu.mosuserver.domain.application.Lunch; import life.mosu.mosuserver.domain.application.Subject; import life.mosu.mosuserver.domain.applicationschool.ApplicationSchoolJpaEntity; -import life.mosu.mosuserver.domain.school.AddressJpaVO; import life.mosu.mosuserver.domain.school.Area; +import life.mosu.mosuserver.domain.school.SchoolJpaEntity; import life.mosu.mosuserver.global.exception.CustomRuntimeException; import life.mosu.mosuserver.global.exception.ErrorCode; public record ApplicationSchoolRequest( - @NotNull(message = "학교 ID는 필수입니다.") - Long schoolId, @NotBlank(message = "학교 이름은 필수입니다.") String schoolName, @@ -32,14 +30,14 @@ public record ApplicationSchoolRequest( ) { public ApplicationSchoolJpaEntity toEntity(Long userId, Long applicationId, - AddressJpaVO address) { + SchoolJpaEntity school) { return ApplicationSchoolJpaEntity.builder() .userId(userId) .applicationId(applicationId) - .schoolId(schoolId) - .schoolName(schoolName) - .area(validatedArea(area)) - .address(address) + .schoolId(school.getId()) + .schoolName(school.getSchoolName()) + .area(school.getArea()) + .address(school.getAddress()) .examDate(examDate) .lunch(validatedLunch(lunch)) .subjects(validatedSubjects(subjects)) @@ -64,7 +62,7 @@ private Lunch validatedLunch(String lunch) { } } - private Area validatedArea(String area) { + public Area validatedArea(String area) { try { return Area.valueOf(area.toUpperCase()); } catch (IllegalArgumentException e) { From e0d78bda5db89a2d18106e9c4eb5f95515c90297 Mon Sep 17 00:00:00 2001 From: chominju Date: Wed, 9 Jul 2025 18:52:29 +0900 Subject: [PATCH 3/4] =?UTF-8?q?MOSU-62=20chore:=20ApplicationSchoolRespons?= =?UTF-8?q?e=20=EA=B0=92=EC=9C=BC=EB=A1=9C=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/dto/ApplicationSchoolResponse.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/life/mosu/mosuserver/presentation/application/dto/ApplicationSchoolResponse.java b/src/main/java/life/mosu/mosuserver/presentation/application/dto/ApplicationSchoolResponse.java index 746f2bc0..336c1d3e 100644 --- a/src/main/java/life/mosu/mosuserver/presentation/application/dto/ApplicationSchoolResponse.java +++ b/src/main/java/life/mosu/mosuserver/presentation/application/dto/ApplicationSchoolResponse.java @@ -3,32 +3,33 @@ import java.time.LocalDate; import java.util.Set; import java.util.stream.Collectors; -import life.mosu.mosuserver.domain.application.Lunch; import life.mosu.mosuserver.domain.application.Subject; import life.mosu.mosuserver.domain.applicationschool.ApplicationSchoolJpaEntity; -import life.mosu.mosuserver.domain.school.Area; public record ApplicationSchoolResponse( Long applicationSchoolId, - Area area, + String area, LocalDate examDate, String schoolName, - Lunch lunch, + String lunch, String examinationNumber, Set subjects ) { public static ApplicationSchoolResponse from(ApplicationSchoolJpaEntity applicationSchool) { + String areaName = applicationSchool.getArea().getAreaName(); + String lunchName = applicationSchool.getLunch().getLunchName(); + Set subjectNames = applicationSchool.getSubjects().stream() .map(Subject::getSubjectName) .collect(Collectors.toSet()); return new ApplicationSchoolResponse( applicationSchool.getId(), - applicationSchool.getArea(), + areaName, applicationSchool.getExamDate(), applicationSchool.getSchoolName(), - applicationSchool.getLunch(), + lunchName, applicationSchool.getExaminationNumber(), subjectNames ); From 4a4001b2f39e936facd77c8119e7cb625ca43a65 Mon Sep 17 00:00:00 2001 From: chominju Date: Wed, 9 Jul 2025 18:53:54 +0900 Subject: [PATCH 4/4] =?UTF-8?q?MOSU-62=20chore:=20area=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 --- src/main/java/life/mosu/mosuserver/domain/school/Area.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/life/mosu/mosuserver/domain/school/Area.java b/src/main/java/life/mosu/mosuserver/domain/school/Area.java index cd800a96..59936697 100644 --- a/src/main/java/life/mosu/mosuserver/domain/school/Area.java +++ b/src/main/java/life/mosu/mosuserver/domain/school/Area.java @@ -3,8 +3,7 @@ public enum Area { DAECHI("대치"), MOKDONG("목동"), - DAEGU("대구"); - + NOWON("노원"); private final String areaName; Area(String areaName) {