From e13046691ef68e69f5ccf8c30a3f28a3d218c06b Mon Sep 17 00:00:00 2001 From: jay-so Date: Wed, 26 Jul 2023 17:25:25 +0900 Subject: [PATCH 01/11] =?UTF-8?q?feat:=20Customer=EC=97=94=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../springbootjpa/domain/Customer.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/main/java/com/programmers/springbootjpa/domain/Customer.java diff --git a/src/main/java/com/programmers/springbootjpa/domain/Customer.java b/src/main/java/com/programmers/springbootjpa/domain/Customer.java new file mode 100644 index 000000000..877869db6 --- /dev/null +++ b/src/main/java/com/programmers/springbootjpa/domain/Customer.java @@ -0,0 +1,33 @@ +package com.programmers.springbootjpa.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "customers") +@Getter +@Setter +public class Customer { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @Column(name = "name", nullable = false, length = 30) + private String name; + + @Column(name = "age") + private Integer age; + + @Column(name = "nick_name", nullable = false, length = 30, unique = true) + private String nickName; + + @Column(name = "address", nullable = false, length = 100) + private String address; +} From 44cb5f8d76f9383a766c5305d9d5d8ae1f02f79c Mon Sep 17 00:00:00 2001 From: jay-so Date: Wed, 26 Jul 2023 18:21:44 +0900 Subject: [PATCH 02/11] =?UTF-8?q?feat:=20Customer=20CREATE=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CustomerController.java | 29 +++++++++++++++++ .../springbootjpa/domain/Customer.java | 17 ++++++++++ .../dto/CustomerCreateRequest.java | 17 ++++++++++ .../springbootjpa/dto/CustomerResponse.java | 26 ++++++++++++++++ .../repository/CustomerRepository.java | 8 +++++ .../service/CustomerService.java | 20 ++++++++++++ .../springbootjpa/domain/CustomerTest.java | 30 ++++++++++++++++++ .../service/CustomerServiceTest.java | 31 +++++++++++++++++++ 8 files changed, 178 insertions(+) create mode 100644 src/main/java/com/programmers/springbootjpa/controller/CustomerController.java create mode 100644 src/main/java/com/programmers/springbootjpa/dto/CustomerCreateRequest.java create mode 100644 src/main/java/com/programmers/springbootjpa/dto/CustomerResponse.java create mode 100644 src/main/java/com/programmers/springbootjpa/repository/CustomerRepository.java create mode 100644 src/main/java/com/programmers/springbootjpa/service/CustomerService.java create mode 100644 src/test/java/com/programmers/springbootjpa/domain/CustomerTest.java create mode 100644 src/test/java/com/programmers/springbootjpa/service/CustomerServiceTest.java diff --git a/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java b/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java new file mode 100644 index 000000000..2f4318afb --- /dev/null +++ b/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java @@ -0,0 +1,29 @@ +package com.programmers.springbootjpa.controller; + +import com.programmers.springbootjpa.domain.Customer; +import com.programmers.springbootjpa.dto.CustomerCreateRequest; +import com.programmers.springbootjpa.dto.CustomerResponse; +import com.programmers.springbootjpa.service.CustomerService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +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.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/v1") +@RequiredArgsConstructor +public class CustomerController { + + private final CustomerService customerService; + + @PostMapping("/customers") + @ResponseStatus(HttpStatus.CREATED) + public CustomerResponse createCustomer(@RequestBody CustomerCreateRequest request) { + Customer savedCustomer = customerService.createCustomer(request); + + return CustomerResponse.of(savedCustomer); + } +} diff --git a/src/main/java/com/programmers/springbootjpa/domain/Customer.java b/src/main/java/com/programmers/springbootjpa/domain/Customer.java index 877869db6..d42ecd876 100644 --- a/src/main/java/com/programmers/springbootjpa/domain/Customer.java +++ b/src/main/java/com/programmers/springbootjpa/domain/Customer.java @@ -1,18 +1,25 @@ package com.programmers.springbootjpa.domain; +import com.programmers.springbootjpa.dto.CustomerCreateRequest; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; @Entity @Table(name = "customers") @Getter @Setter +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode public class Customer { @Id @@ -30,4 +37,14 @@ public class Customer { @Column(name = "address", nullable = false, length = 100) private String address; + + public static Customer of(CustomerCreateRequest request) { + return new Customer( + request.getId(), + request.getName(), + request.getAge(), + request.getNickName(), + request.getAddress() + ); + } } diff --git a/src/main/java/com/programmers/springbootjpa/dto/CustomerCreateRequest.java b/src/main/java/com/programmers/springbootjpa/dto/CustomerCreateRequest.java new file mode 100644 index 000000000..5099bbe39 --- /dev/null +++ b/src/main/java/com/programmers/springbootjpa/dto/CustomerCreateRequest.java @@ -0,0 +1,17 @@ +package com.programmers.springbootjpa.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class CustomerCreateRequest { + + private Long id; + private String name; + private Integer age; + private String nickName; + private String address; +} diff --git a/src/main/java/com/programmers/springbootjpa/dto/CustomerResponse.java b/src/main/java/com/programmers/springbootjpa/dto/CustomerResponse.java new file mode 100644 index 000000000..7fbe7b8bb --- /dev/null +++ b/src/main/java/com/programmers/springbootjpa/dto/CustomerResponse.java @@ -0,0 +1,26 @@ +package com.programmers.springbootjpa.dto; + +import com.programmers.springbootjpa.domain.Customer; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public class CustomerResponse { + + private Long id; + private String name; + private Integer age; + private String nickName; + private String address; + + public static CustomerResponse of(Customer customer) { + return new CustomerResponse( + customer.getId(), + customer.getName(), + customer.getAge(), + customer.getNickName(), + customer.getAddress() + ); + } +} diff --git a/src/main/java/com/programmers/springbootjpa/repository/CustomerRepository.java b/src/main/java/com/programmers/springbootjpa/repository/CustomerRepository.java new file mode 100644 index 000000000..bf639bb3a --- /dev/null +++ b/src/main/java/com/programmers/springbootjpa/repository/CustomerRepository.java @@ -0,0 +1,8 @@ +package com.programmers.springbootjpa.repository; + +import com.programmers.springbootjpa.domain.Customer; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CustomerRepository extends JpaRepository { + +} diff --git a/src/main/java/com/programmers/springbootjpa/service/CustomerService.java b/src/main/java/com/programmers/springbootjpa/service/CustomerService.java new file mode 100644 index 000000000..f4c4a3f8d --- /dev/null +++ b/src/main/java/com/programmers/springbootjpa/service/CustomerService.java @@ -0,0 +1,20 @@ +package com.programmers.springbootjpa.service; + +import com.programmers.springbootjpa.domain.Customer; +import com.programmers.springbootjpa.dto.CustomerCreateRequest; +import com.programmers.springbootjpa.repository.CustomerRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class CustomerService { + + private final CustomerRepository customerRepository; + + public Customer createCustomer(CustomerCreateRequest request) { + Customer savedCustomer = customerRepository.save(Customer.of(request)); + + return savedCustomer; + } +} diff --git a/src/test/java/com/programmers/springbootjpa/domain/CustomerTest.java b/src/test/java/com/programmers/springbootjpa/domain/CustomerTest.java new file mode 100644 index 000000000..088ac2cae --- /dev/null +++ b/src/test/java/com/programmers/springbootjpa/domain/CustomerTest.java @@ -0,0 +1,30 @@ +package com.programmers.springbootjpa.domain; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +import com.programmers.springbootjpa.dto.CustomerCreateRequest; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +class CustomerTest { + + @Test + void of() { + CustomerCreateRequest request = new CustomerCreateRequest( + 1L, + "Kim Jae Won", + 28, + "hanjo", + "서울시 마포구" + ); + + Customer customer = Customer.of(request); + + assertThat(customer.getId()).isEqualTo(1L); + assertThat(customer.getName()).isEqualTo("Kim Jae Won"); + assertThat(customer.getAge()).isEqualTo(28); + assertThat(customer.getNickName()).isEqualTo("hanjo"); + assertThat(customer.getAddress()).isEqualTo("서울시 마포구"); + } +} \ No newline at end of file diff --git a/src/test/java/com/programmers/springbootjpa/service/CustomerServiceTest.java b/src/test/java/com/programmers/springbootjpa/service/CustomerServiceTest.java new file mode 100644 index 000000000..c035005b1 --- /dev/null +++ b/src/test/java/com/programmers/springbootjpa/service/CustomerServiceTest.java @@ -0,0 +1,31 @@ +package com.programmers.springbootjpa.service; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.programmers.springbootjpa.domain.Customer; +import com.programmers.springbootjpa.dto.CustomerCreateRequest; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class CustomerServiceTest { + + @Autowired + private CustomerService customerService; + + @Test + void createCustomer() { + CustomerCreateRequest request = new CustomerCreateRequest( + 1L, + "Kim Jae Won", + 28, + "hanjo", + "서울시 마포구" + ); + + Customer savedCustomer = customerService.createCustomer(request); + + assertThat(savedCustomer).isEqualTo(Customer.of(request)); + } +} \ No newline at end of file From e1fcb3d9c58b1712dab73a5d998928509ca49d53 Mon Sep 17 00:00:00 2001 From: jay-so Date: Wed, 26 Jul 2023 18:38:17 +0900 Subject: [PATCH 03/11] =?UTF-8?q?feat:=20Custer=20READ=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CustomerController.java | 15 ++++++--- .../springbootjpa/domain/Customer.java | 10 ++++-- .../dto/CustomerCreateRequest.java | 1 - .../service/CustomerService.java | 13 ++++++-- .../service/CustomerServiceTest.java | 31 ------------------- 5 files changed, 30 insertions(+), 40 deletions(-) delete mode 100644 src/test/java/com/programmers/springbootjpa/service/CustomerServiceTest.java diff --git a/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java b/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java index 2f4318afb..4672e0499 100644 --- a/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java +++ b/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java @@ -4,8 +4,11 @@ import com.programmers.springbootjpa.dto.CustomerCreateRequest; import com.programmers.springbootjpa.dto.CustomerResponse; import com.programmers.springbootjpa.service.CustomerService; +import java.util.List; +import lombok.Getter; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -13,17 +16,21 @@ import org.springframework.web.bind.annotation.RestController; @RestController -@RequestMapping("/api/v1") +@RequestMapping("/api/v1/customers") @RequiredArgsConstructor public class CustomerController { private final CustomerService customerService; - @PostMapping("/customers") + @PostMapping @ResponseStatus(HttpStatus.CREATED) public CustomerResponse createCustomer(@RequestBody CustomerCreateRequest request) { - Customer savedCustomer = customerService.createCustomer(request); + return customerService.createCustomer(request); - return CustomerResponse.of(savedCustomer); + } + + @GetMapping + public List findAllCustomers(){ + return customerService.findAllCustomers(); } } diff --git a/src/main/java/com/programmers/springbootjpa/domain/Customer.java b/src/main/java/com/programmers/springbootjpa/domain/Customer.java index d42ecd876..1b6a887f5 100644 --- a/src/main/java/com/programmers/springbootjpa/domain/Customer.java +++ b/src/main/java/com/programmers/springbootjpa/domain/Customer.java @@ -18,7 +18,6 @@ @Getter @Setter @NoArgsConstructor -@AllArgsConstructor @EqualsAndHashCode public class Customer { @@ -38,9 +37,16 @@ public class Customer { @Column(name = "address", nullable = false, length = 100) private String address; + + private Customer(String name, Integer age, String nickName, String address) { + this.name = name; + this.age = age; + this.nickName = nickName; + this.address = address; + } + public static Customer of(CustomerCreateRequest request) { return new Customer( - request.getId(), request.getName(), request.getAge(), request.getNickName(), diff --git a/src/main/java/com/programmers/springbootjpa/dto/CustomerCreateRequest.java b/src/main/java/com/programmers/springbootjpa/dto/CustomerCreateRequest.java index 5099bbe39..ffbb24862 100644 --- a/src/main/java/com/programmers/springbootjpa/dto/CustomerCreateRequest.java +++ b/src/main/java/com/programmers/springbootjpa/dto/CustomerCreateRequest.java @@ -9,7 +9,6 @@ @AllArgsConstructor public class CustomerCreateRequest { - private Long id; private String name; private Integer age; private String nickName; diff --git a/src/main/java/com/programmers/springbootjpa/service/CustomerService.java b/src/main/java/com/programmers/springbootjpa/service/CustomerService.java index f4c4a3f8d..37cb64eca 100644 --- a/src/main/java/com/programmers/springbootjpa/service/CustomerService.java +++ b/src/main/java/com/programmers/springbootjpa/service/CustomerService.java @@ -2,7 +2,9 @@ import com.programmers.springbootjpa.domain.Customer; import com.programmers.springbootjpa.dto.CustomerCreateRequest; +import com.programmers.springbootjpa.dto.CustomerResponse; import com.programmers.springbootjpa.repository.CustomerRepository; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -12,9 +14,16 @@ public class CustomerService { private final CustomerRepository customerRepository; - public Customer createCustomer(CustomerCreateRequest request) { + public CustomerResponse createCustomer(CustomerCreateRequest request) { Customer savedCustomer = customerRepository.save(Customer.of(request)); - return savedCustomer; + return CustomerResponse.of(savedCustomer); + } + + public List findAllCustomers() { + return customerRepository.findAll() + .stream() + .map(CustomerResponse::of) + .toList(); } } diff --git a/src/test/java/com/programmers/springbootjpa/service/CustomerServiceTest.java b/src/test/java/com/programmers/springbootjpa/service/CustomerServiceTest.java deleted file mode 100644 index c035005b1..000000000 --- a/src/test/java/com/programmers/springbootjpa/service/CustomerServiceTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.programmers.springbootjpa.service; - -import static org.assertj.core.api.Assertions.assertThat; - -import com.programmers.springbootjpa.domain.Customer; -import com.programmers.springbootjpa.dto.CustomerCreateRequest; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class CustomerServiceTest { - - @Autowired - private CustomerService customerService; - - @Test - void createCustomer() { - CustomerCreateRequest request = new CustomerCreateRequest( - 1L, - "Kim Jae Won", - 28, - "hanjo", - "서울시 마포구" - ); - - Customer savedCustomer = customerService.createCustomer(request); - - assertThat(savedCustomer).isEqualTo(Customer.of(request)); - } -} \ No newline at end of file From 67487b61aaef0760bfb80fca5cc4c09ed1e8fd90 Mon Sep 17 00:00:00 2001 From: jay-so Date: Wed, 26 Jul 2023 18:43:26 +0900 Subject: [PATCH 04/11] =?UTF-8?q?chore:=20application.yaml=20h2=20DB=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.properties | 1 - src/main/resources/application.yaml | 10 ++++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) delete mode 100644 src/main/resources/application.properties create mode 100644 src/main/resources/application.yaml diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties deleted file mode 100644 index 8b1378917..000000000 --- a/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml new file mode 100644 index 000000000..2156c633d --- /dev/null +++ b/src/main/resources/application.yaml @@ -0,0 +1,10 @@ +spring: + datasource: + driver-class-name: org.h2.Driver + username: sa + password: + jpa: + hibernate: + ddl-auto: create-drop + database-platform: org.hibernate.dialect.H2Dialect + show-sql: true \ No newline at end of file From bf761fd95bad6795c8dae5a8d3a444e639a54b45 Mon Sep 17 00:00:00 2001 From: jay-so Date: Wed, 26 Jul 2023 19:10:18 +0900 Subject: [PATCH 05/11] =?UTF-8?q?feat:=20Customer=20UPDATE=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CustomerController.java | 13 ++++++++++--- .../springbootjpa/domain/Customer.java | 13 ++++++++++++- .../dto/CustomerUpdateRequest.java | 13 +++++++++++++ .../service/CustomerService.java | 19 +++++++++++++++---- 4 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/programmers/springbootjpa/dto/CustomerUpdateRequest.java diff --git a/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java b/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java index 4672e0499..57036739d 100644 --- a/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java +++ b/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java @@ -1,14 +1,15 @@ package com.programmers.springbootjpa.controller; -import com.programmers.springbootjpa.domain.Customer; import com.programmers.springbootjpa.dto.CustomerCreateRequest; import com.programmers.springbootjpa.dto.CustomerResponse; +import com.programmers.springbootjpa.dto.CustomerUpdateRequest; import com.programmers.springbootjpa.service.CustomerService; import java.util.List; -import lombok.Getter; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +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; @@ -30,7 +31,13 @@ public CustomerResponse createCustomer(@RequestBody CustomerCreateRequest reques } @GetMapping - public List findAllCustomers(){ + public List findAllCustomers() { return customerService.findAllCustomers(); } + + @PatchMapping("/{id}") + public CustomerResponse updateCustomerById(@PathVariable Long id, + @RequestBody CustomerUpdateRequest request) { + return customerService.updateCustomerById(id, request); + } } diff --git a/src/main/java/com/programmers/springbootjpa/domain/Customer.java b/src/main/java/com/programmers/springbootjpa/domain/Customer.java index 1b6a887f5..05def052f 100644 --- a/src/main/java/com/programmers/springbootjpa/domain/Customer.java +++ b/src/main/java/com/programmers/springbootjpa/domain/Customer.java @@ -16,7 +16,6 @@ @Entity @Table(name = "customers") @Getter -@Setter @NoArgsConstructor @EqualsAndHashCode public class Customer { @@ -53,4 +52,16 @@ public static Customer of(CustomerCreateRequest request) { request.getAddress() ); } + + public void updateName(String name) { + this.name = name; + } + + public void updateAge(Integer age) { + this.age = age; + } + + public void updateAddress(String address) { + this.address = address; + } } diff --git a/src/main/java/com/programmers/springbootjpa/dto/CustomerUpdateRequest.java b/src/main/java/com/programmers/springbootjpa/dto/CustomerUpdateRequest.java new file mode 100644 index 000000000..5cdf8f1c9 --- /dev/null +++ b/src/main/java/com/programmers/springbootjpa/dto/CustomerUpdateRequest.java @@ -0,0 +1,13 @@ +package com.programmers.springbootjpa.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@Getter +public class CustomerUpdateRequest { + + private String name; + private Integer age; + private String address; +} diff --git a/src/main/java/com/programmers/springbootjpa/service/CustomerService.java b/src/main/java/com/programmers/springbootjpa/service/CustomerService.java index 37cb64eca..8ded4fdd2 100644 --- a/src/main/java/com/programmers/springbootjpa/service/CustomerService.java +++ b/src/main/java/com/programmers/springbootjpa/service/CustomerService.java @@ -3,10 +3,12 @@ import com.programmers.springbootjpa.domain.Customer; import com.programmers.springbootjpa.dto.CustomerCreateRequest; import com.programmers.springbootjpa.dto.CustomerResponse; +import com.programmers.springbootjpa.dto.CustomerUpdateRequest; import com.programmers.springbootjpa.repository.CustomerRepository; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor @@ -14,6 +16,7 @@ public class CustomerService { private final CustomerRepository customerRepository; + @Transactional public CustomerResponse createCustomer(CustomerCreateRequest request) { Customer savedCustomer = customerRepository.save(Customer.of(request)); @@ -21,9 +24,17 @@ public CustomerResponse createCustomer(CustomerCreateRequest request) { } public List findAllCustomers() { - return customerRepository.findAll() - .stream() - .map(CustomerResponse::of) - .toList(); + return customerRepository.findAll().stream().map(CustomerResponse::of).toList(); + } + + @Transactional + public CustomerResponse updateCustomerById(Long id, CustomerUpdateRequest request) { + Customer customer = customerRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("해당 ID에 해당하는 구매자가 없습니다.")); + + customer.updateName(request.getName()); + customer.updateAge(request.getAge()); + customer.updateAddress(request.getAddress()); + + return CustomerResponse.of(customer); } } From 81792d25708d9277df296c869f9c6f7b3d08aac7 Mon Sep 17 00:00:00 2001 From: jay-so Date: Wed, 26 Jul 2023 19:17:14 +0900 Subject: [PATCH 06/11] =?UTF-8?q?feat:=20Customer=20DELETE=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../springbootjpa/controller/CustomerController.java | 7 +++++++ .../com/programmers/springbootjpa/domain/Customer.java | 2 -- .../springbootjpa/service/CustomerService.java | 9 +++++++++ .../programmers/springbootjpa/domain/CustomerTest.java | 2 -- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java b/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java index 57036739d..ac810ec4f 100644 --- a/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java +++ b/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java @@ -7,6 +7,7 @@ import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -40,4 +41,10 @@ public CustomerResponse updateCustomerById(@PathVariable Long id, @RequestBody CustomerUpdateRequest request) { return customerService.updateCustomerById(id, request); } + + @DeleteMapping("{id}") + @ResponseStatus(HttpStatus.NO_CONTENT) + public void deleteCustomerById(@PathVariable Long id) { + customerService.deleteCustomerById(id); + } } diff --git a/src/main/java/com/programmers/springbootjpa/domain/Customer.java b/src/main/java/com/programmers/springbootjpa/domain/Customer.java index 05def052f..c73f75e6e 100644 --- a/src/main/java/com/programmers/springbootjpa/domain/Customer.java +++ b/src/main/java/com/programmers/springbootjpa/domain/Customer.java @@ -7,11 +7,9 @@ import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.Table; -import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.Setter; @Entity @Table(name = "customers") diff --git a/src/main/java/com/programmers/springbootjpa/service/CustomerService.java b/src/main/java/com/programmers/springbootjpa/service/CustomerService.java index 8ded4fdd2..22798aea1 100644 --- a/src/main/java/com/programmers/springbootjpa/service/CustomerService.java +++ b/src/main/java/com/programmers/springbootjpa/service/CustomerService.java @@ -37,4 +37,13 @@ public CustomerResponse updateCustomerById(Long id, CustomerUpdateRequest reques return CustomerResponse.of(customer); } + + @Transactional + public void deleteCustomerById(Long id) { + if (!customerRepository.existsById(id)) { + throw new IllegalArgumentException("해당 ID에 해당하는 구매자가 없습니다."); + } + + customerRepository.deleteById(id); + } } diff --git a/src/test/java/com/programmers/springbootjpa/domain/CustomerTest.java b/src/test/java/com/programmers/springbootjpa/domain/CustomerTest.java index 088ac2cae..e0d0e95a1 100644 --- a/src/test/java/com/programmers/springbootjpa/domain/CustomerTest.java +++ b/src/test/java/com/programmers/springbootjpa/domain/CustomerTest.java @@ -12,7 +12,6 @@ class CustomerTest { @Test void of() { CustomerCreateRequest request = new CustomerCreateRequest( - 1L, "Kim Jae Won", 28, "hanjo", @@ -21,7 +20,6 @@ void of() { Customer customer = Customer.of(request); - assertThat(customer.getId()).isEqualTo(1L); assertThat(customer.getName()).isEqualTo("Kim Jae Won"); assertThat(customer.getAge()).isEqualTo(28); assertThat(customer.getNickName()).isEqualTo("hanjo"); From 76cbbdfb62abb53bdd8509cd492c1a46a89bd41e Mon Sep 17 00:00:00 2001 From: jay-so Date: Mon, 31 Jul 2023 22:23:45 +0900 Subject: [PATCH 07/11] =?UTF-8?q?refactor:=20DTO=20to=20Entity=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=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 --- .../springbootjpa/domain/Customer.java | 15 +++------------ .../springbootjpa/dto/CustomerCreateRequest.java | 10 ++++++++++ .../springbootjpa/service/CustomerService.java | 2 +- .../springbootjpa/domain/CustomerTest.java | 2 +- 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/programmers/springbootjpa/domain/Customer.java b/src/main/java/com/programmers/springbootjpa/domain/Customer.java index c73f75e6e..d489c3f79 100644 --- a/src/main/java/com/programmers/springbootjpa/domain/Customer.java +++ b/src/main/java/com/programmers/springbootjpa/domain/Customer.java @@ -1,12 +1,12 @@ package com.programmers.springbootjpa.domain; -import com.programmers.springbootjpa.dto.CustomerCreateRequest; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.Table; +import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; @@ -34,23 +34,14 @@ public class Customer { @Column(name = "address", nullable = false, length = 100) private String address; - - private Customer(String name, Integer age, String nickName, String address) { + @Builder + public Customer(String name, Integer age, String nickName, String address) { this.name = name; this.age = age; this.nickName = nickName; this.address = address; } - public static Customer of(CustomerCreateRequest request) { - return new Customer( - request.getName(), - request.getAge(), - request.getNickName(), - request.getAddress() - ); - } - public void updateName(String name) { this.name = name; } diff --git a/src/main/java/com/programmers/springbootjpa/dto/CustomerCreateRequest.java b/src/main/java/com/programmers/springbootjpa/dto/CustomerCreateRequest.java index ffbb24862..bf06cd5e0 100644 --- a/src/main/java/com/programmers/springbootjpa/dto/CustomerCreateRequest.java +++ b/src/main/java/com/programmers/springbootjpa/dto/CustomerCreateRequest.java @@ -1,5 +1,6 @@ package com.programmers.springbootjpa.dto; +import com.programmers.springbootjpa.domain.Customer; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -13,4 +14,13 @@ public class CustomerCreateRequest { private Integer age; private String nickName; private String address; + + public Customer toEntity() { + return Customer.builder() + .name(name) + .age(age) + .nickName(nickName) + .address(address) + .build(); + } } diff --git a/src/main/java/com/programmers/springbootjpa/service/CustomerService.java b/src/main/java/com/programmers/springbootjpa/service/CustomerService.java index 22798aea1..91e8fc0d0 100644 --- a/src/main/java/com/programmers/springbootjpa/service/CustomerService.java +++ b/src/main/java/com/programmers/springbootjpa/service/CustomerService.java @@ -18,7 +18,7 @@ public class CustomerService { @Transactional public CustomerResponse createCustomer(CustomerCreateRequest request) { - Customer savedCustomer = customerRepository.save(Customer.of(request)); + Customer savedCustomer = customerRepository.save(request.toEntity()); return CustomerResponse.of(savedCustomer); } diff --git a/src/test/java/com/programmers/springbootjpa/domain/CustomerTest.java b/src/test/java/com/programmers/springbootjpa/domain/CustomerTest.java index e0d0e95a1..0c329e632 100644 --- a/src/test/java/com/programmers/springbootjpa/domain/CustomerTest.java +++ b/src/test/java/com/programmers/springbootjpa/domain/CustomerTest.java @@ -18,7 +18,7 @@ void of() { "서울시 마포구" ); - Customer customer = Customer.of(request); + Customer customer = request.toEntity(); assertThat(customer.getName()).isEqualTo("Kim Jae Won"); assertThat(customer.getAge()).isEqualTo(28); From 0b68d4bf42fb51765e8f40b0390e3b9c0c5b919d Mon Sep 17 00:00:00 2001 From: jay-so Date: Mon, 31 Jul 2023 23:40:45 +0900 Subject: [PATCH 08/11] =?UTF-8?q?style:=20Customer=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EB=AC=B8=EA=B5=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../springbootjpa/controller/CustomerController.java | 3 +-- .../programmers/springbootjpa/domain/Customer.java | 6 ++---- .../springbootjpa/service/CustomerService.java | 11 ++++++++--- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java b/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java index ac810ec4f..34fdcff52 100644 --- a/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java +++ b/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java @@ -18,7 +18,7 @@ import org.springframework.web.bind.annotation.RestController; @RestController -@RequestMapping("/api/v1/customers") +@RequestMapping("/api/v1/customer") @RequiredArgsConstructor public class CustomerController { @@ -28,7 +28,6 @@ public class CustomerController { @ResponseStatus(HttpStatus.CREATED) public CustomerResponse createCustomer(@RequestBody CustomerCreateRequest request) { return customerService.createCustomer(request); - } @GetMapping diff --git a/src/main/java/com/programmers/springbootjpa/domain/Customer.java b/src/main/java/com/programmers/springbootjpa/domain/Customer.java index d489c3f79..05777aaa2 100644 --- a/src/main/java/com/programmers/springbootjpa/domain/Customer.java +++ b/src/main/java/com/programmers/springbootjpa/domain/Customer.java @@ -7,19 +7,17 @@ import jakarta.persistence.Id; import jakarta.persistence.Table; import lombok.Builder; -import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; @Entity -@Table(name = "customers") +@Table(name = "customer") @Getter @NoArgsConstructor -@EqualsAndHashCode public class Customer { @Id - @GeneratedValue(strategy = GenerationType.AUTO) + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name", nullable = false, length = 30) diff --git a/src/main/java/com/programmers/springbootjpa/service/CustomerService.java b/src/main/java/com/programmers/springbootjpa/service/CustomerService.java index 91e8fc0d0..e2603c825 100644 --- a/src/main/java/com/programmers/springbootjpa/service/CustomerService.java +++ b/src/main/java/com/programmers/springbootjpa/service/CustomerService.java @@ -6,6 +6,7 @@ import com.programmers.springbootjpa.dto.CustomerUpdateRequest; import com.programmers.springbootjpa.repository.CustomerRepository; import java.util.List; +import java.util.NoSuchElementException; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -24,12 +25,16 @@ public CustomerResponse createCustomer(CustomerCreateRequest request) { } public List findAllCustomers() { - return customerRepository.findAll().stream().map(CustomerResponse::of).toList(); + return customerRepository.findAll() + .stream() + .map(CustomerResponse::of) + .toList(); } @Transactional public CustomerResponse updateCustomerById(Long id, CustomerUpdateRequest request) { - Customer customer = customerRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("해당 ID에 해당하는 구매자가 없습니다.")); + Customer customer = customerRepository.findById(id) + .orElseThrow(() -> new NoSuchElementException("해당 ID에 해당하는 구매자가 없습니다.")); customer.updateName(request.getName()); customer.updateAge(request.getAge()); @@ -41,7 +46,7 @@ public CustomerResponse updateCustomerById(Long id, CustomerUpdateRequest reques @Transactional public void deleteCustomerById(Long id) { if (!customerRepository.existsById(id)) { - throw new IllegalArgumentException("해당 ID에 해당하는 구매자가 없습니다."); + throw new NoSuchElementException("해당 ID에 해당하는 구매자가 없습니다."); } customerRepository.deleteById(id); From a2357b7398be3249910b422b9045d1df8e418d12 Mon Sep 17 00:00:00 2001 From: jay-so Date: Fri, 4 Aug 2023 00:02:23 +0900 Subject: [PATCH 09/11] =?UTF-8?q?style:=20=EC=A0=95=EC=A0=81=20=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=20=EB=A9=94=EC=86=8C=EB=93=9C=EB=AA=85=20?= =?UTF-8?q?=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 --- .../com/programmers/springbootjpa/dto/CustomerResponse.java | 2 +- .../programmers/springbootjpa/service/CustomerService.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/programmers/springbootjpa/dto/CustomerResponse.java b/src/main/java/com/programmers/springbootjpa/dto/CustomerResponse.java index 7fbe7b8bb..934054fb4 100644 --- a/src/main/java/com/programmers/springbootjpa/dto/CustomerResponse.java +++ b/src/main/java/com/programmers/springbootjpa/dto/CustomerResponse.java @@ -14,7 +14,7 @@ public class CustomerResponse { private String nickName; private String address; - public static CustomerResponse of(Customer customer) { + public static CustomerResponse fromEntity(Customer customer) { return new CustomerResponse( customer.getId(), customer.getName(), diff --git a/src/main/java/com/programmers/springbootjpa/service/CustomerService.java b/src/main/java/com/programmers/springbootjpa/service/CustomerService.java index e2603c825..b24c05592 100644 --- a/src/main/java/com/programmers/springbootjpa/service/CustomerService.java +++ b/src/main/java/com/programmers/springbootjpa/service/CustomerService.java @@ -21,13 +21,13 @@ public class CustomerService { public CustomerResponse createCustomer(CustomerCreateRequest request) { Customer savedCustomer = customerRepository.save(request.toEntity()); - return CustomerResponse.of(savedCustomer); + return CustomerResponse.fromEntity(savedCustomer); } public List findAllCustomers() { return customerRepository.findAll() .stream() - .map(CustomerResponse::of) + .map(CustomerResponse::fromEntity) .toList(); } @@ -40,7 +40,7 @@ public CustomerResponse updateCustomerById(Long id, CustomerUpdateRequest reques customer.updateAge(request.getAge()); customer.updateAddress(request.getAddress()); - return CustomerResponse.of(customer); + return CustomerResponse.fromEntity(customer); } @Transactional From 36b08a5da31e78efb980f666a21c9ab119c2ac8c Mon Sep 17 00:00:00 2001 From: jay-so Date: Fri, 4 Aug 2023 00:18:13 +0900 Subject: [PATCH 10/11] =?UTF-8?q?test:=20usingRecursiveComparison()=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=EB=A5=BC=20=ED=86=B5=ED=95=9C=20Cus?= =?UTF-8?q?tomer=20entity=20=EB=8F=99=EB=93=B1=EC=84=B1=20=EB=B9=84?= =?UTF-8?q?=EA=B5=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../springbootjpa/domain/CustomerTest.java | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/test/java/com/programmers/springbootjpa/domain/CustomerTest.java b/src/test/java/com/programmers/springbootjpa/domain/CustomerTest.java index 0c329e632..165a90e06 100644 --- a/src/test/java/com/programmers/springbootjpa/domain/CustomerTest.java +++ b/src/test/java/com/programmers/springbootjpa/domain/CustomerTest.java @@ -1,16 +1,16 @@ package com.programmers.springbootjpa.domain; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; import com.programmers.springbootjpa.dto.CustomerCreateRequest; -import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; class CustomerTest { @Test - void of() { + @DisplayName("Customer 생성 Dto에서 Customer Entity로 정상적으로 변환되는지 테스트한다.") + void customerDtoToEntityTest() { CustomerCreateRequest request = new CustomerCreateRequest( "Kim Jae Won", 28, @@ -18,11 +18,15 @@ void of() { "서울시 마포구" ); - Customer customer = request.toEntity(); + Customer actualEntity = request.toEntity(); - assertThat(customer.getName()).isEqualTo("Kim Jae Won"); - assertThat(customer.getAge()).isEqualTo(28); - assertThat(customer.getNickName()).isEqualTo("hanjo"); - assertThat(customer.getAddress()).isEqualTo("서울시 마포구"); + Customer expectedEntity = Customer.builder() + .name("Kim Jae Won") + .age(28) + .nickName("hanjo") + .address("서울시 마포구") + .build(); + + assertThat(actualEntity).usingRecursiveComparison().isEqualTo(expectedEntity); } -} \ No newline at end of file +} From ccbed5f88b1607f55423acf03dfabc7eab92c51e Mon Sep 17 00:00:00 2001 From: jay-so Date: Fri, 4 Aug 2023 00:32:27 +0900 Subject: [PATCH 11/11] =?UTF-8?q?style:=20DeleteMapping=20Url=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 --- .../springbootjpa/controller/CustomerController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java b/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java index 34fdcff52..5e1a07a6a 100644 --- a/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java +++ b/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java @@ -41,7 +41,7 @@ public CustomerResponse updateCustomerById(@PathVariable Long id, return customerService.updateCustomerById(id, request); } - @DeleteMapping("{id}") + @DeleteMapping("/{id}") @ResponseStatus(HttpStatus.NO_CONTENT) public void deleteCustomerById(@PathVariable Long id) { customerService.deleteCustomerById(id);