From 23bae4f276e59f9d2076a63c219da7f77a14208f Mon Sep 17 00:00:00 2001 From: hyotatoFrappuccino Date: Fri, 29 Aug 2025 23:58:01 +0900 Subject: [PATCH 1/4] =?UTF-8?q?chore:=20=EC=84=A4=EB=AA=85=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80,=20=EB=B0=98=ED=99=98=EB=90=98=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EB=8A=94=20=EC=98=88=EC=99=B8=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/applicationform/api/ApplicationFormApi.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/jobnote/domain/applicationform/api/ApplicationFormApi.java b/src/main/java/com/jobnote/domain/applicationform/api/ApplicationFormApi.java index e8aec4c..ec678df 100644 --- a/src/main/java/com/jobnote/domain/applicationform/api/ApplicationFormApi.java +++ b/src/main/java/com/jobnote/domain/applicationform/api/ApplicationFormApi.java @@ -59,14 +59,14 @@ ResponseEntity>> getAllApplicationForm ); @Operation(summary = "지원서 업데이트", - description = "일정 : (삭제)-> 요청에 미포함, (업데이트)-> id포함 내용변경, (신규)-> id미포함 내용생성") + description = "일정 : (삭제)-> 삭제할 id를 요청에 미기재, (업데이트)-> id 기재 후 내용변경, (신규)-> id 미기재 내용 생성\n" + + "문서 : (삭제)-> 삭제할 id를 요청에 미기재, (신규)->id 미기재 documentId 기재") @ApiResponseExplanations( success = @ApiSuccessResponseExplanation( responseClass = ApplicationFormResponse.class, description = "지원서 업데이트 성공" ), errors = { - @ApiErrorResponseExplanation(exceptionCode = ResponseCode.NOT_FOUND_APPLICATION_FORM), @ApiErrorResponseExplanation(exceptionCode = ResponseCode.INVALID_SCHEDULE_FORM_ASSOCIATION), @ApiErrorResponseExplanation(exceptionCode = ResponseCode.FORBIDDEN) } From 1d2a2281e853ec7e65f8fd723589445e412afe5c Mon Sep 17 00:00:00 2001 From: hyotatoFrappuccino Date: Sat, 30 Aug 2025 00:00:01 +0900 Subject: [PATCH 2/4] =?UTF-8?q?refactor:=20=EC=B1=85=EC=9E=84=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/ApplicationFormService.java | 32 +------------------ .../ApplicationFormDocumentService.java | 29 +++++++++++++++++ 2 files changed, 30 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/jobnote/domain/applicationform/service/ApplicationFormService.java b/src/main/java/com/jobnote/domain/applicationform/service/ApplicationFormService.java index 4e353aa..4fb6759 100644 --- a/src/main/java/com/jobnote/domain/applicationform/service/ApplicationFormService.java +++ b/src/main/java/com/jobnote/domain/applicationform/service/ApplicationFormService.java @@ -2,8 +2,6 @@ import com.jobnote.domain.applicationform.domain.ApplicationForm; import com.jobnote.domain.applicationform.dto.ApplicationFormSimpleResponse; -import com.jobnote.domain.applicationformdocument.domain.ApplicationFormDocument; -import com.jobnote.domain.applicationformdocument.dto.ApplicationFormDocumentRequest; import com.jobnote.domain.applicationform.repository.ApplicationFormRepository; import com.jobnote.domain.applicationform.dto.ApplicationFormRequest; import com.jobnote.domain.applicationform.dto.ApplicationFormResponse; @@ -22,9 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; import static com.jobnote.global.common.ResponseCode.NOT_FOUND_APPLICATION_FORM; @@ -99,7 +94,7 @@ public void update(final Long userId, final Long formId, final ApplicationFormRe scheduleService.updateAll(userId, form, request.schedules()); // 연결된 문서 업데이트 - updateApplicationFormDocuments(userId, form, request.documents()); + applicationFormDocumentService.updateAll(userId, form, request.documents()); } /* DELETE */ @@ -118,29 +113,4 @@ public ApplicationForm getByIdOrThrow(final Long formId) { return applicationFormRepository.findById(formId) .orElseThrow(() -> new JobNoteException(NOT_FOUND_APPLICATION_FORM)); } - - private void updateApplicationFormDocuments(final Long userId, final ApplicationForm form, final List requests) { - // 기존 연결된 문서 조회 - List existsDocuments = applicationFormDocumentService.getAllByApplicationFormId(userId, form.getId()); - - // 요청 문서 ID 목록 - Set requestsIds = requests.stream() - .map(ApplicationFormDocumentRequest::id) - .filter(Objects::nonNull) - .collect(Collectors.toSet()); - - // 삭제 : 기존 문서 중 요청에 없는 문서 삭제 - for (ApplicationFormDocument document : existsDocuments) { - if (!requestsIds.contains(document.getId())) { - applicationFormDocumentService.delete(document); - } - } - - // 신규 생성 ( - for (ApplicationFormDocumentRequest req : requests) { - if (req.id() == null) { - applicationFormDocumentService.saveAll(form, List.of(req)); - } - } - } } diff --git a/src/main/java/com/jobnote/domain/applicationformdocument/service/ApplicationFormDocumentService.java b/src/main/java/com/jobnote/domain/applicationformdocument/service/ApplicationFormDocumentService.java index fe93019..6900300 100644 --- a/src/main/java/com/jobnote/domain/applicationformdocument/service/ApplicationFormDocumentService.java +++ b/src/main/java/com/jobnote/domain/applicationformdocument/service/ApplicationFormDocumentService.java @@ -14,6 +14,8 @@ import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.Set; import java.util.stream.Collectors; import static com.jobnote.global.common.ResponseCode.NOT_FOUND_DOCUMENT; @@ -62,6 +64,33 @@ public void saveAll(final ApplicationForm form, final List requests) { + // 기존 연결된 문서 조회 + List existsDocuments = getAllByApplicationFormId(userId, form.getId()); + + // 요청 문서 ID 목록 + Set requestsIds = requests.stream() + .map(ApplicationFormDocumentRequest::id) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + + // 삭제 : 기존 문서 중 요청에 없는 문서 삭제 + for (ApplicationFormDocument document : existsDocuments) { + if (!requestsIds.contains(document.getId())) { + delete(document); + } + } + + // 신규 생성 + for (ApplicationFormDocumentRequest req : requests) { + if (req.id() == null) { + saveAll(form, List.of(req)); + } + } + } + /* DELETE */ @Transactional public void deleteAllByApplicationFormId(final Long formId) { From 93cd2f257726a0a0911ba4ac373bc2003e30dc06 Mon Sep 17 00:00:00 2001 From: hyotatoFrappuccino Date: Sat, 30 Aug 2025 00:03:48 +0900 Subject: [PATCH 3/4] =?UTF-8?q?refactor:=20=EC=A4=91=EB=B3=B5=20=ED=98=B8?= =?UTF-8?q?=EC=B6=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../applicationform/service/ApplicationFormService.java | 7 ------- .../repository/ApplicationFormDocumentRepository.java | 4 ++++ .../service/ApplicationFormDocumentService.java | 7 +++++++ .../jobnote/domain/document/service/DocumentService.java | 6 +++++- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/jobnote/domain/applicationform/service/ApplicationFormService.java b/src/main/java/com/jobnote/domain/applicationform/service/ApplicationFormService.java index 4fb6759..06a82ac 100644 --- a/src/main/java/com/jobnote/domain/applicationform/service/ApplicationFormService.java +++ b/src/main/java/com/jobnote/domain/applicationform/service/ApplicationFormService.java @@ -1,7 +1,6 @@ package com.jobnote.domain.applicationform.service; import com.jobnote.domain.applicationform.domain.ApplicationForm; -import com.jobnote.domain.applicationform.dto.ApplicationFormSimpleResponse; import com.jobnote.domain.applicationform.repository.ApplicationFormRepository; import com.jobnote.domain.applicationform.dto.ApplicationFormRequest; import com.jobnote.domain.applicationform.dto.ApplicationFormResponse; @@ -58,12 +57,6 @@ public Page getAll(final Long userId, final Pageable pa ); } - public List getAllSimple(final Long userId) { - Page forms = applicationFormRepository.findAllByUserId(userId, Pageable.unpaged()); - - return forms.map(ApplicationFormSimpleResponse::from).toList(); - } - /* CREATE */ @Transactional public Long save(final Long userId, final ApplicationFormRequest request) { diff --git a/src/main/java/com/jobnote/domain/applicationformdocument/repository/ApplicationFormDocumentRepository.java b/src/main/java/com/jobnote/domain/applicationformdocument/repository/ApplicationFormDocumentRepository.java index 23b30fd..c54e2ad 100644 --- a/src/main/java/com/jobnote/domain/applicationformdocument/repository/ApplicationFormDocumentRepository.java +++ b/src/main/java/com/jobnote/domain/applicationformdocument/repository/ApplicationFormDocumentRepository.java @@ -11,6 +11,10 @@ public interface ApplicationFormDocumentRepository extends JpaRepository findAllByUserIdAndApplicationFormIdIn(final Long userId, final List formId); + // 해당 문서에 속한 지원서(지원서-문서 맵핑 엔티티) 목록 반환 + @Query("select afd from ApplicationFormDocument afd join fetch afd.document d join fetch d.user where d.user.id = :userId and d.id in :documentId") + List findAllByUserIdAndDocumentId(final Long userId, final Long documentId); + // 해당 지원서에 속한 문서 연결 해제 void deleteAllByApplicationFormId(final Long formId); diff --git a/src/main/java/com/jobnote/domain/applicationformdocument/service/ApplicationFormDocumentService.java b/src/main/java/com/jobnote/domain/applicationformdocument/service/ApplicationFormDocumentService.java index 6900300..9262440 100644 --- a/src/main/java/com/jobnote/domain/applicationformdocument/service/ApplicationFormDocumentService.java +++ b/src/main/java/com/jobnote/domain/applicationformdocument/service/ApplicationFormDocumentService.java @@ -1,6 +1,7 @@ package com.jobnote.domain.applicationformdocument.service; import com.jobnote.domain.applicationform.domain.ApplicationForm; +import com.jobnote.domain.applicationform.dto.ApplicationFormSimpleResponse; import com.jobnote.domain.applicationformdocument.domain.ApplicationFormDocument; import com.jobnote.domain.applicationformdocument.dto.ApplicationFormDocumentRequest; import com.jobnote.domain.applicationformdocument.repository.ApplicationFormDocumentRepository; @@ -33,6 +34,12 @@ public List getAllByApplicationFormId(final Long userId return applicationFormDocumentRepository.findAllByUserIdAndApplicationFormIdIn(userId, List.of(formId)); } + public List getSimpleResponsesByDocumentId(final Long userId, final Long documentId) { + return applicationFormDocumentRepository.findAllByUserIdAndDocumentId(userId, documentId).stream() + .map(afd -> ApplicationFormSimpleResponse.from(afd.getApplicationForm())) + .toList(); + } + public List getSimpleResponsesByApplicationFormId(final Long userId, final Long formId) { return applicationFormDocumentRepository.findAllByUserIdAndApplicationFormIdIn(userId, List.of(formId)).stream() .map(afd -> DocumentSimpleResponse.from(afd.getDocument())) diff --git a/src/main/java/com/jobnote/domain/document/service/DocumentService.java b/src/main/java/com/jobnote/domain/document/service/DocumentService.java index 4ab51a0..5959e8f 100644 --- a/src/main/java/com/jobnote/domain/document/service/DocumentService.java +++ b/src/main/java/com/jobnote/domain/document/service/DocumentService.java @@ -54,7 +54,11 @@ public Long uploadNewVersionDocument(final Long userId, final Long documentId, f public Page getAll(final Long userId, final Pageable pageable) { return documentRepository.findAllByUserId(userId, pageable) - .map(document -> DocumentResponse.from(document, applicationFormService.getAllSimple(userId))); + .map(document -> + DocumentResponse.from( + document, + applicationFormDocumentService.getSimpleResponsesByDocumentId(userId, document.getId()) + )); } public Page getAllVersions(final Long userId, final Long documentId, final Pageable pageable) { From 73b5a6f4754223efcc86cc544e58a64bfa333cc0 Mon Sep 17 00:00:00 2001 From: hyotatoFrappuccino Date: Sat, 30 Aug 2025 00:09:25 +0900 Subject: [PATCH 4/4] =?UTF-8?q?refactor:=20=EC=BD=94=EB=93=9C=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/ApplicationFormRepository.java | 2 +- .../repository/ApplicationFormDocumentRepository.java | 8 ++++---- .../jobnote/domain/document/dto/DocumentResponse.java | 2 +- .../document/repository/DocumentVersionRepository.java | 9 ++++++--- .../jobnote/domain/document/service/DocumentService.java | 6 ++---- 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/jobnote/domain/applicationform/repository/ApplicationFormRepository.java b/src/main/java/com/jobnote/domain/applicationform/repository/ApplicationFormRepository.java index 3ffe805..314344d 100644 --- a/src/main/java/com/jobnote/domain/applicationform/repository/ApplicationFormRepository.java +++ b/src/main/java/com/jobnote/domain/applicationform/repository/ApplicationFormRepository.java @@ -6,5 +6,5 @@ import org.springframework.data.jpa.repository.JpaRepository; public interface ApplicationFormRepository extends JpaRepository { - Page findAllByUserId(final Long id, final Pageable pageable); + Page findAllByUserId(final Long userId, final Pageable pageable); } diff --git a/src/main/java/com/jobnote/domain/applicationformdocument/repository/ApplicationFormDocumentRepository.java b/src/main/java/com/jobnote/domain/applicationformdocument/repository/ApplicationFormDocumentRepository.java index c54e2ad..a9a1652 100644 --- a/src/main/java/com/jobnote/domain/applicationformdocument/repository/ApplicationFormDocumentRepository.java +++ b/src/main/java/com/jobnote/domain/applicationformdocument/repository/ApplicationFormDocumentRepository.java @@ -7,17 +7,17 @@ import java.util.List; public interface ApplicationFormDocumentRepository extends JpaRepository { - // 해당 지원서에 속한 문서(지원서-문서 맵핑 엔티티) 목록 반환 + /* 해당 지원서에 속한 문서(지원서-문서 맵핑 엔티티) 목록 반환 */ @Query("select afd from ApplicationFormDocument afd join fetch afd.applicationForm af join fetch af.user where af.user.id = :userId and af.id in :formId") List findAllByUserIdAndApplicationFormIdIn(final Long userId, final List formId); - // 해당 문서에 속한 지원서(지원서-문서 맵핑 엔티티) 목록 반환 + /* 해당 문서에 속한 지원서(지원서-문서 맵핑 엔티티) 목록 반환 */ @Query("select afd from ApplicationFormDocument afd join fetch afd.document d join fetch d.user where d.user.id = :userId and d.id in :documentId") List findAllByUserIdAndDocumentId(final Long userId, final Long documentId); - // 해당 지원서에 속한 문서 연결 해제 + /* 해당 지원서에 속한 문서 연결 해제 */ void deleteAllByApplicationFormId(final Long formId); - // 해당 문서에 속한 지원서 연결 해제 + /* 해당 문서에 속한 지원서 연결 해제 */ void deleteAllByDocumentId(final Long documentId); } diff --git a/src/main/java/com/jobnote/domain/document/dto/DocumentResponse.java b/src/main/java/com/jobnote/domain/document/dto/DocumentResponse.java index 4583f00..428c373 100644 --- a/src/main/java/com/jobnote/domain/document/dto/DocumentResponse.java +++ b/src/main/java/com/jobnote/domain/document/dto/DocumentResponse.java @@ -17,7 +17,7 @@ public record DocumentResponse( LocalDate lastModifiedDate, List applicationForms ) { - public static DocumentResponse from(final Document document, final List applicationForms) { + public static DocumentResponse of(final Document document, final List applicationForms) { return DocumentResponse.builder() .id(document.getId()) .type(document.getType()) diff --git a/src/main/java/com/jobnote/domain/document/repository/DocumentVersionRepository.java b/src/main/java/com/jobnote/domain/document/repository/DocumentVersionRepository.java index 5755d0e..82806a5 100644 --- a/src/main/java/com/jobnote/domain/document/repository/DocumentVersionRepository.java +++ b/src/main/java/com/jobnote/domain/document/repository/DocumentVersionRepository.java @@ -10,15 +10,18 @@ import java.util.Optional; public interface DocumentVersionRepository extends JpaRepository { - @Query("select MAX(v.version) from DocumentVersion v where v.document.id = :documentId") - Optional findMaxVersionByDocumentId(final Long documentId); - @Query("select v from DocumentVersion v join fetch v.document d join d.user u where u.id = :userId and d.id = :documentId order by v.version desc") Page findAllByUserIdAndDocumentId(final Long userId, final Long documentId, final Pageable pageable); + /* 해당 문서의 최신 버전 조회 */ + @Query("select MAX(v.version) from DocumentVersion v where v.document.id = :documentId") + Optional findLatestVersionByDocumentId(final Long documentId); + + /* 해당 유저의 문서 총 이용 용량 조회 */ @Query("select COALESCE(SUM(v.fileSize), 0) from DocumentVersion v join v.document d where d.user.id = :userId") Long getTotalFileSizeByUserId(final Long userId); + /* 해당 문서에 등록된 문서 버전들 모두 삭제 */ @Modifying(clearAutomatically = true) void deleteAllByDocumentId(final Long documentId); } diff --git a/src/main/java/com/jobnote/domain/document/service/DocumentService.java b/src/main/java/com/jobnote/domain/document/service/DocumentService.java index 5959e8f..e283c83 100644 --- a/src/main/java/com/jobnote/domain/document/service/DocumentService.java +++ b/src/main/java/com/jobnote/domain/document/service/DocumentService.java @@ -1,6 +1,5 @@ package com.jobnote.domain.document.service; -import com.jobnote.domain.applicationform.service.ApplicationFormService; import com.jobnote.domain.applicationformdocument.service.ApplicationFormDocumentService; import com.jobnote.domain.document.domain.Document; import com.jobnote.domain.document.domain.DocumentVersion; @@ -30,7 +29,6 @@ public class DocumentService { private final DocumentVersionRepository documentVersionRepository; private final UserService userService; private final S3Service s3Service; - private final ApplicationFormService applicationFormService; private final ApplicationFormDocumentService applicationFormDocumentService; @Transactional @@ -47,7 +45,7 @@ public Long uploadNewVersionDocument(final Long userId, final Long documentId, f Document document = getByIdOrThrow(documentId); document.validateOwner(userId); - int version = documentVersionRepository.findMaxVersionByDocumentId(documentId).orElse(0) + 1; + int version = documentVersionRepository.findLatestVersionByDocumentId(documentId).orElse(0) + 1; return saveDocumentVersion(userId, document, request, version); } @@ -55,7 +53,7 @@ public Long uploadNewVersionDocument(final Long userId, final Long documentId, f public Page getAll(final Long userId, final Pageable pageable) { return documentRepository.findAllByUserId(userId, pageable) .map(document -> - DocumentResponse.from( + DocumentResponse.of( document, applicationFormDocumentService.getSimpleResponsesByDocumentId(userId, document.getId()) ));