From bc460cb4c2f9adcffb7c5bd1925d737f140cc589 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Sun, 2 Jun 2024 18:48:52 +0900 Subject: [PATCH 01/62] =?UTF-8?q?feat:=20ErrorCode=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/demo/exception/ErrorCode.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/com/example/demo/exception/ErrorCode.java diff --git a/src/main/java/com/example/demo/exception/ErrorCode.java b/src/main/java/com/example/demo/exception/ErrorCode.java new file mode 100644 index 0000000..bc9b475 --- /dev/null +++ b/src/main/java/com/example/demo/exception/ErrorCode.java @@ -0,0 +1,10 @@ +package com.example.demo.exception; + +import org.springframework.http.HttpStatus; + +public interface ErrorCode { + + HttpStatus getHttpStatus(); + String getMessage(); + +} From 6523f0f6b4bc00ee335c45798aa3f5c7a9ba393c Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Sun, 2 Jun 2024 18:49:04 +0900 Subject: [PATCH 02/62] =?UTF-8?q?feat:=20ArticleErrorCode=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 --- .../demo/exception/ArticleErrorCode.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/com/example/demo/exception/ArticleErrorCode.java diff --git a/src/main/java/com/example/demo/exception/ArticleErrorCode.java b/src/main/java/com/example/demo/exception/ArticleErrorCode.java new file mode 100644 index 0000000..08fe704 --- /dev/null +++ b/src/main/java/com/example/demo/exception/ArticleErrorCode.java @@ -0,0 +1,27 @@ +package com.example.demo.exception; + +import org.springframework.http.HttpStatus; + +public enum ArticleErrorCode implements ErrorCode{ + + REFERENCE_ERROR(HttpStatus.BAD_REQUEST, "존재하지 않는 사용자 또는 게시판입니다."); + + private final HttpStatus httpStatus; + private final String message; + + ArticleErrorCode(HttpStatus httpStatus, String message) { + this.httpStatus = httpStatus; + this.message = message; + } + + @Override + public HttpStatus getHttpStatus() { + return httpStatus; + } + + @Override + public String getMessage() { + return message; + } + +} From 8f46c93af855921dce5980e3ecd99c04be4da458 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Sun, 2 Jun 2024 18:49:17 +0900 Subject: [PATCH 03/62] =?UTF-8?q?feat:=20BoardErrorCode=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 --- .../demo/exception/BoardErrorCode.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/com/example/demo/exception/BoardErrorCode.java diff --git a/src/main/java/com/example/demo/exception/BoardErrorCode.java b/src/main/java/com/example/demo/exception/BoardErrorCode.java new file mode 100644 index 0000000..3d8ba0e --- /dev/null +++ b/src/main/java/com/example/demo/exception/BoardErrorCode.java @@ -0,0 +1,27 @@ +package com.example.demo.exception; + +import org.springframework.http.HttpStatus; + +public enum BoardErrorCode implements ErrorCode{ + + ARTICLE_EXISTENCE(HttpStatus.BAD_REQUEST, "작성된 게시물이 존재합니다."); + + private final HttpStatus httpStatus; + private final String message; + + BoardErrorCode(HttpStatus httpStatus, String message) { + this.httpStatus = httpStatus; + this.message = message; + } + + @Override + public HttpStatus getHttpStatus() { + return httpStatus; + } + + @Override + public String getMessage() { + return message; + } + +} From 0f8680ad886df3e7e14b5adedb9e44c74c64a4f9 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Sun, 2 Jun 2024 18:49:36 +0900 Subject: [PATCH 04/62] =?UTF-8?q?feat:=20MemberErrorCode=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 --- .../demo/exception/MemberErrorCode.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/com/example/demo/exception/MemberErrorCode.java diff --git a/src/main/java/com/example/demo/exception/MemberErrorCode.java b/src/main/java/com/example/demo/exception/MemberErrorCode.java new file mode 100644 index 0000000..b27a16c --- /dev/null +++ b/src/main/java/com/example/demo/exception/MemberErrorCode.java @@ -0,0 +1,28 @@ +package com.example.demo.exception; + +import org.springframework.http.HttpStatus; + +public enum MemberErrorCode implements ErrorCode{ + + EMAIL_CONFLICT(HttpStatus.CONFLICT, "중복된 이메일입니다."), + ARTICLE_EXISTENCE(HttpStatus.BAD_REQUEST, "작성한 게시물이 존재합니다."); + + private final HttpStatus httpStatus; + private final String message; + + MemberErrorCode(HttpStatus httpStatus, String message) { + this.httpStatus = httpStatus; + this.message = message; + } + + @Override + public HttpStatus getHttpStatus() { + return httpStatus; + } + + @Override + public String getMessage() { + return message; + } + +} From 3672b0768a9f126c5b3a1066941991af525dea85 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Sun, 2 Jun 2024 18:49:42 +0900 Subject: [PATCH 05/62] =?UTF-8?q?feat:=20CommonErrorCode=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 --- .../demo/exception/CommonErrorCode.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/com/example/demo/exception/CommonErrorCode.java diff --git a/src/main/java/com/example/demo/exception/CommonErrorCode.java b/src/main/java/com/example/demo/exception/CommonErrorCode.java new file mode 100644 index 0000000..8f9bbc3 --- /dev/null +++ b/src/main/java/com/example/demo/exception/CommonErrorCode.java @@ -0,0 +1,28 @@ +package com.example.demo.exception; + +import org.springframework.http.HttpStatus; + +public enum CommonErrorCode implements ErrorCode{ + + RESOURCE_NOT_FOUND(HttpStatus.NOT_FOUND, "자원이 존재하지 않습니다."), + NULL_PARAMETER(HttpStatus.BAD_REQUEST, "NULL 파라미터가 존재합니다."); + + private final HttpStatus httpStatus; + private final String message; + + CommonErrorCode(HttpStatus httpStatus, String message) { + this.httpStatus = httpStatus; + this.message = message; + } + + @Override + public HttpStatus getHttpStatus() { + return httpStatus; + } + + @Override + public String getMessage() { + return message; + } + +} From 30ec81a48ba29081d51fd0600bb437c2cf2be95a Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Sun, 2 Jun 2024 19:06:51 +0900 Subject: [PATCH 06/62] =?UTF-8?q?refactor:=20exception.error=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/demo/exception/{ => error}/ArticleErrorCode.java | 2 +- .../com/example/demo/exception/{ => error}/BoardErrorCode.java | 2 +- .../com/example/demo/exception/{ => error}/CommonErrorCode.java | 2 +- .../java/com/example/demo/exception/{ => error}/ErrorCode.java | 2 +- .../com/example/demo/exception/{ => error}/MemberErrorCode.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename src/main/java/com/example/demo/exception/{ => error}/ArticleErrorCode.java (93%) rename src/main/java/com/example/demo/exception/{ => error}/BoardErrorCode.java (93%) rename src/main/java/com/example/demo/exception/{ => error}/CommonErrorCode.java (93%) rename src/main/java/com/example/demo/exception/{ => error}/ErrorCode.java (76%) rename src/main/java/com/example/demo/exception/{ => error}/MemberErrorCode.java (93%) diff --git a/src/main/java/com/example/demo/exception/ArticleErrorCode.java b/src/main/java/com/example/demo/exception/error/ArticleErrorCode.java similarity index 93% rename from src/main/java/com/example/demo/exception/ArticleErrorCode.java rename to src/main/java/com/example/demo/exception/error/ArticleErrorCode.java index 08fe704..311af26 100644 --- a/src/main/java/com/example/demo/exception/ArticleErrorCode.java +++ b/src/main/java/com/example/demo/exception/error/ArticleErrorCode.java @@ -1,4 +1,4 @@ -package com.example.demo.exception; +package com.example.demo.exception.error; import org.springframework.http.HttpStatus; diff --git a/src/main/java/com/example/demo/exception/BoardErrorCode.java b/src/main/java/com/example/demo/exception/error/BoardErrorCode.java similarity index 93% rename from src/main/java/com/example/demo/exception/BoardErrorCode.java rename to src/main/java/com/example/demo/exception/error/BoardErrorCode.java index 3d8ba0e..ad7a6c1 100644 --- a/src/main/java/com/example/demo/exception/BoardErrorCode.java +++ b/src/main/java/com/example/demo/exception/error/BoardErrorCode.java @@ -1,4 +1,4 @@ -package com.example.demo.exception; +package com.example.demo.exception.error; import org.springframework.http.HttpStatus; diff --git a/src/main/java/com/example/demo/exception/CommonErrorCode.java b/src/main/java/com/example/demo/exception/error/CommonErrorCode.java similarity index 93% rename from src/main/java/com/example/demo/exception/CommonErrorCode.java rename to src/main/java/com/example/demo/exception/error/CommonErrorCode.java index 8f9bbc3..edef237 100644 --- a/src/main/java/com/example/demo/exception/CommonErrorCode.java +++ b/src/main/java/com/example/demo/exception/error/CommonErrorCode.java @@ -1,4 +1,4 @@ -package com.example.demo.exception; +package com.example.demo.exception.error; import org.springframework.http.HttpStatus; diff --git a/src/main/java/com/example/demo/exception/ErrorCode.java b/src/main/java/com/example/demo/exception/error/ErrorCode.java similarity index 76% rename from src/main/java/com/example/demo/exception/ErrorCode.java rename to src/main/java/com/example/demo/exception/error/ErrorCode.java index bc9b475..93738cb 100644 --- a/src/main/java/com/example/demo/exception/ErrorCode.java +++ b/src/main/java/com/example/demo/exception/error/ErrorCode.java @@ -1,4 +1,4 @@ -package com.example.demo.exception; +package com.example.demo.exception.error; import org.springframework.http.HttpStatus; diff --git a/src/main/java/com/example/demo/exception/MemberErrorCode.java b/src/main/java/com/example/demo/exception/error/MemberErrorCode.java similarity index 93% rename from src/main/java/com/example/demo/exception/MemberErrorCode.java rename to src/main/java/com/example/demo/exception/error/MemberErrorCode.java index b27a16c..5d6db63 100644 --- a/src/main/java/com/example/demo/exception/MemberErrorCode.java +++ b/src/main/java/com/example/demo/exception/error/MemberErrorCode.java @@ -1,4 +1,4 @@ -package com.example.demo.exception; +package com.example.demo.exception.error; import org.springframework.http.HttpStatus; From 14da25cda04dcc24ac9e9f7eee27de73f5cbd4eb Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Sun, 2 Jun 2024 19:07:52 +0900 Subject: [PATCH 07/62] =?UTF-8?q?feat:=20RestApiException=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 --- .../demo/exception/RestApiException.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/main/java/com/example/demo/exception/RestApiException.java diff --git a/src/main/java/com/example/demo/exception/RestApiException.java b/src/main/java/com/example/demo/exception/RestApiException.java new file mode 100644 index 0000000..bce9b99 --- /dev/null +++ b/src/main/java/com/example/demo/exception/RestApiException.java @@ -0,0 +1,17 @@ +package com.example.demo.exception; + +import com.example.demo.exception.error.ErrorCode; + +public class RestApiException extends RuntimeException{ + + private final ErrorCode errorCode; + + public RestApiException(ErrorCode errorCode) { + this.errorCode = errorCode; + } + + public ErrorCode getErrorCode() { + return errorCode; + } + +} From 7bdf905e159ee39fbe192d8d077f07ceccb01315 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Sun, 2 Jun 2024 19:07:59 +0900 Subject: [PATCH 08/62] =?UTF-8?q?feat:=20ErrorResponse=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 --- src/main/java/com/example/demo/exception/ErrorResponse.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/main/java/com/example/demo/exception/ErrorResponse.java diff --git a/src/main/java/com/example/demo/exception/ErrorResponse.java b/src/main/java/com/example/demo/exception/ErrorResponse.java new file mode 100644 index 0000000..43d4b61 --- /dev/null +++ b/src/main/java/com/example/demo/exception/ErrorResponse.java @@ -0,0 +1,4 @@ +package com.example.demo.exception; + +public record ErrorResponse(String status, String message) { +} From 167fd5c35f4897fc50f8a4329f7677cc0eea7390 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Sun, 2 Jun 2024 19:08:07 +0900 Subject: [PATCH 09/62] =?UTF-8?q?feat:=20GlobalExceptionHandler=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/GlobalExceptionHandler.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/main/java/com/example/demo/exception/GlobalExceptionHandler.java diff --git a/src/main/java/com/example/demo/exception/GlobalExceptionHandler.java b/src/main/java/com/example/demo/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..162c584 --- /dev/null +++ b/src/main/java/com/example/demo/exception/GlobalExceptionHandler.java @@ -0,0 +1,19 @@ +package com.example.demo.exception; + +import com.example.demo.exception.error.ErrorCode; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; + +@RestControllerAdvice +public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { + + @ExceptionHandler(RestApiException.class) + public ResponseEntity handleCustomException(RestApiException e) { + ErrorCode errorCode = e.getErrorCode(); + ErrorResponse rsp = new ErrorResponse(errorCode.getHttpStatus().toString(), errorCode.getMessage()); + return ResponseEntity.status(errorCode.getHttpStatus()).body(rsp); + } + +} From 4e57ccf957211bae777a116946153116a4bfe67c Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Sun, 2 Jun 2024 19:31:00 +0900 Subject: [PATCH 10/62] =?UTF-8?q?refactor:=20handleCustomException=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/demo/exception/GlobalExceptionHandler.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/demo/exception/GlobalExceptionHandler.java b/src/main/java/com/example/demo/exception/GlobalExceptionHandler.java index 162c584..fd24165 100644 --- a/src/main/java/com/example/demo/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/example/demo/exception/GlobalExceptionHandler.java @@ -12,7 +12,15 @@ public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { @ExceptionHandler(RestApiException.class) public ResponseEntity handleCustomException(RestApiException e) { ErrorCode errorCode = e.getErrorCode(); - ErrorResponse rsp = new ErrorResponse(errorCode.getHttpStatus().toString(), errorCode.getMessage()); + return handleExceptionInternal(errorCode); + } + + private ErrorResponse makeErrorResponse(ErrorCode errorCode) { + return new ErrorResponse(errorCode.getHttpStatus().toString(), errorCode.getMessage()); + } + + private ResponseEntity handleExceptionInternal(ErrorCode errorCode) { + ErrorResponse rsp = makeErrorResponse(errorCode); return ResponseEntity.status(errorCode.getHttpStatus()).body(rsp); } From 100b4df2894536f68aaf956a452581cb91008303 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Sun, 2 Jun 2024 19:33:24 +0900 Subject: [PATCH 11/62] =?UTF-8?q?feat:=20handleEmptyResultException=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/demo/exception/GlobalExceptionHandler.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/com/example/demo/exception/GlobalExceptionHandler.java b/src/main/java/com/example/demo/exception/GlobalExceptionHandler.java index fd24165..7066bb7 100644 --- a/src/main/java/com/example/demo/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/example/demo/exception/GlobalExceptionHandler.java @@ -1,6 +1,8 @@ package com.example.demo.exception; +import com.example.demo.exception.error.CommonErrorCode; import com.example.demo.exception.error.ErrorCode; +import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; @@ -15,6 +17,12 @@ public ResponseEntity handleCustomException(RestApiException e) { return handleExceptionInternal(errorCode); } + @ExceptionHandler(EmptyResultDataAccessException.class) + public ResponseEntity handleEmptyResultException(EmptyResultDataAccessException e){ + ErrorCode errorCode = CommonErrorCode.RESOURCE_NOT_FOUND; + return handleExceptionInternal(errorCode); + } + private ErrorResponse makeErrorResponse(ErrorCode errorCode) { return new ErrorResponse(errorCode.getHttpStatus().toString(), errorCode.getMessage()); } From 4e257c0072d47130bb45d9f37db963c0255bfd9d Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Sun, 2 Jun 2024 20:43:47 +0900 Subject: [PATCH 12/62] =?UTF-8?q?feat:=20from=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/dto/response/ArticleResponse.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/com/example/demo/controller/dto/response/ArticleResponse.java b/src/main/java/com/example/demo/controller/dto/response/ArticleResponse.java index 65f048f..4763762 100644 --- a/src/main/java/com/example/demo/controller/dto/response/ArticleResponse.java +++ b/src/main/java/com/example/demo/controller/dto/response/ArticleResponse.java @@ -35,4 +35,16 @@ public static ArticleResponse of(Article article, Member member, Board board) { article.getModifiedAt() ); } + + public static ArticleResponse from(Article article) { + return new ArticleResponse( + article.getId(), + article.getAuthorId(), + article.getBoardId(), + article.getTitle(), + article.getContent(), + article.getCreatedAt(), + article.getModifiedAt() + ); + } } From 8b32f218ecb8a730b1dc6730e15ad75d379cb9a2 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Sun, 2 Jun 2024 20:44:03 +0900 Subject: [PATCH 13/62] =?UTF-8?q?feat:=20getArticles=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/demo/service/ArticleService.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/com/example/demo/service/ArticleService.java b/src/main/java/com/example/demo/service/ArticleService.java index 7f8610b..e59bf63 100644 --- a/src/main/java/com/example/demo/service/ArticleService.java +++ b/src/main/java/com/example/demo/service/ArticleService.java @@ -2,6 +2,7 @@ import java.util.List; +import com.example.demo.controller.dto.response.BoardResponse; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -33,6 +34,12 @@ public ArticleService( this.boardRepository = boardRepository; } + public List getArticles() { + return articleRepository.findAll().stream() + .map(ArticleResponse::from) + .toList(); + } + public ArticleResponse getById(Long id) { Article article = articleRepository.findById(id); Member member = memberRepository.findById(article.getAuthorId()); From b0504424bd743091602880ccdca8ee07043a5a8e Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Sun, 2 Jun 2024 20:53:35 +0900 Subject: [PATCH 14/62] =?UTF-8?q?feat:=20=EC=A1=B0=ED=9A=8C=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=EC=B2=98=EB=A6=AC=20controller=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/demo/controller/ArticleController.java | 6 ++++++ .../java/com/example/demo/controller/BoardController.java | 5 +++++ .../java/com/example/demo/controller/MemberController.java | 5 +++++ .../com/example/demo/exception/GlobalExceptionHandler.java | 7 +------ 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/demo/controller/ArticleController.java b/src/main/java/com/example/demo/controller/ArticleController.java index b28e4dd..5bab135 100644 --- a/src/main/java/com/example/demo/controller/ArticleController.java +++ b/src/main/java/com/example/demo/controller/ArticleController.java @@ -3,6 +3,9 @@ import java.net.URI; import java.util.List; +import com.example.demo.exception.RestApiException; +import com.example.demo.exception.error.CommonErrorCode; +import com.example.demo.service.BoardService; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -39,6 +42,9 @@ public ResponseEntity> getArticles( public ResponseEntity getArticle( @PathVariable Long id ) { + if (articleService.getArticles().stream().noneMatch(res -> res.id().equals(id))) { + throw new RestApiException(CommonErrorCode.RESOURCE_NOT_FOUND); + } ArticleResponse response = articleService.getById(id); return ResponseEntity.ok(response); } diff --git a/src/main/java/com/example/demo/controller/BoardController.java b/src/main/java/com/example/demo/controller/BoardController.java index ada81dc..7485bf8 100644 --- a/src/main/java/com/example/demo/controller/BoardController.java +++ b/src/main/java/com/example/demo/controller/BoardController.java @@ -2,6 +2,8 @@ import java.util.List; +import com.example.demo.exception.RestApiException; +import com.example.demo.exception.error.CommonErrorCode; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -34,6 +36,9 @@ public List getBoards() { public BoardResponse getBoard( @PathVariable Long id ) { + if (boardService.getBoards().stream().noneMatch(res -> res.id().equals(id))) { + throw new RestApiException(CommonErrorCode.RESOURCE_NOT_FOUND); + } return boardService.getBoardById(id); } diff --git a/src/main/java/com/example/demo/controller/MemberController.java b/src/main/java/com/example/demo/controller/MemberController.java index ddb18ec..e937404 100644 --- a/src/main/java/com/example/demo/controller/MemberController.java +++ b/src/main/java/com/example/demo/controller/MemberController.java @@ -2,6 +2,8 @@ import java.util.List; +import com.example.demo.exception.RestApiException; +import com.example.demo.exception.error.CommonErrorCode; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -35,6 +37,9 @@ public ResponseEntity> getMembers() { public ResponseEntity getMember( @PathVariable Long id ) { + if (memberService.getAll().stream().noneMatch(res -> res.id().equals(id))) { + throw new RestApiException(CommonErrorCode.RESOURCE_NOT_FOUND); + } MemberResponse response = memberService.getById(id); return ResponseEntity.ok(response); } diff --git a/src/main/java/com/example/demo/exception/GlobalExceptionHandler.java b/src/main/java/com/example/demo/exception/GlobalExceptionHandler.java index 7066bb7..1e10674 100644 --- a/src/main/java/com/example/demo/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/example/demo/exception/GlobalExceptionHandler.java @@ -2,6 +2,7 @@ import com.example.demo.exception.error.CommonErrorCode; import com.example.demo.exception.error.ErrorCode; +import org.springframework.dao.DataAccessException; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; @@ -17,12 +18,6 @@ public ResponseEntity handleCustomException(RestApiException e) { return handleExceptionInternal(errorCode); } - @ExceptionHandler(EmptyResultDataAccessException.class) - public ResponseEntity handleEmptyResultException(EmptyResultDataAccessException e){ - ErrorCode errorCode = CommonErrorCode.RESOURCE_NOT_FOUND; - return handleExceptionInternal(errorCode); - } - private ErrorResponse makeErrorResponse(ErrorCode errorCode) { return new ErrorResponse(errorCode.getHttpStatus().toString(), errorCode.getMessage()); } From ef348a10f073c6614aac0366ece3140abce4982f Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Sun, 2 Jun 2024 21:19:52 +0900 Subject: [PATCH 15/62] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo/controller/MemberController.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/example/demo/controller/MemberController.java b/src/main/java/com/example/demo/controller/MemberController.java index e937404..36ce6d8 100644 --- a/src/main/java/com/example/demo/controller/MemberController.java +++ b/src/main/java/com/example/demo/controller/MemberController.java @@ -4,6 +4,7 @@ import com.example.demo.exception.RestApiException; import com.example.demo.exception.error.CommonErrorCode; +import com.example.demo.exception.error.MemberErrorCode; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -35,7 +36,7 @@ public ResponseEntity> getMembers() { @GetMapping("/members/{id}") public ResponseEntity getMember( - @PathVariable Long id + @PathVariable Long id ) { if (memberService.getAll().stream().noneMatch(res -> res.id().equals(id))) { throw new RestApiException(CommonErrorCode.RESOURCE_NOT_FOUND); @@ -46,7 +47,7 @@ public ResponseEntity getMember( @PostMapping("/members") public ResponseEntity create( - @RequestBody MemberCreateRequest request + @RequestBody MemberCreateRequest request ) { MemberResponse response = memberService.create(request); return ResponseEntity.ok(response); @@ -54,16 +55,22 @@ public ResponseEntity create( @PutMapping("/members/{id}") public ResponseEntity updateMember( - @PathVariable Long id, - @RequestBody MemberUpdateRequest request + @PathVariable Long id, + @RequestBody MemberUpdateRequest request ) { + if (memberService.getAll() + .stream() + .filter(res -> !res.id().equals(id)) + .anyMatch(res -> res.email().equals(request.email()))) { + throw new RestApiException(MemberErrorCode.EMAIL_CONFLICT); + } MemberResponse response = memberService.update(id, request); return ResponseEntity.ok(response); } @DeleteMapping("/members/{id}") public ResponseEntity deleteMember( - @PathVariable Long id + @PathVariable Long id ) { memberService.delete(id); return ResponseEntity.noContent().build(); From 43e903e120ce66a31774c52f3cfcea467cc800f0 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Sun, 2 Jun 2024 21:32:47 +0900 Subject: [PATCH 16/62] =?UTF-8?q?feat:=20=EA=B2=8C=EC=8B=9C=EB=AC=BC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo/controller/ArticleController.java | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/example/demo/controller/ArticleController.java b/src/main/java/com/example/demo/controller/ArticleController.java index 5bab135..6cefcdb 100644 --- a/src/main/java/com/example/demo/controller/ArticleController.java +++ b/src/main/java/com/example/demo/controller/ArticleController.java @@ -4,8 +4,11 @@ import java.util.List; import com.example.demo.exception.RestApiException; +import com.example.demo.exception.error.ArticleErrorCode; import com.example.demo.exception.error.CommonErrorCode; import com.example.demo.service.BoardService; +import com.example.demo.service.MemberService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -25,14 +28,18 @@ public class ArticleController { private final ArticleService articleService; + private final MemberService memberService; + private final BoardService boardService; - public ArticleController(ArticleService articleService) { + public ArticleController(ArticleService articleService, MemberService memberService, BoardService boardService) { this.articleService = articleService; + this.memberService = memberService; + this.boardService = boardService; } @GetMapping("/articles") public ResponseEntity> getArticles( - @RequestParam Long boardId + @RequestParam Long boardId ) { List response = articleService.getByBoardId(boardId); return ResponseEntity.ok(response); @@ -40,9 +47,11 @@ public ResponseEntity> getArticles( @GetMapping("/articles/{id}") public ResponseEntity getArticle( - @PathVariable Long id + @PathVariable Long id ) { - if (articleService.getArticles().stream().noneMatch(res -> res.id().equals(id))) { + if (articleService.getArticles() + .stream() + .noneMatch(res -> res.id().equals(id))) { throw new RestApiException(CommonErrorCode.RESOURCE_NOT_FOUND); } ArticleResponse response = articleService.getById(id); @@ -51,7 +60,7 @@ public ResponseEntity getArticle( @PostMapping("/articles") public ResponseEntity crateArticle( - @RequestBody ArticleCreateRequest request + @RequestBody ArticleCreateRequest request ) { ArticleResponse response = articleService.create(request); return ResponseEntity.created(URI.create("/articles/" + response.id())).body(response); @@ -59,16 +68,21 @@ public ResponseEntity crateArticle( @PutMapping("/articles/{id}") public ResponseEntity updateArticle( - @PathVariable Long id, - @RequestBody ArticleUpdateRequest request + @PathVariable Long id, + @RequestBody ArticleUpdateRequest request ) { + if (boardService.getBoards() + .stream() + .noneMatch(res -> res.id().equals(request.boardId()))) { + throw new RestApiException(ArticleErrorCode.REFERENCE_ERROR); + } ArticleResponse response = articleService.update(id, request); return ResponseEntity.ok(response); } @DeleteMapping("/articles/{id}") public ResponseEntity updateArticle( - @PathVariable Long id + @PathVariable Long id ) { articleService.delete(id); return ResponseEntity.noContent().build(); From 78042a1641c40b13563f9d38d81a81e93186df2e Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Sun, 2 Jun 2024 21:43:01 +0900 Subject: [PATCH 17/62] =?UTF-8?q?feat:=20=EA=B3=B5=ED=86=B5=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=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 --- .../com/example/demo/controller/ArticleController.java | 7 +++++++ .../java/com/example/demo/controller/BoardController.java | 3 +++ .../java/com/example/demo/controller/MemberController.java | 6 ++++++ 3 files changed, 16 insertions(+) diff --git a/src/main/java/com/example/demo/controller/ArticleController.java b/src/main/java/com/example/demo/controller/ArticleController.java index 6cefcdb..b3e8451 100644 --- a/src/main/java/com/example/demo/controller/ArticleController.java +++ b/src/main/java/com/example/demo/controller/ArticleController.java @@ -62,6 +62,13 @@ public ResponseEntity getArticle( public ResponseEntity crateArticle( @RequestBody ArticleCreateRequest request ) { + boolean isNullExistence = request.boardId() == null + || request.authorId() == null + || request.title() == null + || request.description() == null; + if (isNullExistence) { + throw new RestApiException(CommonErrorCode.NULL_PARAMETER); + } ArticleResponse response = articleService.create(request); return ResponseEntity.created(URI.create("/articles/" + response.id())).body(response); } diff --git a/src/main/java/com/example/demo/controller/BoardController.java b/src/main/java/com/example/demo/controller/BoardController.java index 7485bf8..2642fb9 100644 --- a/src/main/java/com/example/demo/controller/BoardController.java +++ b/src/main/java/com/example/demo/controller/BoardController.java @@ -46,6 +46,9 @@ public BoardResponse getBoard( public BoardResponse createBoard( @RequestBody BoardCreateRequest request ) { + if (request.name() == null) { + throw new RestApiException(CommonErrorCode.NULL_PARAMETER); + } return boardService.createBoard(request); } diff --git a/src/main/java/com/example/demo/controller/MemberController.java b/src/main/java/com/example/demo/controller/MemberController.java index 36ce6d8..659d7e3 100644 --- a/src/main/java/com/example/demo/controller/MemberController.java +++ b/src/main/java/com/example/demo/controller/MemberController.java @@ -49,6 +49,12 @@ public ResponseEntity getMember( public ResponseEntity create( @RequestBody MemberCreateRequest request ) { + boolean isNullExistence = request.name() == null + || request.email() == null + || request.password() == null; + if (isNullExistence) { + throw new RestApiException(CommonErrorCode.NULL_PARAMETER); + } MemberResponse response = memberService.create(request); return ResponseEntity.ok(response); } From bfaca10edd0f5e30815d16e536af41686c15d5ec Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Sun, 2 Jun 2024 21:50:00 +0900 Subject: [PATCH 18/62] =?UTF-8?q?feat:=20=EA=B2=8C=EC=8B=9C=EB=AC=BC=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/demo/controller/ArticleController.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/com/example/demo/controller/ArticleController.java b/src/main/java/com/example/demo/controller/ArticleController.java index b3e8451..e0cec23 100644 --- a/src/main/java/com/example/demo/controller/ArticleController.java +++ b/src/main/java/com/example/demo/controller/ArticleController.java @@ -69,6 +69,14 @@ public ResponseEntity crateArticle( if (isNullExistence) { throw new RestApiException(CommonErrorCode.NULL_PARAMETER); } + if (boardService.getBoards() + .stream() + .noneMatch(res -> res.id().equals(request.boardId())) + || memberService.getAll() + .stream() + .noneMatch(res -> res.id().equals(request.authorId()))) { + throw new RestApiException(ArticleErrorCode.REFERENCE_ERROR); + } ArticleResponse response = articleService.create(request); return ResponseEntity.created(URI.create("/articles/" + response.id())).body(response); } From 9169d559dd1c079c489a738adaa3b8b5ef6ed4db Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Sun, 2 Jun 2024 21:56:10 +0900 Subject: [PATCH 19/62] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/demo/controller/MemberController.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/demo/controller/MemberController.java b/src/main/java/com/example/demo/controller/MemberController.java index 659d7e3..e0196dd 100644 --- a/src/main/java/com/example/demo/controller/MemberController.java +++ b/src/main/java/com/example/demo/controller/MemberController.java @@ -5,6 +5,7 @@ import com.example.demo.exception.RestApiException; import com.example.demo.exception.error.CommonErrorCode; import com.example.demo.exception.error.MemberErrorCode; +import com.example.demo.service.ArticleService; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -23,9 +24,11 @@ public class MemberController { private final MemberService memberService; + private final ArticleService articleService; - public MemberController(MemberService memberService) { + public MemberController(MemberService memberService, ArticleService articleService) { this.memberService = memberService; + this.articleService = articleService; } @GetMapping("/members") @@ -78,6 +81,11 @@ public ResponseEntity updateMember( public ResponseEntity deleteMember( @PathVariable Long id ) { + if (articleService.getArticles() + .stream() + .anyMatch(res -> res.authorId().equals(id))) { + throw new RestApiException(MemberErrorCode.ARTICLE_EXISTENCE); + } memberService.delete(id); return ResponseEntity.noContent().build(); } From dfe66270bd8d90ca902d926d45214f4afd5884d0 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Sun, 2 Jun 2024 21:57:44 +0900 Subject: [PATCH 20/62] =?UTF-8?q?feat:=20=EA=B2=8C=EC=8B=9C=ED=8C=90=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/demo/controller/BoardController.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/demo/controller/BoardController.java b/src/main/java/com/example/demo/controller/BoardController.java index 2642fb9..7253220 100644 --- a/src/main/java/com/example/demo/controller/BoardController.java +++ b/src/main/java/com/example/demo/controller/BoardController.java @@ -3,7 +3,10 @@ import java.util.List; import com.example.demo.exception.RestApiException; +import com.example.demo.exception.error.BoardErrorCode; import com.example.demo.exception.error.CommonErrorCode; +import com.example.demo.exception.error.MemberErrorCode; +import com.example.demo.service.ArticleService; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -22,9 +25,11 @@ public class BoardController { private final BoardService boardService; + private final ArticleService articleService; - public BoardController(BoardService boardService) { + public BoardController(BoardService boardService, ArticleService articleService) { this.boardService = boardService; + this.articleService = articleService; } @GetMapping("/boards") @@ -64,6 +69,11 @@ public BoardResponse updateBoard( public ResponseEntity deleteBoard( @PathVariable Long id ) { + if (articleService.getArticles() + .stream() + .anyMatch(res -> res.boardId().equals(id))) { + throw new RestApiException(BoardErrorCode.ARTICLE_EXISTENCE); + } boardService.deleteBoard(id); return ResponseEntity.noContent().build(); } From 0dbe606010edf88ced78e09db26a62583ef3c16a Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Sun, 2 Jun 2024 21:58:30 +0900 Subject: [PATCH 21/62] =?UTF-8?q?style:=20import=20=EC=B5=9C=EC=A0=81?= =?UTF-8?q?=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo/controller/ArticleController.java | 23 ++++++------------- .../demo/controller/BoardController.java | 20 +++++----------- .../demo/controller/MemberController.java | 19 +++++---------- .../dto/response/ArticleResponse.java | 4 ++-- .../exception/GlobalExceptionHandler.java | 3 --- .../demo/repository/ArticleRepository.java | 4 ++-- .../repository/ArticleRepositoryJdbc.java | 7 +++--- .../repository/ArticleRepositoryMemory.java | 4 ++-- .../demo/repository/BoardRepository.java | 4 ++-- .../demo/repository/BoardRepositoryJdbc.java | 7 +++--- .../repository/BoardRepositoryMemory.java | 4 ++-- .../demo/repository/MemberRepository.java | 4 ++-- .../demo/repository/MemberRepositoryJdbc.java | 7 +++--- .../repository/MemberRepositoryMemory.java | 4 ++-- .../example/demo/service/ArticleService.java | 12 ++++------ .../example/demo/service/BoardService.java | 9 ++++---- .../example/demo/service/MemberService.java | 9 ++++---- src/main/resources/application.yml | 6 ----- 18 files changed, 55 insertions(+), 95 deletions(-) delete mode 100644 src/main/resources/application.yml diff --git a/src/main/java/com/example/demo/controller/ArticleController.java b/src/main/java/com/example/demo/controller/ArticleController.java index e0cec23..aad06f0 100644 --- a/src/main/java/com/example/demo/controller/ArticleController.java +++ b/src/main/java/com/example/demo/controller/ArticleController.java @@ -1,28 +1,19 @@ package com.example.demo.controller; -import java.net.URI; -import java.util.List; - +import com.example.demo.controller.dto.request.ArticleCreateRequest; +import com.example.demo.controller.dto.request.ArticleUpdateRequest; +import com.example.demo.controller.dto.response.ArticleResponse; import com.example.demo.exception.RestApiException; import com.example.demo.exception.error.ArticleErrorCode; import com.example.demo.exception.error.CommonErrorCode; +import com.example.demo.service.ArticleService; import com.example.demo.service.BoardService; import com.example.demo.service.MemberService; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; -import com.example.demo.controller.dto.request.ArticleCreateRequest; -import com.example.demo.controller.dto.response.ArticleResponse; -import com.example.demo.controller.dto.request.ArticleUpdateRequest; -import com.example.demo.service.ArticleService; +import java.net.URI; +import java.util.List; @RestController public class ArticleController { diff --git a/src/main/java/com/example/demo/controller/BoardController.java b/src/main/java/com/example/demo/controller/BoardController.java index 7253220..59a44b5 100644 --- a/src/main/java/com/example/demo/controller/BoardController.java +++ b/src/main/java/com/example/demo/controller/BoardController.java @@ -1,25 +1,17 @@ package com.example.demo.controller; -import java.util.List; - +import com.example.demo.controller.dto.request.BoardCreateRequest; +import com.example.demo.controller.dto.request.BoardUpdateRequest; +import com.example.demo.controller.dto.response.BoardResponse; import com.example.demo.exception.RestApiException; import com.example.demo.exception.error.BoardErrorCode; import com.example.demo.exception.error.CommonErrorCode; -import com.example.demo.exception.error.MemberErrorCode; import com.example.demo.service.ArticleService; +import com.example.demo.service.BoardService; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; -import com.example.demo.controller.dto.request.BoardCreateRequest; -import com.example.demo.controller.dto.request.BoardUpdateRequest; -import com.example.demo.controller.dto.response.BoardResponse; -import com.example.demo.service.BoardService; +import java.util.List; @RestController public class BoardController { diff --git a/src/main/java/com/example/demo/controller/MemberController.java b/src/main/java/com/example/demo/controller/MemberController.java index e0196dd..201bcdf 100644 --- a/src/main/java/com/example/demo/controller/MemberController.java +++ b/src/main/java/com/example/demo/controller/MemberController.java @@ -1,24 +1,17 @@ package com.example.demo.controller; -import java.util.List; - +import com.example.demo.controller.dto.request.MemberCreateRequest; +import com.example.demo.controller.dto.request.MemberUpdateRequest; +import com.example.demo.controller.dto.response.MemberResponse; import com.example.demo.exception.RestApiException; import com.example.demo.exception.error.CommonErrorCode; import com.example.demo.exception.error.MemberErrorCode; import com.example.demo.service.ArticleService; +import com.example.demo.service.MemberService; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; -import com.example.demo.controller.dto.request.MemberCreateRequest; -import com.example.demo.controller.dto.request.MemberUpdateRequest; -import com.example.demo.controller.dto.response.MemberResponse; -import com.example.demo.service.MemberService; +import java.util.List; @RestController public class MemberController { diff --git a/src/main/java/com/example/demo/controller/dto/response/ArticleResponse.java b/src/main/java/com/example/demo/controller/dto/response/ArticleResponse.java index 4763762..c10f949 100644 --- a/src/main/java/com/example/demo/controller/dto/response/ArticleResponse.java +++ b/src/main/java/com/example/demo/controller/dto/response/ArticleResponse.java @@ -1,7 +1,5 @@ package com.example.demo.controller.dto.response; -import java.time.LocalDateTime; - import com.example.demo.domain.Article; import com.example.demo.domain.Board; import com.example.demo.domain.Member; @@ -9,6 +7,8 @@ import com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy; import com.fasterxml.jackson.databind.annotation.JsonNaming; +import java.time.LocalDateTime; + @JsonNaming(SnakeCaseStrategy.class) public record ArticleResponse( Long id, diff --git a/src/main/java/com/example/demo/exception/GlobalExceptionHandler.java b/src/main/java/com/example/demo/exception/GlobalExceptionHandler.java index 1e10674..fd24165 100644 --- a/src/main/java/com/example/demo/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/example/demo/exception/GlobalExceptionHandler.java @@ -1,9 +1,6 @@ package com.example.demo.exception; -import com.example.demo.exception.error.CommonErrorCode; import com.example.demo.exception.error.ErrorCode; -import org.springframework.dao.DataAccessException; -import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; diff --git a/src/main/java/com/example/demo/repository/ArticleRepository.java b/src/main/java/com/example/demo/repository/ArticleRepository.java index be3ebd4..88e476e 100644 --- a/src/main/java/com/example/demo/repository/ArticleRepository.java +++ b/src/main/java/com/example/demo/repository/ArticleRepository.java @@ -1,9 +1,9 @@ package com.example.demo.repository; -import java.util.List; - import com.example.demo.domain.Article; +import java.util.List; + public interface ArticleRepository { List
findAll(); diff --git a/src/main/java/com/example/demo/repository/ArticleRepositoryJdbc.java b/src/main/java/com/example/demo/repository/ArticleRepositoryJdbc.java index c9a272e..6cbb20d 100644 --- a/src/main/java/com/example/demo/repository/ArticleRepositoryJdbc.java +++ b/src/main/java/com/example/demo/repository/ArticleRepositoryJdbc.java @@ -1,15 +1,14 @@ package com.example.demo.repository; -import java.sql.PreparedStatement; -import java.util.List; - +import com.example.demo.domain.Article; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; -import com.example.demo.domain.Article; +import java.sql.PreparedStatement; +import java.util.List; @Repository public class ArticleRepositoryJdbc implements ArticleRepository { diff --git a/src/main/java/com/example/demo/repository/ArticleRepositoryMemory.java b/src/main/java/com/example/demo/repository/ArticleRepositoryMemory.java index 13ba78b..5a7b0c2 100644 --- a/src/main/java/com/example/demo/repository/ArticleRepositoryMemory.java +++ b/src/main/java/com/example/demo/repository/ArticleRepositoryMemory.java @@ -1,12 +1,12 @@ package com.example.demo.repository; +import com.example.demo.domain.Article; + import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicLong; -import com.example.demo.domain.Article; - public class ArticleRepositoryMemory implements ArticleRepository { private static final Map articles = new HashMap<>(); diff --git a/src/main/java/com/example/demo/repository/BoardRepository.java b/src/main/java/com/example/demo/repository/BoardRepository.java index cc2dfd0..c3d155d 100644 --- a/src/main/java/com/example/demo/repository/BoardRepository.java +++ b/src/main/java/com/example/demo/repository/BoardRepository.java @@ -1,9 +1,9 @@ package com.example.demo.repository; -import java.util.List; - import com.example.demo.domain.Board; +import java.util.List; + public interface BoardRepository { List findAll(); diff --git a/src/main/java/com/example/demo/repository/BoardRepositoryJdbc.java b/src/main/java/com/example/demo/repository/BoardRepositoryJdbc.java index c4fd6f6..831c1bf 100644 --- a/src/main/java/com/example/demo/repository/BoardRepositoryJdbc.java +++ b/src/main/java/com/example/demo/repository/BoardRepositoryJdbc.java @@ -1,15 +1,14 @@ package com.example.demo.repository; -import java.sql.PreparedStatement; -import java.util.List; - +import com.example.demo.domain.Board; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; -import com.example.demo.domain.Board; +import java.sql.PreparedStatement; +import java.util.List; @Repository public class BoardRepositoryJdbc implements BoardRepository { diff --git a/src/main/java/com/example/demo/repository/BoardRepositoryMemory.java b/src/main/java/com/example/demo/repository/BoardRepositoryMemory.java index 8cf5ecf..24538d8 100644 --- a/src/main/java/com/example/demo/repository/BoardRepositoryMemory.java +++ b/src/main/java/com/example/demo/repository/BoardRepositoryMemory.java @@ -1,12 +1,12 @@ package com.example.demo.repository; +import com.example.demo.domain.Board; + import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicLong; -import com.example.demo.domain.Board; - public class BoardRepositoryMemory implements BoardRepository { private static final Map boards = new HashMap<>(); diff --git a/src/main/java/com/example/demo/repository/MemberRepository.java b/src/main/java/com/example/demo/repository/MemberRepository.java index 8e2ad14..94f16b1 100644 --- a/src/main/java/com/example/demo/repository/MemberRepository.java +++ b/src/main/java/com/example/demo/repository/MemberRepository.java @@ -1,9 +1,9 @@ package com.example.demo.repository; -import java.util.List; - import com.example.demo.domain.Member; +import java.util.List; + public interface MemberRepository { List findAll(); diff --git a/src/main/java/com/example/demo/repository/MemberRepositoryJdbc.java b/src/main/java/com/example/demo/repository/MemberRepositoryJdbc.java index 30d2262..e0a7795 100644 --- a/src/main/java/com/example/demo/repository/MemberRepositoryJdbc.java +++ b/src/main/java/com/example/demo/repository/MemberRepositoryJdbc.java @@ -1,15 +1,14 @@ package com.example.demo.repository; -import java.sql.PreparedStatement; -import java.util.List; - +import com.example.demo.domain.Member; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; -import com.example.demo.domain.Member; +import java.sql.PreparedStatement; +import java.util.List; @Repository public class MemberRepositoryJdbc implements MemberRepository { diff --git a/src/main/java/com/example/demo/repository/MemberRepositoryMemory.java b/src/main/java/com/example/demo/repository/MemberRepositoryMemory.java index b4cf722..3e6625b 100644 --- a/src/main/java/com/example/demo/repository/MemberRepositoryMemory.java +++ b/src/main/java/com/example/demo/repository/MemberRepositoryMemory.java @@ -1,12 +1,12 @@ package com.example.demo.repository; +import com.example.demo.domain.Member; + import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicLong; -import com.example.demo.domain.Member; - public class MemberRepositoryMemory implements MemberRepository { private static final Map members = new HashMap<>(); diff --git a/src/main/java/com/example/demo/service/ArticleService.java b/src/main/java/com/example/demo/service/ArticleService.java index e59bf63..a705990 100644 --- a/src/main/java/com/example/demo/service/ArticleService.java +++ b/src/main/java/com/example/demo/service/ArticleService.java @@ -1,20 +1,18 @@ package com.example.demo.service; -import java.util.List; - -import com.example.demo.controller.dto.response.BoardResponse; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - import com.example.demo.controller.dto.request.ArticleCreateRequest; -import com.example.demo.controller.dto.response.ArticleResponse; import com.example.demo.controller.dto.request.ArticleUpdateRequest; +import com.example.demo.controller.dto.response.ArticleResponse; import com.example.demo.domain.Article; import com.example.demo.domain.Board; import com.example.demo.domain.Member; import com.example.demo.repository.ArticleRepository; import com.example.demo.repository.BoardRepository; import com.example.demo.repository.MemberRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; @Service @Transactional(readOnly = true) diff --git a/src/main/java/com/example/demo/service/BoardService.java b/src/main/java/com/example/demo/service/BoardService.java index ffff891..4843a8b 100644 --- a/src/main/java/com/example/demo/service/BoardService.java +++ b/src/main/java/com/example/demo/service/BoardService.java @@ -1,15 +1,14 @@ package com.example.demo.service; -import java.util.List; - -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - import com.example.demo.controller.dto.request.BoardCreateRequest; import com.example.demo.controller.dto.request.BoardUpdateRequest; import com.example.demo.controller.dto.response.BoardResponse; import com.example.demo.domain.Board; import com.example.demo.repository.BoardRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; @Service @Transactional(readOnly = true) diff --git a/src/main/java/com/example/demo/service/MemberService.java b/src/main/java/com/example/demo/service/MemberService.java index 04c1bc8..3f05c9b 100644 --- a/src/main/java/com/example/demo/service/MemberService.java +++ b/src/main/java/com/example/demo/service/MemberService.java @@ -1,15 +1,14 @@ package com.example.demo.service; -import java.util.List; - -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - import com.example.demo.controller.dto.request.MemberCreateRequest; import com.example.demo.controller.dto.request.MemberUpdateRequest; import com.example.demo.controller.dto.response.MemberResponse; import com.example.demo.domain.Member; import com.example.demo.repository.MemberRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; @Service @Transactional(readOnly = true) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml deleted file mode 100644 index ff69a9e..0000000 --- a/src/main/resources/application.yml +++ /dev/null @@ -1,6 +0,0 @@ -spring: - datasource: - url: jdbc:mysql://localhost:3306/bcsd # 본인의 환경에 맞게 수정한다. - username: root # 본인의 환경에 맞게 수정한다. - password: qwer1234 # 본인의 환경에 맞게 수정한다. - driver-class-name: com.mysql.cj.jdbc.Driver From b60661c04584eaefb13b20444210c167a05ca5e8 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Thu, 6 Jun 2024 14:37:37 +0900 Subject: [PATCH 22/62] =?UTF-8?q?style:=20=EB=93=A4=EC=97=AC=EC=93=B0?= =?UTF-8?q?=EA=B8=B0=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/demo/controller/ArticleController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/demo/controller/ArticleController.java b/src/main/java/com/example/demo/controller/ArticleController.java index aad06f0..2a75c8b 100644 --- a/src/main/java/com/example/demo/controller/ArticleController.java +++ b/src/main/java/com/example/demo/controller/ArticleController.java @@ -63,7 +63,7 @@ public ResponseEntity crateArticle( if (boardService.getBoards() .stream() .noneMatch(res -> res.id().equals(request.boardId())) - || memberService.getAll() + || memberService.getAll() .stream() .noneMatch(res -> res.id().equals(request.authorId()))) { throw new RestApiException(ArticleErrorCode.REFERENCE_ERROR); From aaec70ed2b71708caec3ee08e3a9d80ae52bbbaf Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Thu, 6 Jun 2024 14:41:25 +0900 Subject: [PATCH 23/62] =?UTF-8?q?refactor:=20=EA=B3=B5=ED=86=B5=20mapping?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/demo/controller/ArticleController.java | 12 ++++++------ .../com/example/demo/controller/BoardController.java | 12 ++++++------ .../example/demo/controller/MemberController.java | 12 ++++++------ 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/example/demo/controller/ArticleController.java b/src/main/java/com/example/demo/controller/ArticleController.java index 2a75c8b..b8dae7c 100644 --- a/src/main/java/com/example/demo/controller/ArticleController.java +++ b/src/main/java/com/example/demo/controller/ArticleController.java @@ -15,7 +15,7 @@ import java.net.URI; import java.util.List; -@RestController +@RestController("/articles") public class ArticleController { private final ArticleService articleService; @@ -28,7 +28,7 @@ public ArticleController(ArticleService articleService, MemberService memberServ this.boardService = boardService; } - @GetMapping("/articles") + @GetMapping() public ResponseEntity> getArticles( @RequestParam Long boardId ) { @@ -36,7 +36,7 @@ public ResponseEntity> getArticles( return ResponseEntity.ok(response); } - @GetMapping("/articles/{id}") + @GetMapping("/{id}") public ResponseEntity getArticle( @PathVariable Long id ) { @@ -49,7 +49,7 @@ public ResponseEntity getArticle( return ResponseEntity.ok(response); } - @PostMapping("/articles") + @PostMapping() public ResponseEntity crateArticle( @RequestBody ArticleCreateRequest request ) { @@ -72,7 +72,7 @@ public ResponseEntity crateArticle( return ResponseEntity.created(URI.create("/articles/" + response.id())).body(response); } - @PutMapping("/articles/{id}") + @PutMapping("/{id}") public ResponseEntity updateArticle( @PathVariable Long id, @RequestBody ArticleUpdateRequest request @@ -86,7 +86,7 @@ public ResponseEntity updateArticle( return ResponseEntity.ok(response); } - @DeleteMapping("/articles/{id}") + @DeleteMapping("/{id}") public ResponseEntity updateArticle( @PathVariable Long id ) { diff --git a/src/main/java/com/example/demo/controller/BoardController.java b/src/main/java/com/example/demo/controller/BoardController.java index 59a44b5..34ed434 100644 --- a/src/main/java/com/example/demo/controller/BoardController.java +++ b/src/main/java/com/example/demo/controller/BoardController.java @@ -13,7 +13,7 @@ import java.util.List; -@RestController +@RestController("/boards") public class BoardController { private final BoardService boardService; @@ -24,12 +24,12 @@ public BoardController(BoardService boardService, ArticleService articleService) this.articleService = articleService; } - @GetMapping("/boards") + @GetMapping() public List getBoards() { return boardService.getBoards(); } - @GetMapping("/boards/{id}") + @GetMapping("/{id}") public BoardResponse getBoard( @PathVariable Long id ) { @@ -39,7 +39,7 @@ public BoardResponse getBoard( return boardService.getBoardById(id); } - @PostMapping("/boards") + @PostMapping() public BoardResponse createBoard( @RequestBody BoardCreateRequest request ) { @@ -49,7 +49,7 @@ public BoardResponse createBoard( return boardService.createBoard(request); } - @PutMapping("/boards/{id}") + @PutMapping("/{id}") public BoardResponse updateBoard( @PathVariable Long id, @RequestBody BoardUpdateRequest updateRequest @@ -57,7 +57,7 @@ public BoardResponse updateBoard( return boardService.update(id, updateRequest); } - @DeleteMapping("/boards/{id}") + @DeleteMapping("/{id}") public ResponseEntity deleteBoard( @PathVariable Long id ) { diff --git a/src/main/java/com/example/demo/controller/MemberController.java b/src/main/java/com/example/demo/controller/MemberController.java index 201bcdf..a56ff2c 100644 --- a/src/main/java/com/example/demo/controller/MemberController.java +++ b/src/main/java/com/example/demo/controller/MemberController.java @@ -13,7 +13,7 @@ import java.util.List; -@RestController +@RestController("/members") public class MemberController { private final MemberService memberService; @@ -24,13 +24,13 @@ public MemberController(MemberService memberService, ArticleService articleServi this.articleService = articleService; } - @GetMapping("/members") + @GetMapping() public ResponseEntity> getMembers() { List response = memberService.getAll(); return ResponseEntity.ok(response); } - @GetMapping("/members/{id}") + @GetMapping("/{id}") public ResponseEntity getMember( @PathVariable Long id ) { @@ -41,7 +41,7 @@ public ResponseEntity getMember( return ResponseEntity.ok(response); } - @PostMapping("/members") + @PostMapping() public ResponseEntity create( @RequestBody MemberCreateRequest request ) { @@ -55,7 +55,7 @@ public ResponseEntity create( return ResponseEntity.ok(response); } - @PutMapping("/members/{id}") + @PutMapping("/{id}") public ResponseEntity updateMember( @PathVariable Long id, @RequestBody MemberUpdateRequest request @@ -70,7 +70,7 @@ public ResponseEntity updateMember( return ResponseEntity.ok(response); } - @DeleteMapping("/members/{id}") + @DeleteMapping("/{id}") public ResponseEntity deleteMember( @PathVariable Long id ) { From efc13e2be0f7341f931900e7b0d07eb3deb516c1 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Thu, 6 Jun 2024 14:43:15 +0900 Subject: [PATCH 24/62] =?UTF-8?q?style:=20=EB=85=BC=EB=A6=AC=EC=8B=9D=20?= =?UTF-8?q?=EC=A1=B0=EA=B1=B4=EB=AC=B8=20=EC=82=BD=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo/controller/ArticleController.java | 42 ++++--------------- .../demo/controller/MemberController.java | 31 ++++---------- 2 files changed, 16 insertions(+), 57 deletions(-) diff --git a/src/main/java/com/example/demo/controller/ArticleController.java b/src/main/java/com/example/demo/controller/ArticleController.java index b8dae7c..85d5207 100644 --- a/src/main/java/com/example/demo/controller/ArticleController.java +++ b/src/main/java/com/example/demo/controller/ArticleController.java @@ -29,20 +29,14 @@ public ArticleController(ArticleService articleService, MemberService memberServ } @GetMapping() - public ResponseEntity> getArticles( - @RequestParam Long boardId - ) { + public ResponseEntity> getArticles(@RequestParam Long boardId) { List response = articleService.getByBoardId(boardId); return ResponseEntity.ok(response); } @GetMapping("/{id}") - public ResponseEntity getArticle( - @PathVariable Long id - ) { - if (articleService.getArticles() - .stream() - .noneMatch(res -> res.id().equals(id))) { + public ResponseEntity getArticle(@PathVariable Long id) { + if (articleService.getArticles().stream().noneMatch(res -> res.id().equals(id))) { throw new RestApiException(CommonErrorCode.RESOURCE_NOT_FOUND); } ArticleResponse response = articleService.getById(id); @@ -50,22 +44,11 @@ public ResponseEntity getArticle( } @PostMapping() - public ResponseEntity crateArticle( - @RequestBody ArticleCreateRequest request - ) { - boolean isNullExistence = request.boardId() == null - || request.authorId() == null - || request.title() == null - || request.description() == null; - if (isNullExistence) { + public ResponseEntity crateArticle(@RequestBody ArticleCreateRequest request) { + if (request.boardId() == null || request.authorId() == null || request.title() == null || request.description() == null) { throw new RestApiException(CommonErrorCode.NULL_PARAMETER); } - if (boardService.getBoards() - .stream() - .noneMatch(res -> res.id().equals(request.boardId())) - || memberService.getAll() - .stream() - .noneMatch(res -> res.id().equals(request.authorId()))) { + if (boardService.getBoards().stream().noneMatch(res -> res.id().equals(request.boardId())) || memberService.getAll().stream().noneMatch(res -> res.id().equals(request.authorId()))) { throw new RestApiException(ArticleErrorCode.REFERENCE_ERROR); } ArticleResponse response = articleService.create(request); @@ -73,13 +56,8 @@ public ResponseEntity crateArticle( } @PutMapping("/{id}") - public ResponseEntity updateArticle( - @PathVariable Long id, - @RequestBody ArticleUpdateRequest request - ) { - if (boardService.getBoards() - .stream() - .noneMatch(res -> res.id().equals(request.boardId()))) { + public ResponseEntity updateArticle(@PathVariable Long id, @RequestBody ArticleUpdateRequest request) { + if (boardService.getBoards().stream().noneMatch(res -> res.id().equals(request.boardId()))) { throw new RestApiException(ArticleErrorCode.REFERENCE_ERROR); } ArticleResponse response = articleService.update(id, request); @@ -87,9 +65,7 @@ public ResponseEntity updateArticle( } @DeleteMapping("/{id}") - public ResponseEntity updateArticle( - @PathVariable Long id - ) { + public ResponseEntity updateArticle(@PathVariable Long id) { articleService.delete(id); return ResponseEntity.noContent().build(); } diff --git a/src/main/java/com/example/demo/controller/MemberController.java b/src/main/java/com/example/demo/controller/MemberController.java index a56ff2c..46e3485 100644 --- a/src/main/java/com/example/demo/controller/MemberController.java +++ b/src/main/java/com/example/demo/controller/MemberController.java @@ -31,9 +31,7 @@ public ResponseEntity> getMembers() { } @GetMapping("/{id}") - public ResponseEntity getMember( - @PathVariable Long id - ) { + public ResponseEntity getMember(@PathVariable Long id) { if (memberService.getAll().stream().noneMatch(res -> res.id().equals(id))) { throw new RestApiException(CommonErrorCode.RESOURCE_NOT_FOUND); } @@ -42,13 +40,8 @@ public ResponseEntity getMember( } @PostMapping() - public ResponseEntity create( - @RequestBody MemberCreateRequest request - ) { - boolean isNullExistence = request.name() == null - || request.email() == null - || request.password() == null; - if (isNullExistence) { + public ResponseEntity create(@RequestBody MemberCreateRequest request) { + if (request.name() == null || request.email() == null || request.password() == null) { throw new RestApiException(CommonErrorCode.NULL_PARAMETER); } MemberResponse response = memberService.create(request); @@ -56,14 +49,8 @@ public ResponseEntity create( } @PutMapping("/{id}") - public ResponseEntity updateMember( - @PathVariable Long id, - @RequestBody MemberUpdateRequest request - ) { - if (memberService.getAll() - .stream() - .filter(res -> !res.id().equals(id)) - .anyMatch(res -> res.email().equals(request.email()))) { + public ResponseEntity updateMember(@PathVariable Long id, @RequestBody MemberUpdateRequest request) { + if (memberService.getAll().stream().filter(res -> !res.id().equals(id)).anyMatch(res -> res.email().equals(request.email()))) { throw new RestApiException(MemberErrorCode.EMAIL_CONFLICT); } MemberResponse response = memberService.update(id, request); @@ -71,12 +58,8 @@ public ResponseEntity updateMember( } @DeleteMapping("/{id}") - public ResponseEntity deleteMember( - @PathVariable Long id - ) { - if (articleService.getArticles() - .stream() - .anyMatch(res -> res.authorId().equals(id))) { + public ResponseEntity deleteMember(@PathVariable Long id) { + if (articleService.getArticles().stream().anyMatch(res -> res.authorId().equals(id))) { throw new RestApiException(MemberErrorCode.ARTICLE_EXISTENCE); } memberService.delete(id); From 47d00c746361acda08bb666ec3fe08f8392febaa Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Fri, 21 Jun 2024 18:39:59 +0900 Subject: [PATCH 25/62] =?UTF-8?q?fix:=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + .../java/com/example/demo/controller/ArticleController.java | 3 ++- src/main/java/com/example/demo/controller/BoardController.java | 3 ++- .../java/com/example/demo/controller/MemberController.java | 3 ++- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index c2065bc..0cb0fde 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ build/ !gradle/wrapper/gradle-wrapper.jar !**/src/main/**/build/ !**/src/test/**/build/ +!**/src/main/resources/application.yml ### STS ### .apt_generated diff --git a/src/main/java/com/example/demo/controller/ArticleController.java b/src/main/java/com/example/demo/controller/ArticleController.java index 85d5207..dc2694c 100644 --- a/src/main/java/com/example/demo/controller/ArticleController.java +++ b/src/main/java/com/example/demo/controller/ArticleController.java @@ -15,7 +15,8 @@ import java.net.URI; import java.util.List; -@RestController("/articles") +@RestController +@RequestMapping("/articles") public class ArticleController { private final ArticleService articleService; diff --git a/src/main/java/com/example/demo/controller/BoardController.java b/src/main/java/com/example/demo/controller/BoardController.java index 34ed434..edc4344 100644 --- a/src/main/java/com/example/demo/controller/BoardController.java +++ b/src/main/java/com/example/demo/controller/BoardController.java @@ -13,7 +13,8 @@ import java.util.List; -@RestController("/boards") +@RestController +@RequestMapping("/boards") public class BoardController { private final BoardService boardService; diff --git a/src/main/java/com/example/demo/controller/MemberController.java b/src/main/java/com/example/demo/controller/MemberController.java index 46e3485..0091ed9 100644 --- a/src/main/java/com/example/demo/controller/MemberController.java +++ b/src/main/java/com/example/demo/controller/MemberController.java @@ -13,7 +13,8 @@ import java.util.List; -@RestController("/members") +@RestController +@RequestMapping("/members") public class MemberController { private final MemberService memberService; From e74feed9e6b5896f5b06363638429e28521a891d Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 25 Jun 2024 13:30:25 +0900 Subject: [PATCH 26/62] =?UTF-8?q?feat:=20JPA=20=EC=9D=98=EC=A1=B4=EC=84=B1?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index 728ec9c..b6c0c0f 100644 --- a/build.gradle +++ b/build.gradle @@ -19,6 +19,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-jdbc' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' runtimeOnly 'com.mysql:mysql-connector-j' testImplementation 'org.springframework.boot:spring-boot-starter-test' } From 7f767253fbe8595d96061b64fbc6d728c32097d1 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 25 Jun 2024 13:31:38 +0900 Subject: [PATCH 27/62] refactor: refactor Article to Entity --- src/main/java/com/example/demo/domain/Article.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/com/example/demo/domain/Article.java b/src/main/java/com/example/demo/domain/Article.java index e0183db..dfaa2e8 100644 --- a/src/main/java/com/example/demo/domain/Article.java +++ b/src/main/java/com/example/demo/domain/Article.java @@ -1,17 +1,31 @@ package com.example.demo.domain; +import jakarta.persistence.*; + import java.time.LocalDateTime; +@Entity +@Table(name = "article") public class Article { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @Column(name = "author_id") private Long authorId; + @Column(name = "board_id") private Long boardId; + @Column(name = "title") private String title; + @Column(name = "content") private String content; + @Column(name = "created_date") private LocalDateTime createdAt; + @Column(name = "modified_date") private LocalDateTime modifiedAt; + public Article() {} + public Article( Long id, Long authorId, From a7b41c3ee7fd3726371139d4fe5c9052b9ba5baa Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 25 Jun 2024 13:34:29 +0900 Subject: [PATCH 28/62] refactor: refactor Board to Entity --- src/main/java/com/example/demo/domain/Board.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/com/example/demo/domain/Board.java b/src/main/java/com/example/demo/domain/Board.java index 992e2c6..5c99777 100644 --- a/src/main/java/com/example/demo/domain/Board.java +++ b/src/main/java/com/example/demo/domain/Board.java @@ -1,8 +1,15 @@ package com.example.demo.domain; +import jakarta.persistence.*; + +@Entity +@Table(name = "board") public class Board { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @Column(name = "name") private String name; public Board(Long id, String name) { @@ -14,6 +21,10 @@ public Board(String name) { this.name = name; } + public Board() { + + } + public Long getId() { return id; } From bbf44c69024f3dc89af32c52ecc63cf1c226cf5f Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 25 Jun 2024 13:34:36 +0900 Subject: [PATCH 29/62] refactor: refactor member to Entity --- src/main/java/com/example/demo/domain/Member.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/com/example/demo/domain/Member.java b/src/main/java/com/example/demo/domain/Member.java index fe80d6b..fcca1cf 100644 --- a/src/main/java/com/example/demo/domain/Member.java +++ b/src/main/java/com/example/demo/domain/Member.java @@ -1,10 +1,19 @@ package com.example.demo.domain; +import jakarta.persistence.*; + +@Entity +@Table(name = "member") public class Member { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @Column(name = "name") private String name; + @Column(name = "email") private String email; + @Column(name = "password") private String password; public Member(Long id, String name, String email, String password) { @@ -20,6 +29,10 @@ public Member(String name, String email, String password) { this.password = password; } + public Member() { + + } + public void update(String name, String email) { this.name = name; this.email = email; From 28ff372c30aab2b2055248ce34caf0bdca1c65b0 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 25 Jun 2024 14:44:44 +0900 Subject: [PATCH 30/62] refactor: refactor ArticleRepository impl --- .../ArticleRepositoryEntityManager.java | 60 +++++++++++++++++++ .../repository/ArticleRepositoryJdbc.java | 1 - 2 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/example/demo/repository/ArticleRepositoryEntityManager.java diff --git a/src/main/java/com/example/demo/repository/ArticleRepositoryEntityManager.java b/src/main/java/com/example/demo/repository/ArticleRepositoryEntityManager.java new file mode 100644 index 0000000..1c54e06 --- /dev/null +++ b/src/main/java/com/example/demo/repository/ArticleRepositoryEntityManager.java @@ -0,0 +1,60 @@ +package com.example.demo.repository; + +import com.example.demo.domain.Article; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.TypedQuery; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public class ArticleRepositoryEntityManager implements ArticleRepository{ + + @PersistenceContext + private EntityManager entityManager; + + @Override + public List
findAll() { + return entityManager.createQuery("SELECT a FROM Article a", Article.class).getResultList(); + } + + @Override + public List
findAllByBoardId(Long boardId) { + String jpql = "SELECT a FROM Article a WHERE a.boardId = :boardId"; + TypedQuery
query = entityManager.createQuery(jpql, Article.class); + query.setParameter("boardId", boardId); + return query.getResultList(); + } + + @Override + public List
findAllByMemberId(Long memberId) { + String jpql = "SELECT a FROM Article a WHERE a.authorId = :authorId"; + TypedQuery
query = entityManager.createQuery(jpql, Article.class); + query.setParameter("authorId", memberId); + return query.getResultList(); + } + + @Override + public Article findById(Long id) { + return entityManager.find(Article.class, id); + } + + @Override + public Article insert(Article article) { + entityManager.persist(article); + return findById(article.getId()); + } + + @Override + public Article update(Article article) { + Article forUpdate = findById(article.getId()); + forUpdate.update(article.getBoardId(), article.getTitle(), article.getContent()); + return findById(article.getId()); + } + + @Override + public void deleteById(Long id) { + entityManager.remove(findById(id)); + } +} diff --git a/src/main/java/com/example/demo/repository/ArticleRepositoryJdbc.java b/src/main/java/com/example/demo/repository/ArticleRepositoryJdbc.java index 6cbb20d..be689a6 100644 --- a/src/main/java/com/example/demo/repository/ArticleRepositoryJdbc.java +++ b/src/main/java/com/example/demo/repository/ArticleRepositoryJdbc.java @@ -10,7 +10,6 @@ import java.sql.PreparedStatement; import java.util.List; -@Repository public class ArticleRepositoryJdbc implements ArticleRepository { private final JdbcTemplate jdbcTemplate; From fe2be177303447e0b403f0bc4d243bfbc42316b1 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 25 Jun 2024 14:49:07 +0900 Subject: [PATCH 31/62] refactor: refactor BoardRepository impl --- .../BoardRepositoryEntityManager.java | 44 +++++++++++++++++++ .../demo/repository/BoardRepositoryJdbc.java | 1 - 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/example/demo/repository/BoardRepositoryEntityManager.java diff --git a/src/main/java/com/example/demo/repository/BoardRepositoryEntityManager.java b/src/main/java/com/example/demo/repository/BoardRepositoryEntityManager.java new file mode 100644 index 0000000..c6295dc --- /dev/null +++ b/src/main/java/com/example/demo/repository/BoardRepositoryEntityManager.java @@ -0,0 +1,44 @@ +package com.example.demo.repository; + +import com.example.demo.domain.Board; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public class BoardRepositoryEntityManager implements BoardRepository { + + @PersistenceContext + private EntityManager entityManager; + + @Override + public List findAll() { + return entityManager.createQuery("SELECT b FROM Board b", Board.class).getResultList(); + } + + @Override + public Board findById(Long id) { + return entityManager.find(Board.class, id); + } + + @Override + public Board insert(Board board) { + entityManager.persist(board); + return findById(board.getId()); + } + + @Override + public void deleteById(Long id) { + entityManager.remove(findById(id)); + } + + @Override + public Board update(Board board) { + Board forUpdate = findById(board.getId()); + forUpdate.update(board.getName()); + return findById(board.getId()); + } + +} diff --git a/src/main/java/com/example/demo/repository/BoardRepositoryJdbc.java b/src/main/java/com/example/demo/repository/BoardRepositoryJdbc.java index 831c1bf..94938ee 100644 --- a/src/main/java/com/example/demo/repository/BoardRepositoryJdbc.java +++ b/src/main/java/com/example/demo/repository/BoardRepositoryJdbc.java @@ -10,7 +10,6 @@ import java.sql.PreparedStatement; import java.util.List; -@Repository public class BoardRepositoryJdbc implements BoardRepository { private final JdbcTemplate jdbcTemplate; From 4b2ad7f5cd5c82828dbd2026b0ad89a75abdb29b Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 25 Jun 2024 14:52:51 +0900 Subject: [PATCH 32/62] refactor: refactor MemberRepository impl --- .../MemberRepositoryEntityManager.java | 44 +++++++++++++++++++ .../demo/repository/MemberRepositoryJdbc.java | 1 - 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/example/demo/repository/MemberRepositoryEntityManager.java diff --git a/src/main/java/com/example/demo/repository/MemberRepositoryEntityManager.java b/src/main/java/com/example/demo/repository/MemberRepositoryEntityManager.java new file mode 100644 index 0000000..f24ccf8 --- /dev/null +++ b/src/main/java/com/example/demo/repository/MemberRepositoryEntityManager.java @@ -0,0 +1,44 @@ +package com.example.demo.repository; + +import com.example.demo.domain.Member; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public class MemberRepositoryEntityManager implements MemberRepository { + + @PersistenceContext + private EntityManager entityManager; + + @Override + public List findAll() { + return entityManager.createQuery("SELECT m FROM Member m", Member.class).getResultList(); + } + + @Override + public Member findById(Long id) { + return entityManager.find(Member.class, id); + } + + @Override + public Member insert(Member member) { + entityManager.persist(member); + return findById(member.getId()); + } + + @Override + public Member update(Member member) { + Member forUpdate = findById(member.getId()); + forUpdate.update(member.getName(), member.getEmail()); + return findById(member.getId()); + } + + @Override + public void deleteById(Long id) { + entityManager.remove(findById(id)); + } + +} diff --git a/src/main/java/com/example/demo/repository/MemberRepositoryJdbc.java b/src/main/java/com/example/demo/repository/MemberRepositoryJdbc.java index e0a7795..41c8e44 100644 --- a/src/main/java/com/example/demo/repository/MemberRepositoryJdbc.java +++ b/src/main/java/com/example/demo/repository/MemberRepositoryJdbc.java @@ -10,7 +10,6 @@ import java.sql.PreparedStatement; import java.util.List; -@Repository public class MemberRepositoryJdbc implements MemberRepository { private final JdbcTemplate jdbcTemplate; From 238453196a3143d765e9006370ec5af90603548a Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 25 Jun 2024 17:16:34 +0900 Subject: [PATCH 33/62] refactor: refactor update methods --- .../demo/repository/ArticleRepositoryEntityManager.java | 4 +--- .../example/demo/repository/BoardRepositoryEntityManager.java | 4 +--- .../demo/repository/MemberRepositoryEntityManager.java | 4 +--- src/main/java/com/example/demo/service/ArticleService.java | 3 ++- src/main/java/com/example/demo/service/BoardService.java | 3 ++- src/main/java/com/example/demo/service/MemberService.java | 3 ++- 6 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/example/demo/repository/ArticleRepositoryEntityManager.java b/src/main/java/com/example/demo/repository/ArticleRepositoryEntityManager.java index 1c54e06..9a100b4 100644 --- a/src/main/java/com/example/demo/repository/ArticleRepositoryEntityManager.java +++ b/src/main/java/com/example/demo/repository/ArticleRepositoryEntityManager.java @@ -48,9 +48,7 @@ public Article insert(Article article) { @Override public Article update(Article article) { - Article forUpdate = findById(article.getId()); - forUpdate.update(article.getBoardId(), article.getTitle(), article.getContent()); - return findById(article.getId()); + return entityManager.merge(article); } @Override diff --git a/src/main/java/com/example/demo/repository/BoardRepositoryEntityManager.java b/src/main/java/com/example/demo/repository/BoardRepositoryEntityManager.java index c6295dc..8f2ae2e 100644 --- a/src/main/java/com/example/demo/repository/BoardRepositoryEntityManager.java +++ b/src/main/java/com/example/demo/repository/BoardRepositoryEntityManager.java @@ -36,9 +36,7 @@ public void deleteById(Long id) { @Override public Board update(Board board) { - Board forUpdate = findById(board.getId()); - forUpdate.update(board.getName()); - return findById(board.getId()); + return entityManager.merge(board); } } diff --git a/src/main/java/com/example/demo/repository/MemberRepositoryEntityManager.java b/src/main/java/com/example/demo/repository/MemberRepositoryEntityManager.java index f24ccf8..7465a63 100644 --- a/src/main/java/com/example/demo/repository/MemberRepositoryEntityManager.java +++ b/src/main/java/com/example/demo/repository/MemberRepositoryEntityManager.java @@ -31,9 +31,7 @@ public Member insert(Member member) { @Override public Member update(Member member) { - Member forUpdate = findById(member.getId()); - forUpdate.update(member.getName(), member.getEmail()); - return findById(member.getId()); + return entityManager.merge(member); } @Override diff --git a/src/main/java/com/example/demo/service/ArticleService.java b/src/main/java/com/example/demo/service/ArticleService.java index a705990..4108e14 100644 --- a/src/main/java/com/example/demo/service/ArticleService.java +++ b/src/main/java/com/example/demo/service/ArticleService.java @@ -72,7 +72,8 @@ public ArticleResponse create(ArticleCreateRequest request) { @Transactional public ArticleResponse update(Long id, ArticleUpdateRequest request) { - Article article = articleRepository.findById(id); + Article old = articleRepository.findById(id); + Article article = new Article(old.getId(), old.getAuthorId(), old.getBoardId(), old.getTitle(), old.getContent(), old.getCreatedAt(), old.getModifiedAt()); article.update(request.boardId(), request.title(), request.description()); Article updated = articleRepository.update(article); Member member = memberRepository.findById(updated.getAuthorId()); diff --git a/src/main/java/com/example/demo/service/BoardService.java b/src/main/java/com/example/demo/service/BoardService.java index 4843a8b..3ea1ecd 100644 --- a/src/main/java/com/example/demo/service/BoardService.java +++ b/src/main/java/com/example/demo/service/BoardService.java @@ -45,7 +45,8 @@ public void deleteBoard(Long id) { @Transactional public BoardResponse update(Long id, BoardUpdateRequest request) { - Board board = boardRepository.findById(id); + Board old = boardRepository.findById(id); + Board board = new Board(old.getId(), old.getName()); board.update(request.name()); Board updated = boardRepository.update(board); return BoardResponse.from(updated); diff --git a/src/main/java/com/example/demo/service/MemberService.java b/src/main/java/com/example/demo/service/MemberService.java index 3f05c9b..54ec7dc 100644 --- a/src/main/java/com/example/demo/service/MemberService.java +++ b/src/main/java/com/example/demo/service/MemberService.java @@ -47,7 +47,8 @@ public void delete(Long id) { @Transactional public MemberResponse update(Long id, MemberUpdateRequest request) { - Member member = memberRepository.findById(id); + Member old = memberRepository.findById(id); + Member member = new Member(old.getId(), old.getName(), old.getEmail(), old.getPassword()); member.update(request.name(), request.email()); memberRepository.update(member); return MemberResponse.from(member); From 807ac1a93caf157c54951c0af6e62e761595cc1b Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 2 Jul 2024 11:11:25 +0900 Subject: [PATCH 34/62] refactor: alter ArticleRepository to Spring Data JPA --- .../com/example/demo/repository/ArticleRepository.java | 10 +++++----- .../repository/ArticleRepositoryEntityManager.java | 10 ++-------- .../example/demo/repository/ArticleRepositoryJdbc.java | 10 ++-------- .../demo/repository/ArticleRepositoryMemory.java | 10 ++-------- 4 files changed, 11 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/example/demo/repository/ArticleRepository.java b/src/main/java/com/example/demo/repository/ArticleRepository.java index 88e476e..fa1ec0a 100644 --- a/src/main/java/com/example/demo/repository/ArticleRepository.java +++ b/src/main/java/com/example/demo/repository/ArticleRepository.java @@ -1,22 +1,22 @@ package com.example.demo.repository; import com.example.demo.domain.Article; +import org.springframework.data.repository.Repository; import java.util.List; -public interface ArticleRepository { +public interface ArticleRepository extends Repository { List
findAll(); List
findAllByBoardId(Long boardId); - List
findAllByMemberId(Long memberId); + List
findAllByAuthorId(Long memberId); Article findById(Long id); - Article insert(Article article); - - Article update(Article article); + Article save(Article article); void deleteById(Long id); + } diff --git a/src/main/java/com/example/demo/repository/ArticleRepositoryEntityManager.java b/src/main/java/com/example/demo/repository/ArticleRepositoryEntityManager.java index 9a100b4..a20995f 100644 --- a/src/main/java/com/example/demo/repository/ArticleRepositoryEntityManager.java +++ b/src/main/java/com/example/demo/repository/ArticleRepositoryEntityManager.java @@ -9,17 +9,15 @@ import java.util.List; @Repository -public class ArticleRepositoryEntityManager implements ArticleRepository{ +public class ArticleRepositoryEntityManager { @PersistenceContext private EntityManager entityManager; - @Override public List
findAll() { return entityManager.createQuery("SELECT a FROM Article a", Article.class).getResultList(); } - @Override public List
findAllByBoardId(Long boardId) { String jpql = "SELECT a FROM Article a WHERE a.boardId = :boardId"; TypedQuery
query = entityManager.createQuery(jpql, Article.class); @@ -27,7 +25,6 @@ public List
findAllByBoardId(Long boardId) { return query.getResultList(); } - @Override public List
findAllByMemberId(Long memberId) { String jpql = "SELECT a FROM Article a WHERE a.authorId = :authorId"; TypedQuery
query = entityManager.createQuery(jpql, Article.class); @@ -35,24 +32,21 @@ public List
findAllByMemberId(Long memberId) { return query.getResultList(); } - @Override public Article findById(Long id) { return entityManager.find(Article.class, id); } - @Override public Article insert(Article article) { entityManager.persist(article); return findById(article.getId()); } - @Override public Article update(Article article) { return entityManager.merge(article); } - @Override public void deleteById(Long id) { entityManager.remove(findById(id)); } + } diff --git a/src/main/java/com/example/demo/repository/ArticleRepositoryJdbc.java b/src/main/java/com/example/demo/repository/ArticleRepositoryJdbc.java index be689a6..d2be89c 100644 --- a/src/main/java/com/example/demo/repository/ArticleRepositoryJdbc.java +++ b/src/main/java/com/example/demo/repository/ArticleRepositoryJdbc.java @@ -10,7 +10,7 @@ import java.sql.PreparedStatement; import java.util.List; -public class ArticleRepositoryJdbc implements ArticleRepository { +public class ArticleRepositoryJdbc { private final JdbcTemplate jdbcTemplate; @@ -28,7 +28,6 @@ public ArticleRepositoryJdbc(JdbcTemplate jdbcTemplate) { rs.getTimestamp("modified_date").toLocalDateTime() ); - @Override public List
findAll() { return jdbcTemplate.query(""" SELECT id, board_id, author_id, title, content, created_date, modified_date @@ -36,7 +35,6 @@ public List
findAll() { """, articleRowMapper); } - @Override public List
findAllByBoardId(Long boardId) { return jdbcTemplate.query(""" SELECT id, board_id, author_id, title, content, created_date, modified_date @@ -45,7 +43,6 @@ public List
findAllByBoardId(Long boardId) { """, articleRowMapper, boardId); } - @Override public List
findAllByMemberId(Long memberId) { return jdbcTemplate.query(""" SELECT id, board_id, author_id, title, content, created_date, modified_date @@ -54,7 +51,6 @@ public List
findAllByMemberId(Long memberId) { """, articleRowMapper, memberId); } - @Override public Article findById(Long id) { return jdbcTemplate.queryForObject(""" SELECT id, board_id, author_id, title, content, created_date, modified_date @@ -63,7 +59,6 @@ public Article findById(Long id) { """, articleRowMapper, id); } - @Override public Article insert(Article article) { KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(con -> { @@ -81,7 +76,6 @@ INSERT INTO article (board_id, author_id, title, content) return findById(keyHolder.getKey().longValue()); } - @Override public Article update(Article article) { jdbcTemplate.update(""" UPDATE article @@ -96,11 +90,11 @@ public Article update(Article article) { return findById(article.getId()); } - @Override public void deleteById(Long id) { jdbcTemplate.update(""" DELETE FROM article WHERE id = ? """, id); } + } diff --git a/src/main/java/com/example/demo/repository/ArticleRepositoryMemory.java b/src/main/java/com/example/demo/repository/ArticleRepositoryMemory.java index 5a7b0c2..4996d3f 100644 --- a/src/main/java/com/example/demo/repository/ArticleRepositoryMemory.java +++ b/src/main/java/com/example/demo/repository/ArticleRepositoryMemory.java @@ -7,12 +7,11 @@ import java.util.Map; import java.util.concurrent.atomic.AtomicLong; -public class ArticleRepositoryMemory implements ArticleRepository { +public class ArticleRepositoryMemory { private static final Map articles = new HashMap<>(); private static final AtomicLong autoincrement = new AtomicLong(1); - @Override public List
findAll() { return articles.entrySet().stream() .map(it -> { @@ -22,7 +21,6 @@ public List
findAll() { }).toList(); } - @Override public List
findAllByBoardId(Long boardId) { return articles.entrySet().stream() .filter(it -> it.getValue().getBoardId().equals(boardId)) @@ -33,7 +31,6 @@ public List
findAllByBoardId(Long boardId) { }).toList(); } - @Override public List
findAllByMemberId(Long memberId) { return articles.entrySet().stream() .filter(it -> it.getValue().getAuthorId().equals(memberId)) @@ -44,12 +41,10 @@ public List
findAllByMemberId(Long memberId) { }).toList(); } - @Override public Article findById(Long id) { return articles.getOrDefault(id, null); } - @Override public Article insert(Article article) { long id = autoincrement.getAndIncrement(); articles.put(id, article); @@ -57,14 +52,13 @@ public Article insert(Article article) { return article; } - @Override public Article update(Article article) { articles.put(article.getId(), article); return article; } - @Override public void deleteById(Long id) { articles.remove(id); } + } From b468327a668df1cc45b2227d8546778df9340342 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 2 Jul 2024 11:12:45 +0900 Subject: [PATCH 35/62] refactor: alter BoardRepository to Spring Data JPA --- .../java/com/example/demo/repository/BoardRepository.java | 6 +++--- .../demo/repository/BoardRepositoryEntityManager.java | 7 +------ .../com/example/demo/repository/BoardRepositoryJdbc.java | 8 ++------ .../example/demo/repository/BoardRepositoryMemory.java | 8 ++------ 4 files changed, 8 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/example/demo/repository/BoardRepository.java b/src/main/java/com/example/demo/repository/BoardRepository.java index c3d155d..578a203 100644 --- a/src/main/java/com/example/demo/repository/BoardRepository.java +++ b/src/main/java/com/example/demo/repository/BoardRepository.java @@ -1,18 +1,18 @@ package com.example.demo.repository; import com.example.demo.domain.Board; +import org.springframework.data.repository.Repository; import java.util.List; -public interface BoardRepository { +public interface BoardRepository extends Repository { List findAll(); Board findById(Long id); - Board insert(Board board); + Board save(Board board); void deleteById(Long id); - Board update(Board board); } diff --git a/src/main/java/com/example/demo/repository/BoardRepositoryEntityManager.java b/src/main/java/com/example/demo/repository/BoardRepositoryEntityManager.java index 8f2ae2e..5ba6c2e 100644 --- a/src/main/java/com/example/demo/repository/BoardRepositoryEntityManager.java +++ b/src/main/java/com/example/demo/repository/BoardRepositoryEntityManager.java @@ -8,33 +8,28 @@ import java.util.List; @Repository -public class BoardRepositoryEntityManager implements BoardRepository { +public class BoardRepositoryEntityManager { @PersistenceContext private EntityManager entityManager; - @Override public List findAll() { return entityManager.createQuery("SELECT b FROM Board b", Board.class).getResultList(); } - @Override public Board findById(Long id) { return entityManager.find(Board.class, id); } - @Override public Board insert(Board board) { entityManager.persist(board); return findById(board.getId()); } - @Override public void deleteById(Long id) { entityManager.remove(findById(id)); } - @Override public Board update(Board board) { return entityManager.merge(board); } diff --git a/src/main/java/com/example/demo/repository/BoardRepositoryJdbc.java b/src/main/java/com/example/demo/repository/BoardRepositoryJdbc.java index 94938ee..6bc156e 100644 --- a/src/main/java/com/example/demo/repository/BoardRepositoryJdbc.java +++ b/src/main/java/com/example/demo/repository/BoardRepositoryJdbc.java @@ -10,7 +10,7 @@ import java.sql.PreparedStatement; import java.util.List; -public class BoardRepositoryJdbc implements BoardRepository { +public class BoardRepositoryJdbc { private final JdbcTemplate jdbcTemplate; @@ -23,7 +23,6 @@ public BoardRepositoryJdbc(JdbcTemplate jdbcTemplate) { rs.getString("name") ); - @Override public List findAll() { return jdbcTemplate.query(""" SELECT id, name @@ -31,7 +30,6 @@ public List findAll() { """, boardRowMapper); } - @Override public Board findById(Long id) { return jdbcTemplate.queryForObject(""" SELECT id, name @@ -40,7 +38,6 @@ public Board findById(Long id) { """, boardRowMapper, id); } - @Override public Board insert(Board board) { KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(con -> { @@ -53,18 +50,17 @@ INSERT INTO board (name) VALUES (?) return findById(keyHolder.getKey().longValue()); } - @Override public void deleteById(Long id) { jdbcTemplate.update(""" DELETE FROM board WHERE id = ? """, id); } - @Override public Board update(Board board) { return jdbcTemplate.queryForObject(""" UPDATE board SET name = ? WHERE id = ? """, boardRowMapper, board.getName(), board.getId() ); } + } diff --git a/src/main/java/com/example/demo/repository/BoardRepositoryMemory.java b/src/main/java/com/example/demo/repository/BoardRepositoryMemory.java index 24538d8..c467088 100644 --- a/src/main/java/com/example/demo/repository/BoardRepositoryMemory.java +++ b/src/main/java/com/example/demo/repository/BoardRepositoryMemory.java @@ -7,7 +7,7 @@ import java.util.Map; import java.util.concurrent.atomic.AtomicLong; -public class BoardRepositoryMemory implements BoardRepository { +public class BoardRepositoryMemory { private static final Map boards = new HashMap<>(); private static final AtomicLong autoincrement = new AtomicLong(1); @@ -17,7 +17,6 @@ public class BoardRepositoryMemory implements BoardRepository { boards.put(autoincrement.getAndIncrement(), new Board("자유게시판")); } - @Override public List findAll() { return boards.entrySet().stream() .map(it -> { @@ -27,24 +26,21 @@ public List findAll() { }).toList(); } - @Override public Board findById(Long id) { return boards.getOrDefault(id, null); } - @Override public Board insert(Board board) { boards.put(autoincrement.getAndIncrement(), board); return board; } - @Override public void deleteById(Long id) { boards.remove(id); } - @Override public Board update(Board board) { return boards.put(board.getId(), board); } + } From 93acc08f5f6af7305d3e8ca8dcb21dfc9b7c76d3 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 2 Jul 2024 11:13:50 +0900 Subject: [PATCH 36/62] refactor: alter MemberRepository to Spring Data JPA --- .../com/example/demo/repository/MemberRepository.java | 8 ++++---- .../demo/repository/MemberRepositoryEntityManager.java | 7 +------ .../com/example/demo/repository/MemberRepositoryJdbc.java | 8 ++------ .../example/demo/repository/MemberRepositoryMemory.java | 8 ++------ 4 files changed, 9 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/example/demo/repository/MemberRepository.java b/src/main/java/com/example/demo/repository/MemberRepository.java index 94f16b1..f1276d9 100644 --- a/src/main/java/com/example/demo/repository/MemberRepository.java +++ b/src/main/java/com/example/demo/repository/MemberRepository.java @@ -1,18 +1,18 @@ package com.example.demo.repository; import com.example.demo.domain.Member; +import org.springframework.data.repository.Repository; import java.util.List; -public interface MemberRepository { +public interface MemberRepository extends Repository { List findAll(); Member findById(Long id); - Member insert(Member member); - - Member update(Member member); + Member save(Member member); void deleteById(Long id); + } diff --git a/src/main/java/com/example/demo/repository/MemberRepositoryEntityManager.java b/src/main/java/com/example/demo/repository/MemberRepositoryEntityManager.java index 7465a63..a4442a2 100644 --- a/src/main/java/com/example/demo/repository/MemberRepositoryEntityManager.java +++ b/src/main/java/com/example/demo/repository/MemberRepositoryEntityManager.java @@ -8,33 +8,28 @@ import java.util.List; @Repository -public class MemberRepositoryEntityManager implements MemberRepository { +public class MemberRepositoryEntityManager { @PersistenceContext private EntityManager entityManager; - @Override public List findAll() { return entityManager.createQuery("SELECT m FROM Member m", Member.class).getResultList(); } - @Override public Member findById(Long id) { return entityManager.find(Member.class, id); } - @Override public Member insert(Member member) { entityManager.persist(member); return findById(member.getId()); } - @Override public Member update(Member member) { return entityManager.merge(member); } - @Override public void deleteById(Long id) { entityManager.remove(findById(id)); } diff --git a/src/main/java/com/example/demo/repository/MemberRepositoryJdbc.java b/src/main/java/com/example/demo/repository/MemberRepositoryJdbc.java index 41c8e44..0aab1ff 100644 --- a/src/main/java/com/example/demo/repository/MemberRepositoryJdbc.java +++ b/src/main/java/com/example/demo/repository/MemberRepositoryJdbc.java @@ -10,7 +10,7 @@ import java.sql.PreparedStatement; import java.util.List; -public class MemberRepositoryJdbc implements MemberRepository { +public class MemberRepositoryJdbc { private final JdbcTemplate jdbcTemplate; @@ -25,7 +25,6 @@ public MemberRepositoryJdbc(JdbcTemplate jdbcTemplate) { rs.getString("password") ); - @Override public List findAll() { return jdbcTemplate.query(""" SELECT id, name, email, password @@ -33,7 +32,6 @@ public List findAll() { """, memberRowMapper); } - @Override public Member findById(Long id) { return jdbcTemplate.queryForObject(""" SELECT id, name, email, password @@ -42,7 +40,6 @@ public Member findById(Long id) { """, memberRowMapper, id); } - @Override public Member insert(Member member) { KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(con -> { @@ -57,7 +54,6 @@ INSERT INTO member (name, email, password) VALUES (?, ?, ?) return findById(keyHolder.getKey().longValue()); } - @Override public Member update(Member member) { jdbcTemplate.update(""" UPDATE member @@ -67,11 +63,11 @@ public Member update(Member member) { return findById(member.getId()); } - @Override public void deleteById(Long id) { jdbcTemplate.update(""" DELETE FROM member WHERE id = ? """, id); } + } diff --git a/src/main/java/com/example/demo/repository/MemberRepositoryMemory.java b/src/main/java/com/example/demo/repository/MemberRepositoryMemory.java index 3e6625b..c856ced 100644 --- a/src/main/java/com/example/demo/repository/MemberRepositoryMemory.java +++ b/src/main/java/com/example/demo/repository/MemberRepositoryMemory.java @@ -7,7 +7,7 @@ import java.util.Map; import java.util.concurrent.atomic.AtomicLong; -public class MemberRepositoryMemory implements MemberRepository { +public class MemberRepositoryMemory { private static final Map members = new HashMap<>(); private static final AtomicLong autoincrement = new AtomicLong(1); @@ -17,7 +17,6 @@ public class MemberRepositoryMemory implements MemberRepository { members.put(autoincrement.getAndIncrement(), new Member("최준호", "temp@gmail.com", "password")); } - @Override public List findAll() { return members.entrySet().stream() .map(it -> { @@ -27,12 +26,10 @@ public List findAll() { }).toList(); } - @Override public Member findById(Long id) { return members.getOrDefault(id, null); } - @Override public Member insert(Member member) { long id = autoincrement.getAndIncrement(); members.put(id, member); @@ -40,13 +37,12 @@ public Member insert(Member member) { return member; } - @Override public Member update(Member member) { return members.put(member.getId(), member); } - @Override public void deleteById(Long id) { members.remove(id); } + } From b5abb8a97f1a6435cfffa93bc908501506632b77 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 2 Jul 2024 11:16:10 +0900 Subject: [PATCH 37/62] refactor: refactor ArticleService --- .../java/com/example/demo/service/ArticleService.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/example/demo/service/ArticleService.java b/src/main/java/com/example/demo/service/ArticleService.java index 4108e14..326a667 100644 --- a/src/main/java/com/example/demo/service/ArticleService.java +++ b/src/main/java/com/example/demo/service/ArticleService.java @@ -64,7 +64,7 @@ public ArticleResponse create(ArticleCreateRequest request) { request.title(), request.description() ); - Article saved = articleRepository.insert(article); + Article saved = articleRepository.save(article); Member member = memberRepository.findById(saved.getAuthorId()); Board board = boardRepository.findById(saved.getBoardId()); return ArticleResponse.of(saved, member, board); @@ -72,11 +72,9 @@ public ArticleResponse create(ArticleCreateRequest request) { @Transactional public ArticleResponse update(Long id, ArticleUpdateRequest request) { - Article old = articleRepository.findById(id); - Article article = new Article(old.getId(), old.getAuthorId(), old.getBoardId(), old.getTitle(), old.getContent(), old.getCreatedAt(), old.getModifiedAt()); + Article article = articleRepository.findById(id); article.update(request.boardId(), request.title(), request.description()); - Article updated = articleRepository.update(article); - Member member = memberRepository.findById(updated.getAuthorId()); + Member member = memberRepository.findById(article.getAuthorId()); Board board = boardRepository.findById(article.getBoardId()); return ArticleResponse.of(article, member, board); } From a145eab1b89454e19db8b66c7eac67dffb1f4e64 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 2 Jul 2024 11:16:45 +0900 Subject: [PATCH 38/62] refactor: refactor BoardService --- src/main/java/com/example/demo/service/BoardService.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/example/demo/service/BoardService.java b/src/main/java/com/example/demo/service/BoardService.java index 3ea1ecd..3fcbd61 100644 --- a/src/main/java/com/example/demo/service/BoardService.java +++ b/src/main/java/com/example/demo/service/BoardService.java @@ -34,7 +34,7 @@ public BoardResponse getBoardById(Long id) { @Transactional public BoardResponse createBoard(BoardCreateRequest request) { Board board = new Board(request.name()); - Board saved = boardRepository.insert(board); + Board saved = boardRepository.save(board); return BoardResponse.from(saved); } @@ -45,10 +45,9 @@ public void deleteBoard(Long id) { @Transactional public BoardResponse update(Long id, BoardUpdateRequest request) { - Board old = boardRepository.findById(id); - Board board = new Board(old.getId(), old.getName()); + Board board = boardRepository.findById(id); board.update(request.name()); - Board updated = boardRepository.update(board); - return BoardResponse.from(updated); + return BoardResponse.from(board); } + } From 9e5b1cf83e999e7f622c118c3b46cd74f34499e7 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 2 Jul 2024 11:17:21 +0900 Subject: [PATCH 39/62] refactor: refactor MemberService --- src/main/java/com/example/demo/service/MemberService.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/example/demo/service/MemberService.java b/src/main/java/com/example/demo/service/MemberService.java index 54ec7dc..89c5ea7 100644 --- a/src/main/java/com/example/demo/service/MemberService.java +++ b/src/main/java/com/example/demo/service/MemberService.java @@ -34,7 +34,7 @@ public List getAll() { @Transactional public MemberResponse create(MemberCreateRequest request) { - Member member = memberRepository.insert( + Member member = memberRepository.save( new Member(request.name(), request.email(), request.password()) ); return MemberResponse.from(member); @@ -47,10 +47,9 @@ public void delete(Long id) { @Transactional public MemberResponse update(Long id, MemberUpdateRequest request) { - Member old = memberRepository.findById(id); - Member member = new Member(old.getId(), old.getName(), old.getEmail(), old.getPassword()); + Member member = memberRepository.findById(id); member.update(request.name(), request.email()); - memberRepository.update(member); return MemberResponse.from(member); } + } From c7aa9de472a6428368cb05f571b0b167fb89cd2c Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 2 Jul 2024 11:32:48 +0900 Subject: [PATCH 40/62] refactor: makes Article have many-to-one mapping --- .../dto/response/ArticleResponse.java | 4 +- .../java/com/example/demo/domain/Article.java | 37 ++-- .../ArticleRepositoryEntityManager.java | 74 ++++---- .../repository/ArticleRepositoryJdbc.java | 168 +++++++++--------- .../repository/ArticleRepositoryMemory.java | 102 +++++------ .../example/demo/service/ArticleService.java | 23 +-- 6 files changed, 206 insertions(+), 202 deletions(-) diff --git a/src/main/java/com/example/demo/controller/dto/response/ArticleResponse.java b/src/main/java/com/example/demo/controller/dto/response/ArticleResponse.java index c10f949..d18c01b 100644 --- a/src/main/java/com/example/demo/controller/dto/response/ArticleResponse.java +++ b/src/main/java/com/example/demo/controller/dto/response/ArticleResponse.java @@ -39,8 +39,8 @@ public static ArticleResponse of(Article article, Member member, Board board) { public static ArticleResponse from(Article article) { return new ArticleResponse( article.getId(), - article.getAuthorId(), - article.getBoardId(), + article.getAuthor().getId(), + article.getBoard().getId(), article.getTitle(), article.getContent(), article.getCreatedAt(), diff --git a/src/main/java/com/example/demo/domain/Article.java b/src/main/java/com/example/demo/domain/Article.java index dfaa2e8..a832aa5 100644 --- a/src/main/java/com/example/demo/domain/Article.java +++ b/src/main/java/com/example/demo/domain/Article.java @@ -11,10 +11,12 @@ public class Article { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Column(name = "author_id") - private Long authorId; - @Column(name = "board_id") - private Long boardId; + @ManyToOne + @JoinColumn(name = "author_id") + private Member author; + @ManyToOne + @JoinColumn(name = "board_id") + private Board board; @Column(name = "title") private String title; @Column(name = "content") @@ -28,34 +30,34 @@ public Article() {} public Article( Long id, - Long authorId, - Long boardId, + Member author, + Board board, String title, String content, LocalDateTime createdAt, LocalDateTime modifiedAt ) { this.id = id; - this.authorId = authorId; - this.boardId = boardId; + this.author = author; + this.board = board; this.title = title; this.content = content; this.createdAt = createdAt; this.modifiedAt = modifiedAt; } - public Article(Long authorId, Long boardId, String title, String content) { + public Article(Member author, Board board, String title, String content) { this.id = null; - this.authorId = authorId; - this.boardId = boardId; + this.author = author; + this.board = board; this.title = title; this.content = content; this.createdAt = LocalDateTime.now(); this.modifiedAt = LocalDateTime.now(); } - public void update(Long boardId, String title, String description) { - this.boardId = boardId; + public void update(Board board, String title, String description) { + this.board = board; this.title = title; this.content = description; this.modifiedAt = LocalDateTime.now(); @@ -73,12 +75,12 @@ public Long getId() { return id; } - public Long getAuthorId() { - return authorId; + public Member getAuthor() { + return author; } - public Long getBoardId() { - return boardId; + public Board getBoard() { + return board; } public String getTitle() { @@ -96,4 +98,5 @@ public LocalDateTime getCreatedAt() { public LocalDateTime getModifiedAt() { return modifiedAt; } + } diff --git a/src/main/java/com/example/demo/repository/ArticleRepositoryEntityManager.java b/src/main/java/com/example/demo/repository/ArticleRepositoryEntityManager.java index a20995f..1049966 100644 --- a/src/main/java/com/example/demo/repository/ArticleRepositoryEntityManager.java +++ b/src/main/java/com/example/demo/repository/ArticleRepositoryEntityManager.java @@ -11,42 +11,42 @@ @Repository public class ArticleRepositoryEntityManager { - @PersistenceContext - private EntityManager entityManager; - - public List
findAll() { - return entityManager.createQuery("SELECT a FROM Article a", Article.class).getResultList(); - } - - public List
findAllByBoardId(Long boardId) { - String jpql = "SELECT a FROM Article a WHERE a.boardId = :boardId"; - TypedQuery
query = entityManager.createQuery(jpql, Article.class); - query.setParameter("boardId", boardId); - return query.getResultList(); - } - - public List
findAllByMemberId(Long memberId) { - String jpql = "SELECT a FROM Article a WHERE a.authorId = :authorId"; - TypedQuery
query = entityManager.createQuery(jpql, Article.class); - query.setParameter("authorId", memberId); - return query.getResultList(); - } - - public Article findById(Long id) { - return entityManager.find(Article.class, id); - } - - public Article insert(Article article) { - entityManager.persist(article); - return findById(article.getId()); - } - - public Article update(Article article) { - return entityManager.merge(article); - } - - public void deleteById(Long id) { - entityManager.remove(findById(id)); - } +// @PersistenceContext +// private EntityManager entityManager; +// +// public List
findAll() { +// return entityManager.createQuery("SELECT a FROM Article a", Article.class).getResultList(); +// } +// +// public List
findAllByBoardId(Long boardId) { +// String jpql = "SELECT a FROM Article a WHERE a.boardId = :boardId"; +// TypedQuery
query = entityManager.createQuery(jpql, Article.class); +// query.setParameter("boardId", boardId); +// return query.getResultList(); +// } +// +// public List
findAllByMemberId(Long memberId) { +// String jpql = "SELECT a FROM Article a WHERE a.authorId = :authorId"; +// TypedQuery
query = entityManager.createQuery(jpql, Article.class); +// query.setParameter("authorId", memberId); +// return query.getResultList(); +// } +// +// public Article findById(Long id) { +// return entityManager.find(Article.class, id); +// } +// +// public Article insert(Article article) { +// entityManager.persist(article); +// return findById(article.getId()); +// } +// +// public Article update(Article article) { +// return entityManager.merge(article); +// } +// +// public void deleteById(Long id) { +// entityManager.remove(findById(id)); +// } } diff --git a/src/main/java/com/example/demo/repository/ArticleRepositoryJdbc.java b/src/main/java/com/example/demo/repository/ArticleRepositoryJdbc.java index d2be89c..389b04d 100644 --- a/src/main/java/com/example/demo/repository/ArticleRepositoryJdbc.java +++ b/src/main/java/com/example/demo/repository/ArticleRepositoryJdbc.java @@ -12,89 +12,89 @@ public class ArticleRepositoryJdbc { - private final JdbcTemplate jdbcTemplate; - - public ArticleRepositoryJdbc(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - - private static final RowMapper
articleRowMapper = (rs, rowNum) -> new Article( - rs.getLong("id"), - rs.getLong("author_id"), - rs.getLong("board_id"), - rs.getString("title"), - rs.getString("content"), - rs.getTimestamp("created_date").toLocalDateTime(), - rs.getTimestamp("modified_date").toLocalDateTime() - ); - - public List
findAll() { - return jdbcTemplate.query(""" - SELECT id, board_id, author_id, title, content, created_date, modified_date - FROM article - """, articleRowMapper); - } - - public List
findAllByBoardId(Long boardId) { - return jdbcTemplate.query(""" - SELECT id, board_id, author_id, title, content, created_date, modified_date - FROM article - WHERE board_id = ? - """, articleRowMapper, boardId); - } - - public List
findAllByMemberId(Long memberId) { - return jdbcTemplate.query(""" - SELECT id, board_id, author_id, title, content, created_date, modified_date - FROM article - WHERE author_id = ? - """, articleRowMapper, memberId); - } - - public Article findById(Long id) { - return jdbcTemplate.queryForObject(""" - SELECT id, board_id, author_id, title, content, created_date, modified_date - FROM article - WHERE id = ? - """, articleRowMapper, id); - } - - public Article insert(Article article) { - KeyHolder keyHolder = new GeneratedKeyHolder(); - jdbcTemplate.update(con -> { - PreparedStatement ps = con.prepareStatement(""" - INSERT INTO article (board_id, author_id, title, content) - VALUES (?, ?, ?, ?) - """, - new String[]{"id"}); - ps.setLong(1, article.getBoardId()); - ps.setLong(2, article.getAuthorId()); - ps.setString(3, article.getTitle()); - ps.setString(4, article.getContent()); - return ps; - }, keyHolder); - return findById(keyHolder.getKey().longValue()); - } - - public Article update(Article article) { - jdbcTemplate.update(""" - UPDATE article - SET board_id = ?, title = ?, content = ? - WHERE id = ? - """, - article.getBoardId(), - article.getTitle(), - article.getContent(), - article.getId() - ); - return findById(article.getId()); - } - - public void deleteById(Long id) { - jdbcTemplate.update(""" - DELETE FROM article - WHERE id = ? - """, id); - } +// private final JdbcTemplate jdbcTemplate; +// +// public ArticleRepositoryJdbc(JdbcTemplate jdbcTemplate) { +// this.jdbcTemplate = jdbcTemplate; +// } +// +// private static final RowMapper
articleRowMapper = (rs, rowNum) -> new Article( +// rs.getLong("id"), +// rs.getLong("author_id"), +// rs.getLong("board_id"), +// rs.getString("title"), +// rs.getString("content"), +// rs.getTimestamp("created_date").toLocalDateTime(), +// rs.getTimestamp("modified_date").toLocalDateTime() +// ); +// +// public List
findAll() { +// return jdbcTemplate.query(""" +// SELECT id, board_id, author_id, title, content, created_date, modified_date +// FROM article +// """, articleRowMapper); +// } +// +// public List
findAllByBoardId(Long boardId) { +// return jdbcTemplate.query(""" +// SELECT id, board_id, author_id, title, content, created_date, modified_date +// FROM article +// WHERE board_id = ? +// """, articleRowMapper, boardId); +// } +// +// public List
findAllByMemberId(Long memberId) { +// return jdbcTemplate.query(""" +// SELECT id, board_id, author_id, title, content, created_date, modified_date +// FROM article +// WHERE author_id = ? +// """, articleRowMapper, memberId); +// } +// +// public Article findById(Long id) { +// return jdbcTemplate.queryForObject(""" +// SELECT id, board_id, author_id, title, content, created_date, modified_date +// FROM article +// WHERE id = ? +// """, articleRowMapper, id); +// } +// +// public Article insert(Article article) { +// KeyHolder keyHolder = new GeneratedKeyHolder(); +// jdbcTemplate.update(con -> { +// PreparedStatement ps = con.prepareStatement(""" +// INSERT INTO article (board_id, author_id, title, content) +// VALUES (?, ?, ?, ?) +// """, +// new String[]{"id"}); +// ps.setLong(1, article.getBoardId()); +// ps.setLong(2, article.getAuthorId()); +// ps.setString(3, article.getTitle()); +// ps.setString(4, article.getContent()); +// return ps; +// }, keyHolder); +// return findById(keyHolder.getKey().longValue()); +// } +// +// public Article update(Article article) { +// jdbcTemplate.update(""" +// UPDATE article +// SET board_id = ?, title = ?, content = ? +// WHERE id = ? +// """, +// article.getBoardId(), +// article.getTitle(), +// article.getContent(), +// article.getId() +// ); +// return findById(article.getId()); +// } +// +// public void deleteById(Long id) { +// jdbcTemplate.update(""" +// DELETE FROM article +// WHERE id = ? +// """, id); +// } } diff --git a/src/main/java/com/example/demo/repository/ArticleRepositoryMemory.java b/src/main/java/com/example/demo/repository/ArticleRepositoryMemory.java index 4996d3f..bdd7d5c 100644 --- a/src/main/java/com/example/demo/repository/ArticleRepositoryMemory.java +++ b/src/main/java/com/example/demo/repository/ArticleRepositoryMemory.java @@ -9,56 +9,56 @@ public class ArticleRepositoryMemory { - private static final Map articles = new HashMap<>(); - private static final AtomicLong autoincrement = new AtomicLong(1); - - public List
findAll() { - return articles.entrySet().stream() - .map(it -> { - Article article = it.getValue(); - article.setId(it.getKey()); - return article; - }).toList(); - } - - public List
findAllByBoardId(Long boardId) { - return articles.entrySet().stream() - .filter(it -> it.getValue().getBoardId().equals(boardId)) - .map(it -> { - Article article = it.getValue(); - article.setId(it.getKey()); - return article; - }).toList(); - } - - public List
findAllByMemberId(Long memberId) { - return articles.entrySet().stream() - .filter(it -> it.getValue().getAuthorId().equals(memberId)) - .map(it -> { - Article article = it.getValue(); - article.setId(it.getKey()); - return article; - }).toList(); - } - - public Article findById(Long id) { - return articles.getOrDefault(id, null); - } - - public Article insert(Article article) { - long id = autoincrement.getAndIncrement(); - articles.put(id, article); - article.setId(id); - return article; - } - - public Article update(Article article) { - articles.put(article.getId(), article); - return article; - } - - public void deleteById(Long id) { - articles.remove(id); - } +// private static final Map articles = new HashMap<>(); +// private static final AtomicLong autoincrement = new AtomicLong(1); +// +// public List
findAll() { +// return articles.entrySet().stream() +// .map(it -> { +// Article article = it.getValue(); +// article.setId(it.getKey()); +// return article; +// }).toList(); +// } +// +// public List
findAllByBoardId(Long boardId) { +// return articles.entrySet().stream() +// .filter(it -> it.getValue().getBoardId().equals(boardId)) +// .map(it -> { +// Article article = it.getValue(); +// article.setId(it.getKey()); +// return article; +// }).toList(); +// } +// +// public List
findAllByMemberId(Long memberId) { +// return articles.entrySet().stream() +// .filter(it -> it.getValue().getAuthorId().equals(memberId)) +// .map(it -> { +// Article article = it.getValue(); +// article.setId(it.getKey()); +// return article; +// }).toList(); +// } +// +// public Article findById(Long id) { +// return articles.getOrDefault(id, null); +// } +// +// public Article insert(Article article) { +// long id = autoincrement.getAndIncrement(); +// articles.put(id, article); +// article.setId(id); +// return article; +// } +// +// public Article update(Article article) { +// articles.put(article.getId(), article); +// return article; +// } +// +// public void deleteById(Long id) { +// articles.remove(id); +// } } diff --git a/src/main/java/com/example/demo/service/ArticleService.java b/src/main/java/com/example/demo/service/ArticleService.java index 326a667..cf2ef11 100644 --- a/src/main/java/com/example/demo/service/ArticleService.java +++ b/src/main/java/com/example/demo/service/ArticleService.java @@ -40,8 +40,8 @@ public List getArticles() { public ArticleResponse getById(Long id) { Article article = articleRepository.findById(id); - Member member = memberRepository.findById(article.getAuthorId()); - Board board = boardRepository.findById(article.getBoardId()); + Member member = memberRepository.findById(article.getAuthor().getId()); + Board board = boardRepository.findById(article.getBoard().getId()); return ArticleResponse.of(article, member, board); } @@ -49,8 +49,8 @@ public List getByBoardId(Long boardId) { List
articles = articleRepository.findAllByBoardId(boardId); return articles.stream() .map(article -> { - Member member = memberRepository.findById(article.getAuthorId()); - Board board = boardRepository.findById(article.getBoardId()); + Member member = memberRepository.findById(article.getAuthor().getId()); + Board board = boardRepository.findById(article.getBoard().getId()); return ArticleResponse.of(article, member, board); }) .toList(); @@ -59,23 +59,23 @@ public List getByBoardId(Long boardId) { @Transactional public ArticleResponse create(ArticleCreateRequest request) { Article article = new Article( - request.authorId(), - request.boardId(), + memberRepository.findById(request.authorId()), + boardRepository.findById(request.boardId()), request.title(), request.description() ); Article saved = articleRepository.save(article); - Member member = memberRepository.findById(saved.getAuthorId()); - Board board = boardRepository.findById(saved.getBoardId()); + Member member = memberRepository.findById(saved.getAuthor().getId()); + Board board = boardRepository.findById(saved.getBoard().getId()); return ArticleResponse.of(saved, member, board); } @Transactional public ArticleResponse update(Long id, ArticleUpdateRequest request) { Article article = articleRepository.findById(id); - article.update(request.boardId(), request.title(), request.description()); - Member member = memberRepository.findById(article.getAuthorId()); - Board board = boardRepository.findById(article.getBoardId()); + article.update(boardRepository.findById(request.boardId()), request.title(), request.description()); + Member member = memberRepository.findById(article.getAuthor().getId()); + Board board = boardRepository.findById(article.getBoard().getId()); return ArticleResponse.of(article, member, board); } @@ -83,4 +83,5 @@ public ArticleResponse update(Long id, ArticleUpdateRequest request) { public void delete(Long id) { articleRepository.deleteById(id); } + } From 966fbac5cec90a6a0f19b894c6aba15367e5cb61 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 2 Jul 2024 11:35:46 +0900 Subject: [PATCH 41/62] refactor: makes Board have one-to-many mapping --- src/main/java/com/example/demo/domain/Board.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/example/demo/domain/Board.java b/src/main/java/com/example/demo/domain/Board.java index 5c99777..6ec4d4b 100644 --- a/src/main/java/com/example/demo/domain/Board.java +++ b/src/main/java/com/example/demo/domain/Board.java @@ -2,6 +2,8 @@ import jakarta.persistence.*; +import java.util.List; + @Entity @Table(name = "board") public class Board { @@ -11,6 +13,8 @@ public class Board { private Long id; @Column(name = "name") private String name; + @OneToMany(mappedBy = "board") + private List
articles; public Board(Long id, String name) { this.id = id; @@ -40,4 +44,5 @@ public String getName() { public void update(String name) { this.name = name; } + } From 0d35924730ca774bd2337d718bec9c3ae1e2a2dd Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 2 Jul 2024 11:42:02 +0900 Subject: [PATCH 42/62] refactor: makes member have one-to-many mapping --- src/main/java/com/example/demo/domain/Member.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/example/demo/domain/Member.java b/src/main/java/com/example/demo/domain/Member.java index fcca1cf..1cea336 100644 --- a/src/main/java/com/example/demo/domain/Member.java +++ b/src/main/java/com/example/demo/domain/Member.java @@ -2,6 +2,8 @@ import jakarta.persistence.*; +import java.util.List; + @Entity @Table(name = "member") public class Member { @@ -15,6 +17,8 @@ public class Member { private String email; @Column(name = "password") private String password; + @OneToMany(mappedBy = "author") + private List
articles; public Member(Long id, String name, String email, String password) { this.id = id; From f3405c611f0b4159d38fac7dd0e326a41cc1e067 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 2 Jul 2024 11:55:26 +0900 Subject: [PATCH 43/62] refactor: alter to lazy fetch --- src/main/java/com/example/demo/domain/Article.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/demo/domain/Article.java b/src/main/java/com/example/demo/domain/Article.java index a832aa5..6ecff18 100644 --- a/src/main/java/com/example/demo/domain/Article.java +++ b/src/main/java/com/example/demo/domain/Article.java @@ -11,10 +11,10 @@ public class Article { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "author_id") private Member author; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "board_id") private Board board; @Column(name = "title") From c2ba88a4786f275406a6242e44e22b47b1920534 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 2 Jul 2024 13:11:49 +0900 Subject: [PATCH 44/62] refactor: modify create, update logic in ArticleService --- .../java/com/example/demo/service/ArticleService.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/example/demo/service/ArticleService.java b/src/main/java/com/example/demo/service/ArticleService.java index cf2ef11..7b4478a 100644 --- a/src/main/java/com/example/demo/service/ArticleService.java +++ b/src/main/java/com/example/demo/service/ArticleService.java @@ -65,8 +65,8 @@ public ArticleResponse create(ArticleCreateRequest request) { request.description() ); Article saved = articleRepository.save(article); - Member member = memberRepository.findById(saved.getAuthor().getId()); - Board board = boardRepository.findById(saved.getBoard().getId()); + Member member = saved.getAuthor(); + Board board = saved.getBoard(); return ArticleResponse.of(saved, member, board); } @@ -74,8 +74,8 @@ public ArticleResponse create(ArticleCreateRequest request) { public ArticleResponse update(Long id, ArticleUpdateRequest request) { Article article = articleRepository.findById(id); article.update(boardRepository.findById(request.boardId()), request.title(), request.description()); - Member member = memberRepository.findById(article.getAuthor().getId()); - Board board = boardRepository.findById(article.getBoard().getId()); + Member member = article.getAuthor(); + Board board = article.getBoard(); return ArticleResponse.of(article, member, board); } From 93c1057855ef12098f2cfbe4c3a4c87a7ec260dc Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 2 Jul 2024 13:12:12 +0900 Subject: [PATCH 45/62] feat: add articles getter --- src/main/java/com/example/demo/domain/Board.java | 9 +++++++-- src/main/java/com/example/demo/domain/Member.java | 8 +++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/example/demo/domain/Board.java b/src/main/java/com/example/demo/domain/Board.java index 6ec4d4b..2e76188 100644 --- a/src/main/java/com/example/demo/domain/Board.java +++ b/src/main/java/com/example/demo/domain/Board.java @@ -2,6 +2,7 @@ import jakarta.persistence.*; +import java.util.ArrayList; import java.util.List; @Entity @@ -13,8 +14,8 @@ public class Board { private Long id; @Column(name = "name") private String name; - @OneToMany(mappedBy = "board") - private List
articles; + @OneToMany(mappedBy = "board", orphanRemoval = true, cascade = CascadeType.ALL) + private List
articles = new ArrayList<>(); public Board(Long id, String name) { this.id = id; @@ -41,6 +42,10 @@ public String getName() { return name; } + public List
getArticles() { + return articles; + } + public void update(String name) { this.name = name; } diff --git a/src/main/java/com/example/demo/domain/Member.java b/src/main/java/com/example/demo/domain/Member.java index 1cea336..e1cda64 100644 --- a/src/main/java/com/example/demo/domain/Member.java +++ b/src/main/java/com/example/demo/domain/Member.java @@ -2,6 +2,7 @@ import jakarta.persistence.*; +import java.util.ArrayList; import java.util.List; @Entity @@ -18,7 +19,7 @@ public class Member { @Column(name = "password") private String password; @OneToMany(mappedBy = "author") - private List
articles; + private List
articles = new ArrayList<>(); public Member(Long id, String name, String email, String password) { this.id = id; @@ -61,4 +62,9 @@ public String getEmail() { public String getPassword() { return password; } + + public List
getArticles() { + return articles; + } + } From 9b5c19e32deab32158f538cff1ef81e76648d670 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 2 Jul 2024 13:18:03 +0900 Subject: [PATCH 46/62] =?UTF-8?q?feat:=20=EC=96=91=EB=B0=A9=ED=96=A5=20?= =?UTF-8?q?=EC=97=B0=EA=B4=80=EA=B4=80=EA=B3=84=20=EC=A0=81=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/demo/domain/Article.java | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/example/demo/domain/Article.java b/src/main/java/com/example/demo/domain/Article.java index 6ecff18..67fe032 100644 --- a/src/main/java/com/example/demo/domain/Article.java +++ b/src/main/java/com/example/demo/domain/Article.java @@ -26,16 +26,17 @@ public class Article { @Column(name = "modified_date") private LocalDateTime modifiedAt; - public Article() {} + public Article() { + } public Article( - Long id, - Member author, - Board board, - String title, - String content, - LocalDateTime createdAt, - LocalDateTime modifiedAt + Long id, + Member author, + Board board, + String title, + String content, + LocalDateTime createdAt, + LocalDateTime modifiedAt ) { this.id = id; this.author = author; @@ -44,6 +45,9 @@ public Article( this.content = content; this.createdAt = createdAt; this.modifiedAt = modifiedAt; + + author.getArticles().add(this); + board.getArticles().add(this); } public Article(Member author, Board board, String title, String content) { @@ -54,13 +58,20 @@ public Article(Member author, Board board, String title, String content) { this.content = content; this.createdAt = LocalDateTime.now(); this.modifiedAt = LocalDateTime.now(); + + author.getArticles().add(this); + board.getArticles().add(this); } public void update(Board board, String title, String description) { + this.board.getArticles().remove(this); + this.board = board; this.title = title; this.content = description; this.modifiedAt = LocalDateTime.now(); + + board.getArticles().add(this); } public void setId(Long id) { From 7600bd2d4c98c7f80b1e5ec4bfab4af17b29c80b Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Sat, 6 Jul 2024 23:27:43 +0900 Subject: [PATCH 47/62] =?UTF-8?q?style:=20=ED=95=84=EB=93=9C=EA=B0=84=20?= =?UTF-8?q?=EA=B0=9C=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/demo/domain/Article.java | 22 ++++++++++++------- .../java/com/example/demo/domain/Board.java | 2 ++ .../java/com/example/demo/domain/Member.java | 4 ++++ 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/example/demo/domain/Article.java b/src/main/java/com/example/demo/domain/Article.java index 67fe032..603a7ad 100644 --- a/src/main/java/com/example/demo/domain/Article.java +++ b/src/main/java/com/example/demo/domain/Article.java @@ -11,18 +11,24 @@ public class Article { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "author_id") private Member author; + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "board_id") private Board board; + @Column(name = "title") private String title; + @Column(name = "content") private String content; + @Column(name = "created_date") private LocalDateTime createdAt; + @Column(name = "modified_date") private LocalDateTime modifiedAt; @@ -74,18 +80,14 @@ public void update(Board board, String title, String description) { board.getArticles().add(this); } - public void setId(Long id) { - this.id = id; - } - - public void setModifiedAt(LocalDateTime modifiedAt) { - this.modifiedAt = modifiedAt; - } - public Long getId() { return id; } + public void setId(Long id) { + this.id = id; + } + public Member getAuthor() { return author; } @@ -110,4 +112,8 @@ public LocalDateTime getModifiedAt() { return modifiedAt; } + public void setModifiedAt(LocalDateTime modifiedAt) { + this.modifiedAt = modifiedAt; + } + } diff --git a/src/main/java/com/example/demo/domain/Board.java b/src/main/java/com/example/demo/domain/Board.java index 2e76188..0af9858 100644 --- a/src/main/java/com/example/demo/domain/Board.java +++ b/src/main/java/com/example/demo/domain/Board.java @@ -12,8 +12,10 @@ public class Board { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @Column(name = "name") private String name; + @OneToMany(mappedBy = "board", orphanRemoval = true, cascade = CascadeType.ALL) private List
articles = new ArrayList<>(); diff --git a/src/main/java/com/example/demo/domain/Member.java b/src/main/java/com/example/demo/domain/Member.java index e1cda64..34edc65 100644 --- a/src/main/java/com/example/demo/domain/Member.java +++ b/src/main/java/com/example/demo/domain/Member.java @@ -12,12 +12,16 @@ public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @Column(name = "name") private String name; + @Column(name = "email") private String email; + @Column(name = "password") private String password; + @OneToMany(mappedBy = "author") private List
articles = new ArrayList<>(); From 5c65b1c47196698d77c90540b3ad34b845a431b9 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 9 Jul 2024 21:30:18 +0900 Subject: [PATCH 48/62] feat: add dependencies --- build.gradle | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index b6c0c0f..77b0125 100644 --- a/build.gradle +++ b/build.gradle @@ -21,7 +21,10 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-jdbc' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' runtimeOnly 'com.mysql:mysql-connector-j' - testImplementation 'org.springframework.boot:spring-boot-starter-test' +// testImplementation 'org.springframework.boot:spring-boot-starter-test' + implementation 'org.springframework.boot:spring-boot-starter-security' +// implementation 'io.jsonwebtoken:jjwt:0.9.1' + } tasks.named('test') { From adbb0c0d4c0850494843bda7a114ff75d3a5060c Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 9 Jul 2024 21:31:03 +0900 Subject: [PATCH 49/62] feat: add POST /members/login and /members/join --- .../java/com/example/demo/controller/MemberController.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/demo/controller/MemberController.java b/src/main/java/com/example/demo/controller/MemberController.java index 0091ed9..ccd49f1 100644 --- a/src/main/java/com/example/demo/controller/MemberController.java +++ b/src/main/java/com/example/demo/controller/MemberController.java @@ -40,7 +40,7 @@ public ResponseEntity getMember(@PathVariable Long id) { return ResponseEntity.ok(response); } - @PostMapping() + @PostMapping("/join") public ResponseEntity create(@RequestBody MemberCreateRequest request) { if (request.name() == null || request.email() == null || request.password() == null) { throw new RestApiException(CommonErrorCode.NULL_PARAMETER); @@ -49,6 +49,11 @@ public ResponseEntity create(@RequestBody MemberCreateRequest re return ResponseEntity.ok(response); } + @PostMapping("/login") + public ResponseEntity login() { + return ResponseEntity.ok().body("token"); + } + @PutMapping("/{id}") public ResponseEntity updateMember(@PathVariable Long id, @RequestBody MemberUpdateRequest request) { if (memberService.getAll().stream().filter(res -> !res.id().equals(id)).anyMatch(res -> res.email().equals(request.email()))) { From 21f7c37b7acbe10989d8d08072552464d35e07a3 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 9 Jul 2024 21:31:15 +0900 Subject: [PATCH 50/62] feat: add AuthenticationConfig --- .../configuration/AuthenticationConfig.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/com/example/demo/configuration/AuthenticationConfig.java diff --git a/src/main/java/com/example/demo/configuration/AuthenticationConfig.java b/src/main/java/com/example/demo/configuration/AuthenticationConfig.java new file mode 100644 index 0000000..99848fe --- /dev/null +++ b/src/main/java/com/example/demo/configuration/AuthenticationConfig.java @@ -0,0 +1,28 @@ +package com.example.demo.configuration; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.web.SecurityFilterChain; + +@Configuration +@EnableWebSecurity +public class AuthenticationConfig { + + @Bean + public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception { + httpSecurity + .csrf(AbstractHttpConfigurer::disable) + .formLogin(AbstractHttpConfigurer::disable) + .authorizeHttpRequests(authorize -> authorize + .requestMatchers("/members/join").permitAll() + .requestMatchers("/members/login").permitAll() + .requestMatchers(HttpMethod.POST).authenticated() + .anyRequest().authenticated()); + return httpSecurity.build(); + } + +} From 98c649aeeb1c912644f00a41abb1d73beb15d6b4 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 9 Jul 2024 21:32:35 +0900 Subject: [PATCH 51/62] feat: add dependency --- build.gradle | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 77b0125..a8847f2 100644 --- a/build.gradle +++ b/build.gradle @@ -23,8 +23,7 @@ dependencies { runtimeOnly 'com.mysql:mysql-connector-j' // testImplementation 'org.springframework.boot:spring-boot-starter-test' implementation 'org.springframework.boot:spring-boot-starter-security' -// implementation 'io.jsonwebtoken:jjwt:0.9.1' - + implementation 'io.jsonwebtoken:jjwt:0.9.1' } tasks.named('test') { From f0228e96b792cb7b7c1e5d86767a7655f9f93709 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 9 Jul 2024 21:49:07 +0900 Subject: [PATCH 52/62] feat: add JwtUtil --- .../java/com/example/demo/jwt/JwtUtil.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/com/example/demo/jwt/JwtUtil.java diff --git a/src/main/java/com/example/demo/jwt/JwtUtil.java b/src/main/java/com/example/demo/jwt/JwtUtil.java new file mode 100644 index 0000000..2e3f080 --- /dev/null +++ b/src/main/java/com/example/demo/jwt/JwtUtil.java @@ -0,0 +1,23 @@ +package com.example.demo.jwt; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +import java.util.Date; + +public class JwtUtil { + + public static String createJwt(String email, String secretKey, Long expiredMs) { + Claims claims = Jwts.claims(); + claims.put("userName", email); + + return Jwts.builder() + .setClaims(claims) + .setIssuedAt(new Date(System.currentTimeMillis())) + .setExpiration(new Date(System.currentTimeMillis() + expiredMs)) + .signWith(SignatureAlgorithm.HS256, secretKey) + .compact(); + } + +} From 7ab68c1f3a5f912ed92c466593dc013ba41ab406 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 9 Jul 2024 21:51:45 +0900 Subject: [PATCH 53/62] feat: add login method --- .../example/demo/controller/MemberController.java | 2 +- .../java/com/example/demo/service/MemberService.java | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/demo/controller/MemberController.java b/src/main/java/com/example/demo/controller/MemberController.java index ccd49f1..0bcae24 100644 --- a/src/main/java/com/example/demo/controller/MemberController.java +++ b/src/main/java/com/example/demo/controller/MemberController.java @@ -51,7 +51,7 @@ public ResponseEntity create(@RequestBody MemberCreateRequest re @PostMapping("/login") public ResponseEntity login() { - return ResponseEntity.ok().body("token"); + return ResponseEntity.ok().body(memberService.login("","")); } @PutMapping("/{id}") diff --git a/src/main/java/com/example/demo/service/MemberService.java b/src/main/java/com/example/demo/service/MemberService.java index 89c5ea7..b250af0 100644 --- a/src/main/java/com/example/demo/service/MemberService.java +++ b/src/main/java/com/example/demo/service/MemberService.java @@ -4,7 +4,9 @@ import com.example.demo.controller.dto.request.MemberUpdateRequest; import com.example.demo.controller.dto.response.MemberResponse; import com.example.demo.domain.Member; +import com.example.demo.jwt.JwtUtil; import com.example.demo.repository.MemberRepository; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -14,6 +16,11 @@ @Transactional(readOnly = true) public class MemberService { + @Value("${jwt.secret}") + private String secretKey; + + private Long expiredMs = 1000 * 60 * 60L; + private final MemberRepository memberRepository; public MemberService(MemberRepository memberRepository) { @@ -52,4 +59,9 @@ public MemberResponse update(Long id, MemberUpdateRequest request) { return MemberResponse.from(member); } + public String login(String email, String password) { + // 인증과정 + return JwtUtil.createJwt(email, secretKey, expiredMs); + } + } From e33138ee8ac656f2edeff45295aca76db173bfc1 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 9 Jul 2024 22:38:09 +0900 Subject: [PATCH 54/62] feat: add dependency --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index a8847f2..08c0779 100644 --- a/build.gradle +++ b/build.gradle @@ -24,6 +24,7 @@ dependencies { // testImplementation 'org.springframework.boot:spring-boot-starter-test' implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'io.jsonwebtoken:jjwt:0.9.1' + implementation 'javax.xml.bind:jaxb-api:2.3.0' } tasks.named('test') { From 164a7c75607a5b5939aa71ee97754956f68be450 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 9 Jul 2024 22:38:35 +0900 Subject: [PATCH 55/62] feat: add JwtFilter class --- .../configuration/AuthenticationConfig.java | 16 ++++- .../java/com/example/demo/jwt/JwtFilter.java | 59 +++++++++++++++++++ .../java/com/example/demo/jwt/JwtUtil.java | 14 ++++- 3 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/example/demo/jwt/JwtFilter.java diff --git a/src/main/java/com/example/demo/configuration/AuthenticationConfig.java b/src/main/java/com/example/demo/configuration/AuthenticationConfig.java index 99848fe..37bb21b 100644 --- a/src/main/java/com/example/demo/configuration/AuthenticationConfig.java +++ b/src/main/java/com/example/demo/configuration/AuthenticationConfig.java @@ -1,5 +1,8 @@ package com.example.demo.configuration; +import com.example.demo.jwt.JwtFilter; +import com.example.demo.service.MemberService; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; @@ -7,11 +10,21 @@ import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; @Configuration @EnableWebSecurity public class AuthenticationConfig { + private final MemberService memberService; + + @Value("${jwt.secret}") + private String secretKey; + + public AuthenticationConfig(MemberService memberService) { + this.memberService = memberService; + } + @Bean public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception { httpSecurity @@ -21,7 +34,8 @@ public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Excepti .requestMatchers("/members/join").permitAll() .requestMatchers("/members/login").permitAll() .requestMatchers(HttpMethod.POST).authenticated() - .anyRequest().authenticated()); + .anyRequest().authenticated()) + .addFilterBefore(new JwtFilter(memberService, secretKey), UsernamePasswordAuthenticationFilter.class); return httpSecurity.build(); } diff --git a/src/main/java/com/example/demo/jwt/JwtFilter.java b/src/main/java/com/example/demo/jwt/JwtFilter.java new file mode 100644 index 0000000..743fbcb --- /dev/null +++ b/src/main/java/com/example/demo/jwt/JwtFilter.java @@ -0,0 +1,59 @@ +package com.example.demo.jwt; + +import com.example.demo.service.MemberService; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.http.HttpHeaders; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; +import java.util.List; + +public class JwtFilter extends OncePerRequestFilter { + + private final MemberService memberService; + private final String secretKey; + + public JwtFilter(MemberService memberService, String secretKey) { + this.memberService = memberService; + this.secretKey = secretKey; + } + + // 필터 실제 로직 + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + + final String authorization = request.getHeader(HttpHeaders.AUTHORIZATION); + + // token 안보내면 block + if (authorization == null || !authorization.startsWith("Bearer ")) { + filterChain.doFilter(request, response); + return; + } + + // token 꺼내기 + String token = authorization.split(" ")[1]; + + // token expired 여부 + if (JwtUtil.isExpired(token, secretKey)) { + filterChain.doFilter(request, response); + return; + } + + // UserName token 에서 꺼내기 + String userName = JwtUtil.getUserName(token, secretKey); + + //인증된 사용자를 나타내는 토큰 객체를 생성하고, 권한 정보를 설정 + UsernamePasswordAuthenticationToken authenticationToken = + new UsernamePasswordAuthenticationToken(userName, null, List.of(new SimpleGrantedAuthority("USER"))); + authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + SecurityContextHolder.getContext().setAuthentication(authenticationToken); + filterChain.doFilter(request, response); + } +} diff --git a/src/main/java/com/example/demo/jwt/JwtUtil.java b/src/main/java/com/example/demo/jwt/JwtUtil.java index 2e3f080..dd930cc 100644 --- a/src/main/java/com/example/demo/jwt/JwtUtil.java +++ b/src/main/java/com/example/demo/jwt/JwtUtil.java @@ -8,9 +8,19 @@ public class JwtUtil { - public static String createJwt(String email, String secretKey, Long expiredMs) { + public static String getUserName(String token, String secretKey) { + return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token) + .getBody().get("userName", String.class); + } + + public static boolean isExpired(String token, String secretKey) { + return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token) + .getBody().getExpiration().before(new Date()); + } + + public static String createJwt(String name, String secretKey, Long expiredMs) { Claims claims = Jwts.claims(); - claims.put("userName", email); + claims.put("userName", name); return Jwts.builder() .setClaims(claims) From f16ec8c53cc3dcbff0374e1f4bd162767538f335 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 9 Jul 2024 23:22:55 +0900 Subject: [PATCH 56/62] =?UTF-8?q?feat:=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=EC=8B=9C=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20=EC=A4=91?= =?UTF-8?q?=EB=B3=B5=20=EB=B0=A9=EC=A7=80=20=EA=B8=B0=EB=8A=A5=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 --- .../com/example/demo/controller/MemberController.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/demo/controller/MemberController.java b/src/main/java/com/example/demo/controller/MemberController.java index 0bcae24..a84271c 100644 --- a/src/main/java/com/example/demo/controller/MemberController.java +++ b/src/main/java/com/example/demo/controller/MemberController.java @@ -1,6 +1,7 @@ package com.example.demo.controller; import com.example.demo.controller.dto.request.MemberCreateRequest; +import com.example.demo.controller.dto.request.MemberLoginRequest; import com.example.demo.controller.dto.request.MemberUpdateRequest; import com.example.demo.controller.dto.response.MemberResponse; import com.example.demo.exception.RestApiException; @@ -45,13 +46,16 @@ public ResponseEntity create(@RequestBody MemberCreateRequest re if (request.name() == null || request.email() == null || request.password() == null) { throw new RestApiException(CommonErrorCode.NULL_PARAMETER); } + if (memberService.getAll().stream().anyMatch((res -> res.email().equals(request.email())))) { + throw new RestApiException(MemberErrorCode.EMAIL_CONFLICT); + } MemberResponse response = memberService.create(request); return ResponseEntity.ok(response); } @PostMapping("/login") - public ResponseEntity login() { - return ResponseEntity.ok().body(memberService.login("","")); + public ResponseEntity login(@RequestBody MemberLoginRequest request) { + return ResponseEntity.ok().body(memberService.login(request)); } @PutMapping("/{id}") From 4c304655d8baebf91b2443be4a9b0dbdbef45838 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 9 Jul 2024 23:24:33 +0900 Subject: [PATCH 57/62] =?UTF-8?q?feat:=20=EC=9D=B4=EB=A9=94=EC=9D=BC?= =?UTF-8?q?=EB=A1=9C=20=EA=B2=80=EC=83=89=20=EA=B8=B0=EB=8A=A5=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/example/demo/repository/MemberRepository.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/example/demo/repository/MemberRepository.java b/src/main/java/com/example/demo/repository/MemberRepository.java index f1276d9..7b89c51 100644 --- a/src/main/java/com/example/demo/repository/MemberRepository.java +++ b/src/main/java/com/example/demo/repository/MemberRepository.java @@ -4,6 +4,7 @@ import org.springframework.data.repository.Repository; import java.util.List; +import java.util.Optional; public interface MemberRepository extends Repository { @@ -11,6 +12,8 @@ public interface MemberRepository extends Repository { Member findById(Long id); + Optional findByEmail(String email); + Member save(Member member); void deleteById(Long id); From 756e6eb7ed45147cf7c3ae7bd65c206359e704a1 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 9 Jul 2024 23:24:56 +0900 Subject: [PATCH 58/62] =?UTF-8?q?feat:=20EncoderConfig=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 --- .../example/demo/configuration/EncoderConfig.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/com/example/demo/configuration/EncoderConfig.java diff --git a/src/main/java/com/example/demo/configuration/EncoderConfig.java b/src/main/java/com/example/demo/configuration/EncoderConfig.java new file mode 100644 index 0000000..caff823 --- /dev/null +++ b/src/main/java/com/example/demo/configuration/EncoderConfig.java @@ -0,0 +1,15 @@ +package com.example.demo.configuration; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +@Configuration +public class EncoderConfig { + + @Bean + public BCryptPasswordEncoder encoder() { + return new BCryptPasswordEncoder(); + } + +} From 82c04a81501b9931e27364d382c13201c184723d Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 9 Jul 2024 23:25:38 +0900 Subject: [PATCH 59/62] =?UTF-8?q?feat:=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20?= =?UTF-8?q?=EC=A1=B4=EC=9E=AC=ED=95=98=EC=A7=80=20=EC=95=8A=EC=9D=8C,=20?= =?UTF-8?q?=ED=8C=A8=EC=8A=A4=EC=9B=8C=EB=93=9C=20=EB=B6=88=EC=9D=BC?= =?UTF-8?q?=EC=B9=98=20=EC=97=90=EB=9F=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/demo/exception/error/MemberErrorCode.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/demo/exception/error/MemberErrorCode.java b/src/main/java/com/example/demo/exception/error/MemberErrorCode.java index 5d6db63..da1de20 100644 --- a/src/main/java/com/example/demo/exception/error/MemberErrorCode.java +++ b/src/main/java/com/example/demo/exception/error/MemberErrorCode.java @@ -4,8 +4,10 @@ public enum MemberErrorCode implements ErrorCode{ + EMAIL_NOT_FOUND(HttpStatus.NOT_FOUND, "이메일을 찾을 수 없습니다."), EMAIL_CONFLICT(HttpStatus.CONFLICT, "중복된 이메일입니다."), - ARTICLE_EXISTENCE(HttpStatus.BAD_REQUEST, "작성한 게시물이 존재합니다."); + ARTICLE_EXISTENCE(HttpStatus.BAD_REQUEST, "작성한 게시물이 존재합니다."), + INVALID_PASSWORD(HttpStatus.BAD_REQUEST, "패스워드를 잘못 입력했습니다."); private final HttpStatus httpStatus; private final String message; From 9efdca4a54271e1c7ec3a3241e12eee565d4f9fb Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 9 Jul 2024 23:25:59 +0900 Subject: [PATCH 60/62] =?UTF-8?q?feat:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20dto?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo/controller/dto/request/MemberLoginRequest.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/main/java/com/example/demo/controller/dto/request/MemberLoginRequest.java diff --git a/src/main/java/com/example/demo/controller/dto/request/MemberLoginRequest.java b/src/main/java/com/example/demo/controller/dto/request/MemberLoginRequest.java new file mode 100644 index 0000000..5032ab9 --- /dev/null +++ b/src/main/java/com/example/demo/controller/dto/request/MemberLoginRequest.java @@ -0,0 +1,4 @@ +package com.example.demo.controller.dto.request; + +public record MemberLoginRequest(String email, String password) { +} From 384823e3732f7ba40ff8201f0c84136a80b977ce Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Tue, 9 Jul 2024 23:27:28 +0900 Subject: [PATCH 61/62] =?UTF-8?q?feat:=20login=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/demo/service/MemberService.java | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/example/demo/service/MemberService.java b/src/main/java/com/example/demo/service/MemberService.java index b250af0..36b1fc4 100644 --- a/src/main/java/com/example/demo/service/MemberService.java +++ b/src/main/java/com/example/demo/service/MemberService.java @@ -1,12 +1,17 @@ package com.example.demo.service; import com.example.demo.controller.dto.request.MemberCreateRequest; +import com.example.demo.controller.dto.request.MemberLoginRequest; import com.example.demo.controller.dto.request.MemberUpdateRequest; import com.example.demo.controller.dto.response.MemberResponse; import com.example.demo.domain.Member; +import com.example.demo.exception.RestApiException; +import com.example.demo.exception.error.ErrorCode; +import com.example.demo.exception.error.MemberErrorCode; import com.example.demo.jwt.JwtUtil; import com.example.demo.repository.MemberRepository; import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -19,12 +24,15 @@ public class MemberService { @Value("${jwt.secret}") private String secretKey; - private Long expiredMs = 1000 * 60 * 60L; + final private Long expiredMs = 1000 * 60 * 60L; private final MemberRepository memberRepository; - public MemberService(MemberRepository memberRepository) { + private final PasswordEncoder passwordEncoder; + + public MemberService(MemberRepository memberRepository, PasswordEncoder passwordEncoder) { this.memberRepository = memberRepository; + this.passwordEncoder = passwordEncoder; } public MemberResponse getById(Long id) { @@ -42,7 +50,7 @@ public List getAll() { @Transactional public MemberResponse create(MemberCreateRequest request) { Member member = memberRepository.save( - new Member(request.name(), request.email(), request.password()) + new Member(request.name(), request.email(), passwordEncoder.encode(request.password())) ); return MemberResponse.from(member); } @@ -59,9 +67,14 @@ public MemberResponse update(Long id, MemberUpdateRequest request) { return MemberResponse.from(member); } - public String login(String email, String password) { + public String login(MemberLoginRequest request) { // 인증과정 - return JwtUtil.createJwt(email, secretKey, expiredMs); + Member selectedMember = memberRepository.findByEmail(request.email()).orElseThrow(() -> new RestApiException(MemberErrorCode.EMAIL_NOT_FOUND)); + if (!passwordEncoder.matches(request.password(), selectedMember.getPassword())) { + throw new RestApiException(MemberErrorCode.INVALID_PASSWORD); + } + + return JwtUtil.createJwt(request.email(), secretKey, expiredMs); } } From 2947fbcf0f14be485a9f579514812a86018bb233 Mon Sep 17 00:00:00 2001 From: In-Hwa Kang Date: Wed, 10 Jul 2024 00:04:51 +0900 Subject: [PATCH 62/62] =?UTF-8?q?feat:=20get=20=EC=9A=94=EC=B2=AD=EC=9D=84?= =?UTF-8?q?=20=ED=97=88=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/demo/configuration/AuthenticationConfig.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/demo/configuration/AuthenticationConfig.java b/src/main/java/com/example/demo/configuration/AuthenticationConfig.java index 37bb21b..440918d 100644 --- a/src/main/java/com/example/demo/configuration/AuthenticationConfig.java +++ b/src/main/java/com/example/demo/configuration/AuthenticationConfig.java @@ -34,7 +34,9 @@ public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Excepti .requestMatchers("/members/join").permitAll() .requestMatchers("/members/login").permitAll() .requestMatchers(HttpMethod.POST).authenticated() - .anyRequest().authenticated()) + .requestMatchers(HttpMethod.GET).permitAll() + .anyRequest().authenticated() + ) .addFilterBefore(new JwtFilter(memberService, secretKey), UsernamePasswordAuthenticationFilter.class); return httpSecurity.build(); }