diff --git a/src/main/java/com/programmers/springbootjpa/dto/request/CreateRequestDto.java b/src/main/java/com/programmers/springbootjpa/dto/request/CreateRequestDto.java new file mode 100644 index 000000000..c6e5da8f3 --- /dev/null +++ b/src/main/java/com/programmers/springbootjpa/dto/request/CreateRequestDto.java @@ -0,0 +1,24 @@ +package com.programmers.springbootjpa.dto.request; + +import com.programmers.springbootjpa.entity.Member; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class CreateRequestDto { + + private String name; + private String nickName; + private Integer age; + private String address; + + public Member toEntity() { + return Member.builder() + .name(name) + .nickName(nickName) + .age(age) + .address(address) + .build(); + } +} diff --git a/src/main/java/com/programmers/springbootjpa/dto/response/ResponseDto.java b/src/main/java/com/programmers/springbootjpa/dto/response/ResponseDto.java new file mode 100644 index 000000000..beb13a42d --- /dev/null +++ b/src/main/java/com/programmers/springbootjpa/dto/response/ResponseDto.java @@ -0,0 +1,31 @@ +package com.programmers.springbootjpa.dto.response; + +import com.programmers.springbootjpa.entity.Member; +import lombok.*; + +@Getter +@NoArgsConstructor +public class ResponseDto { + + private Long memberId; + private String name; + private String nickName; + private String address; + + @Builder + private ResponseDto(Long memberId, String name, String nickName, String address) { + this.memberId = memberId; + this.name = name; + this.nickName = nickName; + this.address = address; + } + + public static ResponseDto fromEntity(Member member) { + return ResponseDto.builder() + .memberId(member.getId()) + .name(member.getName()) + .nickName(member.getNickName()) + .address(member.getAddress()) + .build(); + } +} diff --git a/src/main/java/com/programmers/springbootjpa/entity/BaseTimeEntity.java b/src/main/java/com/programmers/springbootjpa/entity/BaseTimeEntity.java new file mode 100644 index 000000000..c9db170ba --- /dev/null +++ b/src/main/java/com/programmers/springbootjpa/entity/BaseTimeEntity.java @@ -0,0 +1,21 @@ +package com.programmers.springbootjpa.entity; + +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; + +@EntityListeners(AuditingEntityListener.class) +@MappedSuperclass +public abstract class BaseTimeEntity { + + @CreatedDate + @Column(updatable = false) + private LocalDateTime registeredDatetime; + + @LastModifiedDate + private LocalDateTime updatedDatetime; +} diff --git a/src/main/java/com/programmers/springbootjpa/entity/Member.java b/src/main/java/com/programmers/springbootjpa/entity/Member.java new file mode 100644 index 000000000..7539e83d3 --- /dev/null +++ b/src/main/java/com/programmers/springbootjpa/entity/Member.java @@ -0,0 +1,49 @@ +package com.programmers.springbootjpa.entity; + +import jakarta.persistence.*; +import lombok.*; + +import java.util.ArrayList; +import java.util.List; + +@Entity +@Table(name = "member") +@Getter +@Setter +@NoArgsConstructor +public class Member extends BaseTimeEntity { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE) + private Long id; + + @Column(nullable = false, length = 30) + private String name; + + @Column(nullable = false, length = 40, unique = true) + private String nickName; + + private Integer age; + + @Column(nullable = false, length = 100) + private String address; + + @OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true) + private List orders = new ArrayList<>(); + + @Builder + private Member(String name, String nickName, Integer age, String address) { + this.name = name; + this.nickName = nickName; + this.age = age; + this.address = address; + } + + public void addOrder(Order order) { + orders.add(order); + } + + public void removeOrder(Order order) { + orders.remove(order); + } +} \ No newline at end of file diff --git a/src/main/java/com/programmers/springbootjpa/entity/Order.java b/src/main/java/com/programmers/springbootjpa/entity/Order.java new file mode 100644 index 000000000..4e187a687 --- /dev/null +++ b/src/main/java/com/programmers/springbootjpa/entity/Order.java @@ -0,0 +1,47 @@ +package com.programmers.springbootjpa.entity; + +import com.programmers.springbootjpa.dto.response.ResponseDto; +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +@Entity +@Table(name = "orders") +@Getter +@Setter +public class Order extends BaseTimeEntity { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE) + private Long id; + + @Enumerated(EnumType.STRING) + private OrderStatus orderStatus; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member_id", referencedColumnName = "id") + private Member member; + + @OneToMany(cascade = CascadeType.ALL, mappedBy = "order", orphanRemoval = true) + private List orderItems = new ArrayList<>(); + + public void updateMember(Member member) { + if (Objects.nonNull(this.member)) { + this.member.removeOrder(this); + } + this.member = member; + member.addOrder(this); + } + + public void addOrderItem(OrderItem orderItem) { + orderItems.add(orderItem); + } + + public void removeOrderItem(OrderItem orderItem) { + orderItems.remove(orderItem); + } +} diff --git a/src/main/java/com/programmers/springbootjpa/entity/OrderItem.java b/src/main/java/com/programmers/springbootjpa/entity/OrderItem.java new file mode 100644 index 000000000..ee97a1a5e --- /dev/null +++ b/src/main/java/com/programmers/springbootjpa/entity/OrderItem.java @@ -0,0 +1,37 @@ +package com.programmers.springbootjpa.entity; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +import java.util.Objects; + +@Entity +@Table(name = "order_item") +@Getter +@Setter +public class OrderItem extends BaseTimeEntity { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE) + private Long id; + + @Column(nullable = false) + private Integer quantity; + + @Column(nullable = false) + private Integer price; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "order_id", referencedColumnName = "id") + private Order order; + + public void updateOrder(Order order) { + if (Objects.nonNull(this.order)) { + this.order.removeOrderItem(this); + } + + this.order = order; + order.addOrderItem(this); + } +} diff --git a/src/main/java/com/programmers/springbootjpa/entity/OrderStatus.java b/src/main/java/com/programmers/springbootjpa/entity/OrderStatus.java new file mode 100644 index 000000000..263c17ace --- /dev/null +++ b/src/main/java/com/programmers/springbootjpa/entity/OrderStatus.java @@ -0,0 +1,5 @@ +package com.programmers.springbootjpa.entity; + +public enum OrderStatus { + ACCEPTED, CANCELED, DELIVERED +} diff --git a/src/main/java/com/programmers/springbootjpa/repository/MemberRepository.java b/src/main/java/com/programmers/springbootjpa/repository/MemberRepository.java new file mode 100644 index 000000000..03827db6d --- /dev/null +++ b/src/main/java/com/programmers/springbootjpa/repository/MemberRepository.java @@ -0,0 +1,7 @@ +package com.programmers.springbootjpa.repository; + +import com.programmers.springbootjpa.entity.Member; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MemberRepository extends JpaRepository { +} diff --git a/src/main/java/com/programmers/springbootjpa/repository/OrderItemRepository.java b/src/main/java/com/programmers/springbootjpa/repository/OrderItemRepository.java new file mode 100644 index 000000000..fbba7a129 --- /dev/null +++ b/src/main/java/com/programmers/springbootjpa/repository/OrderItemRepository.java @@ -0,0 +1,7 @@ +package com.programmers.springbootjpa.repository; + +import com.programmers.springbootjpa.entity.OrderItem; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface OrderItemRepository extends JpaRepository { +} diff --git a/src/main/java/com/programmers/springbootjpa/repository/OrderRepository.java b/src/main/java/com/programmers/springbootjpa/repository/OrderRepository.java new file mode 100644 index 000000000..38c467949 --- /dev/null +++ b/src/main/java/com/programmers/springbootjpa/repository/OrderRepository.java @@ -0,0 +1,7 @@ +package com.programmers.springbootjpa.repository; + +import com.programmers.springbootjpa.entity.Order; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface OrderRepository extends JpaRepository { +} diff --git a/src/main/java/com/programmers/springbootjpa/service/MemberService.java b/src/main/java/com/programmers/springbootjpa/service/MemberService.java new file mode 100644 index 000000000..87790f80a --- /dev/null +++ b/src/main/java/com/programmers/springbootjpa/service/MemberService.java @@ -0,0 +1,47 @@ +package com.programmers.springbootjpa.service; + +import com.programmers.springbootjpa.dto.request.CreateRequestDto; +import com.programmers.springbootjpa.dto.response.ResponseDto; +import com.programmers.springbootjpa.entity.Member; +import com.programmers.springbootjpa.repository.MemberRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.NoSuchElementException; + +@Service +@RequiredArgsConstructor +public class MemberService { + + private final MemberRepository memberRepository; + + @Transactional + public void createMember(CreateRequestDto createRequestDto) { + Member member = createRequestDto.toEntity(); + memberRepository.save(member); + } + + public List findAll() { + return memberRepository.findAll().stream() + .map(ResponseDto::fromEntity) + .toList(); + } + + public ResponseDto findById(Long id) { + Member member = memberRepository.findById(id) + .orElseThrow(() -> new NoSuchElementException("해당 고객이 존재하지 않습니다.")); + + return ResponseDto.fromEntity(member); + } + + @Transactional + public void deleteById(Long id) { + if (!memberRepository.existsById(id)) { + throw new NoSuchElementException("삭제하려는 고객을 찾지 못했습니다."); + } + + memberRepository.deleteById(id); + } +} 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