From db2b413103d3fe3735c12412f1cc19e7a5a31594 Mon Sep 17 00:00:00 2001 From: JuHyeonPark Date: Mon, 1 Jan 2024 19:47:12 +0900 Subject: [PATCH 01/10] =?UTF-8?q?feat:=20Test=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EA=B5=AC=EC=B6=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 도메인 예시를 위한 Test 도메인 구축: 엔티티 + dto + 3계층 --- .../test/controller/TestController.java | 32 +++++++++++++++++ .../domain/test/dto/TestInfoResponse.java | 20 +++++++++++ .../domain/test/dto/TestSaveRequest.java | 18 ++++++++++ .../domain/test/entity/TestEntity.java | 35 +++++++++++++++++++ .../test/repository/TestRepository.java | 8 +++++ .../domain/test/service/TestService.java | 29 +++++++++++++++ 6 files changed, 142 insertions(+) create mode 100644 src/main/java/kr/co/fastcampus/Yanabada/domain/test/controller/TestController.java create mode 100644 src/main/java/kr/co/fastcampus/Yanabada/domain/test/dto/TestInfoResponse.java create mode 100644 src/main/java/kr/co/fastcampus/Yanabada/domain/test/dto/TestSaveRequest.java create mode 100644 src/main/java/kr/co/fastcampus/Yanabada/domain/test/entity/TestEntity.java create mode 100644 src/main/java/kr/co/fastcampus/Yanabada/domain/test/repository/TestRepository.java create mode 100644 src/main/java/kr/co/fastcampus/Yanabada/domain/test/service/TestService.java diff --git a/src/main/java/kr/co/fastcampus/Yanabada/domain/test/controller/TestController.java b/src/main/java/kr/co/fastcampus/Yanabada/domain/test/controller/TestController.java new file mode 100644 index 00000000..ca2e734b --- /dev/null +++ b/src/main/java/kr/co/fastcampus/Yanabada/domain/test/controller/TestController.java @@ -0,0 +1,32 @@ +package kr.co.fastcampus.Yanabada.domain.test.controller; + +import kr.co.fastcampus.Yanabada.domain.test.dto.TestInfoResponse; +import kr.co.fastcampus.Yanabada.domain.test.dto.TestSaveRequest; +import kr.co.fastcampus.Yanabada.domain.test.service.TestService; +import kr.co.fastcampus.fastcatch.common.response.ResponseBody; +import lombok.RequiredArgsConstructor; +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.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/tests") +@RequiredArgsConstructor +public class TestController { + + private final TestService testService; + + @GetMapping("/{testId}") + public ResponseBody getTest(@PathVariable Long testId) { + return ResponseBody.ok(testService.findById(testId)); + } + + @PostMapping + public ResponseBody addTest(@RequestBody TestSaveRequest request) { + return ResponseBody.ok(testService.save(request)); + } + +} diff --git a/src/main/java/kr/co/fastcampus/Yanabada/domain/test/dto/TestInfoResponse.java b/src/main/java/kr/co/fastcampus/Yanabada/domain/test/dto/TestInfoResponse.java new file mode 100644 index 00000000..afe0a142 --- /dev/null +++ b/src/main/java/kr/co/fastcampus/Yanabada/domain/test/dto/TestInfoResponse.java @@ -0,0 +1,20 @@ +package kr.co.fastcampus.Yanabada.domain.test.dto; + +import kr.co.fastcampus.Yanabada.domain.test.entity.TestEntity; +import lombok.Builder; + +@Builder +public record TestInfoResponse( + Long id, + String name, + String email +) { + + public static TestInfoResponse from(TestEntity testEntity) { + return TestInfoResponse.builder() + .id(testEntity.getId()) + .name(testEntity.getName()) + .email(testEntity.getEmail()) + .build(); + } +} diff --git a/src/main/java/kr/co/fastcampus/Yanabada/domain/test/dto/TestSaveRequest.java b/src/main/java/kr/co/fastcampus/Yanabada/domain/test/dto/TestSaveRequest.java new file mode 100644 index 00000000..7325f71f --- /dev/null +++ b/src/main/java/kr/co/fastcampus/Yanabada/domain/test/dto/TestSaveRequest.java @@ -0,0 +1,18 @@ +package kr.co.fastcampus.Yanabada.domain.test.dto; + +import kr.co.fastcampus.Yanabada.domain.test.entity.TestEntity; +import lombok.Builder; + +@Builder +public record TestSaveRequest( + String name, + String email +) { + + public TestEntity toEntity() { + return TestEntity.builder() + .name(name) + .email(email) + .build(); + } +} diff --git a/src/main/java/kr/co/fastcampus/Yanabada/domain/test/entity/TestEntity.java b/src/main/java/kr/co/fastcampus/Yanabada/domain/test/entity/TestEntity.java new file mode 100644 index 00000000..0220e5b5 --- /dev/null +++ b/src/main/java/kr/co/fastcampus/Yanabada/domain/test/entity/TestEntity.java @@ -0,0 +1,35 @@ +package kr.co.fastcampus.Yanabada.domain.test.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import kr.co.fastcampus.fastcatch.common.baseentity.BaseEntity; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Getter +public class TestEntity extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false, length = 100) + private String name; + + @Column(nullable = false, length = 100) + private String email; + + @Builder + private TestEntity(String name, String email) { + this.name = name; + this.email = email; + } + +} diff --git a/src/main/java/kr/co/fastcampus/Yanabada/domain/test/repository/TestRepository.java b/src/main/java/kr/co/fastcampus/Yanabada/domain/test/repository/TestRepository.java new file mode 100644 index 00000000..61f34105 --- /dev/null +++ b/src/main/java/kr/co/fastcampus/Yanabada/domain/test/repository/TestRepository.java @@ -0,0 +1,8 @@ +package kr.co.fastcampus.Yanabada.domain.test.repository; + +import kr.co.fastcampus.Yanabada.domain.test.entity.TestEntity; +import org.springframework.data.repository.CrudRepository; + +public interface TestRepository extends CrudRepository { + +} diff --git a/src/main/java/kr/co/fastcampus/Yanabada/domain/test/service/TestService.java b/src/main/java/kr/co/fastcampus/Yanabada/domain/test/service/TestService.java new file mode 100644 index 00000000..0ff0e5b2 --- /dev/null +++ b/src/main/java/kr/co/fastcampus/Yanabada/domain/test/service/TestService.java @@ -0,0 +1,29 @@ +package kr.co.fastcampus.Yanabada.domain.test.service; + +import kr.co.fastcampus.Yanabada.domain.test.dto.TestInfoResponse; +import kr.co.fastcampus.Yanabada.domain.test.dto.TestSaveRequest; +import kr.co.fastcampus.Yanabada.domain.test.entity.TestEntity; +import kr.co.fastcampus.Yanabada.domain.test.repository.TestRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class TestService { + + private final TestRepository testRepository; + + public TestInfoResponse findById(Long testId) { + TestEntity testEntity = testRepository.findById(testId).orElseThrow(); + return TestInfoResponse.from(testEntity); + } + + @Transactional + public TestInfoResponse save(TestSaveRequest request) { + TestEntity testEntity = request.toEntity(); + TestEntity result = testRepository.save(testEntity); + return TestInfoResponse.from(result); + } +} From 37d3d0eed7396e1ad07180d0dcf69f7809cde6c8 Mon Sep 17 00:00:00 2001 From: JuHyeonPark Date: Mon, 1 Jan 2024 19:59:26 +0900 Subject: [PATCH 02/10] =?UTF-8?q?refactor:=20Test=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 빌더가 아닌 생성자를 사용하여 엔티티 생성, 디렉토리 이름 변경 --- .../domain/test/dto/TestSaveRequest.java | 18 ------------------ .../YanabadaApplication.java | 2 +- .../domain/test/controller/TestController.java | 10 +++++----- .../domain/test/dto/TestInfoResponse.java | 4 ++-- .../domain/test/dto/TestSaveRequest.java | 13 +++++++++++++ .../domain/test/entity/TestEntity.java | 10 ++++++---- .../domain/test/repository/TestRepository.java | 4 ++-- .../domain/test/service/TestService.java | 10 +++++----- .../YanabadaApplicationTests.java | 2 +- 9 files changed, 35 insertions(+), 38 deletions(-) delete mode 100644 src/main/java/kr/co/fastcampus/Yanabada/domain/test/dto/TestSaveRequest.java rename src/main/java/kr/co/fastcampus/{Yanabada => yanabada}/YanabadaApplication.java (89%) rename src/main/java/kr/co/fastcampus/{Yanabada => yanabada}/domain/test/controller/TestController.java (74%) rename src/main/java/kr/co/fastcampus/{Yanabada => yanabada}/domain/test/dto/TestInfoResponse.java (76%) create mode 100644 src/main/java/kr/co/fastcampus/yanabada/domain/test/dto/TestSaveRequest.java rename src/main/java/kr/co/fastcampus/{Yanabada => yanabada}/domain/test/entity/TestEntity.java (75%) rename src/main/java/kr/co/fastcampus/{Yanabada => yanabada}/domain/test/repository/TestRepository.java (53%) rename src/main/java/kr/co/fastcampus/{Yanabada => yanabada}/domain/test/service/TestService.java (70%) rename src/test/java/kr/co/fastcampus/{Yanabada => yanabada}/YanabadaApplicationTests.java (84%) diff --git a/src/main/java/kr/co/fastcampus/Yanabada/domain/test/dto/TestSaveRequest.java b/src/main/java/kr/co/fastcampus/Yanabada/domain/test/dto/TestSaveRequest.java deleted file mode 100644 index 7325f71f..00000000 --- a/src/main/java/kr/co/fastcampus/Yanabada/domain/test/dto/TestSaveRequest.java +++ /dev/null @@ -1,18 +0,0 @@ -package kr.co.fastcampus.Yanabada.domain.test.dto; - -import kr.co.fastcampus.Yanabada.domain.test.entity.TestEntity; -import lombok.Builder; - -@Builder -public record TestSaveRequest( - String name, - String email -) { - - public TestEntity toEntity() { - return TestEntity.builder() - .name(name) - .email(email) - .build(); - } -} diff --git a/src/main/java/kr/co/fastcampus/Yanabada/YanabadaApplication.java b/src/main/java/kr/co/fastcampus/yanabada/YanabadaApplication.java similarity index 89% rename from src/main/java/kr/co/fastcampus/Yanabada/YanabadaApplication.java rename to src/main/java/kr/co/fastcampus/yanabada/YanabadaApplication.java index e4b453b1..18a7e827 100644 --- a/src/main/java/kr/co/fastcampus/Yanabada/YanabadaApplication.java +++ b/src/main/java/kr/co/fastcampus/yanabada/YanabadaApplication.java @@ -1,4 +1,4 @@ -package kr.co.fastcampus.Yanabada; +package kr.co.fastcampus.yanabada; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/src/main/java/kr/co/fastcampus/Yanabada/domain/test/controller/TestController.java b/src/main/java/kr/co/fastcampus/yanabada/domain/test/controller/TestController.java similarity index 74% rename from src/main/java/kr/co/fastcampus/Yanabada/domain/test/controller/TestController.java rename to src/main/java/kr/co/fastcampus/yanabada/domain/test/controller/TestController.java index ca2e734b..084dfe36 100644 --- a/src/main/java/kr/co/fastcampus/Yanabada/domain/test/controller/TestController.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/test/controller/TestController.java @@ -1,9 +1,9 @@ -package kr.co.fastcampus.Yanabada.domain.test.controller; +package kr.co.fastcampus.yanabada.domain.test.controller; -import kr.co.fastcampus.Yanabada.domain.test.dto.TestInfoResponse; -import kr.co.fastcampus.Yanabada.domain.test.dto.TestSaveRequest; -import kr.co.fastcampus.Yanabada.domain.test.service.TestService; -import kr.co.fastcampus.fastcatch.common.response.ResponseBody; +import kr.co.fastcampus.yanabada.common.response.ResponseBody; +import kr.co.fastcampus.yanabada.domain.test.dto.TestInfoResponse; +import kr.co.fastcampus.yanabada.domain.test.dto.TestSaveRequest; +import kr.co.fastcampus.yanabada.domain.test.service.TestService; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; diff --git a/src/main/java/kr/co/fastcampus/Yanabada/domain/test/dto/TestInfoResponse.java b/src/main/java/kr/co/fastcampus/yanabada/domain/test/dto/TestInfoResponse.java similarity index 76% rename from src/main/java/kr/co/fastcampus/Yanabada/domain/test/dto/TestInfoResponse.java rename to src/main/java/kr/co/fastcampus/yanabada/domain/test/dto/TestInfoResponse.java index afe0a142..d3e1a7ea 100644 --- a/src/main/java/kr/co/fastcampus/Yanabada/domain/test/dto/TestInfoResponse.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/test/dto/TestInfoResponse.java @@ -1,6 +1,6 @@ -package kr.co.fastcampus.Yanabada.domain.test.dto; +package kr.co.fastcampus.yanabada.domain.test.dto; -import kr.co.fastcampus.Yanabada.domain.test.entity.TestEntity; +import kr.co.fastcampus.yanabada.domain.test.entity.TestEntity; import lombok.Builder; @Builder diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/test/dto/TestSaveRequest.java b/src/main/java/kr/co/fastcampus/yanabada/domain/test/dto/TestSaveRequest.java new file mode 100644 index 00000000..b4074888 --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/test/dto/TestSaveRequest.java @@ -0,0 +1,13 @@ +package kr.co.fastcampus.yanabada.domain.test.dto; + +import kr.co.fastcampus.yanabada.domain.test.entity.TestEntity; + +public record TestSaveRequest( + String name, + String email +) { + + public TestEntity toEntity() { + return TestEntity.create(name, email); + } +} diff --git a/src/main/java/kr/co/fastcampus/Yanabada/domain/test/entity/TestEntity.java b/src/main/java/kr/co/fastcampus/yanabada/domain/test/entity/TestEntity.java similarity index 75% rename from src/main/java/kr/co/fastcampus/Yanabada/domain/test/entity/TestEntity.java rename to src/main/java/kr/co/fastcampus/yanabada/domain/test/entity/TestEntity.java index 0220e5b5..8d2387be 100644 --- a/src/main/java/kr/co/fastcampus/Yanabada/domain/test/entity/TestEntity.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/test/entity/TestEntity.java @@ -1,13 +1,12 @@ -package kr.co.fastcampus.Yanabada.domain.test.entity; +package kr.co.fastcampus.yanabada.domain.test.entity; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import kr.co.fastcampus.fastcatch.common.baseentity.BaseEntity; +import kr.co.fastcampus.yanabada.common.baseentity.BaseEntity; import lombok.AccessLevel; -import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -26,10 +25,13 @@ public class TestEntity extends BaseEntity { @Column(nullable = false, length = 100) private String email; - @Builder private TestEntity(String name, String email) { this.name = name; this.email = email; } + public static TestEntity create(String name, String email) { + return new TestEntity(name, email); + } + } diff --git a/src/main/java/kr/co/fastcampus/Yanabada/domain/test/repository/TestRepository.java b/src/main/java/kr/co/fastcampus/yanabada/domain/test/repository/TestRepository.java similarity index 53% rename from src/main/java/kr/co/fastcampus/Yanabada/domain/test/repository/TestRepository.java rename to src/main/java/kr/co/fastcampus/yanabada/domain/test/repository/TestRepository.java index 61f34105..73e22a27 100644 --- a/src/main/java/kr/co/fastcampus/Yanabada/domain/test/repository/TestRepository.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/test/repository/TestRepository.java @@ -1,6 +1,6 @@ -package kr.co.fastcampus.Yanabada.domain.test.repository; +package kr.co.fastcampus.yanabada.domain.test.repository; -import kr.co.fastcampus.Yanabada.domain.test.entity.TestEntity; +import kr.co.fastcampus.yanabada.domain.test.entity.TestEntity; import org.springframework.data.repository.CrudRepository; public interface TestRepository extends CrudRepository { diff --git a/src/main/java/kr/co/fastcampus/Yanabada/domain/test/service/TestService.java b/src/main/java/kr/co/fastcampus/yanabada/domain/test/service/TestService.java similarity index 70% rename from src/main/java/kr/co/fastcampus/Yanabada/domain/test/service/TestService.java rename to src/main/java/kr/co/fastcampus/yanabada/domain/test/service/TestService.java index 0ff0e5b2..1c077124 100644 --- a/src/main/java/kr/co/fastcampus/Yanabada/domain/test/service/TestService.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/test/service/TestService.java @@ -1,9 +1,9 @@ -package kr.co.fastcampus.Yanabada.domain.test.service; +package kr.co.fastcampus.yanabada.domain.test.service; -import kr.co.fastcampus.Yanabada.domain.test.dto.TestInfoResponse; -import kr.co.fastcampus.Yanabada.domain.test.dto.TestSaveRequest; -import kr.co.fastcampus.Yanabada.domain.test.entity.TestEntity; -import kr.co.fastcampus.Yanabada.domain.test.repository.TestRepository; +import kr.co.fastcampus.yanabada.domain.test.dto.TestInfoResponse; +import kr.co.fastcampus.yanabada.domain.test.dto.TestSaveRequest; +import kr.co.fastcampus.yanabada.domain.test.entity.TestEntity; +import kr.co.fastcampus.yanabada.domain.test.repository.TestRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/test/java/kr/co/fastcampus/Yanabada/YanabadaApplicationTests.java b/src/test/java/kr/co/fastcampus/yanabada/YanabadaApplicationTests.java similarity index 84% rename from src/test/java/kr/co/fastcampus/Yanabada/YanabadaApplicationTests.java rename to src/test/java/kr/co/fastcampus/yanabada/YanabadaApplicationTests.java index 9082eb1e..73c42d3c 100644 --- a/src/test/java/kr/co/fastcampus/Yanabada/YanabadaApplicationTests.java +++ b/src/test/java/kr/co/fastcampus/yanabada/YanabadaApplicationTests.java @@ -1,4 +1,4 @@ -package kr.co.fastcampus.Yanabada; +package kr.co.fastcampus.yanabada; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; From a8e486a405dbc4794b73833462e66edf26eea96a Mon Sep 17 00:00:00 2001 From: JuHyeonPark Date: Mon, 1 Jan 2024 20:01:14 +0900 Subject: [PATCH 03/10] =?UTF-8?q?feat:=20BaseEntity=20=EC=84=A4=EA=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BaseEntity 설계 - 생성날짜와 수정 날짜 필드 갖게끔 설계 --- .../common/baseentity/BaseEntity.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/kr/co/fastcampus/yanabada/common/baseentity/BaseEntity.java diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/baseentity/BaseEntity.java b/src/main/java/kr/co/fastcampus/yanabada/common/baseentity/BaseEntity.java new file mode 100644 index 00000000..2dfd8882 --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/common/baseentity/BaseEntity.java @@ -0,0 +1,23 @@ +package kr.co.fastcampus.yanabada.common.baseentity; + +import jakarta.persistence.Column; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.MappedSuperclass; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import java.time.LocalDateTime; + +@MappedSuperclass +@EntityListeners(AuditingEntityListener.class) +public abstract class BaseEntity { + + @CreatedDate + @Column(updatable = false) + private LocalDateTime createdDate; + + @LastModifiedDate + private LocalDateTime updatedDate; + +} From fa8a7887b8d32a3d92063512ab6131c7da663ed3 Mon Sep 17 00:00:00 2001 From: JuHyeonPark Date: Mon, 1 Jan 2024 20:02:30 +0900 Subject: [PATCH 04/10] =?UTF-8?q?feat:=20ResponseBody=20=EC=84=A4=EA=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ResponseBody 설계 - status : success, fail, error 에 따른 ResponseBody 구축 --- .../common/response/ResponseBody.java | 37 +++++++++++++++++++ .../yanabada/common/response/Status.java | 5 +++ 2 files changed, 42 insertions(+) create mode 100644 src/main/java/kr/co/fastcampus/yanabada/common/response/ResponseBody.java create mode 100644 src/main/java/kr/co/fastcampus/yanabada/common/response/Status.java diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/response/ResponseBody.java b/src/main/java/kr/co/fastcampus/yanabada/common/response/ResponseBody.java new file mode 100644 index 00000000..330429ff --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/common/response/ResponseBody.java @@ -0,0 +1,37 @@ +package kr.co.fastcampus.yanabada.common.response; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public class ResponseBody { + + private final Status status; + private final String errorMessage; + private final T data; + + public static ResponseBody ok() { + return new ResponseBody<>(Status.SUCCESS, null, null); + } + + public static ResponseBody ok(T data) { + return new ResponseBody<>(Status.SUCCESS, null, data); + } + + public static ResponseBody fail(String errorMessage) { + return new ResponseBody<>(Status.FAIL, errorMessage, null); + } + + public static ResponseBody fail(String errorMessage, T data) { + return new ResponseBody<>(Status.FAIL, errorMessage, data); + } + + public static ResponseBody error(String errorMessage) { + return new ResponseBody<>(Status.ERROR, errorMessage, null); + } + + public static ResponseBody error(String errorMessage, T data) { + return new ResponseBody<>(Status.ERROR, errorMessage, data); + } +} diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/response/Status.java b/src/main/java/kr/co/fastcampus/yanabada/common/response/Status.java new file mode 100644 index 00000000..81376ab1 --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/common/response/Status.java @@ -0,0 +1,5 @@ +package kr.co.fastcampus.yanabada.common.response; + +public enum Status { + SUCCESS, FAIL, ERROR +} From dc2785b424b9c92473fcc7bff1052c08233a2438 Mon Sep 17 00:00:00 2001 From: JuHyeonPark Date: Mon, 1 Jan 2024 20:09:07 +0900 Subject: [PATCH 05/10] =?UTF-8?q?style:=20import=EB=AC=B8=20=EC=88=9C?= =?UTF-8?q?=EC=84=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit import문 순서 변경 --- .../co/fastcampus/yanabada/common/baseentity/BaseEntity.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/baseentity/BaseEntity.java b/src/main/java/kr/co/fastcampus/yanabada/common/baseentity/BaseEntity.java index 2dfd8882..963109b8 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/common/baseentity/BaseEntity.java +++ b/src/main/java/kr/co/fastcampus/yanabada/common/baseentity/BaseEntity.java @@ -3,12 +3,11 @@ import jakarta.persistence.Column; import jakarta.persistence.EntityListeners; import jakarta.persistence.MappedSuperclass; +import java.time.LocalDateTime; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; -import java.time.LocalDateTime; - @MappedSuperclass @EntityListeners(AuditingEntityListener.class) public abstract class BaseEntity { From f27bf6b445f4b92cdd3e6c1125283adf3a10fd62 Mon Sep 17 00:00:00 2001 From: JuHyeonPark Date: Mon, 1 Jan 2024 20:30:29 +0900 Subject: [PATCH 06/10] =?UTF-8?q?refactor:=20@EnableJpaAuditing=20=20?= =?UTF-8?q?=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=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 생성날짜, 수정날짜 자동 생성을 위한 @EnableJpaAuditing 추가 --- .../java/kr/co/fastcampus/yanabada/YanabadaApplication.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/kr/co/fastcampus/yanabada/YanabadaApplication.java b/src/main/java/kr/co/fastcampus/yanabada/YanabadaApplication.java index 18a7e827..7a1f55cf 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/YanabadaApplication.java +++ b/src/main/java/kr/co/fastcampus/yanabada/YanabadaApplication.java @@ -2,8 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @SpringBootApplication +@EnableJpaAuditing public class YanabadaApplication { public static void main(String[] args) { From 8a80198c3c62092309395da54a1dd13eb681eb53 Mon Sep 17 00:00:00 2001 From: JuHyeonPark Date: Mon, 1 Jan 2024 20:31:52 +0900 Subject: [PATCH 07/10] =?UTF-8?q?feat:=20GlobalExceptionHandler=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GlobalExceptionHandler 작성 및 공통 메소드 추가 --- .../handler/GlobalExceptionHandler.java | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 src/main/java/kr/co/fastcampus/yanabada/common/exception/handler/GlobalExceptionHandler.java diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/exception/handler/GlobalExceptionHandler.java b/src/main/java/kr/co/fastcampus/yanabada/common/exception/handler/GlobalExceptionHandler.java new file mode 100644 index 00000000..61a7e1ee --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/common/exception/handler/GlobalExceptionHandler.java @@ -0,0 +1,97 @@ +package kr.co.fastcampus.yanabada.common.exception.handler; + +import kr.co.fastcampus.yanabada.common.response.ResponseBody; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.NestedExceptionUtils; +import org.springframework.http.HttpStatus; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.validation.BindingResult; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.MissingServletRequestParameterException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; + +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +@Slf4j +@RestControllerAdvice +public class GlobalExceptionHandler { + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(value = BaseException.class) + public ResponseBody handleBaseException(BaseException e) { + log.warn("[BaseException] Message = {}", e.getMessage()); + return ResponseBody.fail(e.getMessage()); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(value = MethodArgumentNotValidException.class) + public ResponseBody handleValidException(MethodArgumentNotValidException e) { + log.warn("[MethodArgumentNotValidException] Message = {}", + NestedExceptionUtils.getMostSpecificCause(e).getMessage()); + + BindingResult bindingResult = e.getBindingResult(); + List fieldErrors = getSortedFieldErrors(bindingResult); + + String response = "[Request error] " + + fieldErrors.stream() + .map(fieldError -> String.format("%s", + fieldError.getDefaultMessage() + ) + ).collect(Collectors.joining()); + return ResponseBody.fail(response); + } + + private List getSortedFieldErrors(BindingResult bindingResult) { + List declaredFields = Arrays.stream( + Objects.requireNonNull(bindingResult.getTarget()).getClass().getDeclaredFields()) + .map(Field::getName) + .toList(); + + return bindingResult.getFieldErrors().stream() + .filter(fieldError -> declaredFields.contains(fieldError.getField())) + .sorted(Comparator.comparingInt(fe -> declaredFields.indexOf(fe.getField()))) + .collect(Collectors.toList()); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(value = IllegalArgumentException.class) + public ResponseBody illegalArgumentException(IllegalArgumentException e) { + log.error("[IllegalArgumentException] Message = {}", e.getMessage()); + return ResponseBody.fail(e.getMessage()); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(value = HttpMessageNotReadableException.class) + public ResponseBody httpMessageNotReadableException(HttpMessageNotReadableException e) { + log.error("[HttpMessageNotReadableException] Message = {}", e.getMessage()); + return ResponseBody.fail(e.getMessage()); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(value = MethodArgumentTypeMismatchException.class) + public ResponseBody methodArgumentTypeMismatchException( + MethodArgumentTypeMismatchException e + ) { + log.error("[MethodArgumentTypeMismatchException] Message = {}", e.getMessage()); + return ResponseBody.fail(e.getMessage()); + } + + @ExceptionHandler(MissingServletRequestParameterException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public ResponseBody missingServletRequestParameterException( + MissingServletRequestParameterException e + ) { + log.error("[MissingServletRequestParameterException] Message = {}", e.getMessage()); + return ResponseBody.fail(e.getParameterName() + + " 파라미터가 빈 값이거나 잘못된 유형입니다."); + } +} From 0ac2bf2ad84a7b43bb2678b67afe7ab4eb49e115 Mon Sep 17 00:00:00 2001 From: JuHyeonPark Date: Mon, 1 Jan 2024 20:33:28 +0900 Subject: [PATCH 08/10] =?UTF-8?q?style:=20GlobalExceptionHandler=20=20?= =?UTF-8?q?=EC=A3=BC=EC=84=9D=EB=AC=B8=20=EC=88=9C=EC=84=9C=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 GlobalExceptionHandler 주석문 순서 변경 --- .../exception/handler/GlobalExceptionHandler.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/exception/handler/GlobalExceptionHandler.java b/src/main/java/kr/co/fastcampus/yanabada/common/exception/handler/GlobalExceptionHandler.java index 61a7e1ee..2d4da1d9 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/common/exception/handler/GlobalExceptionHandler.java +++ b/src/main/java/kr/co/fastcampus/yanabada/common/exception/handler/GlobalExceptionHandler.java @@ -1,5 +1,12 @@ package kr.co.fastcampus.yanabada.common.exception.handler; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; +import kr.co.fastcampus.yanabada.common.exception.BaseException; import kr.co.fastcampus.yanabada.common.response.ResponseBody; import lombok.extern.slf4j.Slf4j; import org.springframework.core.NestedExceptionUtils; @@ -14,13 +21,6 @@ import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; -import java.lang.reflect.Field; -import java.util.Arrays; -import java.util.Comparator; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - @Slf4j @RestControllerAdvice public class GlobalExceptionHandler { From 0f1f78c51eb9d8b67b463fc43d3e50c69ec8c813 Mon Sep 17 00:00:00 2001 From: JuHyeonPark Date: Mon, 1 Jan 2024 20:34:38 +0900 Subject: [PATCH 09/10] =?UTF-8?q?feat:=20BaseException=20=EB=B0=8F=20Error?= =?UTF-8?q?Code=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BaseException 및 ErrorCode 작성 --- .../common/exception/BaseException.java | 19 +++++++++++++++++++ .../CommonEntityNotFoundException.java | 9 +++++++++ .../yanabada/common/response/ErrorCode.java | 17 +++++++++++++++++ 3 files changed, 45 insertions(+) create mode 100644 src/main/java/kr/co/fastcampus/yanabada/common/exception/BaseException.java create mode 100644 src/main/java/kr/co/fastcampus/yanabada/common/exception/CommonEntityNotFoundException.java create mode 100644 src/main/java/kr/co/fastcampus/yanabada/common/response/ErrorCode.java diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/exception/BaseException.java b/src/main/java/kr/co/fastcampus/yanabada/common/exception/BaseException.java new file mode 100644 index 00000000..bdf86d92 --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/common/exception/BaseException.java @@ -0,0 +1,19 @@ +package kr.co.fastcampus.yanabada.common.exception; + +import lombok.Getter; + +@Getter +public abstract class BaseException extends RuntimeException { + + public BaseException() { + super(); + } + + public BaseException(String message) { + super(message); + } + + public BaseException(String message, Throwable cause) { + super(message, cause); + } +} \ No newline at end of file diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/exception/CommonEntityNotFoundException.java b/src/main/java/kr/co/fastcampus/yanabada/common/exception/CommonEntityNotFoundException.java new file mode 100644 index 00000000..1587d8d8 --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/common/exception/CommonEntityNotFoundException.java @@ -0,0 +1,9 @@ +package kr.co.fastcampus.yanabada.common.exception; + +import kr.co.fastcampus.yanabada.common.response.ErrorCode; + +public class CommonEntityNotFoundException extends BaseException { + public CommonEntityNotFoundException() { + super(ErrorCode.COMMON_ENTITY_NOT_FOUND.getErrorMsg()); + } +} diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/response/ErrorCode.java b/src/main/java/kr/co/fastcampus/yanabada/common/response/ErrorCode.java new file mode 100644 index 00000000..6a692671 --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/common/response/ErrorCode.java @@ -0,0 +1,17 @@ +package kr.co.fastcampus.yanabada.common.response; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum ErrorCode { + COMMON_ENTITY_NOT_FOUND("존재하지 않는 엔티티입니다."), + ; + + private final String errorMsg; + + public String getErrorMsg(Object... arg) { + return String.format(errorMsg, arg); + } +} From 72329e0175499f8de10a8201a4b6d739863ce6f4 Mon Sep 17 00:00:00 2001 From: JuHyeonPark Date: Mon, 1 Jan 2024 20:35:11 +0900 Subject: [PATCH 10/10] =?UTF-8?q?feat:=20AppConfig=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AppConfig 작성 --- .../yanabada/common/config/AppConfig.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/main/java/kr/co/fastcampus/yanabada/common/config/AppConfig.java diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/config/AppConfig.java b/src/main/java/kr/co/fastcampus/yanabada/common/config/AppConfig.java new file mode 100644 index 00000000..d6aef72d --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/common/config/AppConfig.java @@ -0,0 +1,20 @@ +package kr.co.fastcampus.yanabada.common.config; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class AppConfig { + @Bean + public ObjectMapper objectMapper() { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + objectMapper.registerModule(new JavaTimeModule()); + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + return objectMapper; + } +}