diff --git a/src/main/java/life/mosu/mosuserver/domain/application/Lunch.java b/src/main/java/life/mosu/mosuserver/domain/application/Lunch.java index c75505bf..1f0cb87c 100644 --- a/src/main/java/life/mosu/mosuserver/domain/application/Lunch.java +++ b/src/main/java/life/mosu/mosuserver/domain/application/Lunch.java @@ -1,5 +1,8 @@ package life.mosu.mosuserver.domain.application; +import java.util.Arrays; +import life.mosu.mosuserver.global.exception.CustomRuntimeException; +import life.mosu.mosuserver.global.exception.ErrorCode; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -15,4 +18,13 @@ public enum Lunch { OPTION6("중식 도시락"); private final String lunchName; + + public static Lunch from(String lunchName) { + return Arrays.stream(values()) + .filter(e -> e.getLunchName().equals(lunchName)) + .findFirst() + .orElseThrow( + () -> new CustomRuntimeException(ErrorCode.NOT_FOUND_LUNCH) + ); + } } 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 59936697..b894ee47 100644 --- a/src/main/java/life/mosu/mosuserver/domain/school/Area.java +++ b/src/main/java/life/mosu/mosuserver/domain/school/Area.java @@ -1,16 +1,25 @@ package life.mosu.mosuserver.domain.school; +import java.util.Arrays; +import life.mosu.mosuserver.global.exception.CustomRuntimeException; +import life.mosu.mosuserver.global.exception.ErrorCode; +import lombok.Getter; + +@Getter public enum Area { DAECHI("대치"), MOKDONG("목동"), NOWON("노원"); private final String areaName; - Area(String areaName) { + private Area(String areaName) { this.areaName = areaName; } - public String getAreaName() { - return areaName; + public static Area from(String areaName) { + return Arrays.stream(Area.values()) + .filter(area -> area.getAreaName().equals(areaName)) + .findFirst() + .orElseThrow(() -> new CustomRuntimeException(ErrorCode.NOT_FOUND_AREA)); } } \ No newline at end of file diff --git a/src/main/java/life/mosu/mosuserver/domain/school/SchoolJpaEntity.java b/src/main/java/life/mosu/mosuserver/domain/school/SchoolJpaEntity.java index 994bc884..2b2f40df 100644 --- a/src/main/java/life/mosu/mosuserver/domain/school/SchoolJpaEntity.java +++ b/src/main/java/life/mosu/mosuserver/domain/school/SchoolJpaEntity.java @@ -11,6 +11,8 @@ import jakarta.persistence.Id; import jakarta.persistence.Table; import java.time.LocalDate; +import java.time.LocalDateTime; +import life.mosu.mosuserver.domain.application.Lunch; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -30,11 +32,20 @@ public class SchoolJpaEntity { @Column(name = "school_name") private String schoolName; + @Embedded + private AddressJpaVO address; + @Enumerated(EnumType.STRING) private Area area; - @Embedded - private AddressJpaVO address; + @Enumerated(EnumType.STRING) + private Lunch lunch; + + @Column(name = "lunch_price") + private Integer lunchPrice; + + @Column(name = "deadline_time") + private LocalDateTime deadlineTime; @Column(name = "exam_date") private LocalDate examDate; @@ -43,12 +54,16 @@ public class SchoolJpaEntity { private Long capacity; @Builder - public SchoolJpaEntity(String schoolName, Area area, AddressJpaVO address, LocalDate examDate, - Long capacity) { + public SchoolJpaEntity(String schoolName, Area area, Lunch lunch, LocalDate examDate, + Long capacity, + LocalDateTime deadlineTime, Integer lunchPrice, AddressJpaVO address) { this.schoolName = schoolName; this.area = area; - this.address = address; + this.lunch = lunch; this.examDate = examDate; this.capacity = capacity; + this.deadlineTime = deadlineTime; + this.lunchPrice = lunchPrice; + this.address = address; } } diff --git a/src/main/java/life/mosu/mosuserver/global/exception/ErrorCode.java b/src/main/java/life/mosu/mosuserver/global/exception/ErrorCode.java index 35d44ab9..be7dd28b 100644 --- a/src/main/java/life/mosu/mosuserver/global/exception/ErrorCode.java +++ b/src/main/java/life/mosu/mosuserver/global/exception/ErrorCode.java @@ -63,6 +63,10 @@ public enum ErrorCode { // 이벤트 관련 에러 EVENT_NOT_FOUND(HttpStatus.NOT_FOUND, "이벤트를 찾을 수 없습니다."), + // Enum 관련 에러 + NOT_FOUND_AREA(HttpStatus.NOT_FOUND, "해당 지역을 찾을 수 없습니다."), + NOT_FOUND_LUNCH(HttpStatus.NOT_FOUND, "해당 도시락을 찾을 수 없습니다."), + // FAQ 관련 에러 FAQ_NOT_FOUND(HttpStatus.NOT_FOUND, "FAQ를 찾을 수 없습니다."), FAQ_CREATION_FAILED(HttpStatus.INTERNAL_SERVER_ERROR, "FAQ 등록에 실패했습니다."), diff --git a/src/main/java/life/mosu/mosuserver/presentation/school/dto/SchoolRegistrationRequest.java b/src/main/java/life/mosu/mosuserver/presentation/school/dto/SchoolRegistrationRequest.java index 64c14612..ecacdad7 100644 --- a/src/main/java/life/mosu/mosuserver/presentation/school/dto/SchoolRegistrationRequest.java +++ b/src/main/java/life/mosu/mosuserver/presentation/school/dto/SchoolRegistrationRequest.java @@ -5,7 +5,8 @@ import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Positive; import java.time.LocalDate; -import life.mosu.mosuserver.domain.school.AddressJpaVO; +import java.time.LocalDateTime; +import life.mosu.mosuserver.domain.application.Lunch; import life.mosu.mosuserver.domain.school.Area; import life.mosu.mosuserver.domain.school.SchoolJpaEntity; import life.mosu.mosuserver.presentation.application.dto.AddressRequest; @@ -13,9 +14,6 @@ @Schema(description = "학교 생성/등록 요청 DTO") public record SchoolRegistrationRequest( - @Schema(description = "학교 이름", example = "모수고등학교") - @NotBlank(message = "학교 이름은 필수 입니다.") - String schoolName, @Schema(description = "지역 (예: DAECHI, MOKDONG, NOWON)", example = "DAECHI") @NotNull(message = "지역은 필수 입니다.") @@ -23,12 +21,28 @@ public record SchoolRegistrationRequest( @Schema(description = "학교 주소 정보") @NotNull(message = "주소 정보는 필수 입니다.") - AddressRequest address, + AddressRequest schoolAddress, - @Schema(description = "시험/입학 시험 날짜 (YYYY-MM-DD)", example = "2025-11-20") + @Schema(description = "날짜 (YYYY-MM-DD)", example = "2025-11-20") @NotNull(message = "시험 날짜는 필수입니다.") LocalDate examDate, + @Schema(description = "학교명", example = "모수고등학교") + @NotBlank(message = "학교 이름은 필수 입니다.") + String schoolName, + + @Schema(description = "도시락 메뉴") + @NotNull + String lunch, + + @Schema(description = "도시락 가격") + @NotNull + Integer lunchPrice, + + @NotNull + @Schema(description = "신청 마감 일시", example = "2025-05-30T10:00:00") + LocalDateTime deadlineTime, + @Schema(description = "수용 인원", example = "300") @NotNull(message = "수용 인원은 필수입니다.") @Positive(message = "수용 인원은 양수여야 합니다.") @@ -36,12 +50,14 @@ public record SchoolRegistrationRequest( ) { public SchoolJpaEntity toEntity() { - AddressJpaVO address = address().toValueObject(); return SchoolJpaEntity.builder() - .schoolName(schoolName) - .area(Area.valueOf(area)) - .address(address) + .address(schoolAddress.toValueObject()) + .area(Area.from(area)) .examDate(examDate) + .schoolName(schoolName) + .lunch(Lunch.from(lunch)) + .lunchPrice(lunchPrice) + .deadlineTime(deadlineTime) .capacity(capacity) .build(); }