From b33de47b7ef1d8e6cdcac66edfa87273c3a62eb6 Mon Sep 17 00:00:00 2001 From: yeram0709 Date: Thu, 3 Oct 2024 16:13:30 +0900 Subject: [PATCH 1/7] =?UTF-8?q?=EB=A9=94=EB=89=B4=20crud=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../one/kiosk/controller/MenuController.java | 107 ++++++++++++++++++ src/main/java/one/kiosk/dto/ApiResponse.java | 12 ++ src/main/java/one/kiosk/dto/InfoDto.java | 13 +++ .../java/one/kiosk/dto/MenuUpdateDto.java | 27 +++++ .../java/one/kiosk/dto/MenuUploadDto.java | 26 +++++ .../java/one/kiosk/entity/MenuEntity.java | 43 +++++++ .../kiosk/repository/MenuJpaRepository.java | 10 ++ .../java/one/kiosk/service/MenuService.java | 84 ++++++++++++++ src/main/resources/application.yml | 23 ++-- 9 files changed, 329 insertions(+), 16 deletions(-) create mode 100644 src/main/java/one/kiosk/controller/MenuController.java create mode 100644 src/main/java/one/kiosk/dto/ApiResponse.java create mode 100644 src/main/java/one/kiosk/dto/InfoDto.java create mode 100644 src/main/java/one/kiosk/dto/MenuUpdateDto.java create mode 100644 src/main/java/one/kiosk/dto/MenuUploadDto.java create mode 100644 src/main/java/one/kiosk/entity/MenuEntity.java create mode 100644 src/main/java/one/kiosk/repository/MenuJpaRepository.java create mode 100644 src/main/java/one/kiosk/service/MenuService.java diff --git a/src/main/java/one/kiosk/controller/MenuController.java b/src/main/java/one/kiosk/controller/MenuController.java new file mode 100644 index 0000000..13bb24d --- /dev/null +++ b/src/main/java/one/kiosk/controller/MenuController.java @@ -0,0 +1,107 @@ +package one.kiosk.controller; + +import lombok.RequiredArgsConstructor; +import one.kiosk.dto.ApiResponse; +import one.kiosk.dto.MenuUpdateDto; +import one.kiosk.dto.MenuUploadDto; +import one.kiosk.entity.MenuEntity; +import one.kiosk.service.MenuService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/menu") +public class MenuController { + + private final MenuService menuService; + + //메뉴 등록 + @PostMapping("/upload") + public ResponseEntity> upload(@RequestBody MenuUploadDto menuUploadDto) { + MenuEntity menuEntity = menuService.upload(menuUploadDto); + + //메뉴 등록 실패 + if(menuEntity == null) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(new ApiResponse<>(false,"메뉴 등록에 실패하였습니다.",null)); + } + + //메뉴 등록 성공 + return ResponseEntity.status(HttpStatus.CREATED) + .body(new ApiResponse<>(true,"메뉴가 등록되었습니다.",null)); + } + + //메뉴 검색 + @GetMapping("search/{id}") + public ResponseEntity> upload(@PathVariable Long id) { + MenuEntity menuEntity = menuService.find(id); + + //찾고자 하는 메뉴가 없을 경우 + if(menuEntity == null) { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(new ApiResponse<>(false,"메뉴를 찾을 수 없습니다",null)); + } + //필요한 필드만 DTO로 변환 + MenuUploadDto menuUploadDto = new MenuUploadDto( + menuEntity.getMenuname(), + menuEntity.getPrice(), + menuEntity.getCategory() + ); + + //메뉴 검색 성공 + return ResponseEntity.status(HttpStatus.OK) + .body(new ApiResponse<>(true,"메뉴 정보를 조회합니다",menuUploadDto)); + } + + //메뉴 전체조회 + @GetMapping("/total") + public ResponseEntity>> total() { + List menuDtos = menuService.findAll(); + + //등록된 메뉴가 없을경우 + if(menuDtos==null) { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(new ApiResponse<>(false,"등록된 메뉴가 없습니다",null)); + } + + return ResponseEntity.status(HttpStatus.OK) + .body(new ApiResponse<>(true,"전체 메뉴를 조회합니다",menuDtos)); + } + + //메뉴 수정 + @PutMapping("/update") + public ResponseEntity> update(@RequestBody MenuUpdateDto menuUpdateDto) { + boolean success = menuService.update(menuUpdateDto); + + //수정하고자 하는 메뉴가 없을경우 + if(!success) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(new ApiResponse<>(false,"메뉴를 수정하지 못했습니다.",null)); + } + + //수정 완료 + return ResponseEntity.status(HttpStatus.OK) + .body(new ApiResponse<>(true,"메뉴정보 수정이 완료되었습니다.",null)); + } + + //메뉴 삭제 + @DeleteMapping("/delete/{id}") + public ResponseEntity> delete(@PathVariable Long id) { + boolean success = menuService.delete(id); + + //삭제 실패 + if(!success) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(new ApiResponse<>(false,"메뉴를 삭제하지 못했습니다",null)); + } + + //삭제 성공 + return ResponseEntity.status(HttpStatus.OK) + .body(new ApiResponse<>(true,"메뉴를 삭제하였습니다.",null)); + } +} diff --git a/src/main/java/one/kiosk/dto/ApiResponse.java b/src/main/java/one/kiosk/dto/ApiResponse.java new file mode 100644 index 0000000..865eb21 --- /dev/null +++ b/src/main/java/one/kiosk/dto/ApiResponse.java @@ -0,0 +1,12 @@ +package one.kiosk.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class ApiResponse { + private boolean success; + private String message; + private T data; +} diff --git a/src/main/java/one/kiosk/dto/InfoDto.java b/src/main/java/one/kiosk/dto/InfoDto.java new file mode 100644 index 0000000..4546aa4 --- /dev/null +++ b/src/main/java/one/kiosk/dto/InfoDto.java @@ -0,0 +1,13 @@ +package one.kiosk.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import one.kiosk.jwt.MemberRole; + +@Data +@AllArgsConstructor +public class InfoDto { + private String username; + private String company; + private MemberRole role; +} \ No newline at end of file diff --git a/src/main/java/one/kiosk/dto/MenuUpdateDto.java b/src/main/java/one/kiosk/dto/MenuUpdateDto.java new file mode 100644 index 0000000..7fbafb8 --- /dev/null +++ b/src/main/java/one/kiosk/dto/MenuUpdateDto.java @@ -0,0 +1,27 @@ +package one.kiosk.dto; + +import lombok.*; +import one.kiosk.entity.MenuEntity; + +@Data +@AllArgsConstructor +@Getter +@Builder +public class MenuUpdateDto { + + private Long id; + private String menuname; + private int price; + private String category; + + //findAll을 통해 받은 MenuEntity들을 Dto로 변환 후 리턴 + public static MenuUpdateDto toMenuUpdateDto(MenuEntity menuEntity) { + return MenuUpdateDto.builder() + .id(menuEntity.getMenuId()) + .menuname(menuEntity.getMenuname()) + .price(menuEntity.getPrice()) + .category(menuEntity.getCategory()) + .build(); + } + +} diff --git a/src/main/java/one/kiosk/dto/MenuUploadDto.java b/src/main/java/one/kiosk/dto/MenuUploadDto.java new file mode 100644 index 0000000..ef57204 --- /dev/null +++ b/src/main/java/one/kiosk/dto/MenuUploadDto.java @@ -0,0 +1,26 @@ +package one.kiosk.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import one.kiosk.entity.MenuEntity; + +@Data +@AllArgsConstructor +@Builder +public class MenuUploadDto { + private String menuname; + private int price; + private String category; + + + public MenuEntity toMenuEntity() { + return MenuEntity.builder() + .menuname(this.menuname) + .price(this.price) + .category(this.category).build(); + } + +} + diff --git a/src/main/java/one/kiosk/entity/MenuEntity.java b/src/main/java/one/kiosk/entity/MenuEntity.java new file mode 100644 index 0000000..a693026 --- /dev/null +++ b/src/main/java/one/kiosk/entity/MenuEntity.java @@ -0,0 +1,43 @@ +package one.kiosk.entity; + +import jakarta.persistence.*; +import lombok.*; +import one.kiosk.jwt.MemberRole; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; + +import java.time.LocalDateTime; + +@Entity +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Data +@Getter +@Setter +@Table(name = "tbl_menu") +public class MenuEntity extends DateEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "menu_id") + private Long menuId; + + @Column(name = "menuname", nullable = false) + private String menuname; + + @Column(name = "price", nullable = false) + private int price; + + @Column(name = "category", nullable = false) + private String category; + + + @CreatedDate + @Column(name = "create", updatable = false) + private LocalDateTime create; + + @LastModifiedDate + @Column(name = "update") + private LocalDateTime update; +} diff --git a/src/main/java/one/kiosk/repository/MenuJpaRepository.java b/src/main/java/one/kiosk/repository/MenuJpaRepository.java new file mode 100644 index 0000000..4cb3314 --- /dev/null +++ b/src/main/java/one/kiosk/repository/MenuJpaRepository.java @@ -0,0 +1,10 @@ +package one.kiosk.repository; + + +import one.kiosk.entity.MenuEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MenuJpaRepository extends JpaRepository { + MenuEntity findByMenuId(Long menuId); + +} diff --git a/src/main/java/one/kiosk/service/MenuService.java b/src/main/java/one/kiosk/service/MenuService.java new file mode 100644 index 0000000..d415e85 --- /dev/null +++ b/src/main/java/one/kiosk/service/MenuService.java @@ -0,0 +1,84 @@ +package one.kiosk.service; + + +import lombok.RequiredArgsConstructor; +import one.kiosk.dto.MenuUpdateDto; +import one.kiosk.dto.MenuUploadDto; +import one.kiosk.entity.MenuEntity; +import one.kiosk.repository.MenuJpaRepository; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class MenuService { + + private final MenuJpaRepository menuJpaRepository;; + + //메뉴 등록 + public MenuEntity upload(MenuUploadDto menuUploadDto) { + MenuEntity menuEntity = menuJpaRepository.save(menuUploadDto.toMenuEntity()); + //메뉴 등록 진행 중, 오류가 발생하면 null 반환 + try{ + return menuEntity; + } + catch(Exception e){ + return null; + } + } + + //메뉴 검색. dto변환 필요 + public MenuEntity find(Long id) { + MenuEntity findMenu = menuJpaRepository.findById(id).orElse(null); + return findMenu; + } + + //메뉴 수정. 성공시 true, 실패시 false 반환 + public boolean update(MenuUpdateDto menuUpdateDto) { + MenuEntity menuEntity = menuJpaRepository.findByMenuId(menuUpdateDto.getId()); + + if(menuEntity != null){ + menuEntity.setMenuname(menuUpdateDto.getMenuname()); + menuEntity.setPrice(menuUpdateDto.getPrice()); + menuEntity.setCategory(menuUpdateDto.getCategory()); + menuEntity.setUpdate(LocalDateTime.now()); + + menuJpaRepository.save(menuEntity); + return true; + } + else{ + return false; + } + } + + //메뉴 삭제. 성공시 true, 실패시 false 반환 + public boolean delete(Long id) { + MenuEntity menuEntity = menuJpaRepository.findById(id).orElse(null); + if(menuEntity != null){ + menuJpaRepository.delete(menuEntity); + return true; + } + else{ + return false; + } + } + + //전체조회 + public List findAll() { + List menuEntities = menuJpaRepository.findAll(); + List menuUpdateDto = new ArrayList<>(); + + //가게에 메뉴가 존재하지 않을 경우 + if(menuEntities.isEmpty()){ + return null; + } + + for (MenuEntity menu : menuEntities) { + menuUpdateDto.add(MenuUpdateDto.toMenuUpdateDto(menu)); + } + return menuUpdateDto; + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 3f84289..82fdadc 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,8 +1,11 @@ +server: + port : 8081 + spring: datasource: - url: jdbc:mysql://116.39.208.72:33060/expo2024 - username: one - password: one2024 + url: jdbc:mysql://127.0.0.1/kiosk?serverTimezone=Asia/Seoul&characterEncoding=UTF-8 + username: root + password: yr030709 driver-class-name: com.mysql.cj.jdbc.Driver jpa: open-in-view: false @@ -17,16 +20,4 @@ spring: token-validity-in-seconds: mvc: locale: - timezone: Asia/Seoul - - file: - upload-dir: /home/one/uploade_image - - servlet: - multipart: - enabled: true - max-file-size: 10MB - max-request-size: 10MB - -server: - port: 8022 + timezone: Asia/Seoul \ No newline at end of file From 6e5dbed6161709b6b581c9f8bfff80c66f1914ec Mon Sep 17 00:00:00 2001 From: yeram0709 Date: Mon, 7 Oct 2024 14:56:35 +0900 Subject: [PATCH 2/7] =?UTF-8?q?=EC=97=90=EB=9F=AC=20throw=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EB=B0=8F=20=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../one/kiosk/controller/MenuController.java | 69 +++++++------- .../java/one/kiosk/dto/MenuReturnDto.java | 20 +++++ .../java/one/kiosk/dto/MenuUploadDto.java | 5 +- .../java/one/kiosk/entity/MenuEntity.java | 10 +-- .../exception/GlobalExceptionHandler.java | 61 +++++++++++++ .../kiosk/repository/MenuJpaRepository.java | 5 ++ .../java/one/kiosk/service/MenuService.java | 89 ++++++++++++++----- src/main/resources/application.yml | 23 +++-- 8 files changed, 204 insertions(+), 78 deletions(-) create mode 100644 src/main/java/one/kiosk/dto/MenuReturnDto.java diff --git a/src/main/java/one/kiosk/controller/MenuController.java b/src/main/java/one/kiosk/controller/MenuController.java index 13bb24d..6e97175 100644 --- a/src/main/java/one/kiosk/controller/MenuController.java +++ b/src/main/java/one/kiosk/controller/MenuController.java @@ -2,35 +2,35 @@ import lombok.RequiredArgsConstructor; import one.kiosk.dto.ApiResponse; +import one.kiosk.dto.MenuReturnDto; import one.kiosk.dto.MenuUpdateDto; import one.kiosk.dto.MenuUploadDto; import one.kiosk.entity.MenuEntity; +import one.kiosk.exception.GlobalExceptionHandler; import one.kiosk.service.MenuService; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; +import org.springframework.web.server.ResponseStatusException; import java.util.List; @RestController @RequiredArgsConstructor -@RequestMapping("/menu") +@RequestMapping("/api/menu") public class MenuController { private final MenuService menuService; //메뉴 등록 @PostMapping("/upload") - public ResponseEntity> upload(@RequestBody MenuUploadDto menuUploadDto) { - MenuEntity menuEntity = menuService.upload(menuUploadDto); + public ResponseEntity> upload(@RequestHeader("Authorization") String token, @RequestBody MenuUploadDto menuUploadDto) { - //메뉴 등록 실패 - if(menuEntity == null) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST) - .body(new ApiResponse<>(false,"메뉴 등록에 실패하였습니다.",null)); - } + //토큰의 "Bearer " 지우기 + String TokenUsername = token.replace("Bearer ", ""); + menuService.upload(menuUploadDto, TokenUsername); //메뉴 등록 성공 return ResponseEntity.status(HttpStatus.CREATED) .body(new ApiResponse<>(true,"메뉴가 등록되었습니다.",null)); @@ -38,16 +38,18 @@ public ResponseEntity> upload(@RequestBody MenuUploadDto men //메뉴 검색 @GetMapping("search/{id}") - public ResponseEntity> upload(@PathVariable Long id) { - MenuEntity menuEntity = menuService.find(id); + public ResponseEntity> upload(@RequestHeader("Authorization") String token,@PathVariable Long id) { + + //토큰의 "Bearer " 지우기 + String TokenUsername = token.replace("Bearer ", ""); - //찾고자 하는 메뉴가 없을 경우 - if(menuEntity == null) { - return ResponseEntity.status(HttpStatus.NOT_FOUND) - .body(new ApiResponse<>(false,"메뉴를 찾을 수 없습니다",null)); + MenuEntity menuEntity = menuService.find(id,TokenUsername); + + if (menuEntity == null) { + throw new GlobalExceptionHandler.MenuNotFoundException("메뉴를 찾을 수 없습니다"); } //필요한 필드만 DTO로 변환 - MenuUploadDto menuUploadDto = new MenuUploadDto( + MenuReturnDto menuReturnDto = new MenuReturnDto( menuEntity.getMenuname(), menuEntity.getPrice(), menuEntity.getCategory() @@ -55,35 +57,28 @@ public ResponseEntity> upload(@PathVariable Long id) //메뉴 검색 성공 return ResponseEntity.status(HttpStatus.OK) - .body(new ApiResponse<>(true,"메뉴 정보를 조회합니다",menuUploadDto)); + .body(new ApiResponse<>(true,"메뉴 정보를 조회합니다",menuReturnDto)); } //메뉴 전체조회 @GetMapping("/total") - public ResponseEntity>> total() { - List menuDtos = menuService.findAll(); - - //등록된 메뉴가 없을경우 - if(menuDtos==null) { - return ResponseEntity.status(HttpStatus.NOT_FOUND) - .body(new ApiResponse<>(false,"등록된 메뉴가 없습니다",null)); - } + public ResponseEntity>> total(@RequestHeader("Authorization") String token) { + //토큰의 "Bearer " 지우기 + String TokenUsername = token.replace("Bearer ", ""); + List menuDtos = menuService.findAll(TokenUsername); return ResponseEntity.status(HttpStatus.OK) .body(new ApiResponse<>(true,"전체 메뉴를 조회합니다",menuDtos)); } //메뉴 수정 @PutMapping("/update") - public ResponseEntity> update(@RequestBody MenuUpdateDto menuUpdateDto) { - boolean success = menuService.update(menuUpdateDto); + public ResponseEntity> update(@RequestHeader("Authorization") String token, @RequestBody MenuUpdateDto menuUpdateDto) { - //수정하고자 하는 메뉴가 없을경우 - if(!success) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST) - .body(new ApiResponse<>(false,"메뉴를 수정하지 못했습니다.",null)); - } + //토큰의 "Bearer " 지우기 + String TokenUsername = token.replace("Bearer ", ""); //토큰의 "Bearer " 지우기 + menuService.update(menuUpdateDto,TokenUsername); //수정 완료 return ResponseEntity.status(HttpStatus.OK) .body(new ApiResponse<>(true,"메뉴정보 수정이 완료되었습니다.",null)); @@ -91,15 +86,11 @@ public ResponseEntity> update(@RequestBody MenuUpdateDto men //메뉴 삭제 @DeleteMapping("/delete/{id}") - public ResponseEntity> delete(@PathVariable Long id) { - boolean success = menuService.delete(id); - - //삭제 실패 - if(!success) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST) - .body(new ApiResponse<>(false,"메뉴를 삭제하지 못했습니다",null)); - } + public ResponseEntity> delete(@RequestHeader("Authorization") String token, @PathVariable Long id) { + //토큰의 "Bearer " 지우기 + String TokenUsername = token.replace("Bearer ", ""); + menuService.delete(id,TokenUsername); //삭제 성공 return ResponseEntity.status(HttpStatus.OK) .body(new ApiResponse<>(true,"메뉴를 삭제하였습니다.",null)); diff --git a/src/main/java/one/kiosk/dto/MenuReturnDto.java b/src/main/java/one/kiosk/dto/MenuReturnDto.java new file mode 100644 index 0000000..9a50684 --- /dev/null +++ b/src/main/java/one/kiosk/dto/MenuReturnDto.java @@ -0,0 +1,20 @@ +package one.kiosk.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import one.kiosk.entity.MenuEntity; +import one.kiosk.jwt.JWTUtil; + +@Data +@AllArgsConstructor +@Builder +public class MenuReturnDto { + private String menuname; + private int price; + private String category; + + +} + diff --git a/src/main/java/one/kiosk/dto/MenuUploadDto.java b/src/main/java/one/kiosk/dto/MenuUploadDto.java index ef57204..7a00334 100644 --- a/src/main/java/one/kiosk/dto/MenuUploadDto.java +++ b/src/main/java/one/kiosk/dto/MenuUploadDto.java @@ -5,6 +5,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import one.kiosk.entity.MenuEntity; +import one.kiosk.jwt.JWTUtil; @Data @AllArgsConstructor @@ -13,13 +14,15 @@ public class MenuUploadDto { private String menuname; private int price; private String category; + private String username; public MenuEntity toMenuEntity() { return MenuEntity.builder() .menuname(this.menuname) .price(this.price) - .category(this.category).build(); + .category(this.category) + .username(this.username).build(); } } diff --git a/src/main/java/one/kiosk/entity/MenuEntity.java b/src/main/java/one/kiosk/entity/MenuEntity.java index a693026..5c1ec84 100644 --- a/src/main/java/one/kiosk/entity/MenuEntity.java +++ b/src/main/java/one/kiosk/entity/MenuEntity.java @@ -32,12 +32,8 @@ public class MenuEntity extends DateEntity { @Column(name = "category", nullable = false) private String category; + //jwt 토큰에서 추출한 username을 저장 + @Column(name = "username", nullable = false) + private String username; - @CreatedDate - @Column(name = "create", updatable = false) - private LocalDateTime create; - - @LastModifiedDate - @Column(name = "update") - private LocalDateTime update; } diff --git a/src/main/java/one/kiosk/exception/GlobalExceptionHandler.java b/src/main/java/one/kiosk/exception/GlobalExceptionHandler.java index eff1975..b6df004 100644 --- a/src/main/java/one/kiosk/exception/GlobalExceptionHandler.java +++ b/src/main/java/one/kiosk/exception/GlobalExceptionHandler.java @@ -48,6 +48,31 @@ public CustomAuthenticationException(String message) { } } + // 내부 클래스 : 메뉴 crud 예외들 + public static class MenuUplaodException extends RuntimeException { + public MenuUplaodException(String message) {super(message);} + } + + public static class MenuNotFoundException extends RuntimeException { + public MenuNotFoundException(String message) {super(message);} + } + + public static class MenuNotExistException extends RuntimeException { + public MenuNotExistException(String message) {super(message);} + } + + public static class MenuUpdateException extends RuntimeException { + public MenuUpdateException(String message) {super(message);} + } + + public static class MenuDeleteException extends RuntimeException { + public MenuDeleteException(String message) {super(message);} + } + + public static class UserUnmatchException extends RuntimeException { + public UserUnmatchException(String message) {super(message);} + } + // 예외 처리 메서드들 @ExceptionHandler(UserNotFoundException.class) public ResponseEntity handleUserNotFoundException(UserNotFoundException ex) { @@ -105,4 +130,40 @@ public ResponseEntity handleGeneralException(Exception ex) { logger.error("Unhandled Exception: ", ex); return createResponse(HttpStatus.INTERNAL_SERVER_ERROR, "서버 내부 오류가 발생했습니다."); } + + @ExceptionHandler(MenuUplaodException.class) + public ResponseEntity handleMenuUplaodException(MenuUplaodException ex) { + logger.error("MenuUplaodException: ", ex); + return createResponse(HttpStatus.BAD_REQUEST,"메뉴 등록에 실패하였습니다."); + } + + @ExceptionHandler(MenuNotFoundException.class) + public ResponseEntity handleMenuNotFoundException(MenuNotFoundException ex) { + logger.error("MenuNotFoundException: ", ex); + return createResponse(HttpStatus.NOT_FOUND,ex.getMessage()); + } + + @ExceptionHandler(MenuNotExistException.class) + public ResponseEntity handleMenuNotExistException(MenuNotExistException ex) { + logger.error("MenuNotExistException: ", ex); + return createResponse(HttpStatus.NOT_FOUND,"등록된 메뉴가 없습니다."); + } + + @ExceptionHandler(MenuUpdateException.class) + public ResponseEntity handleMenuUpdateException(MenuUpdateException ex) { + logger.error("MenuUpdateException: ", ex); + return createResponse(HttpStatus.BAD_REQUEST, "메뉴를 수정하지 못했습니다"); + } + + @ExceptionHandler(MenuDeleteException.class) + public ResponseEntity handleMenuDeleteException(MenuDeleteException ex) { + logger.error("MenuDeleteException: ", ex); + return createResponse(HttpStatus.BAD_REQUEST,"메뉴를 삭제하지 못했습니다."); + } + + @ExceptionHandler(UserUnmatchException.class) + public ResponseEntity handleUserUnmatchException(UserUnmatchException ex) { + logger.error("UserUnmatchException : ", ex); + return createResponse(HttpStatus.BAD_REQUEST,"해당 메뉴에 접근 권한이 없습니다."); + } } diff --git a/src/main/java/one/kiosk/repository/MenuJpaRepository.java b/src/main/java/one/kiosk/repository/MenuJpaRepository.java index 4cb3314..9f711ff 100644 --- a/src/main/java/one/kiosk/repository/MenuJpaRepository.java +++ b/src/main/java/one/kiosk/repository/MenuJpaRepository.java @@ -4,7 +4,12 @@ import one.kiosk.entity.MenuEntity; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; +import java.util.Optional; + public interface MenuJpaRepository extends JpaRepository { MenuEntity findByMenuId(Long menuId); + List findAllByUsername(String username); + } diff --git a/src/main/java/one/kiosk/service/MenuService.java b/src/main/java/one/kiosk/service/MenuService.java index d415e85..ad44eac 100644 --- a/src/main/java/one/kiosk/service/MenuService.java +++ b/src/main/java/one/kiosk/service/MenuService.java @@ -5,75 +5,116 @@ import one.kiosk.dto.MenuUpdateDto; import one.kiosk.dto.MenuUploadDto; import one.kiosk.entity.MenuEntity; +import one.kiosk.exception.GlobalExceptionHandler; +import one.kiosk.jwt.JWTUtil; import one.kiosk.repository.MenuJpaRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; +import java.nio.file.AccessDeniedException; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; +import java.util.Optional; @Service @RequiredArgsConstructor public class MenuService { - private final MenuJpaRepository menuJpaRepository;; + private final MenuJpaRepository menuJpaRepository; + private final JWTUtil jwtUtil; + private static final Logger logger = LoggerFactory.getLogger(MenuService.class); // Logger 생성 //메뉴 등록 - public MenuEntity upload(MenuUploadDto menuUploadDto) { + public MenuEntity upload(MenuUploadDto menuUploadDto, String token) { + + //토큰에서 유저 이름 추출 후 메뉴 테이블에 로그인한 유저 이름 저장 + String username = jwtUtil.getUsername(token); + menuUploadDto.setUsername(username); MenuEntity menuEntity = menuJpaRepository.save(menuUploadDto.toMenuEntity()); - //메뉴 등록 진행 중, 오류가 발생하면 null 반환 + //메뉴 등록 진행 중, 오류가 발생하면 throw error try{ return menuEntity; } catch(Exception e){ - return null; + throw new GlobalExceptionHandler.MenuUplaodException("메뉴 등록에 실패하였습니다"); } } //메뉴 검색. dto변환 필요 - public MenuEntity find(Long id) { - MenuEntity findMenu = menuJpaRepository.findById(id).orElse(null); - return findMenu; + public MenuEntity find(Long id,String token) { + String username = jwtUtil.getUsername(token); + logger.info("JWT에서 추출된 username: " + username); + Optional OpmenuEntity = menuJpaRepository.findById(id); + + if(OpmenuEntity.isPresent()){ + MenuEntity menuEntity = OpmenuEntity.get(); + + if(!menuEntity.getUsername().equals(username)){ + throw new GlobalExceptionHandler.UserUnmatchException("해당 메뉴에 접근 권한이 없습니다."); + } + return menuEntity; + } + return null; } - //메뉴 수정. 성공시 true, 실패시 false 반환 - public boolean update(MenuUpdateDto menuUpdateDto) { - MenuEntity menuEntity = menuJpaRepository.findByMenuId(menuUpdateDto.getId()); + //메뉴 수정. 성공시 true, 실패시 throw error + public void update(MenuUpdateDto menuUpdateDto, String token) { + String username = jwtUtil.getUsername(token); + + Optional OpMenuEntity = Optional.ofNullable(menuJpaRepository.findByMenuId(menuUpdateDto.getId())); + + if (OpMenuEntity.isPresent()) { + // optional에서 entity값 추출 + MenuEntity menuEntity = OpMenuEntity.get(); + + //findByMenuId를 통해 찾은 menuEntity의 username과 토큰에서 추출한 username을 비교. 일치하지 않으면 에러 throw + if(!menuEntity.getUsername().equals(username)) { + throw new GlobalExceptionHandler.UserUnmatchException("해당 메뉴에 접근 권한이 없습니다."); + } - if(menuEntity != null){ menuEntity.setMenuname(menuUpdateDto.getMenuname()); menuEntity.setPrice(menuUpdateDto.getPrice()); menuEntity.setCategory(menuUpdateDto.getCategory()); menuEntity.setUpdate(LocalDateTime.now()); menuJpaRepository.save(menuEntity); - return true; - } - else{ - return false; + + } else { + //에러 발생시 throw + throw new GlobalExceptionHandler.MenuUpdateException("메뉴를 수정하지 못했습니다"); } } - //메뉴 삭제. 성공시 true, 실패시 false 반환 - public boolean delete(Long id) { - MenuEntity menuEntity = menuJpaRepository.findById(id).orElse(null); - if(menuEntity != null){ + //메뉴 삭제. 실패시 throw error + public void delete(Long id, String token) { + String username = jwtUtil.getUsername(token); + Optional OpMenuEntity = menuJpaRepository.findById(id); + + if(OpMenuEntity.isPresent()){ + MenuEntity menuEntity = OpMenuEntity.get(); + + //findByMenuId를 통해 찾은 menuEntity의 username과 토큰에서 추출한 username을 비교. 일치하지 않으면 에러 throw + if(!menuEntity.getUsername().equals(username)) { + throw new GlobalExceptionHandler.UserUnmatchException("해당 메뉴에 접근 권한이 없습니다."); + } menuJpaRepository.delete(menuEntity); - return true; } else{ - return false; + throw new GlobalExceptionHandler.MenuDeleteException("메뉴를 삭제하지 못했습니다."); } } //전체조회 - public List findAll() { - List menuEntities = menuJpaRepository.findAll(); + public List findAll(String token) { + String username = jwtUtil.getUsername(token); + List menuEntities = menuJpaRepository.findAllByUsername(username); List menuUpdateDto = new ArrayList<>(); //가게에 메뉴가 존재하지 않을 경우 if(menuEntities.isEmpty()){ - return null; + throw new GlobalExceptionHandler.MenuNotExistException("등록된 메뉴가 없습니다"); } for (MenuEntity menu : menuEntities) { diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 82fdadc..b143139 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,11 +1,8 @@ -server: - port : 8081 - spring: datasource: - url: jdbc:mysql://127.0.0.1/kiosk?serverTimezone=Asia/Seoul&characterEncoding=UTF-8 - username: root - password: yr030709 + url: jdbc:mysql://116.39.208.72:33060/expo2024 + username: one + password: one2024 driver-class-name: com.mysql.cj.jdbc.Driver jpa: open-in-view: false @@ -20,4 +17,16 @@ spring: token-validity-in-seconds: mvc: locale: - timezone: Asia/Seoul \ No newline at end of file + timezone: Asia/Seoul + + file: + upload-dir: /home/one/uploade_image + + servlet: + multipart: + enabled: true + max-file-size: 10MB + max-request-size: 10MB + +server: + port: 8022 \ No newline at end of file From 1e228857254f68548e5e3a0cf4294702a3dc5a07 Mon Sep 17 00:00:00 2001 From: yeram0709 Date: Mon, 7 Oct 2024 21:13:15 +0900 Subject: [PATCH 3/7] =?UTF-8?q?2=EC=B0=A8=EC=88=98=EC=A0=95-=ED=86=A0?= =?UTF-8?q?=ED=81=B0=EA=B0=92=EC=97=90id=20=EB=84=A3=EA=B8=B0=20=EB=B0=8F?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../one/kiosk/controller/MenuController.java | 24 +++++++-------- .../java/one/kiosk/dto/MenuUploadDto.java | 4 +-- .../java/one/kiosk/entity/MenuEntity.java | 6 ++-- src/main/java/one/kiosk/jwt/JWTFilter.java | 2 ++ src/main/java/one/kiosk/jwt/JWTUtil.java | 6 +++- src/main/java/one/kiosk/jwt/LoginFilter.java | 3 +- .../kiosk/repository/MenuJpaRepository.java | 2 +- .../java/one/kiosk/service/MemberService.java | 2 +- .../java/one/kiosk/service/MenuService.java | 30 ++++++++++--------- 9 files changed, 42 insertions(+), 37 deletions(-) diff --git a/src/main/java/one/kiosk/controller/MenuController.java b/src/main/java/one/kiosk/controller/MenuController.java index 6e97175..2502cce 100644 --- a/src/main/java/one/kiosk/controller/MenuController.java +++ b/src/main/java/one/kiosk/controller/MenuController.java @@ -28,9 +28,9 @@ public class MenuController { public ResponseEntity> upload(@RequestHeader("Authorization") String token, @RequestBody MenuUploadDto menuUploadDto) { //토큰의 "Bearer " 지우기 - String TokenUsername = token.replace("Bearer ", ""); + String tokenId = token.replace("Bearer ", ""); - menuService.upload(menuUploadDto, TokenUsername); + menuService.upload(menuUploadDto, tokenId); //메뉴 등록 성공 return ResponseEntity.status(HttpStatus.CREATED) .body(new ApiResponse<>(true,"메뉴가 등록되었습니다.",null)); @@ -41,9 +41,9 @@ public ResponseEntity> upload(@RequestHeader("Authorization" public ResponseEntity> upload(@RequestHeader("Authorization") String token,@PathVariable Long id) { //토큰의 "Bearer " 지우기 - String TokenUsername = token.replace("Bearer ", ""); + String tokenId = token.replace("Bearer ", ""); - MenuEntity menuEntity = menuService.find(id,TokenUsername); + MenuEntity menuEntity = menuService.find(id,tokenId); if (menuEntity == null) { throw new GlobalExceptionHandler.MenuNotFoundException("메뉴를 찾을 수 없습니다"); @@ -64,9 +64,8 @@ public ResponseEntity> upload(@RequestHeader("Authori @GetMapping("/total") public ResponseEntity>> total(@RequestHeader("Authorization") String token) { //토큰의 "Bearer " 지우기 - String TokenUsername = token.replace("Bearer ", ""); - - List menuDtos = menuService.findAll(TokenUsername); + String tokenId = token.replace("Bearer ", ""); + List menuDtos = menuService.findAll(tokenId); return ResponseEntity.status(HttpStatus.OK) .body(new ApiResponse<>(true,"전체 메뉴를 조회합니다",menuDtos)); } @@ -74,11 +73,9 @@ public ResponseEntity>> total(@RequestHeader("Au //메뉴 수정 @PutMapping("/update") public ResponseEntity> update(@RequestHeader("Authorization") String token, @RequestBody MenuUpdateDto menuUpdateDto) { - //토큰의 "Bearer " 지우기 - String TokenUsername = token.replace("Bearer ", ""); //토큰의 "Bearer " 지우기 - - menuService.update(menuUpdateDto,TokenUsername); + String tokenId = token.replace("Bearer ", ""); + menuService.update(menuUpdateDto,tokenId); //수정 완료 return ResponseEntity.status(HttpStatus.OK) .body(new ApiResponse<>(true,"메뉴정보 수정이 완료되었습니다.",null)); @@ -88,9 +85,8 @@ public ResponseEntity> update(@RequestHeader("Authorization" @DeleteMapping("/delete/{id}") public ResponseEntity> delete(@RequestHeader("Authorization") String token, @PathVariable Long id) { //토큰의 "Bearer " 지우기 - String TokenUsername = token.replace("Bearer ", ""); - - menuService.delete(id,TokenUsername); + String tokenId = token.replace("Bearer ", ""); + menuService.delete(id,tokenId); //삭제 성공 return ResponseEntity.status(HttpStatus.OK) .body(new ApiResponse<>(true,"메뉴를 삭제하였습니다.",null)); diff --git a/src/main/java/one/kiosk/dto/MenuUploadDto.java b/src/main/java/one/kiosk/dto/MenuUploadDto.java index 7a00334..695b16a 100644 --- a/src/main/java/one/kiosk/dto/MenuUploadDto.java +++ b/src/main/java/one/kiosk/dto/MenuUploadDto.java @@ -14,7 +14,7 @@ public class MenuUploadDto { private String menuname; private int price; private String category; - private String username; + private Long adminId; public MenuEntity toMenuEntity() { @@ -22,7 +22,7 @@ public MenuEntity toMenuEntity() { .menuname(this.menuname) .price(this.price) .category(this.category) - .username(this.username).build(); + .adminId(this.adminId).build(); } } diff --git a/src/main/java/one/kiosk/entity/MenuEntity.java b/src/main/java/one/kiosk/entity/MenuEntity.java index 5c1ec84..4330568 100644 --- a/src/main/java/one/kiosk/entity/MenuEntity.java +++ b/src/main/java/one/kiosk/entity/MenuEntity.java @@ -32,8 +32,8 @@ public class MenuEntity extends DateEntity { @Column(name = "category", nullable = false) private String category; - //jwt 토큰에서 추출한 username을 저장 - @Column(name = "username", nullable = false) - private String username; + //jwt 토큰에서 추출한 id를 저장 + @Column(name = "admin_id", nullable = false) + private Long adminId; } diff --git a/src/main/java/one/kiosk/jwt/JWTFilter.java b/src/main/java/one/kiosk/jwt/JWTFilter.java index 1dda3cb..6c668c4 100644 --- a/src/main/java/one/kiosk/jwt/JWTFilter.java +++ b/src/main/java/one/kiosk/jwt/JWTFilter.java @@ -59,12 +59,14 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse } // 토큰에서 사용자 정보 추출 + Long adminId = jwtUtil.getId(token); String username = jwtUtil.getUsername(token); String role = jwtUtil.getRole(token); String company = jwtUtil.getCompany(token); // Member 객체 생성 Member member = new Member(); + member.setId(adminId); member.setUsername(username); member.setPassword("임시 비밀번호"); // 실제 비밀번호는 필요하지 않음 member.setRole(MemberRole.valueOf(role)); // Enum 변환 diff --git a/src/main/java/one/kiosk/jwt/JWTUtil.java b/src/main/java/one/kiosk/jwt/JWTUtil.java index 1bdd5a2..db6bb91 100644 --- a/src/main/java/one/kiosk/jwt/JWTUtil.java +++ b/src/main/java/one/kiosk/jwt/JWTUtil.java @@ -22,6 +22,9 @@ public JWTUtil(@Value("${spring.jwt.secret}") String secret) { this.secretKey = Keys.hmacShaKeyFor(secret.getBytes()); // HS256 알고리즘에 적합한 SecretKey 생성 } + //JWT 토큰에서 id 추출 + public Long getId(String token) {return extractAllClaims(token).get("id", Long.class);} + // JWT 토큰에서 username 추출 public String getUsername(String token) { return extractAllClaims(token).get("username", String.class); @@ -72,8 +75,9 @@ private Claims extractAllClaims(String token) { } // JWT 토큰 생성 메서드 - public String createJwt(String username, String company, String role) { + public String createJwt(Long id,String username, String company, String role) { return Jwts.builder() + .claim("id",id) .claim("username", username) .claim("role", role) .claim("company", company) diff --git a/src/main/java/one/kiosk/jwt/LoginFilter.java b/src/main/java/one/kiosk/jwt/LoginFilter.java index ba719f5..d947117 100644 --- a/src/main/java/one/kiosk/jwt/LoginFilter.java +++ b/src/main/java/one/kiosk/jwt/LoginFilter.java @@ -44,6 +44,7 @@ protected void successfulAuthentication(HttpServletRequest request, HttpServletR CustomUserDetails customUserDetails = (CustomUserDetails) authentication.getPrincipal(); String username = customUserDetails.getUsername(); String company = customUserDetails.getCompany(); + Long id = customUserDetails.getId(); //role 추출 @@ -53,7 +54,7 @@ protected void successfulAuthentication(HttpServletRequest request, HttpServletR String role = auth.getAuthority(); // JWTUtil에 token 생성 요청 - String token = jwtUtil.createJwt(username, company, role); + String token = jwtUtil.createJwt(id, username, company, role); // JWT를 response에 담아서 응답 (header 부분에) // key : "Authorization" diff --git a/src/main/java/one/kiosk/repository/MenuJpaRepository.java b/src/main/java/one/kiosk/repository/MenuJpaRepository.java index 9f711ff..1fb5226 100644 --- a/src/main/java/one/kiosk/repository/MenuJpaRepository.java +++ b/src/main/java/one/kiosk/repository/MenuJpaRepository.java @@ -10,6 +10,6 @@ public interface MenuJpaRepository extends JpaRepository { MenuEntity findByMenuId(Long menuId); - List findAllByUsername(String username); + List findAllByAdminId(Long adminId); } diff --git a/src/main/java/one/kiosk/service/MemberService.java b/src/main/java/one/kiosk/service/MemberService.java index 7839665..01983eb 100644 --- a/src/main/java/one/kiosk/service/MemberService.java +++ b/src/main/java/one/kiosk/service/MemberService.java @@ -46,6 +46,6 @@ public String login(RequestLoginDto loginRequest) { } // 인증 성공 시 사용자 정보 반환 - return jwtUtil.createJwt(findMember.getUsername(), findMember.getCompany(), findMember.getRole().name()); + return jwtUtil.createJwt(findMember.getId(), findMember.getUsername(), findMember.getCompany(), findMember.getRole().name()); } } diff --git a/src/main/java/one/kiosk/service/MenuService.java b/src/main/java/one/kiosk/service/MenuService.java index ad44eac..13c4f6a 100644 --- a/src/main/java/one/kiosk/service/MenuService.java +++ b/src/main/java/one/kiosk/service/MenuService.java @@ -29,9 +29,10 @@ public class MenuService { //메뉴 등록 public MenuEntity upload(MenuUploadDto menuUploadDto, String token) { - //토큰에서 유저 이름 추출 후 메뉴 테이블에 로그인한 유저 이름 저장 - String username = jwtUtil.getUsername(token); - menuUploadDto.setUsername(username); + //토큰에서 유저 id 추출 후 메뉴 entity에 저장 + Long adminId = jwtUtil.getId(token); + + menuUploadDto.setAdminId(adminId); MenuEntity menuEntity = menuJpaRepository.save(menuUploadDto.toMenuEntity()); //메뉴 등록 진행 중, 오류가 발생하면 throw error try{ @@ -44,14 +45,14 @@ public MenuEntity upload(MenuUploadDto menuUploadDto, String token) { //메뉴 검색. dto변환 필요 public MenuEntity find(Long id,String token) { - String username = jwtUtil.getUsername(token); - logger.info("JWT에서 추출된 username: " + username); + Long adminId = jwtUtil.getId(token); + Optional OpmenuEntity = menuJpaRepository.findById(id); if(OpmenuEntity.isPresent()){ MenuEntity menuEntity = OpmenuEntity.get(); - if(!menuEntity.getUsername().equals(username)){ + if(!menuEntity.getAdminId().equals(adminId)){ throw new GlobalExceptionHandler.UserUnmatchException("해당 메뉴에 접근 권한이 없습니다."); } return menuEntity; @@ -61,7 +62,7 @@ public MenuEntity find(Long id,String token) { //메뉴 수정. 성공시 true, 실패시 throw error public void update(MenuUpdateDto menuUpdateDto, String token) { - String username = jwtUtil.getUsername(token); + Long adminId = jwtUtil.getId(token); Optional OpMenuEntity = Optional.ofNullable(menuJpaRepository.findByMenuId(menuUpdateDto.getId())); @@ -69,8 +70,8 @@ public void update(MenuUpdateDto menuUpdateDto, String token) { // optional에서 entity값 추출 MenuEntity menuEntity = OpMenuEntity.get(); - //findByMenuId를 통해 찾은 menuEntity의 username과 토큰에서 추출한 username을 비교. 일치하지 않으면 에러 throw - if(!menuEntity.getUsername().equals(username)) { + //findByMenuId를 통해 찾은 menuEntity의 menuId과 토큰에서 추출한 adminId를 비교. 일치하지 않으면 에러 throw + if(!menuEntity.getAdminId().equals(adminId)) { throw new GlobalExceptionHandler.UserUnmatchException("해당 메뉴에 접근 권한이 없습니다."); } @@ -89,14 +90,14 @@ public void update(MenuUpdateDto menuUpdateDto, String token) { //메뉴 삭제. 실패시 throw error public void delete(Long id, String token) { - String username = jwtUtil.getUsername(token); + Long adminId = jwtUtil.getId(token); Optional OpMenuEntity = menuJpaRepository.findById(id); if(OpMenuEntity.isPresent()){ MenuEntity menuEntity = OpMenuEntity.get(); - //findByMenuId를 통해 찾은 menuEntity의 username과 토큰에서 추출한 username을 비교. 일치하지 않으면 에러 throw - if(!menuEntity.getUsername().equals(username)) { + //findByMenuId를 통해 찾은 menuEntity의 menuId과 토큰에서 추출한 adminId를 비교. 일치하지 않으면 에러 throw + if(!menuEntity.getAdminId().equals(adminId)) { throw new GlobalExceptionHandler.UserUnmatchException("해당 메뉴에 접근 권한이 없습니다."); } menuJpaRepository.delete(menuEntity); @@ -108,8 +109,8 @@ public void delete(Long id, String token) { //전체조회 public List findAll(String token) { - String username = jwtUtil.getUsername(token); - List menuEntities = menuJpaRepository.findAllByUsername(username); + Long adminId = jwtUtil.getId(token); + List menuEntities = menuJpaRepository.findAllByAdminId(adminId); List menuUpdateDto = new ArrayList<>(); //가게에 메뉴가 존재하지 않을 경우 @@ -122,4 +123,5 @@ public List findAll(String token) { } return menuUpdateDto; } + } From ccf06a1a5a146d364b97d79fc529ef01fa26a797 Mon Sep 17 00:00:00 2001 From: yeram0709 Date: Wed, 9 Oct 2024 17:55:40 +0900 Subject: [PATCH 4/7] =?UTF-8?q?=EB=A9=94=EB=89=B4=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=EC=8B=9C=20=EC=9D=B4=EB=AF=B8=EC=A7=80=EC=99=80=20=ED=95=A8?= =?UTF-8?q?=EA=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../one/kiosk/controller/MenuController.java | 15 +++----- .../java/one/kiosk/dto/MenuReturnDto.java | 14 ++++++- .../java/one/kiosk/dto/MenuUpdateDto.java | 11 +----- .../java/one/kiosk/dto/MenuUploadDto.java | 4 +- .../java/one/kiosk/entity/MenuEntity.java | 3 ++ .../java/one/kiosk/service/MenuService.java | 37 ++++++++++++++++--- 6 files changed, 56 insertions(+), 28 deletions(-) diff --git a/src/main/java/one/kiosk/controller/MenuController.java b/src/main/java/one/kiosk/controller/MenuController.java index 2502cce..49f20b8 100644 --- a/src/main/java/one/kiosk/controller/MenuController.java +++ b/src/main/java/one/kiosk/controller/MenuController.java @@ -43,17 +43,11 @@ public ResponseEntity> upload(@RequestHeader("Authori //토큰의 "Bearer " 지우기 String tokenId = token.replace("Bearer ", ""); - MenuEntity menuEntity = menuService.find(id,tokenId); + MenuReturnDto menuReturnDto = menuService.find(id,tokenId); - if (menuEntity == null) { + if (menuReturnDto == null) { throw new GlobalExceptionHandler.MenuNotFoundException("메뉴를 찾을 수 없습니다"); } - //필요한 필드만 DTO로 변환 - MenuReturnDto menuReturnDto = new MenuReturnDto( - menuEntity.getMenuname(), - menuEntity.getPrice(), - menuEntity.getCategory() - ); //메뉴 검색 성공 return ResponseEntity.status(HttpStatus.OK) @@ -62,10 +56,11 @@ public ResponseEntity> upload(@RequestHeader("Authori //메뉴 전체조회 @GetMapping("/total") - public ResponseEntity>> total(@RequestHeader("Authorization") String token) { + public ResponseEntity>> total(@RequestHeader("Authorization") String token) { //토큰의 "Bearer " 지우기 String tokenId = token.replace("Bearer ", ""); - List menuDtos = menuService.findAll(tokenId); + List menuDtos = menuService.findAll(tokenId); + return ResponseEntity.status(HttpStatus.OK) .body(new ApiResponse<>(true,"전체 메뉴를 조회합니다",menuDtos)); } diff --git a/src/main/java/one/kiosk/dto/MenuReturnDto.java b/src/main/java/one/kiosk/dto/MenuReturnDto.java index 9a50684..5fcd6a8 100644 --- a/src/main/java/one/kiosk/dto/MenuReturnDto.java +++ b/src/main/java/one/kiosk/dto/MenuReturnDto.java @@ -9,11 +9,23 @@ @Data @AllArgsConstructor -@Builder +@NoArgsConstructor public class MenuReturnDto { + private String menuname; private int price; private String category; + private String imageUrl; + + //메뉴 entity와 검색을 통해 나온 이미지의 url을 함께 dto에 저장 + public static MenuReturnDto toMenuReturnDto(MenuEntity menuEntity, String imageUrl) { + MenuReturnDto dto = new MenuReturnDto(); + dto.setMenuname(menuEntity.getMenuname()); + dto.setPrice(menuEntity.getPrice()); + dto.setCategory(menuEntity.getCategory()); + dto.setImageUrl(imageUrl); + return dto; + } } diff --git a/src/main/java/one/kiosk/dto/MenuUpdateDto.java b/src/main/java/one/kiosk/dto/MenuUpdateDto.java index 7fbafb8..859f1c1 100644 --- a/src/main/java/one/kiosk/dto/MenuUpdateDto.java +++ b/src/main/java/one/kiosk/dto/MenuUpdateDto.java @@ -13,15 +13,6 @@ public class MenuUpdateDto { private String menuname; private int price; private String category; - - //findAll을 통해 받은 MenuEntity들을 Dto로 변환 후 리턴 - public static MenuUpdateDto toMenuUpdateDto(MenuEntity menuEntity) { - return MenuUpdateDto.builder() - .id(menuEntity.getMenuId()) - .menuname(menuEntity.getMenuname()) - .price(menuEntity.getPrice()) - .category(menuEntity.getCategory()) - .build(); - } + private Long imageId; } diff --git a/src/main/java/one/kiosk/dto/MenuUploadDto.java b/src/main/java/one/kiosk/dto/MenuUploadDto.java index 695b16a..44865f0 100644 --- a/src/main/java/one/kiosk/dto/MenuUploadDto.java +++ b/src/main/java/one/kiosk/dto/MenuUploadDto.java @@ -15,6 +15,7 @@ public class MenuUploadDto { private int price; private String category; private Long adminId; + private Long imageId; public MenuEntity toMenuEntity() { @@ -22,7 +23,8 @@ public MenuEntity toMenuEntity() { .menuname(this.menuname) .price(this.price) .category(this.category) - .adminId(this.adminId).build(); + .adminId(this.adminId) + .imageId(this.imageId).build(); } } diff --git a/src/main/java/one/kiosk/entity/MenuEntity.java b/src/main/java/one/kiosk/entity/MenuEntity.java index 4330568..ae4ad92 100644 --- a/src/main/java/one/kiosk/entity/MenuEntity.java +++ b/src/main/java/one/kiosk/entity/MenuEntity.java @@ -36,4 +36,7 @@ public class MenuEntity extends DateEntity { @Column(name = "admin_id", nullable = false) private Long adminId; + @Column(name = "image_id") + private Long imageId; + } diff --git a/src/main/java/one/kiosk/service/MenuService.java b/src/main/java/one/kiosk/service/MenuService.java index 13c4f6a..259591e 100644 --- a/src/main/java/one/kiosk/service/MenuService.java +++ b/src/main/java/one/kiosk/service/MenuService.java @@ -2,11 +2,14 @@ import lombok.RequiredArgsConstructor; +import one.kiosk.dto.MenuReturnDto; import one.kiosk.dto.MenuUpdateDto; import one.kiosk.dto.MenuUploadDto; +import one.kiosk.entity.Image; import one.kiosk.entity.MenuEntity; import one.kiosk.exception.GlobalExceptionHandler; import one.kiosk.jwt.JWTUtil; +import one.kiosk.repository.ImageRepository; import one.kiosk.repository.MenuJpaRepository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,6 +28,7 @@ public class MenuService { private final MenuJpaRepository menuJpaRepository; private final JWTUtil jwtUtil; private static final Logger logger = LoggerFactory.getLogger(MenuService.class); // Logger 생성 + private final ImageRepository imageRepository; //메뉴 등록 public MenuEntity upload(MenuUploadDto menuUploadDto, String token) { @@ -44,7 +48,7 @@ public MenuEntity upload(MenuUploadDto menuUploadDto, String token) { } //메뉴 검색. dto변환 필요 - public MenuEntity find(Long id,String token) { + public MenuReturnDto find(Long id,String token) { Long adminId = jwtUtil.getId(token); Optional OpmenuEntity = menuJpaRepository.findById(id); @@ -55,7 +59,17 @@ public MenuEntity find(Long id,String token) { if(!menuEntity.getAdminId().equals(adminId)){ throw new GlobalExceptionHandler.UserUnmatchException("해당 메뉴에 접근 권한이 없습니다."); } - return menuEntity; + + //메뉴 테이블에 저장된 메뉴 아이디를 이용하여 메뉴 url 조회 + String imgUrl = null; + if(menuEntity.getImageId() != null){ + Optional Opimage = imageRepository.findById(menuEntity.getImageId()); + if(Opimage.isPresent()){ + imgUrl = Opimage.get().getImageUrl(); + } + } + + return MenuReturnDto.toMenuReturnDto(menuEntity,imgUrl); } return null; } @@ -79,6 +93,7 @@ public void update(MenuUpdateDto menuUpdateDto, String token) { menuEntity.setPrice(menuUpdateDto.getPrice()); menuEntity.setCategory(menuUpdateDto.getCategory()); menuEntity.setUpdate(LocalDateTime.now()); + menuEntity.setImageId(menuEntity.getImageId()); menuJpaRepository.save(menuEntity); @@ -108,10 +123,10 @@ public void delete(Long id, String token) { } //전체조회 - public List findAll(String token) { + public List findAll(String token) { Long adminId = jwtUtil.getId(token); List menuEntities = menuJpaRepository.findAllByAdminId(adminId); - List menuUpdateDto = new ArrayList<>(); + List menuReturnDto = new ArrayList<>(); //가게에 메뉴가 존재하지 않을 경우 if(menuEntities.isEmpty()){ @@ -119,9 +134,19 @@ public List findAll(String token) { } for (MenuEntity menu : menuEntities) { - menuUpdateDto.add(MenuUpdateDto.toMenuUpdateDto(menu)); + String imgUrl = null; + + //메뉴 테이블의 image id를 통해 이미지 url 가져오기 + if(menu.getImageId() != null){ + Optional Opimage = imageRepository.findById(menu.getImageId()); + if(Opimage.isPresent()){ + imgUrl = Opimage.get().getImageUrl(); + } + + } + menuReturnDto.add(MenuReturnDto.toMenuReturnDto(menu,imgUrl)); } - return menuUpdateDto; + return menuReturnDto; } } From 7b2149155ca039737ac1b4d71c005c709a2b4580 Mon Sep 17 00:00:00 2001 From: yeram0709 Date: Wed, 9 Oct 2024 22:59:34 +0900 Subject: [PATCH 5/7] =?UTF-8?q?=EB=A7=A4=EB=89=B4=20=EC=98=B5=EC=85=98=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../one/kiosk/dto/MenuOptionReturnDto.java | 24 ++++++++++++++++++ .../java/one/kiosk/dto/MenuReturnDto.java | 8 ++++-- .../one/kiosk/entity/MenuOptionEntity.java | 25 +++++++++++++++++++ .../repository/MenuOptionRepository.java | 10 ++++++++ .../java/one/kiosk/service/MenuService.java | 23 ++++++++++++++--- 5 files changed, 85 insertions(+), 5 deletions(-) create mode 100644 src/main/java/one/kiosk/dto/MenuOptionReturnDto.java create mode 100644 src/main/java/one/kiosk/entity/MenuOptionEntity.java create mode 100644 src/main/java/one/kiosk/repository/MenuOptionRepository.java diff --git a/src/main/java/one/kiosk/dto/MenuOptionReturnDto.java b/src/main/java/one/kiosk/dto/MenuOptionReturnDto.java new file mode 100644 index 0000000..a536723 --- /dev/null +++ b/src/main/java/one/kiosk/dto/MenuOptionReturnDto.java @@ -0,0 +1,24 @@ +package one.kiosk.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; +import one.kiosk.entity.MenuOptionEntity; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class MenuOptionReturnDto { + private String optionname; + private int price; + + //메뉴 Entity를 dto로 변환 + public static MenuOptionReturnDto toMenuOptionReturnDto(MenuOptionEntity menuOptionEntity) { + MenuOptionReturnDto dto = new MenuOptionReturnDto(); + dto.setOptionname(menuOptionEntity.getOptionname()); + dto.setPrice(menuOptionEntity.getPrice()); + return dto; + } +} + diff --git a/src/main/java/one/kiosk/dto/MenuReturnDto.java b/src/main/java/one/kiosk/dto/MenuReturnDto.java index 5fcd6a8..0020f63 100644 --- a/src/main/java/one/kiosk/dto/MenuReturnDto.java +++ b/src/main/java/one/kiosk/dto/MenuReturnDto.java @@ -7,6 +7,8 @@ import one.kiosk.entity.MenuEntity; import one.kiosk.jwt.JWTUtil; +import java.util.List; + @Data @AllArgsConstructor @NoArgsConstructor @@ -16,14 +18,16 @@ public class MenuReturnDto { private int price; private String category; private String imageUrl; + private List option; - //메뉴 entity와 검색을 통해 나온 이미지의 url을 함께 dto에 저장 - public static MenuReturnDto toMenuReturnDto(MenuEntity menuEntity, String imageUrl) { + //메뉴 entity와 검색을 통해 나온 이미지의 url을 함께 dto에 저장. 전체 메뉴옵션을 함께 리턴 + public static MenuReturnDto toMenuReturnDto(MenuEntity menuEntity, String imageUrl, List optionReturnDto) { MenuReturnDto dto = new MenuReturnDto(); dto.setMenuname(menuEntity.getMenuname()); dto.setPrice(menuEntity.getPrice()); dto.setCategory(menuEntity.getCategory()); dto.setImageUrl(imageUrl); + dto.setOption(optionReturnDto); return dto; } diff --git a/src/main/java/one/kiosk/entity/MenuOptionEntity.java b/src/main/java/one/kiosk/entity/MenuOptionEntity.java new file mode 100644 index 0000000..37724a5 --- /dev/null +++ b/src/main/java/one/kiosk/entity/MenuOptionEntity.java @@ -0,0 +1,25 @@ +package one.kiosk.entity; + +import jakarta.persistence.*; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +@Data +@Entity +@Getter +@Setter +@Table(name = "tbl_menuoption") +public class MenuOptionEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "menuop_id") + private Long menuopid; + + @Column(name = "optionname") + private String optionname; + + @Column(name = "price") + private int price; + +} diff --git a/src/main/java/one/kiosk/repository/MenuOptionRepository.java b/src/main/java/one/kiosk/repository/MenuOptionRepository.java new file mode 100644 index 0000000..a592d1a --- /dev/null +++ b/src/main/java/one/kiosk/repository/MenuOptionRepository.java @@ -0,0 +1,10 @@ +package one.kiosk.repository; + +import one.kiosk.entity.MenuOptionEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface MenuOptionRepository extends JpaRepository { + +} diff --git a/src/main/java/one/kiosk/service/MenuService.java b/src/main/java/one/kiosk/service/MenuService.java index 259591e..7ae5665 100644 --- a/src/main/java/one/kiosk/service/MenuService.java +++ b/src/main/java/one/kiosk/service/MenuService.java @@ -2,15 +2,18 @@ import lombok.RequiredArgsConstructor; +import one.kiosk.dto.MenuOptionReturnDto; import one.kiosk.dto.MenuReturnDto; import one.kiosk.dto.MenuUpdateDto; import one.kiosk.dto.MenuUploadDto; import one.kiosk.entity.Image; import one.kiosk.entity.MenuEntity; +import one.kiosk.entity.MenuOptionEntity; import one.kiosk.exception.GlobalExceptionHandler; import one.kiosk.jwt.JWTUtil; import one.kiosk.repository.ImageRepository; import one.kiosk.repository.MenuJpaRepository; +import one.kiosk.repository.MenuOptionRepository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; @@ -29,7 +32,7 @@ public class MenuService { private final JWTUtil jwtUtil; private static final Logger logger = LoggerFactory.getLogger(MenuService.class); // Logger 생성 private final ImageRepository imageRepository; - + private final MenuOptionRepository menuOptionRepository; //메뉴 등록 public MenuEntity upload(MenuUploadDto menuUploadDto, String token) { @@ -69,7 +72,13 @@ public MenuReturnDto find(Long id,String token) { } } - return MenuReturnDto.toMenuReturnDto(menuEntity,imgUrl); + List menuOptionEntities = menuOptionRepository.findAll(); + List menuOptionReturnDtos = new ArrayList<>(); + + for(MenuOptionEntity menuOptionEntity : menuOptionEntities){ + menuOptionReturnDtos.add(MenuOptionReturnDto.toMenuOptionReturnDto(menuOptionEntity)); + } + return MenuReturnDto.toMenuReturnDto(menuEntity,imgUrl,menuOptionReturnDtos); } return null; } @@ -133,6 +142,14 @@ public List findAll(String token) { throw new GlobalExceptionHandler.MenuNotExistException("등록된 메뉴가 없습니다"); } + //모든 메뉴 옵션 불러오기 + List menuOptionEntities = menuOptionRepository.findAll(); + List menuOptionReturnDtos = new ArrayList<>(); + + for(MenuOptionEntity menuOptionEntity : menuOptionEntities){ + menuOptionReturnDtos.add(MenuOptionReturnDto.toMenuOptionReturnDto(menuOptionEntity)); + } + for (MenuEntity menu : menuEntities) { String imgUrl = null; @@ -144,7 +161,7 @@ public List findAll(String token) { } } - menuReturnDto.add(MenuReturnDto.toMenuReturnDto(menu,imgUrl)); + menuReturnDto.add(MenuReturnDto.toMenuReturnDto(menu,imgUrl,menuOptionReturnDtos)); } return menuReturnDto; } From 42d24471588222dda618f4ab6001306f948a15f6 Mon Sep 17 00:00:00 2001 From: yeram0709 Date: Thu, 10 Oct 2024 01:11:44 +0900 Subject: [PATCH 6/7] =?UTF-8?q?=EC=98=B5=EC=85=98=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../one/kiosk/dto/MenuOptionReturnDto.java | 17 +++++--------- .../one/kiosk/entity/MenuOptionEntity.java | 2 -- .../repository/MenuOptionRepository.java | 5 +---- .../MenuOptionRepositoryCustom.java | 12 ++++++++++ .../repository/MenuOptionRepositoryImpl.java | 22 +++++++++++++++++++ .../java/one/kiosk/service/MenuService.java | 16 ++------------ 6 files changed, 43 insertions(+), 31 deletions(-) create mode 100644 src/main/java/one/kiosk/repository/MenuOptionRepositoryCustom.java create mode 100644 src/main/java/one/kiosk/repository/MenuOptionRepositoryImpl.java diff --git a/src/main/java/one/kiosk/dto/MenuOptionReturnDto.java b/src/main/java/one/kiosk/dto/MenuOptionReturnDto.java index a536723..a3b5483 100644 --- a/src/main/java/one/kiosk/dto/MenuOptionReturnDto.java +++ b/src/main/java/one/kiosk/dto/MenuOptionReturnDto.java @@ -1,24 +1,19 @@ package one.kiosk.dto; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.ToString; +import lombok.*; import one.kiosk.entity.MenuOptionEntity; @Data -@AllArgsConstructor @NoArgsConstructor +@Getter +@Setter public class MenuOptionReturnDto { private String optionname; private int price; - //메뉴 Entity를 dto로 변환 - public static MenuOptionReturnDto toMenuOptionReturnDto(MenuOptionEntity menuOptionEntity) { - MenuOptionReturnDto dto = new MenuOptionReturnDto(); - dto.setOptionname(menuOptionEntity.getOptionname()); - dto.setPrice(menuOptionEntity.getPrice()); - return dto; + public MenuOptionReturnDto(String optionname, int price) { + this.optionname = optionname; + this.price = price; } } diff --git a/src/main/java/one/kiosk/entity/MenuOptionEntity.java b/src/main/java/one/kiosk/entity/MenuOptionEntity.java index 37724a5..d213b74 100644 --- a/src/main/java/one/kiosk/entity/MenuOptionEntity.java +++ b/src/main/java/one/kiosk/entity/MenuOptionEntity.java @@ -7,8 +7,6 @@ @Data @Entity -@Getter -@Setter @Table(name = "tbl_menuoption") public class MenuOptionEntity { @Id diff --git a/src/main/java/one/kiosk/repository/MenuOptionRepository.java b/src/main/java/one/kiosk/repository/MenuOptionRepository.java index a592d1a..bfa2526 100644 --- a/src/main/java/one/kiosk/repository/MenuOptionRepository.java +++ b/src/main/java/one/kiosk/repository/MenuOptionRepository.java @@ -2,9 +2,6 @@ import one.kiosk.entity.MenuOptionEntity; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface MenuOptionRepository extends JpaRepository { +public interface MenuOptionRepository extends JpaRepository, MenuOptionRepositoryCustom { } diff --git a/src/main/java/one/kiosk/repository/MenuOptionRepositoryCustom.java b/src/main/java/one/kiosk/repository/MenuOptionRepositoryCustom.java new file mode 100644 index 0000000..45b930a --- /dev/null +++ b/src/main/java/one/kiosk/repository/MenuOptionRepositoryCustom.java @@ -0,0 +1,12 @@ +package one.kiosk.repository; + +import one.kiosk.dto.MenuOptionReturnDto; +import one.kiosk.entity.MenuOptionEntity; + +import java.util.List; + +public interface MenuOptionRepositoryCustom { + + //쿼리문 실행을 위한 커스텀 리포지토리 + List findMenuOptions(); +} diff --git a/src/main/java/one/kiosk/repository/MenuOptionRepositoryImpl.java b/src/main/java/one/kiosk/repository/MenuOptionRepositoryImpl.java new file mode 100644 index 0000000..f604a3d --- /dev/null +++ b/src/main/java/one/kiosk/repository/MenuOptionRepositoryImpl.java @@ -0,0 +1,22 @@ +package one.kiosk.repository; + +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import one.kiosk.dto.MenuOptionReturnDto; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public class MenuOptionRepositoryImpl implements MenuOptionRepositoryCustom{ + + @PersistenceContext + private EntityManager em; + + //쿼리문 실행하여 리스트에 한꺼번에 담기 + @Override + public List findMenuOptions() { + String jpql = "SELECT new one.kiosk.dto.MenuOptionReturnDto(m.optionname, m.price) FROM MenuOptionEntity m"; + return em.createQuery(jpql, MenuOptionReturnDto.class).getResultList(); + } +} diff --git a/src/main/java/one/kiosk/service/MenuService.java b/src/main/java/one/kiosk/service/MenuService.java index 7ae5665..74ce588 100644 --- a/src/main/java/one/kiosk/service/MenuService.java +++ b/src/main/java/one/kiosk/service/MenuService.java @@ -62,7 +62,7 @@ public MenuReturnDto find(Long id,String token) { if(!menuEntity.getAdminId().equals(adminId)){ throw new GlobalExceptionHandler.UserUnmatchException("해당 메뉴에 접근 권한이 없습니다."); } - + List menuOptionReturnDtos = menuOptionRepository.findMenuOptions(); //메뉴 테이블에 저장된 메뉴 아이디를 이용하여 메뉴 url 조회 String imgUrl = null; if(menuEntity.getImageId() != null){ @@ -72,12 +72,7 @@ public MenuReturnDto find(Long id,String token) { } } - List menuOptionEntities = menuOptionRepository.findAll(); - List menuOptionReturnDtos = new ArrayList<>(); - for(MenuOptionEntity menuOptionEntity : menuOptionEntities){ - menuOptionReturnDtos.add(MenuOptionReturnDto.toMenuOptionReturnDto(menuOptionEntity)); - } return MenuReturnDto.toMenuReturnDto(menuEntity,imgUrl,menuOptionReturnDtos); } return null; @@ -142,16 +137,9 @@ public List findAll(String token) { throw new GlobalExceptionHandler.MenuNotExistException("등록된 메뉴가 없습니다"); } - //모든 메뉴 옵션 불러오기 - List menuOptionEntities = menuOptionRepository.findAll(); - List menuOptionReturnDtos = new ArrayList<>(); - - for(MenuOptionEntity menuOptionEntity : menuOptionEntities){ - menuOptionReturnDtos.add(MenuOptionReturnDto.toMenuOptionReturnDto(menuOptionEntity)); - } - for (MenuEntity menu : menuEntities) { String imgUrl = null; + List menuOptionReturnDtos = menuOptionRepository.findMenuOptions(); //메뉴 테이블의 image id를 통해 이미지 url 가져오기 if(menu.getImageId() != null){ From a5384e4fa4248fd15d2ed117a4963046f7a1aed8 Mon Sep 17 00:00:00 2001 From: yeram0709 Date: Fri, 11 Oct 2024 22:29:57 +0900 Subject: [PATCH 7/7] =?UTF-8?q?=EC=A0=84=EC=B2=B4=EC=A1=B0=ED=9A=8C=20for?= =?UTF-8?q?=EB=AC=B8=20=EC=A0=9C=EC=99=B8,=20querydsl=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 7 +++ .../java/one/kiosk/dto/MenuReturnDto.java | 12 +++- .../java/one/kiosk/dto/MenuUploadDto.java | 3 +- .../java/one/kiosk/entity/MenuEntity.java | 9 ++- .../kiosk/repository/MenuJpaRepository.java | 5 +- .../repository/MenuJpaRepositoryImpl.java | 55 +++++++++++++++++++ .../repository/MenuJpaRpositoryCustom.java | 10 ++++ .../one/kiosk/repository/QuerydslConfig.java | 21 +++++++ .../java/one/kiosk/service/MenuService.java | 31 +++-------- 9 files changed, 124 insertions(+), 29 deletions(-) create mode 100644 src/main/java/one/kiosk/repository/MenuJpaRepositoryImpl.java create mode 100644 src/main/java/one/kiosk/repository/MenuJpaRpositoryCustom.java create mode 100644 src/main/java/one/kiosk/repository/QuerydslConfig.java diff --git a/build.gradle b/build.gradle index ccbba32..2c3b903 100644 --- a/build.gradle +++ b/build.gradle @@ -45,6 +45,13 @@ dependencies { // Spring Test 의존성 추가 testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' + + //QueryDsl 의존성 추가 + implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' + annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" + annotationProcessor "jakarta.annotation:jakarta.annotation-api" + annotationProcessor "jakarta.persistence:jakarta.persistence-api" + } tasks.named('test') { diff --git a/src/main/java/one/kiosk/dto/MenuReturnDto.java b/src/main/java/one/kiosk/dto/MenuReturnDto.java index 0020f63..ad2fc66 100644 --- a/src/main/java/one/kiosk/dto/MenuReturnDto.java +++ b/src/main/java/one/kiosk/dto/MenuReturnDto.java @@ -10,7 +10,6 @@ import java.util.List; @Data -@AllArgsConstructor @NoArgsConstructor public class MenuReturnDto { @@ -20,7 +19,15 @@ public class MenuReturnDto { private String imageUrl; private List option; - //메뉴 entity와 검색을 통해 나온 이미지의 url을 함께 dto에 저장. 전체 메뉴옵션을 함께 리턴 + // 생성자(전체조회용) + public MenuReturnDto(String menuname, int price, String category, String imgUrl, List menuOptions) { + this.menuname = menuname; + this.price = price; + this.category = category; + this.imageUrl = imgUrl; + this.option = menuOptions; + } + //메뉴 entity와 검색을 통해 나온 이미지의 url을 함께 dto에 저장. 전체 메뉴옵션을 함께 리턴(단일조회용) public static MenuReturnDto toMenuReturnDto(MenuEntity menuEntity, String imageUrl, List optionReturnDto) { MenuReturnDto dto = new MenuReturnDto(); dto.setMenuname(menuEntity.getMenuname()); @@ -30,7 +37,6 @@ public static MenuReturnDto toMenuReturnDto(MenuEntity menuEntity, String imageU dto.setOption(optionReturnDto); return dto; } - } diff --git a/src/main/java/one/kiosk/dto/MenuUploadDto.java b/src/main/java/one/kiosk/dto/MenuUploadDto.java index 44865f0..9ccdd48 100644 --- a/src/main/java/one/kiosk/dto/MenuUploadDto.java +++ b/src/main/java/one/kiosk/dto/MenuUploadDto.java @@ -4,6 +4,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import one.kiosk.entity.Image; import one.kiosk.entity.MenuEntity; import one.kiosk.jwt.JWTUtil; @@ -15,7 +16,7 @@ public class MenuUploadDto { private int price; private String category; private Long adminId; - private Long imageId; + private Image imageId; public MenuEntity toMenuEntity() { diff --git a/src/main/java/one/kiosk/entity/MenuEntity.java b/src/main/java/one/kiosk/entity/MenuEntity.java index ae4ad92..498ffa4 100644 --- a/src/main/java/one/kiosk/entity/MenuEntity.java +++ b/src/main/java/one/kiosk/entity/MenuEntity.java @@ -7,6 +7,7 @@ import org.springframework.data.annotation.LastModifiedDate; import java.time.LocalDateTime; +import java.util.List; @Entity @NoArgsConstructor @@ -36,7 +37,11 @@ public class MenuEntity extends DateEntity { @Column(name = "admin_id", nullable = false) private Long adminId; - @Column(name = "image_id") - private Long imageId; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "image_id") // 외래키 설정 + private Image imageId; + + + } diff --git a/src/main/java/one/kiosk/repository/MenuJpaRepository.java b/src/main/java/one/kiosk/repository/MenuJpaRepository.java index 1fb5226..167fadc 100644 --- a/src/main/java/one/kiosk/repository/MenuJpaRepository.java +++ b/src/main/java/one/kiosk/repository/MenuJpaRepository.java @@ -1,13 +1,16 @@ package one.kiosk.repository; +import one.kiosk.dto.MenuReturnDto; import one.kiosk.entity.MenuEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.List; import java.util.Optional; -public interface MenuJpaRepository extends JpaRepository { +public interface MenuJpaRepository extends JpaRepository, MenuJpaRpositoryCustom { MenuEntity findByMenuId(Long menuId); List findAllByAdminId(Long adminId); diff --git a/src/main/java/one/kiosk/repository/MenuJpaRepositoryImpl.java b/src/main/java/one/kiosk/repository/MenuJpaRepositoryImpl.java new file mode 100644 index 0000000..61d5cbc --- /dev/null +++ b/src/main/java/one/kiosk/repository/MenuJpaRepositoryImpl.java @@ -0,0 +1,55 @@ +package one.kiosk.repository; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.RequiredArgsConstructor; +import one.kiosk.dto.MenuOptionReturnDto; +import one.kiosk.dto.MenuReturnDto; +import one.kiosk.entity.MenuEntity; +import one.kiosk.entity.QImage; +import one.kiosk.entity.QMenuEntity; +import one.kiosk.entity.QMenuOptionEntity; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.stream.Collectors; + +@Repository +@RequiredArgsConstructor +public class MenuJpaRepositoryImpl implements MenuJpaRpositoryCustom{ + private final JPAQueryFactory queryFactory; + + //메뉴 전체조회 리스트 생성, 옵션dto 리스트 따로 생성 후 메뉴 전체조회 리스트 항목 한개당 옵션dto 넣기 + @Override + public List findAllMenuWithOptionsByAdminId(Long adminId) { + QMenuEntity menu = QMenuEntity.menuEntity; + QMenuOptionEntity option = QMenuOptionEntity.menuOptionEntity; + QImage image = QImage.image; + + // 모든 메뉴 조회 + List menus = queryFactory + .selectFrom(menu) + .leftJoin(menu.imageId, image).fetchJoin() // 메뉴와 이미지를 조인 + .where(menu.adminId.eq(adminId)) + .fetch(); + + //모든 옵션 조회후 옵션 dto리스트 생성 + List options = queryFactory + .selectFrom(option) + .fetch() + .stream() + .map(o -> new MenuOptionReturnDto(o.getOptionname(), o.getPrice())) + .collect(Collectors.toList()); + + // 각 메뉴 항목에 옵션 리스트를 넣어 DTO로 변환 + return menus.stream() + .map(m -> new MenuReturnDto( + m.getMenuname(), + m.getPrice(), + m.getCategory(), + m.getImageId() != null ? m.getImageId().getImageUrl() : null, + options // 메뉴 항목 하나당 모든 옵션들 포함 + )) + .collect(Collectors.toList()); + + } +} diff --git a/src/main/java/one/kiosk/repository/MenuJpaRpositoryCustom.java b/src/main/java/one/kiosk/repository/MenuJpaRpositoryCustom.java new file mode 100644 index 0000000..d56cd3e --- /dev/null +++ b/src/main/java/one/kiosk/repository/MenuJpaRpositoryCustom.java @@ -0,0 +1,10 @@ +package one.kiosk.repository; + +import one.kiosk.dto.MenuReturnDto; + +import java.util.List; + +public interface MenuJpaRpositoryCustom { + List findAllMenuWithOptionsByAdminId(Long adminId); + +} diff --git a/src/main/java/one/kiosk/repository/QuerydslConfig.java b/src/main/java/one/kiosk/repository/QuerydslConfig.java new file mode 100644 index 0000000..413d8a0 --- /dev/null +++ b/src/main/java/one/kiosk/repository/QuerydslConfig.java @@ -0,0 +1,21 @@ +package one.kiosk.repository; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class QuerydslConfig { + + @PersistenceContext + private EntityManager entityManager; + + //JPAQueryFactory 스프링 빈 등록 + @Bean + public JPAQueryFactory jpaQueryFactory() { + return new JPAQueryFactory(entityManager); + } +} + diff --git a/src/main/java/one/kiosk/service/MenuService.java b/src/main/java/one/kiosk/service/MenuService.java index 74ce588..80e1c97 100644 --- a/src/main/java/one/kiosk/service/MenuService.java +++ b/src/main/java/one/kiosk/service/MenuService.java @@ -20,9 +20,8 @@ import java.nio.file.AccessDeniedException; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; +import java.util.*; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -66,7 +65,7 @@ public MenuReturnDto find(Long id,String token) { //메뉴 테이블에 저장된 메뉴 아이디를 이용하여 메뉴 url 조회 String imgUrl = null; if(menuEntity.getImageId() != null){ - Optional Opimage = imageRepository.findById(menuEntity.getImageId()); + Optional Opimage = imageRepository.findById(menuEntity.getImageId().getId()); if(Opimage.isPresent()){ imgUrl = Opimage.get().getImageUrl(); } @@ -129,29 +128,17 @@ public void delete(Long id, String token) { //전체조회 public List findAll(String token) { Long adminId = jwtUtil.getId(token); - List menuEntities = menuJpaRepository.findAllByAdminId(adminId); - List menuReturnDto = new ArrayList<>(); - //가게에 메뉴가 존재하지 않을 경우 - if(menuEntities.isEmpty()){ + + List menuReturnDtos = menuJpaRepository.findAllMenuWithOptionsByAdminId(adminId); + + if (menuReturnDtos.isEmpty()) { throw new GlobalExceptionHandler.MenuNotExistException("등록된 메뉴가 없습니다"); } + return menuReturnDtos; - for (MenuEntity menu : menuEntities) { - String imgUrl = null; - List menuOptionReturnDtos = menuOptionRepository.findMenuOptions(); + } - //메뉴 테이블의 image id를 통해 이미지 url 가져오기 - if(menu.getImageId() != null){ - Optional Opimage = imageRepository.findById(menu.getImageId()); - if(Opimage.isPresent()){ - imgUrl = Opimage.get().getImageUrl(); - } - } - menuReturnDto.add(MenuReturnDto.toMenuReturnDto(menu,imgUrl,menuOptionReturnDtos)); - } - return menuReturnDto; - } }