From c7db38b32ceabceed28a2e0f639592f8fbba7763 Mon Sep 17 00:00:00 2001 From: Youth <109585620+Youthhing@users.noreply.github.com> Date: Tue, 18 Jun 2024 17:37:19 +0900 Subject: [PATCH] =?UTF-8?q?Feature:=20=EC=84=B8=EC=85=98=20=EB=8D=B0?= =?UTF-8?q?=EB=B8=8C=ED=86=A1=20=EC=BB=A8=ED=85=90=EC=B8=A0=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=B0=8F=20=EC=9E=84=EB=B2=A0=EB=94=94=EB=93=9C?= =?UTF-8?q?=ED=99=94=20(#27)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 세션 데브톡 컨텐츠 추가 * feat: 세션 컨텐츠 임베디드화 - SessionContents 임베디드 타입 추가 - 세션 리스트 반환 API Response 변경 - Jpa 메서드명 변경 --- .../session/controller/SessionController.java | 1 - .../api/session/dto/AddSessionRequest.java | 4 +- .../api/session/dto/SessionListResponse.java | 12 ++--- .../api/session/dto/UpdateSessionRequest.java | 6 ++- .../embedded}/GenerationPeriod.java | 2 +- .../generation/embedded/SessionContents.java | 39 ++++++++++++++ .../domain/generation/entity/Generation.java | 4 +- .../domain/generation/entity/Session.java | 51 ++++++++----------- .../domain/generation/enums/DevTalk.java | 11 ++++ .../repository/SessionRepository.java | 2 +- .../generation/service/GenerationService.java | 2 +- .../generation/service/SessionService.java | 20 +++++--- 12 files changed, 99 insertions(+), 55 deletions(-) rename src/main/java/org/cotato/csquiz/{common/entity => domain/generation/embedded}/GenerationPeriod.java (91%) create mode 100644 src/main/java/org/cotato/csquiz/domain/generation/embedded/SessionContents.java create mode 100644 src/main/java/org/cotato/csquiz/domain/generation/enums/DevTalk.java diff --git a/src/main/java/org/cotato/csquiz/api/session/controller/SessionController.java b/src/main/java/org/cotato/csquiz/api/session/controller/SessionController.java index 3dd3d156..7b7bfdac 100644 --- a/src/main/java/org/cotato/csquiz/api/session/controller/SessionController.java +++ b/src/main/java/org/cotato/csquiz/api/session/controller/SessionController.java @@ -41,7 +41,6 @@ public ResponseEntity> findSessionsByGenerationId(@Req @PostMapping(value = "/add", consumes = "multipart/form-data") public ResponseEntity addSession(@ModelAttribute @Valid AddSessionRequest request) throws ImageException { - log.info("세션 추가 컨트롤러 : {}", request.description()); return ResponseEntity.status(HttpStatus.CREATED).body(sessionService.addSession(request)); } diff --git a/src/main/java/org/cotato/csquiz/api/session/dto/AddSessionRequest.java b/src/main/java/org/cotato/csquiz/api/session/dto/AddSessionRequest.java index 166f34e6..b264c4a2 100644 --- a/src/main/java/org/cotato/csquiz/api/session/dto/AddSessionRequest.java +++ b/src/main/java/org/cotato/csquiz/api/session/dto/AddSessionRequest.java @@ -1,6 +1,7 @@ package org.cotato.csquiz.api.session.dto; import org.cotato.csquiz.domain.generation.enums.CSEducation; +import org.cotato.csquiz.domain.generation.enums.DevTalk; import org.cotato.csquiz.domain.generation.enums.ItIssue; import org.cotato.csquiz.domain.generation.enums.Networking; import jakarta.validation.constraints.NotNull; @@ -14,6 +15,7 @@ public record AddSessionRequest( String description, ItIssue itIssue, Networking networking, - CSEducation csEducation + CSEducation csEducation, + DevTalk devTalk ) { } diff --git a/src/main/java/org/cotato/csquiz/api/session/dto/SessionListResponse.java b/src/main/java/org/cotato/csquiz/api/session/dto/SessionListResponse.java index aab9d14a..73ff707b 100644 --- a/src/main/java/org/cotato/csquiz/api/session/dto/SessionListResponse.java +++ b/src/main/java/org/cotato/csquiz/api/session/dto/SessionListResponse.java @@ -1,8 +1,6 @@ package org.cotato.csquiz.api.session.dto; -import org.cotato.csquiz.domain.generation.enums.CSEducation; -import org.cotato.csquiz.domain.generation.enums.ItIssue; -import org.cotato.csquiz.domain.generation.enums.Networking; +import org.cotato.csquiz.domain.generation.embedded.SessionContents; import org.cotato.csquiz.domain.generation.entity.Session; public record SessionListResponse( @@ -11,9 +9,7 @@ public record SessionListResponse( String photoUrl, String description, Long generationId, - ItIssue itIssue, - Networking networking, - CSEducation csEducation + SessionContents sessionContents ) { public static SessionListResponse from(Session session) { return new SessionListResponse( @@ -22,9 +18,7 @@ public static SessionListResponse from(Session session) { (session.getPhotoS3Info() != null) ? session.getPhotoS3Info().getUrl() : null, session.getDescription(), session.getGeneration().getId(), - session.getItIssue(), - session.getNetworking(), - session.getCsEducation() + session.getSessionContents() ); } } diff --git a/src/main/java/org/cotato/csquiz/api/session/dto/UpdateSessionRequest.java b/src/main/java/org/cotato/csquiz/api/session/dto/UpdateSessionRequest.java index d5094abe..06ba6fe3 100644 --- a/src/main/java/org/cotato/csquiz/api/session/dto/UpdateSessionRequest.java +++ b/src/main/java/org/cotato/csquiz/api/session/dto/UpdateSessionRequest.java @@ -1,6 +1,7 @@ package org.cotato.csquiz.api.session.dto; import org.cotato.csquiz.domain.generation.enums.CSEducation; +import org.cotato.csquiz.domain.generation.enums.DevTalk; import org.cotato.csquiz.domain.generation.enums.ItIssue; import org.cotato.csquiz.domain.generation.enums.Networking; import jakarta.validation.constraints.NotNull; @@ -18,6 +19,9 @@ public record UpdateSessionRequest( @NotNull Networking networking, @NotNull - CSEducation csEducation + CSEducation csEducation, + + @NotNull + DevTalk devTalk ) { } diff --git a/src/main/java/org/cotato/csquiz/common/entity/GenerationPeriod.java b/src/main/java/org/cotato/csquiz/domain/generation/embedded/GenerationPeriod.java similarity index 91% rename from src/main/java/org/cotato/csquiz/common/entity/GenerationPeriod.java rename to src/main/java/org/cotato/csquiz/domain/generation/embedded/GenerationPeriod.java index 95543795..34a1cca8 100644 --- a/src/main/java/org/cotato/csquiz/common/entity/GenerationPeriod.java +++ b/src/main/java/org/cotato/csquiz/domain/generation/embedded/GenerationPeriod.java @@ -1,4 +1,4 @@ -package org.cotato.csquiz.common.entity; +package org.cotato.csquiz.domain.generation.embedded; import jakarta.persistence.Embeddable; import java.time.LocalDate; diff --git a/src/main/java/org/cotato/csquiz/domain/generation/embedded/SessionContents.java b/src/main/java/org/cotato/csquiz/domain/generation/embedded/SessionContents.java new file mode 100644 index 00000000..7f8ae05d --- /dev/null +++ b/src/main/java/org/cotato/csquiz/domain/generation/embedded/SessionContents.java @@ -0,0 +1,39 @@ +package org.cotato.csquiz.domain.generation.embedded; + +import jakarta.persistence.Embeddable; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.cotato.csquiz.domain.generation.enums.CSEducation; +import org.cotato.csquiz.domain.generation.enums.DevTalk; +import org.cotato.csquiz.domain.generation.enums.ItIssue; +import org.cotato.csquiz.domain.generation.enums.Networking; +import org.hibernate.annotations.ColumnDefault; + +@Embeddable +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class SessionContents { + + @Enumerated(EnumType.STRING) + @ColumnDefault(value = "'IT_OFF'") + private ItIssue itIssue; + + @Enumerated(EnumType.STRING) + @ColumnDefault(value = "'NW_OFF'") + private Networking networking; + + @Enumerated(EnumType.STRING) + @ColumnDefault(value = "'CS_OFF'") + private CSEducation csEducation; + + @Enumerated(EnumType.STRING) + @ColumnDefault(value = "'DEVTALK_OFF'") + private DevTalk devTalk; +} diff --git a/src/main/java/org/cotato/csquiz/domain/generation/entity/Generation.java b/src/main/java/org/cotato/csquiz/domain/generation/entity/Generation.java index a2217a4b..576135ef 100644 --- a/src/main/java/org/cotato/csquiz/domain/generation/entity/Generation.java +++ b/src/main/java/org/cotato/csquiz/domain/generation/entity/Generation.java @@ -8,14 +8,12 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import jakarta.persistence.Persistence; -import java.time.LocalDate; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.cotato.csquiz.common.entity.BaseTimeEntity; -import org.cotato.csquiz.common.entity.GenerationPeriod; +import org.cotato.csquiz.domain.generation.embedded.GenerationPeriod; @Entity @Getter diff --git a/src/main/java/org/cotato/csquiz/domain/generation/entity/Session.java b/src/main/java/org/cotato/csquiz/domain/generation/entity/Session.java index c4acb06e..4b584100 100644 --- a/src/main/java/org/cotato/csquiz/domain/generation/entity/Session.java +++ b/src/main/java/org/cotato/csquiz/domain/generation/entity/Session.java @@ -2,11 +2,11 @@ import static jakarta.persistence.FetchType.LAZY; +import jakarta.persistence.AttributeOverride; +import jakarta.persistence.AttributeOverrides; import jakarta.persistence.Column; import jakarta.persistence.Embedded; import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; @@ -16,12 +16,9 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import org.cotato.csquiz.common.entity.S3Info; -import org.cotato.csquiz.domain.generation.enums.CSEducation; -import org.cotato.csquiz.domain.generation.enums.ItIssue; -import org.cotato.csquiz.domain.generation.enums.Networking; import org.cotato.csquiz.common.entity.BaseTimeEntity; -import org.hibernate.annotations.ColumnDefault; +import org.cotato.csquiz.common.entity.S3Info; +import org.cotato.csquiz.domain.generation.embedded.SessionContents; import org.hibernate.annotations.DynamicInsert; @Entity @@ -48,34 +45,28 @@ public class Session extends BaseTimeEntity { @JoinColumn(name = "generation_id") private Generation generation; - @Column(name = "session_it_issue") - @Enumerated(EnumType.STRING) - @ColumnDefault(value = "'IT_OFF'") - private ItIssue itIssue; - - @Column(name = "session_networking") - @Enumerated(EnumType.STRING) - @ColumnDefault(value = "'NW_OFF'") - private Networking networking; - - @Column(name = "session_cs_education") - @Enumerated(EnumType.STRING) - @ColumnDefault(value = "'CS_OFF'") - private CSEducation csEducation; + @AttributeOverrides({ + @AttributeOverride(name = "itIssue", + column = @Column(name = "session_it_issue")), + @AttributeOverride(name = "networking", + column = @Column(name = "session_networking")), + @AttributeOverride(name = "csEducation", + column = @Column(name = "session_cs_education")), + @AttributeOverride(name = "devTalk", + column = @Column(name = "session_dev_talk")) + }) + private SessionContents sessionContents; @Builder - public Session(int number, S3Info s3Info, String description, Generation generation, ItIssue itIssue, - CSEducation csEducation, Networking networking) { + public Session(Integer number, S3Info s3Info, String description, Generation generation, SessionContents sessionContents) { this.number = number; this.photoS3Info = s3Info; this.description = description; this.generation = generation; - this.itIssue = itIssue; - this.csEducation = csEducation; - this.networking = networking; + this.sessionContents = sessionContents; } - public void changeSessionNumber(int sessionNumber) { + public void changeSessionNumber(Integer sessionNumber) { this.number = sessionNumber; } @@ -87,9 +78,7 @@ public void changePhotoUrl(S3Info photoUrl) { this.photoS3Info = photoUrl; } - public void updateToggle(ItIssue itIssue, CSEducation csEducation, Networking networking) { - this.itIssue = itIssue; - this.csEducation = csEducation; - this.networking = networking; + public void updateSessionContents(SessionContents sessionContents) { + this.sessionContents = sessionContents; } } diff --git a/src/main/java/org/cotato/csquiz/domain/generation/enums/DevTalk.java b/src/main/java/org/cotato/csquiz/domain/generation/enums/DevTalk.java new file mode 100644 index 00000000..5ebf649a --- /dev/null +++ b/src/main/java/org/cotato/csquiz/domain/generation/enums/DevTalk.java @@ -0,0 +1,11 @@ +package org.cotato.csquiz.domain.generation.enums; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public enum DevTalk { + ON("데브톡 존재"), + OFF("데브톡 없음") + ; + private final String description; +} diff --git a/src/main/java/org/cotato/csquiz/domain/generation/repository/SessionRepository.java b/src/main/java/org/cotato/csquiz/domain/generation/repository/SessionRepository.java index 376c1264..2ded44e4 100644 --- a/src/main/java/org/cotato/csquiz/domain/generation/repository/SessionRepository.java +++ b/src/main/java/org/cotato/csquiz/domain/generation/repository/SessionRepository.java @@ -9,5 +9,5 @@ public interface SessionRepository extends JpaRepository { List findAllByGeneration(Generation generation); - List findAllByGenerationAndCsEducation(Generation generation, CSEducation csEducation); + List findAllByGenerationAndSessionContentsCsEducation(Generation generation, CSEducation csEducation); } diff --git a/src/main/java/org/cotato/csquiz/domain/generation/service/GenerationService.java b/src/main/java/org/cotato/csquiz/domain/generation/service/GenerationService.java index 0f065141..91f9c8d9 100644 --- a/src/main/java/org/cotato/csquiz/domain/generation/service/GenerationService.java +++ b/src/main/java/org/cotato/csquiz/domain/generation/service/GenerationService.java @@ -10,7 +10,7 @@ import org.cotato.csquiz.api.generation.dto.ChangeGenerationPeriodRequest; import org.cotato.csquiz.api.generation.dto.ChangeRecruitingStatusRequest; import org.cotato.csquiz.api.generation.dto.GenerationInfoResponse; -import org.cotato.csquiz.common.entity.GenerationPeriod; +import org.cotato.csquiz.domain.generation.embedded.GenerationPeriod; import org.cotato.csquiz.domain.generation.entity.Generation; import org.cotato.csquiz.common.error.exception.AppException; import org.cotato.csquiz.common.error.ErrorCode; diff --git a/src/main/java/org/cotato/csquiz/domain/generation/service/SessionService.java b/src/main/java/org/cotato/csquiz/domain/generation/service/SessionService.java index c0d7f75a..766c07e2 100644 --- a/src/main/java/org/cotato/csquiz/domain/generation/service/SessionService.java +++ b/src/main/java/org/cotato/csquiz/domain/generation/service/SessionService.java @@ -15,6 +15,7 @@ import org.cotato.csquiz.common.entity.S3Info; import org.cotato.csquiz.domain.education.entity.Education; import org.cotato.csquiz.domain.education.service.EducationService; +import org.cotato.csquiz.domain.generation.embedded.SessionContents; import org.cotato.csquiz.domain.generation.enums.CSEducation; import org.cotato.csquiz.domain.generation.entity.Generation; import org.cotato.csquiz.domain.generation.entity.Session; @@ -54,9 +55,12 @@ public AddSessionResponse addSession(AddSessionRequest request) throws ImageExce .s3Info(s3Info) .description(request.description()) .generation(findGeneration) - .itIssue(request.itIssue()) - .csEducation(request.csEducation()) - .networking(request.networking()) + .sessionContents(SessionContents.builder() + .csEducation(request.csEducation()) + .devTalk(request.devTalk()) + .itIssue(request.itIssue()) + .networking(request.networking()) + .build()) .build(); Session savedSession = sessionRepository.save(session); log.info("세션 생성 완료"); @@ -87,8 +91,12 @@ public void updateSession(UpdateSessionRequest request) throws ImageException { Session session = findSessionById(request.sessionId()); session.updateDescription(request.description()); - session.updateToggle(request.itIssue(), request.csEducation(), - request.networking()); + session.updateSessionContents(SessionContents.builder() + .csEducation(request.csEducation()) + .devTalk(request.devTalk()) + .itIssue(request.itIssue()) + .networking(request.networking()) + .build()); if (request.isPhotoUpdated()) { updatePhoto(session, request.sessionImage()); } @@ -139,7 +147,7 @@ public Session findSessionById(Long sessionId) { public List findAllNotLinkedCsOnSessionsByGenerationId(Long generationId) { Generation generation = generationRepository.findById(generationId) .orElseThrow(() -> new EntityNotFoundException("해당 기수를 찾을 수 없습니다.")); - List sessions = sessionRepository.findAllByGenerationAndCsEducation(generation, CSEducation.CS_ON); + List sessions = sessionRepository.findAllByGenerationAndSessionContentsCsEducation(generation, CSEducation.CS_ON); List educationLinkedSessionIds = educationService.findAllEducationByGenerationId(generationId).stream() .map(Education::getSessionId)