From 0fae6b56f38a78e58dbcacf47cf14daaad866279 Mon Sep 17 00:00:00 2001 From: yoonho Date: Fri, 3 Apr 2026 15:47:31 +0900 Subject: [PATCH 1/4] =?UTF-8?q?[#8]=20feat:=20=EA=B3=B5=EC=A7=80=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20CRUD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/common/config/JpaAuditingConfig.java | 9 +++ .../core/common/exception/NoticeError.java | 26 +++++++ .../core/controller/NoticeController.java | 59 +++++++++++++++ .../earseo/core/dto/etl/NoticeListItem.java | 7 ++ .../core/dto/request/NoticeCreateRequest.java | 7 ++ .../core/dto/request/NoticeUpdateRequest.java | 7 ++ .../dto/response/NoticeDeleteResponse.java | 6 ++ .../core/dto/response/NoticeListResponse.java | 22 ++++++ .../core/dto/response/NoticeResponse.java | 23 ++++++ .../java/com/earseo/core/entity/Notice.java | 46 ++++++++++++ .../core/repository/NoticeRepository.java | 14 ++++ .../earseo/core/service/NoticeService.java | 75 +++++++++++++++++++ 12 files changed, 301 insertions(+) create mode 100644 src/main/java/com/earseo/core/common/config/JpaAuditingConfig.java create mode 100644 src/main/java/com/earseo/core/common/exception/NoticeError.java create mode 100644 src/main/java/com/earseo/core/controller/NoticeController.java create mode 100644 src/main/java/com/earseo/core/dto/etl/NoticeListItem.java create mode 100644 src/main/java/com/earseo/core/dto/request/NoticeCreateRequest.java create mode 100644 src/main/java/com/earseo/core/dto/request/NoticeUpdateRequest.java create mode 100644 src/main/java/com/earseo/core/dto/response/NoticeDeleteResponse.java create mode 100644 src/main/java/com/earseo/core/dto/response/NoticeListResponse.java create mode 100644 src/main/java/com/earseo/core/dto/response/NoticeResponse.java create mode 100644 src/main/java/com/earseo/core/entity/Notice.java create mode 100644 src/main/java/com/earseo/core/repository/NoticeRepository.java create mode 100644 src/main/java/com/earseo/core/service/NoticeService.java diff --git a/src/main/java/com/earseo/core/common/config/JpaAuditingConfig.java b/src/main/java/com/earseo/core/common/config/JpaAuditingConfig.java new file mode 100644 index 0000000..7161982 --- /dev/null +++ b/src/main/java/com/earseo/core/common/config/JpaAuditingConfig.java @@ -0,0 +1,9 @@ +package com.earseo.core.common.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; + +@Configuration +@EnableJpaAuditing +public class JpaAuditingConfig { +} diff --git a/src/main/java/com/earseo/core/common/exception/NoticeError.java b/src/main/java/com/earseo/core/common/exception/NoticeError.java new file mode 100644 index 0000000..e38c86b --- /dev/null +++ b/src/main/java/com/earseo/core/common/exception/NoticeError.java @@ -0,0 +1,26 @@ +package com.earseo.core.common.exception; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +@AllArgsConstructor +public enum NoticeError implements ErrorCodeInterface{ + + NOTICE_NOT_FOUND("NTC001", "공지사항을 찾을 수 없습니다", HttpStatus.NOT_FOUND), + ; + + private final String status; + private final String message; + private final HttpStatus httpStatus; + + @Override + public ErrorCode getErrorCode() { + return ErrorCode.builder() + .status(status) + .message(message) + .httpStatus(httpStatus) + .build(); + } +} diff --git a/src/main/java/com/earseo/core/controller/NoticeController.java b/src/main/java/com/earseo/core/controller/NoticeController.java new file mode 100644 index 0000000..73cf418 --- /dev/null +++ b/src/main/java/com/earseo/core/controller/NoticeController.java @@ -0,0 +1,59 @@ +package com.earseo.core.controller; + +import com.earseo.core.common.BaseResponse; +import com.earseo.core.dto.request.NoticeCreateRequest; +import com.earseo.core.dto.request.NoticeUpdateRequest; +import com.earseo.core.dto.response.NoticeDeleteResponse; +import com.earseo.core.dto.response.NoticeListResponse; +import com.earseo.core.dto.response.NoticeResponse; +import com.earseo.core.service.NoticeService; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.web.PageableDefault; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequiredArgsConstructor +public class NoticeController { + + private final NoticeService noticeService; + + @GetMapping("/api/core/notice/{noticeId}") + public ResponseEntity> getNotice( + @PathVariable Long noticeId + ) { + return ResponseEntity.ok(BaseResponse.ok(noticeService.getNotice(noticeId))); + } + + @GetMapping("/api/core/notice") + public ResponseEntity> getNoticeList( + @PageableDefault(size = 10, sort = "id", direction = Sort.Direction.DESC) + Pageable pageable + ) { + return ResponseEntity.ok(BaseResponse.ok(noticeService.getNoticeList(pageable))); + } + + @PostMapping("/api/admin/core/notice") + public ResponseEntity> createNotice( + @RequestBody NoticeCreateRequest request + ){ + return ResponseEntity.ok(BaseResponse.ok(noticeService.createNotice(request))); + } + + @PutMapping("/api/admin/core/notice/{noticeId}") + public ResponseEntity> updateNotice( + @PathVariable Long noticeId, + @RequestBody NoticeUpdateRequest request + ){ + return ResponseEntity.ok(BaseResponse.ok(noticeService.updateNotice(noticeId, request))); + } + + @DeleteMapping("/api/admin/core/notice/{noticeId}") + public ResponseEntity> deleteNotice( + @PathVariable Long noticeId + ){ + return ResponseEntity.ok(BaseResponse.ok(noticeService.deleteNotice(noticeId))); + } +} diff --git a/src/main/java/com/earseo/core/dto/etl/NoticeListItem.java b/src/main/java/com/earseo/core/dto/etl/NoticeListItem.java new file mode 100644 index 0000000..b21faf9 --- /dev/null +++ b/src/main/java/com/earseo/core/dto/etl/NoticeListItem.java @@ -0,0 +1,7 @@ +package com.earseo.core.dto.etl; + +public record NoticeListItem( + Long noticeId, + String title +) { +} diff --git a/src/main/java/com/earseo/core/dto/request/NoticeCreateRequest.java b/src/main/java/com/earseo/core/dto/request/NoticeCreateRequest.java new file mode 100644 index 0000000..b21eac4 --- /dev/null +++ b/src/main/java/com/earseo/core/dto/request/NoticeCreateRequest.java @@ -0,0 +1,7 @@ +package com.earseo.core.dto.request; + +public record NoticeCreateRequest( + String title, + String content +) { +} diff --git a/src/main/java/com/earseo/core/dto/request/NoticeUpdateRequest.java b/src/main/java/com/earseo/core/dto/request/NoticeUpdateRequest.java new file mode 100644 index 0000000..d1d5e2c --- /dev/null +++ b/src/main/java/com/earseo/core/dto/request/NoticeUpdateRequest.java @@ -0,0 +1,7 @@ +package com.earseo.core.dto.request; + +public record NoticeUpdateRequest( + String title, + String content +) { +} diff --git a/src/main/java/com/earseo/core/dto/response/NoticeDeleteResponse.java b/src/main/java/com/earseo/core/dto/response/NoticeDeleteResponse.java new file mode 100644 index 0000000..7c056f3 --- /dev/null +++ b/src/main/java/com/earseo/core/dto/response/NoticeDeleteResponse.java @@ -0,0 +1,6 @@ +package com.earseo.core.dto.response; + +public record NoticeDeleteResponse( + Long noticeId +) { +} diff --git a/src/main/java/com/earseo/core/dto/response/NoticeListResponse.java b/src/main/java/com/earseo/core/dto/response/NoticeListResponse.java new file mode 100644 index 0000000..c16f586 --- /dev/null +++ b/src/main/java/com/earseo/core/dto/response/NoticeListResponse.java @@ -0,0 +1,22 @@ +package com.earseo.core.dto.response; + +import com.earseo.core.dto.etl.NoticeListItem; +import org.springframework.data.domain.Slice; + +import java.util.List; + +public record NoticeListResponse( + List content, + int page, + int size, + boolean last +) { + public static NoticeListResponse toDto(Slice page) { + return new NoticeListResponse( + page.getContent(), + page.getNumber(), + page.getSize(), + page.isLast() + ); + } +} diff --git a/src/main/java/com/earseo/core/dto/response/NoticeResponse.java b/src/main/java/com/earseo/core/dto/response/NoticeResponse.java new file mode 100644 index 0000000..c9cf365 --- /dev/null +++ b/src/main/java/com/earseo/core/dto/response/NoticeResponse.java @@ -0,0 +1,23 @@ +package com.earseo.core.dto.response; + +import com.earseo.core.entity.Notice; + +import java.time.format.DateTimeFormatter; + +public record NoticeResponse( + Long noticeId, + String noticeTitle, + String noticeContent, + String createdAt, + String updatedAt +) { + public static NoticeResponse toDto(Notice notice) { + return new NoticeResponse( + notice.getId(), + notice.getTitle(), + notice.getContent(), + notice.getCreatedAt().format(DateTimeFormatter.ofPattern("yyyy/MM/dd")), + notice.getUpdatedAt().format(DateTimeFormatter.ofPattern("yyyy/MM/dd")) + ); + } +} diff --git a/src/main/java/com/earseo/core/entity/Notice.java b/src/main/java/com/earseo/core/entity/Notice.java new file mode 100644 index 0000000..fe29150 --- /dev/null +++ b/src/main/java/com/earseo/core/entity/Notice.java @@ -0,0 +1,46 @@ +package com.earseo.core.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import java.time.LocalDateTime; + +@Entity +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@EntityListeners(AuditingEntityListener.class) +public class Notice { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "title") + private String title; + + @Column(name = "content", columnDefinition = "TEXT") + private String content; + + @CreatedDate + @Column(updatable = false) + private LocalDateTime createdAt; + + @LastModifiedDate + private LocalDateTime updatedAt; + + public void update(String title, String content) { + if (title != null && !title.isBlank()) { + this.title = title; + } + if (content != null && !content.isBlank()) { + this.content = content; + } + } +} diff --git a/src/main/java/com/earseo/core/repository/NoticeRepository.java b/src/main/java/com/earseo/core/repository/NoticeRepository.java new file mode 100644 index 0000000..9dfd34e --- /dev/null +++ b/src/main/java/com/earseo/core/repository/NoticeRepository.java @@ -0,0 +1,14 @@ +package com.earseo.core.repository; + +import com.earseo.core.dto.etl.NoticeListItem; +import com.earseo.core.entity.Notice; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +public interface NoticeRepository extends JpaRepository { + + @Query("SELECT new com.earseo.core.dto.etl.NoticeListItem(n.id, n.title) FROM Notice n") + Slice findNoticeList(Pageable pageable); +} diff --git a/src/main/java/com/earseo/core/service/NoticeService.java b/src/main/java/com/earseo/core/service/NoticeService.java new file mode 100644 index 0000000..23e502e --- /dev/null +++ b/src/main/java/com/earseo/core/service/NoticeService.java @@ -0,0 +1,75 @@ +package com.earseo.core.service; + +import com.earseo.core.common.exception.BaseException; +import com.earseo.core.common.exception.NoticeError; +import com.earseo.core.dto.etl.NoticeListItem; +import com.earseo.core.dto.request.NoticeCreateRequest; +import com.earseo.core.dto.request.NoticeUpdateRequest; +import com.earseo.core.dto.response.NoticeDeleteResponse; +import com.earseo.core.dto.response.NoticeListResponse; +import com.earseo.core.dto.response.NoticeResponse; +import com.earseo.core.entity.Notice; +import com.earseo.core.repository.NoticeRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Slf4j +public class NoticeService { + + private final NoticeRepository noticeRepository; + + @Transactional(readOnly = true) + public NoticeResponse getNotice(Long noticeId) { + Notice notice = noticeRepository.findById(noticeId) + .orElseThrow(() -> new BaseException(NoticeError.NOTICE_NOT_FOUND)); + + return NoticeResponse.toDto(notice); + } + + @Transactional(readOnly = true) + public NoticeListResponse getNoticeList(Pageable pageable) { + Slice notices = noticeRepository.findNoticeList(pageable); + return NoticeListResponse.toDto(notices); + } + + @Transactional + public NoticeResponse createNotice(NoticeCreateRequest request) { + Notice notice = Notice.builder() + .title(request.title()) + .content(request.content()) + .build(); + + noticeRepository.save(notice); + + return NoticeResponse.toDto(notice); + } + + @Transactional + public NoticeResponse updateNotice(Long noticeId, NoticeUpdateRequest noticeUpdateRequest) { + Notice notice = noticeRepository.findById(noticeId) + .orElseThrow(() -> new BaseException(NoticeError.NOTICE_NOT_FOUND)); + + notice.update( + noticeUpdateRequest.title(), noticeUpdateRequest.content() + ); + + return NoticeResponse.toDto(notice); + } + + @Transactional + public NoticeDeleteResponse deleteNotice(Long noticeId) { + Notice notice = noticeRepository.findById(noticeId) + .orElseThrow(() -> new BaseException(NoticeError.NOTICE_NOT_FOUND)); + + noticeRepository.delete(notice); + + return new NoticeDeleteResponse(noticeId); + } +} From 27a7cfa8f7cdf1d0f77227d23fc108c861810e12 Mon Sep 17 00:00:00 2001 From: yoonho Date: Tue, 7 Apr 2026 22:43:44 +0900 Subject: [PATCH 2/4] =?UTF-8?q?[#8]=20feat:=20=ED=8E=98=EC=9D=B4=EC=A7=80?= =?UTF-8?q?=20=EC=9D=91=EB=8B=B5=20dto=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/controller/NoticeController.java | 4 +-- ...oticeListItem.java => NoticePageItem.java} | 2 +- .../core/dto/response/NoticeListResponse.java | 22 ------------ .../core/dto/response/NoticePageResponse.java | 36 +++++++++++++++++++ .../core/repository/NoticeRepository.java | 6 ++-- .../earseo/core/service/NoticeService.java | 11 +++--- 6 files changed, 47 insertions(+), 34 deletions(-) rename src/main/java/com/earseo/core/dto/etl/{NoticeListItem.java => NoticePageItem.java} (73%) delete mode 100644 src/main/java/com/earseo/core/dto/response/NoticeListResponse.java create mode 100644 src/main/java/com/earseo/core/dto/response/NoticePageResponse.java diff --git a/src/main/java/com/earseo/core/controller/NoticeController.java b/src/main/java/com/earseo/core/controller/NoticeController.java index 73cf418..b24e83e 100644 --- a/src/main/java/com/earseo/core/controller/NoticeController.java +++ b/src/main/java/com/earseo/core/controller/NoticeController.java @@ -4,7 +4,7 @@ import com.earseo.core.dto.request.NoticeCreateRequest; import com.earseo.core.dto.request.NoticeUpdateRequest; import com.earseo.core.dto.response.NoticeDeleteResponse; -import com.earseo.core.dto.response.NoticeListResponse; +import com.earseo.core.dto.response.NoticePageResponse; import com.earseo.core.dto.response.NoticeResponse; import com.earseo.core.service.NoticeService; import lombok.RequiredArgsConstructor; @@ -28,7 +28,7 @@ public ResponseEntity> getNotice( } @GetMapping("/api/core/notice") - public ResponseEntity> getNoticeList( + public ResponseEntity> getNoticeList( @PageableDefault(size = 10, sort = "id", direction = Sort.Direction.DESC) Pageable pageable ) { diff --git a/src/main/java/com/earseo/core/dto/etl/NoticeListItem.java b/src/main/java/com/earseo/core/dto/etl/NoticePageItem.java similarity index 73% rename from src/main/java/com/earseo/core/dto/etl/NoticeListItem.java rename to src/main/java/com/earseo/core/dto/etl/NoticePageItem.java index b21faf9..930a95d 100644 --- a/src/main/java/com/earseo/core/dto/etl/NoticeListItem.java +++ b/src/main/java/com/earseo/core/dto/etl/NoticePageItem.java @@ -1,6 +1,6 @@ package com.earseo.core.dto.etl; -public record NoticeListItem( +public record NoticePageItem( Long noticeId, String title ) { diff --git a/src/main/java/com/earseo/core/dto/response/NoticeListResponse.java b/src/main/java/com/earseo/core/dto/response/NoticeListResponse.java deleted file mode 100644 index c16f586..0000000 --- a/src/main/java/com/earseo/core/dto/response/NoticeListResponse.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.earseo.core.dto.response; - -import com.earseo.core.dto.etl.NoticeListItem; -import org.springframework.data.domain.Slice; - -import java.util.List; - -public record NoticeListResponse( - List content, - int page, - int size, - boolean last -) { - public static NoticeListResponse toDto(Slice page) { - return new NoticeListResponse( - page.getContent(), - page.getNumber(), - page.getSize(), - page.isLast() - ); - } -} diff --git a/src/main/java/com/earseo/core/dto/response/NoticePageResponse.java b/src/main/java/com/earseo/core/dto/response/NoticePageResponse.java new file mode 100644 index 0000000..9406618 --- /dev/null +++ b/src/main/java/com/earseo/core/dto/response/NoticePageResponse.java @@ -0,0 +1,36 @@ +package com.earseo.core.dto.response; + +import com.earseo.core.dto.etl.NoticePageItem; +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.domain.Slice; + +import java.util.List; + +public record NoticePageResponse( + @Schema(description = "공지사항 목록 (페이징/정렬 반영)") + List content, + @Schema(description = "현재 페이지 번호 (0부터 시작)", example = "0") + int number, + @Schema(description = "페이지 크기", example = "10") + int size, + @Schema(description = "첫 페이지 여부", example = "true") + boolean isFirst, + @Schema(description = "마지막 페이지 여부", example = "false") + boolean isLast, + @Schema(description = "다음 페이지 존재 여부", example = "true") + boolean hasNext, + @Schema(description = "이전 페이지 존재 여부", example = "false") + boolean hasPrevious +) { + public static NoticePageResponse toDto(Slice page) { + return new NoticePageResponse( + page.getContent(), + page.getNumber(), + page.getSize(), + page.isFirst(), + page.isLast(), + page.hasNext(), + page.hasPrevious() + ); + } +} diff --git a/src/main/java/com/earseo/core/repository/NoticeRepository.java b/src/main/java/com/earseo/core/repository/NoticeRepository.java index 9dfd34e..ccc01cd 100644 --- a/src/main/java/com/earseo/core/repository/NoticeRepository.java +++ b/src/main/java/com/earseo/core/repository/NoticeRepository.java @@ -1,6 +1,6 @@ package com.earseo.core.repository; -import com.earseo.core.dto.etl.NoticeListItem; +import com.earseo.core.dto.etl.NoticePageItem; import com.earseo.core.entity.Notice; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; @@ -9,6 +9,6 @@ public interface NoticeRepository extends JpaRepository { - @Query("SELECT new com.earseo.core.dto.etl.NoticeListItem(n.id, n.title) FROM Notice n") - Slice findNoticeList(Pageable pageable); + @Query("SELECT new com.earseo.core.dto.etl.NoticePageItem(n.id, n.title) FROM Notice n") + Slice findNoticeList(Pageable pageable); } diff --git a/src/main/java/com/earseo/core/service/NoticeService.java b/src/main/java/com/earseo/core/service/NoticeService.java index 23e502e..e9de2a2 100644 --- a/src/main/java/com/earseo/core/service/NoticeService.java +++ b/src/main/java/com/earseo/core/service/NoticeService.java @@ -2,17 +2,16 @@ import com.earseo.core.common.exception.BaseException; import com.earseo.core.common.exception.NoticeError; -import com.earseo.core.dto.etl.NoticeListItem; +import com.earseo.core.dto.etl.NoticePageItem; import com.earseo.core.dto.request.NoticeCreateRequest; import com.earseo.core.dto.request.NoticeUpdateRequest; import com.earseo.core.dto.response.NoticeDeleteResponse; -import com.earseo.core.dto.response.NoticeListResponse; +import com.earseo.core.dto.response.NoticePageResponse; import com.earseo.core.dto.response.NoticeResponse; import com.earseo.core.entity.Notice; import com.earseo.core.repository.NoticeRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; import org.springframework.stereotype.Service; @@ -34,9 +33,9 @@ public NoticeResponse getNotice(Long noticeId) { } @Transactional(readOnly = true) - public NoticeListResponse getNoticeList(Pageable pageable) { - Slice notices = noticeRepository.findNoticeList(pageable); - return NoticeListResponse.toDto(notices); + public NoticePageResponse getNoticeList(Pageable pageable) { + Slice notices = noticeRepository.findNoticeList(pageable); + return NoticePageResponse.toDto(notices); } @Transactional From e9b98d949150e7ee694d28ca4f4682f76e08aa51 Mon Sep 17 00:00:00 2001 From: yoonho Date: Tue, 7 Apr 2026 23:04:45 +0900 Subject: [PATCH 3/4] =?UTF-8?q?[#8]=20feat:=20=EA=B3=B5=EC=A7=80=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EC=83=9D=EC=84=B1,=20=EC=88=98=EC=A0=95=20request?= =?UTF-8?q?=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=A6=9D=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/earseo/core/controller/NoticeController.java | 5 +++-- .../com/earseo/core/dto/request/NoticeCreateRequest.java | 7 +++++++ .../com/earseo/core/dto/request/NoticeUpdateRequest.java | 7 +++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/earseo/core/controller/NoticeController.java b/src/main/java/com/earseo/core/controller/NoticeController.java index b24e83e..f57abde 100644 --- a/src/main/java/com/earseo/core/controller/NoticeController.java +++ b/src/main/java/com/earseo/core/controller/NoticeController.java @@ -7,6 +7,7 @@ import com.earseo.core.dto.response.NoticePageResponse; import com.earseo.core.dto.response.NoticeResponse; import com.earseo.core.service.NoticeService; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; @@ -37,7 +38,7 @@ public ResponseEntity> getNoticeList( @PostMapping("/api/admin/core/notice") public ResponseEntity> createNotice( - @RequestBody NoticeCreateRequest request + @RequestBody @Valid NoticeCreateRequest request ){ return ResponseEntity.ok(BaseResponse.ok(noticeService.createNotice(request))); } @@ -45,7 +46,7 @@ public ResponseEntity> createNotice( @PutMapping("/api/admin/core/notice/{noticeId}") public ResponseEntity> updateNotice( @PathVariable Long noticeId, - @RequestBody NoticeUpdateRequest request + @RequestBody @Valid NoticeUpdateRequest request ){ return ResponseEntity.ok(BaseResponse.ok(noticeService.updateNotice(noticeId, request))); } diff --git a/src/main/java/com/earseo/core/dto/request/NoticeCreateRequest.java b/src/main/java/com/earseo/core/dto/request/NoticeCreateRequest.java index b21eac4..9d99878 100644 --- a/src/main/java/com/earseo/core/dto/request/NoticeCreateRequest.java +++ b/src/main/java/com/earseo/core/dto/request/NoticeCreateRequest.java @@ -1,7 +1,14 @@ package com.earseo.core.dto.request; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; + public record NoticeCreateRequest( + @NotBlank(message = "제목은 필수입니다") + @Size(min = 1, max = 255, message = "제목은 1자 이상 255자 이하여야 합니다") String title, + @NotBlank(message = "내용은 필수입니다") + @Size(min = 1, max = 1000, message = "내용은 1자 이상 1000자 이하여야 합니다") String content ) { } diff --git a/src/main/java/com/earseo/core/dto/request/NoticeUpdateRequest.java b/src/main/java/com/earseo/core/dto/request/NoticeUpdateRequest.java index d1d5e2c..89f9355 100644 --- a/src/main/java/com/earseo/core/dto/request/NoticeUpdateRequest.java +++ b/src/main/java/com/earseo/core/dto/request/NoticeUpdateRequest.java @@ -1,7 +1,14 @@ package com.earseo.core.dto.request; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; + public record NoticeUpdateRequest( + @NotBlank(message = "제목은 필수입니다") + @Size(min = 1, max = 255, message = "제목은 1자 이상 255자 이하여야 합니다") String title, + @NotBlank(message = "내용은 필수입니다") + @Size(min = 1, max = 1000, message = "내용은 1자 이상 1000자 이하여야 합니다") String content ) { } From 9dcba872cf4b1bcf58f4f5fe8e7bcc86abe1f6e5 Mon Sep 17 00:00:00 2001 From: yoonho Date: Wed, 8 Apr 2026 13:02:38 +0900 Subject: [PATCH 4/4] =?UTF-8?q?[#8]=20chore:=20v0.1.3=20=EB=B0=B0=ED=8F=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- k8s/helm-value.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/k8s/helm-value.yaml b/k8s/helm-value.yaml index 32ff051..2bd52c1 100644 --- a/k8s/helm-value.yaml +++ b/k8s/helm-value.yaml @@ -1,2 +1,2 @@ image: - tag: v0.1.2 + tag: v0.1.3