From 5d3b4eb5be9827472b302ead4f5d7df8413e1676 Mon Sep 17 00:00:00 2001 From: jeongminuk Date: Mon, 5 Aug 2024 15:42:44 +0900 Subject: [PATCH 01/45] =?UTF-8?q?feat:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=ED=8F=B4=EB=8D=94=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/uiDesigner.xml | 124 ++++++++++++++++++ .../src/main/java/com/tools/.DS_Store | Bin 6148 -> 6148 bytes .../tools/potato_field/delivery/Delivery.java | 18 --- .../delivery/DeliveryController.java | 37 ------ .../delivery/DeliveryRepository.java | 7 - .../delivery/DeliveryService.java | 34 ----- .../com/tools/potato_field/item/Item.java | 15 --- .../potato_field/item/ItemController.java | 37 ------ .../potato_field/item/ItemRepository.java | 7 - .../tools/potato_field/item/ItemService.java | 34 ----- .../com/tools/potato_field/member/Member.java | 16 --- .../potato_field/member/MemberController.java | 37 ------ .../potato_field/member/MemberRepository.java | 7 - .../potato_field/member/MemberService.java | 35 ----- .../com/tools/potato_field/order/Order.java | 2 +- .../potato_field/order/OrderController.java | 3 +- .../potato_field/order/OrderRepository.java | 2 +- .../potato_field/order/OrderService.java | 3 +- 18 files changed, 128 insertions(+), 290 deletions(-) create mode 100644 .idea/uiDesigner.xml delete mode 100644 potato-field/src/main/java/com/tools/potato_field/delivery/Delivery.java delete mode 100644 potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryController.java delete mode 100644 potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryRepository.java delete mode 100644 potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryService.java delete mode 100644 potato-field/src/main/java/com/tools/potato_field/item/Item.java delete mode 100644 potato-field/src/main/java/com/tools/potato_field/item/ItemController.java delete mode 100644 potato-field/src/main/java/com/tools/potato_field/item/ItemRepository.java delete mode 100644 potato-field/src/main/java/com/tools/potato_field/item/ItemService.java delete mode 100644 potato-field/src/main/java/com/tools/potato_field/member/Member.java delete mode 100644 potato-field/src/main/java/com/tools/potato_field/member/MemberController.java delete mode 100644 potato-field/src/main/java/com/tools/potato_field/member/MemberRepository.java delete mode 100644 potato-field/src/main/java/com/tools/potato_field/member/MemberService.java diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/.DS_Store b/potato-field/src/main/java/com/tools/.DS_Store index 595ce2f106dcad11cf424b1ed0ba497db0532c34..b75214ec5e4a287c99ae8b9a1a4e5a6086e81da0 100644 GIT binary patch delta 20 bcmZoMXffFEkcr*gQb)nWz;g2oCK*uxMyUoW delta 20 bcmZoMXffFEkcr*GKu5vI$b9n)CK*uxMnnc6 diff --git a/potato-field/src/main/java/com/tools/potato_field/delivery/Delivery.java b/potato-field/src/main/java/com/tools/potato_field/delivery/Delivery.java deleted file mode 100644 index 5024747..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/delivery/Delivery.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tools.potato_field.entity; - -import javax.persistence.*; -import lombok.Data; - -@Entity -@Data -public class Delivery { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @OneToOne - @JoinColumn(name = "order_id") - private Order order; - - private String status; -} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryController.java b/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryController.java deleted file mode 100644 index 14adb67..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryController.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.tools.potato_field.controller; - -import com.tools.potato_field.entity.Delivery; -import com.tools.potato_field.service.DeliveryService; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@RestController -@RequestMapping("/deliveries") -public class DeliveryController { - private final DeliveryService deliveryService; - - public DeliveryController(DeliveryService deliveryService) { - this.deliveryService = deliveryService; - } - - @PostMapping - public Delivery createDelivery(@RequestBody Delivery delivery) { - return deliveryService.createDelivery(delivery); - } - - @GetMapping("/{id}") - public Delivery getDelivery(@PathVariable Long id) { - return deliveryService.findDelivery(id); - } - - @GetMapping - public List getAllDeliveries() { - return deliveryService.findAllDeliveries(); - } - - @DeleteMapping("/{id}") - public void deleteDelivery(@PathVariable Long id) { - deliveryService.deleteDelivery(id); - } -} diff --git a/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryRepository.java b/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryRepository.java deleted file mode 100644 index 996fe7c..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.tools.potato_field.repository; - -import com.tools.potato_field.entity.Delivery; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface DeliveryRepository extends JpaRepository { -} diff --git a/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryService.java b/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryService.java deleted file mode 100644 index b30cc66..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryService.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.tools.potato_field.service; - -import com.tools.potato_field.entity.Delivery; -import com.tools.potato_field.repository.DeliveryRepository; -import org.springframework.stereotype.Service; - -import javax.transaction.Transactional; -import java.util.List; - -@Service -@Transactional -public class DeliveryService { - private final DeliveryRepository deliveryRepository; - - public DeliveryService(DeliveryRepository deliveryRepository) { - this.deliveryRepository = deliveryRepository; - } - - public Delivery createDelivery(Delivery delivery) { - return deliveryRepository.save(delivery); - } - - public Delivery findDelivery(Long id) { - return deliveryRepository.findById(id).orElseThrow(() -> new RuntimeException("Delivery not found")); - } - - public List findAllDeliveries() { - return deliveryRepository.findAll(); - } - - public void deleteDelivery(Long id) { - deliveryRepository.deleteById(id); - } -} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/item/Item.java b/potato-field/src/main/java/com/tools/potato_field/item/Item.java deleted file mode 100644 index 8d02dfd..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/item/Item.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.tools.potato_field.entity; - -import javax.persistence.*; -import lombok.Data; - -@Entity -@Data -public class Item { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - private String name; - private double price; - private int stockQuantity; -} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/item/ItemController.java b/potato-field/src/main/java/com/tools/potato_field/item/ItemController.java deleted file mode 100644 index 57105d1..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/item/ItemController.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.tools.potato_field.controller; - -import com.tools.potato_field.entity.Item; -import com.tools.potato_field.service.ItemService; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@RestController -@RequestMapping("/items") -public class ItemController { - private final ItemService itemService; - - public ItemController(ItemService itemService) { - this.itemService = itemService; - } - - @PostMapping - public Item addItem(@RequestBody Item item) { - return itemService.addItem(item); - } - - @GetMapping("/{id}") - public Item getItem(@PathVariable Long id) { - return itemService.findItem(id); - } - - @GetMapping - public List getAllItems() { - return itemService.findAllItems(); - } - - @DeleteMapping("/{id}") - public void deleteItem(@PathVariable Long id) { - itemService.deleteItem(id); - } -} diff --git a/potato-field/src/main/java/com/tools/potato_field/item/ItemRepository.java b/potato-field/src/main/java/com/tools/potato_field/item/ItemRepository.java deleted file mode 100644 index e6f1028..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/item/ItemRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.tools.potato_field.repository; - -import com.tools.potato_field.entity.Item; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface ItemRepository extends JpaRepository { -} diff --git a/potato-field/src/main/java/com/tools/potato_field/item/ItemService.java b/potato-field/src/main/java/com/tools/potato_field/item/ItemService.java deleted file mode 100644 index 0d0bd28..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/item/ItemService.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.tools.potato_field.service; - -import com.tools.potato_field.entity.Item; -import com.tools.potato_field.repository.ItemRepository; -import org.springframework.stereotype.Service; - -import javax.transaction.Transactional; -import java.util.List; - -@Service -@Transactional -public class ItemService { - private final ItemRepository itemRepository; - - public ItemService(ItemRepository itemRepository) { - this.itemRepository = itemRepository; - } - - public Item addItem(Item item) { - return itemRepository.save(item); - } - - public Item findItem(Long id) { - return itemRepository.findById(id).orElseThrow(() -> new RuntimeException("Item not found")); - } - - public List findAllItems() { - return itemRepository.findAll(); - } - - public void deleteItem(Long id) { - itemRepository.deleteById(id); - } -} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/member/Member.java b/potato-field/src/main/java/com/tools/potato_field/member/Member.java deleted file mode 100644 index 280f459..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/member/Member.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tools.potato_field.entity; - -import javax.persistence.*; -import lombok.Data; - -@Entity -@Data -public class Member { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - private String username; - private String password; - private String email; - private String address; -} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/member/MemberController.java b/potato-field/src/main/java/com/tools/potato_field/member/MemberController.java deleted file mode 100644 index 9248d47..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/member/MemberController.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.tools.potato_field.controller; - -import com.tools.potato_field.entity.member; -import com.tools.potato_field.service.MemberService; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@RestController -@RequestMapping("/members") -public class MemberController { - private final MemberService memberService; - - public MemberController(MemberService memberService) { - this.memberService = memberService; - } - - @PostMapping - public Member registerMember(@RequestBody Member member) { - return memberService.registerMember(member); - } - - @GetMapping("/{id}") - public Member getMember(@PathVariable Long id) { - return memberService.findMember(id); - } - - @GetMapping - public List getAllMembers() { - return memberService.findAllMembers(); - } - - @DeleteMapping("/{id}") - public void deleteMember(@PathVariable Long id) { - memberService.deleteMember(id); - } -} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/member/MemberRepository.java b/potato-field/src/main/java/com/tools/potato_field/member/MemberRepository.java deleted file mode 100644 index ef6715a..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/member/MemberRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.tools.potato_field.repository; - -import com.tools.potato_field.entity.Member; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface MemberRepository extends JpaRepository { -} diff --git a/potato-field/src/main/java/com/tools/potato_field/member/MemberService.java b/potato-field/src/main/java/com/tools/potato_field/member/MemberService.java deleted file mode 100644 index 4302aa5..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/member/MemberService.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.tools.potato_field.service; - -import com.tools.potato_field.entity.Member; -import com.tools.potato_field.repository.MemberRepository; -import org.springframework.stereotype.Service; - -import javax.transaction.Transactional; -import java.util.List; - -@Service -@Transactional -public class MemberService { - private final MemberRepository memberRepository; - - public MemberService(MemberRepository memberRepository) { - this.memberRepository = memberRepository; - } - - public Member registerMember(Member member) { - return memberRepository.save(member); - } - - public Member findMember(Long id) { - return memberRepository.findById(id).orElseThrow(() -> new RuntimeException("Member not found")); - } - - public List findAllMembers() { - return memberRepository.findAll(); - } - - public void deleteMember(Long id) { - memberRepository.deleteById(id); - } -} - diff --git a/potato-field/src/main/java/com/tools/potato_field/order/Order.java b/potato-field/src/main/java/com/tools/potato_field/order/Order.java index 6a349c8..c2461c6 100644 --- a/potato-field/src/main/java/com/tools/potato_field/order/Order.java +++ b/potato-field/src/main/java/com/tools/potato_field/order/Order.java @@ -1,4 +1,4 @@ -package com.example.ex01.service; +package com.tools.potato_field.order; import javax.persistence.*; import lombok.Data; diff --git a/potato-field/src/main/java/com/tools/potato_field/order/OrderController.java b/potato-field/src/main/java/com/tools/potato_field/order/OrderController.java index 65c1748..db96438 100644 --- a/potato-field/src/main/java/com/tools/potato_field/order/OrderController.java +++ b/potato-field/src/main/java/com/tools/potato_field/order/OrderController.java @@ -1,7 +1,6 @@ -package com.tools.potato_field.controller; +package com.tools.potato_field.order; import com.tools.potato_field.entity.Order; -import com.tools.potato_field.service.OrderService; import org.springframework.web.bind.annotation.*; import java.util.List; diff --git a/potato-field/src/main/java/com/tools/potato_field/order/OrderRepository.java b/potato-field/src/main/java/com/tools/potato_field/order/OrderRepository.java index 8e5bb4f..1727f60 100644 --- a/potato-field/src/main/java/com/tools/potato_field/order/OrderRepository.java +++ b/potato-field/src/main/java/com/tools/potato_field/order/OrderRepository.java @@ -1,4 +1,4 @@ -package com.tools.potato_field.repository; +package com.tools.potato_field.order; import com.tools.potato_field.entity.Order; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/potato-field/src/main/java/com/tools/potato_field/order/OrderService.java b/potato-field/src/main/java/com/tools/potato_field/order/OrderService.java index 42ffceb..f1b614f 100644 --- a/potato-field/src/main/java/com/tools/potato_field/order/OrderService.java +++ b/potato-field/src/main/java/com/tools/potato_field/order/OrderService.java @@ -1,7 +1,6 @@ -package com.tools.potato_field.service; +package com.tools.potato_field.order; import com.tools.potato_field.entity.Order; -import com.tools.potato_field.repository.OrderRepository; import org.springframework.stereotype.Service; import javax.transaction.Transactional; From f65d90e2cc884fbcf1bb97a02b02f7ad8b7076de Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 5 Aug 2024 16:15:26 +0900 Subject: [PATCH 02/45] feat : 2nd --- .../java/com/tools/potato_field/delivery/Delivery.java | 2 +- .../tools/potato_field/delivery/DeliveryController.java | 3 ++- .../tools/potato_field/delivery/DeliveryRepository.java | 5 +++-- .../com/tools/potato_field/delivery/DeliveryService.java | 7 ++++--- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/potato-field/src/main/java/com/tools/potato_field/delivery/Delivery.java b/potato-field/src/main/java/com/tools/potato_field/delivery/Delivery.java index 292b13c..1b12ad7 100644 --- a/potato-field/src/main/java/com/tools/potato_field/delivery/Delivery.java +++ b/potato-field/src/main/java/com/tools/potato_field/delivery/Delivery.java @@ -1,4 +1,4 @@ -package com.tools.potato_field.entity; +package com.tools.potato_field.delivery; import jakarta.persistence.*; import lombok.Data; diff --git a/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryController.java b/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryController.java index 14adb67..e508da2 100644 --- a/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryController.java +++ b/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryController.java @@ -1,6 +1,7 @@ package com.tools.potato_field.controller; -import com.tools.potato_field.entity.Delivery; +import com.tools.potato_field.delivery +.Delivery; import com.tools.potato_field.service.DeliveryService; import org.springframework.web.bind.annotation.*; diff --git a/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryRepository.java b/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryRepository.java index 996fe7c..b1771d1 100644 --- a/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryRepository.java +++ b/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryRepository.java @@ -1,6 +1,7 @@ -package com.tools.potato_field.repository; +package com.tools.potato_field.delivery; -import com.tools.potato_field.entity.Delivery; +import com.tools.potato_field.delivery +.Delivery; import org.springframework.data.jpa.repository.JpaRepository; public interface DeliveryRepository extends JpaRepository { diff --git a/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryService.java b/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryService.java index b30cc66..69b4719 100644 --- a/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryService.java +++ b/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryService.java @@ -1,10 +1,11 @@ -package com.tools.potato_field.service; +package com.tools.potato_field.delivery; -import com.tools.potato_field.entity.Delivery; +import com.tools.potato_field.delivery +.Delivery; import com.tools.potato_field.repository.DeliveryRepository; import org.springframework.stereotype.Service; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import java.util.List; @Service From f3a676ab577bee05fb632d655590abf9a16e98cb Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 8 Aug 2024 11:59:20 +0900 Subject: [PATCH 03/45] session added ver --- potato-field/build.gradle | 5 ++ .../tools/potato_field/SecurityConfig.java | 16 +++++- .../com/tools/potato_field/SessionConfig.java | 16 ++++++ .../tools/potato_field/delivery/Delivery.java | 1 + .../delivery/DeliveryController.java | 4 +- .../delivery/DeliveryService.java | 2 +- .../com/tools/potato_field/item/Item.java | 2 +- .../potato_field/item/ItemController.java | 4 +- .../potato_field/item/ItemRepository.java | 3 +- .../tools/potato_field/item/ItemService.java | 7 ++- .../member/GlobalExceptionHandler.java | 17 +++++++ .../com/tools/potato_field/member/Member.java | 2 +- .../potato_field/member/MemberController.java | 49 ++++++++++++++----- .../potato_field/member/MemberRepository.java | 3 +- .../potato_field/member/MemberService.java | 4 +- .../com/tools/potato_field/order/Order.java | 4 +- .../potato_field/order/OrderController.java | 5 +- .../potato_field/order/OrderRepository.java | 3 +- .../potato_field/order/OrderService.java | 6 +-- .../src/main/resources/application.yml | 18 +++++-- 20 files changed, 125 insertions(+), 46 deletions(-) create mode 100644 potato-field/src/main/java/com/tools/potato_field/SessionConfig.java create mode 100644 potato-field/src/main/java/com/tools/potato_field/member/GlobalExceptionHandler.java diff --git a/potato-field/build.gradle b/potato-field/build.gradle index 6c3761c..dc5c116 100644 --- a/potato-field/build.gradle +++ b/potato-field/build.gradle @@ -37,6 +37,11 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + implementation 'org.springframework.session:spring-session-core' + implementation 'org.springframework.boot:spring-boot-starter-data-redis' + implementation 'org.springframework.boot:spring-boot-starter-data-redis' + implementation 'org.springframework.session:spring-session-data-redis' + } tasks.named('test') { diff --git a/potato-field/src/main/java/com/tools/potato_field/SecurityConfig.java b/potato-field/src/main/java/com/tools/potato_field/SecurityConfig.java index 3a9047e..64408cb 100644 --- a/potato-field/src/main/java/com/tools/potato_field/SecurityConfig.java +++ b/potato-field/src/main/java/com/tools/potato_field/SecurityConfig.java @@ -2,10 +2,14 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; @Configuration +@EnableWebSecurity public class SecurityConfig { @Bean @@ -13,5 +17,15 @@ public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } - // 기타 보안 설정... + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + http + .csrf(csrf -> csrf.disable()) + .authorizeHttpRequests(authz -> authz + .requestMatchers("/api/members/register", "/api/members/login").permitAll() + .anyRequest().authenticated() + ); + + return http.build(); + } } \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/SessionConfig.java b/potato-field/src/main/java/com/tools/potato_field/SessionConfig.java new file mode 100644 index 0000000..c7cf714 --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/SessionConfig.java @@ -0,0 +1,16 @@ +package com.tools.potato_field; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; +import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; + +@Configuration +@EnableRedisHttpSession +public class SessionConfig { + + @Bean + public LettuceConnectionFactory connectionFactory() { + return new LettuceConnectionFactory(); + } +} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/delivery/Delivery.java b/potato-field/src/main/java/com/tools/potato_field/delivery/Delivery.java index 1b12ad7..6870a08 100644 --- a/potato-field/src/main/java/com/tools/potato_field/delivery/Delivery.java +++ b/potato-field/src/main/java/com/tools/potato_field/delivery/Delivery.java @@ -1,5 +1,6 @@ package com.tools.potato_field.delivery; +import com.tools.potato_field.order.Order; import jakarta.persistence.*; import lombok.Data; diff --git a/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryController.java b/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryController.java index e508da2..93994cd 100644 --- a/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryController.java +++ b/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryController.java @@ -1,8 +1,8 @@ -package com.tools.potato_field.controller; +package com.tools.potato_field.delivery; import com.tools.potato_field.delivery .Delivery; -import com.tools.potato_field.service.DeliveryService; +import com.tools.potato_field.delivery.DeliveryService; import org.springframework.web.bind.annotation.*; import java.util.List; diff --git a/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryService.java b/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryService.java index 69b4719..40dbc08 100644 --- a/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryService.java +++ b/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryService.java @@ -2,7 +2,7 @@ import com.tools.potato_field.delivery .Delivery; -import com.tools.potato_field.repository.DeliveryRepository; +import com.tools.potato_field.delivery.DeliveryRepository; import org.springframework.stereotype.Service; import jakarta.transaction.Transactional; diff --git a/potato-field/src/main/java/com/tools/potato_field/item/Item.java b/potato-field/src/main/java/com/tools/potato_field/item/Item.java index b333ab4..2c03c7a 100644 --- a/potato-field/src/main/java/com/tools/potato_field/item/Item.java +++ b/potato-field/src/main/java/com/tools/potato_field/item/Item.java @@ -1,4 +1,4 @@ -package com.tools.potato_field.entity; +package com.tools.potato_field.item; import jakarta.persistence.*; import lombok.Data; diff --git a/potato-field/src/main/java/com/tools/potato_field/item/ItemController.java b/potato-field/src/main/java/com/tools/potato_field/item/ItemController.java index 57105d1..959e134 100644 --- a/potato-field/src/main/java/com/tools/potato_field/item/ItemController.java +++ b/potato-field/src/main/java/com/tools/potato_field/item/ItemController.java @@ -1,7 +1,5 @@ -package com.tools.potato_field.controller; +package com.tools.potato_field.item; -import com.tools.potato_field.entity.Item; -import com.tools.potato_field.service.ItemService; import org.springframework.web.bind.annotation.*; import java.util.List; diff --git a/potato-field/src/main/java/com/tools/potato_field/item/ItemRepository.java b/potato-field/src/main/java/com/tools/potato_field/item/ItemRepository.java index e6f1028..991065d 100644 --- a/potato-field/src/main/java/com/tools/potato_field/item/ItemRepository.java +++ b/potato-field/src/main/java/com/tools/potato_field/item/ItemRepository.java @@ -1,6 +1,5 @@ -package com.tools.potato_field.repository; +package com.tools.potato_field.item; -import com.tools.potato_field.entity.Item; import org.springframework.data.jpa.repository.JpaRepository; public interface ItemRepository extends JpaRepository { diff --git a/potato-field/src/main/java/com/tools/potato_field/item/ItemService.java b/potato-field/src/main/java/com/tools/potato_field/item/ItemService.java index 0d0bd28..b017ba5 100644 --- a/potato-field/src/main/java/com/tools/potato_field/item/ItemService.java +++ b/potato-field/src/main/java/com/tools/potato_field/item/ItemService.java @@ -1,10 +1,9 @@ -package com.tools.potato_field.service; +package com.tools.potato_field.item; -import com.tools.potato_field.entity.Item; -import com.tools.potato_field.repository.ItemRepository; + +import jakarta.transaction.Transactional; import org.springframework.stereotype.Service; -import javax.transaction.Transactional; import java.util.List; @Service diff --git a/potato-field/src/main/java/com/tools/potato_field/member/GlobalExceptionHandler.java b/potato-field/src/main/java/com/tools/potato_field/member/GlobalExceptionHandler.java new file mode 100644 index 0000000..99ce01f --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/member/GlobalExceptionHandler.java @@ -0,0 +1,17 @@ +package com.tools.potato_field.member; + +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.http.ResponseEntity; +import org.springframework.http.HttpStatus; + + +@ControllerAdvice +public class GlobalExceptionHandler { + + @ExceptionHandler(RuntimeException.class) + public ResponseEntity handleRuntimeException(RuntimeException ex) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage()); + } + +} diff --git a/potato-field/src/main/java/com/tools/potato_field/member/Member.java b/potato-field/src/main/java/com/tools/potato_field/member/Member.java index 66e9e0a..e6e3a91 100644 --- a/potato-field/src/main/java/com/tools/potato_field/member/Member.java +++ b/potato-field/src/main/java/com/tools/potato_field/member/Member.java @@ -1,4 +1,4 @@ -package com.tools.potato_field.entity; +package com.tools.potato_field.member; import jakarta.persistence.*; import lombok.AllArgsConstructor; diff --git a/potato-field/src/main/java/com/tools/potato_field/member/MemberController.java b/potato-field/src/main/java/com/tools/potato_field/member/MemberController.java index 8a56985..1ae4657 100644 --- a/potato-field/src/main/java/com/tools/potato_field/member/MemberController.java +++ b/potato-field/src/main/java/com/tools/potato_field/member/MemberController.java @@ -1,12 +1,12 @@ -package com.tools.potato_field.controller; +package com.tools.potato_field.member; -import com.tools.potato_field.entity.Member; -import com.tools.potato_field.service.MemberService; import com.tools.potato_field.dto.LoginRequest; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpSession; import java.util.List; @RestController @@ -25,24 +25,51 @@ public ResponseEntity registerMember(@RequestBody Member member) { return ResponseEntity.ok(memberService.registerMember(member)); } + @PostMapping("/login") + public ResponseEntity loginMember(@RequestBody LoginRequest loginRequest, HttpSession session) { + Member member = memberService.loginMember(loginRequest.getEmail(), loginRequest.getPassword()); + session.setAttribute("MEMBER_ID", member.getId()); + return ResponseEntity.ok("Login successful"); + } + + @PostMapping("/logout") + public ResponseEntity logoutMember(HttpSession session) { + session.invalidate(); + return ResponseEntity.ok("Logout successful"); + } + + @GetMapping("/me") + public ResponseEntity getCurrentMember(HttpSession session) { + Long memberId = (Long) session.getAttribute("MEMBER_ID"); + if (memberId == null) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); + } + Member member = memberService.findMember(memberId); + return ResponseEntity.ok(member); + } + @GetMapping("/{id}") - public ResponseEntity getMember(@PathVariable Long id) { + public ResponseEntity getMember(@PathVariable Long id, HttpSession session) { + if (session.getAttribute("MEMBER_ID") == null) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); + } return ResponseEntity.ok(memberService.findMember(id)); } @GetMapping - public ResponseEntity> getAllMembers() { + public ResponseEntity> getAllMembers(HttpSession session) { + if (session.getAttribute("MEMBER_ID") == null) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); + } return ResponseEntity.ok(memberService.findAllMembers()); } @DeleteMapping("/{id}") - public ResponseEntity deleteMember(@PathVariable Long id) { + public ResponseEntity deleteMember(@PathVariable Long id, HttpSession session) { + if (session.getAttribute("MEMBER_ID") == null) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); + } memberService.deleteMember(id); return ResponseEntity.ok().build(); } - - @PostMapping("/login") - public ResponseEntity loginMember(@RequestBody LoginRequest loginRequest) { - return ResponseEntity.ok(memberService.loginMember(loginRequest.getEmail(), loginRequest.getPassword())); - } } \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/member/MemberRepository.java b/potato-field/src/main/java/com/tools/potato_field/member/MemberRepository.java index ea2a577..a3ee5cd 100644 --- a/potato-field/src/main/java/com/tools/potato_field/member/MemberRepository.java +++ b/potato-field/src/main/java/com/tools/potato_field/member/MemberRepository.java @@ -1,6 +1,5 @@ -package com.tools.potato_field.repository; +package com.tools.potato_field.member; -import com.tools.potato_field.entity.Member; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/potato-field/src/main/java/com/tools/potato_field/member/MemberService.java b/potato-field/src/main/java/com/tools/potato_field/member/MemberService.java index 371583f..38987f4 100644 --- a/potato-field/src/main/java/com/tools/potato_field/member/MemberService.java +++ b/potato-field/src/main/java/com/tools/potato_field/member/MemberService.java @@ -1,7 +1,5 @@ -package com.tools.potato_field.service; +package com.tools.potato_field.member; -import com.tools.potato_field.entity.Member; -import com.tools.potato_field.repository.MemberRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; diff --git a/potato-field/src/main/java/com/tools/potato_field/order/Order.java b/potato-field/src/main/java/com/tools/potato_field/order/Order.java index c7dbb06..a319992 100644 --- a/potato-field/src/main/java/com/tools/potato_field/order/Order.java +++ b/potato-field/src/main/java/com/tools/potato_field/order/Order.java @@ -1,5 +1,7 @@ -package com.tools.potato_field.entity; +package com.tools.potato_field.order; +import com.tools.potato_field.item.Item; +import com.tools.potato_field.member.Member; import jakarta.persistence.*; import lombok.Data; import java.time.LocalDateTime; diff --git a/potato-field/src/main/java/com/tools/potato_field/order/OrderController.java b/potato-field/src/main/java/com/tools/potato_field/order/OrderController.java index 1391510..6b3e98d 100644 --- a/potato-field/src/main/java/com/tools/potato_field/order/OrderController.java +++ b/potato-field/src/main/java/com/tools/potato_field/order/OrderController.java @@ -1,7 +1,6 @@ -package com.tools.potato_field.controller; +package com.tools.potato_field.order; + -import com.tools.potato_field.entity.Order; -import com.tools.potato_field.service.OrderService; import org.springframework.web.bind.annotation.*; import java.util.List; diff --git a/potato-field/src/main/java/com/tools/potato_field/order/OrderRepository.java b/potato-field/src/main/java/com/tools/potato_field/order/OrderRepository.java index 788e3f8..d2246dc 100644 --- a/potato-field/src/main/java/com/tools/potato_field/order/OrderRepository.java +++ b/potato-field/src/main/java/com/tools/potato_field/order/OrderRepository.java @@ -1,6 +1,5 @@ -package com.tools.potato_field.repository; +package com.tools.potato_field.order; -import com.tools.potato_field.entity.Order; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/potato-field/src/main/java/com/tools/potato_field/order/OrderService.java b/potato-field/src/main/java/com/tools/potato_field/order/OrderService.java index 42ffceb..6b79878 100644 --- a/potato-field/src/main/java/com/tools/potato_field/order/OrderService.java +++ b/potato-field/src/main/java/com/tools/potato_field/order/OrderService.java @@ -1,10 +1,8 @@ -package com.tools.potato_field.service; +package com.tools.potato_field.order; -import com.tools.potato_field.entity.Order; -import com.tools.potato_field.repository.OrderRepository; +import jakarta.transaction.Transactional; import org.springframework.stereotype.Service; -import javax.transaction.Transactional; import java.util.List; @Service diff --git a/potato-field/src/main/resources/application.yml b/potato-field/src/main/resources/application.yml index 3a9ece4..05e351c 100644 --- a/potato-field/src/main/resources/application.yml +++ b/potato-field/src/main/resources/application.yml @@ -2,7 +2,7 @@ spring: application: name: potato-field datasource: - url: jdbc:h2:mem:testdb + url: jdbc:h2:mem:potato_field_db # 'testdb'를 더 명확한 이름으로 변경 driver-class-name: org.h2.Driver username: sa password: @@ -15,9 +15,17 @@ spring: console: enabled: true path: /h2-console - jwt: - secret: yourSecretKey - expiration: 86400000 # 24 hours + data: + redis: + host: localhost + port: 6379 + session: + store-type: redis server: - port: 8080 \ No newline at end of file + port: 8080 + +# JWT 설정을 별도의 섹션으로 분리 +jwt: + secret: your_very_long_and_secure_secret_key_here + expiration: 86400000 # 24 hours in milliseconds \ No newline at end of file From dc0a5a605786a7013f8f48ad66af76104f21f119 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 12 Aug 2024 16:56:50 +0900 Subject: [PATCH 04/45] hahahah --- potato-field/build.gradle | 4 +- .../potato_field/JwtAuthenticationFilter.java | 55 +++++++++++++++++++ .../java/com/tools/potato_field/JwtUtil.java | 39 +++++++++++++ .../tools/potato_field/SecurityConfig.java | 14 ++++- .../com/tools/potato_field/SessionConfig.java | 16 ------ .../com/tools/potato_field/WebConfig.java | 19 +++++++ .../tools/potato_field/dto/LoginRequest.java | 3 +- .../tools/potato_field/dto/ViewInfoModel.java | 15 +++++ .../member/CustomUserDetailService.java | 29 ++++++++++ .../com/tools/potato_field/member/Member.java | 11 ++++ .../potato_field/member/MemberRepository.java | 1 + .../potato_field/member/MemberService.java | 6 +- .../src/main/resources/application.yml | 6 +- 13 files changed, 195 insertions(+), 23 deletions(-) create mode 100644 potato-field/src/main/java/com/tools/potato_field/JwtAuthenticationFilter.java create mode 100644 potato-field/src/main/java/com/tools/potato_field/JwtUtil.java delete mode 100644 potato-field/src/main/java/com/tools/potato_field/SessionConfig.java create mode 100644 potato-field/src/main/java/com/tools/potato_field/WebConfig.java create mode 100644 potato-field/src/main/java/com/tools/potato_field/dto/ViewInfoModel.java create mode 100644 potato-field/src/main/java/com/tools/potato_field/member/CustomUserDetailService.java diff --git a/potato-field/build.gradle b/potato-field/build.gradle index dc5c116..b720aed 100644 --- a/potato-field/build.gradle +++ b/potato-field/build.gradle @@ -39,8 +39,10 @@ dependencies { testRuntimeOnly 'org.junit.platform:junit-platform-launcher' implementation 'org.springframework.session:spring-session-core' implementation 'org.springframework.boot:spring-boot-starter-data-redis' - implementation 'org.springframework.boot:spring-boot-starter-data-redis' implementation 'org.springframework.session:spring-session-data-redis' + implementation 'io.jsonwebtoken:jjwt-api:0.11.5' + runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5' + runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5' } diff --git a/potato-field/src/main/java/com/tools/potato_field/JwtAuthenticationFilter.java b/potato-field/src/main/java/com/tools/potato_field/JwtAuthenticationFilter.java new file mode 100644 index 0000000..12b5f40 --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/JwtAuthenticationFilter.java @@ -0,0 +1,55 @@ +package com.tools.potato_field; + + +import com.tools.potato_field.service.CustomUserDetailsService; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; + +@Component +public class JwtAuthenticationFilter extends OncePerRequestFilter { + + @Autowired + private JwtUtil jwtUtil; + + @Autowired + private CustomUserDetailsService customUserDetailsService; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + + final String authorizationHeader = request.getHeader("Authorization"); + + String username = null; + String jwt = null; + + if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) { + jwt = authorizationHeader.substring(7); + username = jwtUtil.getUsernameFromToken(jwt); + } + + if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { + UserDetails userDetails = this.customUserDetailsService.loadUserByUsername(username); + + if (jwtUtil.validateToken(jwt, userDetails)) { + UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken( + userDetails, null, userDetails.getAuthorities()); + usernamePasswordAuthenticationToken + .setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken); + } + } + filterChain.doFilter(request, response); + } +} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/JwtUtil.java b/potato-field/src/main/java/com/tools/potato_field/JwtUtil.java new file mode 100644 index 0000000..6a5046e --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/JwtUtil.java @@ -0,0 +1,39 @@ +package com.tools.potato_field; + +import io.jsonwebtoken.*; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.util.Date; + +@Component +public class JwtUtil { + + @Value("${jwt.secret}") + private String secret; + + @Value("${jwt.expiration}") + private long expiration; + + public String generateToken(String username) { + return Jwts.builder() + .setSubject(username) + .setIssuedAt(new Date(System.currentTimeMillis())) + .setExpiration(new Date(System.currentTimeMillis() + expiration)) + .signWith(SignatureAlgorithm.HS512, secret) + .compact(); + } + + public boolean validateToken(String token) { + try { + Jwts.parser().setSigningKey(secret).parseClaimsJws(token); + return true; + } catch (JwtException | IllegalArgumentException e) { + return false; + } + } + + public String getUsernameFromToken(String token) { + return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody().getSubject(); + } +} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/SecurityConfig.java b/potato-field/src/main/java/com/tools/potato_field/SecurityConfig.java index 64408cb..c20bbe3 100644 --- a/potato-field/src/main/java/com/tools/potato_field/SecurityConfig.java +++ b/potato-field/src/main/java/com/tools/potato_field/SecurityConfig.java @@ -1,30 +1,42 @@ package com.tools.potato_field; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; @Configuration @EnableWebSecurity public class SecurityConfig { + @Autowired + private JwtAuthenticationFilter jwtAuthenticationFilter; @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } + @Bean + public JwtAuthenticationFilter jwtAuthenticationFilter() { + return new JwtAuthenticationFilter(); + } + @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .csrf(csrf -> csrf.disable()) + .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authorizeHttpRequests(authz -> authz .requestMatchers("/api/members/register", "/api/members/login").permitAll() .anyRequest().authenticated() - ); + ) + .addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); return http.build(); } diff --git a/potato-field/src/main/java/com/tools/potato_field/SessionConfig.java b/potato-field/src/main/java/com/tools/potato_field/SessionConfig.java deleted file mode 100644 index c7cf714..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/SessionConfig.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tools.potato_field; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; - -@Configuration -@EnableRedisHttpSession -public class SessionConfig { - - @Bean - public LettuceConnectionFactory connectionFactory() { - return new LettuceConnectionFactory(); - } -} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/WebConfig.java b/potato-field/src/main/java/com/tools/potato_field/WebConfig.java new file mode 100644 index 0000000..bd16347 --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/WebConfig.java @@ -0,0 +1,19 @@ +package com.tools.potato_field; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOrigins("http://localhost:3000") // 프론트엔드 서버 주소 + .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") + .allowedHeaders("*") + .allowCredentials(true) + .maxAge(3600); // 1시간 + } +} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/dto/LoginRequest.java b/potato-field/src/main/java/com/tools/potato_field/dto/LoginRequest.java index cf935c5..a512031 100644 --- a/potato-field/src/main/java/com/tools/potato_field/dto/LoginRequest.java +++ b/potato-field/src/main/java/com/tools/potato_field/dto/LoginRequest.java @@ -4,6 +4,7 @@ @Data public class LoginRequest { - private String email; + private String username; private String password; + } \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/dto/ViewInfoModel.java b/potato-field/src/main/java/com/tools/potato_field/dto/ViewInfoModel.java new file mode 100644 index 0000000..1fc5951 --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/dto/ViewInfoModel.java @@ -0,0 +1,15 @@ +package com.tools.potato_field.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ViewInfoModel { + + private String callId; + private String openedAt; + +} diff --git a/potato-field/src/main/java/com/tools/potato_field/member/CustomUserDetailService.java b/potato-field/src/main/java/com/tools/potato_field/member/CustomUserDetailService.java new file mode 100644 index 0000000..aec97d9 --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/member/CustomUserDetailService.java @@ -0,0 +1,29 @@ +package com.tools.potato_field.member; + + + +import com.tools.potato_field.member.Member; +import com.tools.potato_field.member.MemberRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; + +@Service +public class CustomUserDetailsService implements UserDetailsService { + + @Autowired + private MemberRepository memberRepository; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + Member member = memberRepository.findByUsername(username) + .orElseThrow(() -> new UsernameNotFoundException("User not found with username: " + username)); + + return new User(member.getUsername(), member.getPassword(), new ArrayList<>()); + } +} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/member/Member.java b/potato-field/src/main/java/com/tools/potato_field/member/Member.java index e6e3a91..bfcc40c 100644 --- a/potato-field/src/main/java/com/tools/potato_field/member/Member.java +++ b/potato-field/src/main/java/com/tools/potato_field/member/Member.java @@ -5,6 +5,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.springframework.data.redis.core.RedisHash; @Data @Builder @@ -24,8 +25,18 @@ public class Member { @Column(nullable = false) private String password; + @Column(nullable = false, unique = true) + private String username; + + + @Column(name = "phone_number") + private String number; + + + @Column(nullable = false) private String name; + @Column(nullable = false) private String address; // 추가적인 필드들 (예: 생년월일, 전화번호 등) diff --git a/potato-field/src/main/java/com/tools/potato_field/member/MemberRepository.java b/potato-field/src/main/java/com/tools/potato_field/member/MemberRepository.java index a3ee5cd..2a58361 100644 --- a/potato-field/src/main/java/com/tools/potato_field/member/MemberRepository.java +++ b/potato-field/src/main/java/com/tools/potato_field/member/MemberRepository.java @@ -8,4 +8,5 @@ @Repository public interface MemberRepository extends JpaRepository { Optional findByEmail(String email); + Optional findByUsername(String username); } \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/member/MemberService.java b/potato-field/src/main/java/com/tools/potato_field/member/MemberService.java index 38987f4..d45e336 100644 --- a/potato-field/src/main/java/com/tools/potato_field/member/MemberService.java +++ b/potato-field/src/main/java/com/tools/potato_field/member/MemberService.java @@ -19,13 +19,15 @@ public MemberService(MemberRepository memberRepository, PasswordEncoder password } public Member registerMember(Member member) { + if (memberRepository.findByUsername(member.getUsername()).isPresent()) { + throw new RuntimeException("Username already exists"); + } if (memberRepository.findByEmail(member.getEmail()).isPresent()) { - throw new RuntimeException("Email is already in use"); + throw new RuntimeException("Email already exists"); } member.setPassword(passwordEncoder.encode(member.getPassword())); return memberRepository.save(member); } - public Member findMember(Long id) { return memberRepository.findById(id) .orElseThrow(() -> new RuntimeException("Member not found")); diff --git a/potato-field/src/main/resources/application.yml b/potato-field/src/main/resources/application.yml index 05e351c..47ed651 100644 --- a/potato-field/src/main/resources/application.yml +++ b/potato-field/src/main/resources/application.yml @@ -21,11 +21,13 @@ spring: port: 6379 session: store-type: redis + main: + allow-bean-definition-overriding: true server: port: 8080 # JWT 설정을 별도의 섹션으로 분리 jwt: - secret: your_very_long_and_secure_secret_key_here - expiration: 86400000 # 24 hours in milliseconds \ No newline at end of file + secret: yourSecretKey + expiration: 360000 \ No newline at end of file From 18d53114f561aa4ec3f348d89bf165da7fdca7de Mon Sep 17 00:00:00 2001 From: jeongminuk Date: Mon, 12 Aug 2024 17:05:01 +0900 Subject: [PATCH 05/45] post version -01 --- .../tools/potato_field/delivery/Delivery.java | 19 ---------- .../com/tools/potato_field/order/Order.java | 28 --------------- .../potato_field/order/OrderController.java | 31 ---------------- .../potato_field/order/OrderRepository.java | 18 ---------- .../potato_field/order/OrderService.java | 35 ------------------- .../com/tools/potato_field/post/Post.java | 35 +++++++++++++++++++ .../potato_field/post/PostController.java | 4 +++ .../potato_field/post/PostRepository.java | 9 +++++ .../tools/potato_field/post/PostService.java | 4 +++ 9 files changed, 52 insertions(+), 131 deletions(-) delete mode 100644 potato-field/src/main/java/com/tools/potato_field/delivery/Delivery.java delete mode 100644 potato-field/src/main/java/com/tools/potato_field/order/Order.java delete mode 100644 potato-field/src/main/java/com/tools/potato_field/order/OrderController.java delete mode 100644 potato-field/src/main/java/com/tools/potato_field/order/OrderRepository.java delete mode 100644 potato-field/src/main/java/com/tools/potato_field/order/OrderService.java create mode 100644 potato-field/src/main/java/com/tools/potato_field/post/Post.java create mode 100644 potato-field/src/main/java/com/tools/potato_field/post/PostController.java create mode 100644 potato-field/src/main/java/com/tools/potato_field/post/PostRepository.java create mode 100644 potato-field/src/main/java/com/tools/potato_field/post/PostService.java diff --git a/potato-field/src/main/java/com/tools/potato_field/delivery/Delivery.java b/potato-field/src/main/java/com/tools/potato_field/delivery/Delivery.java deleted file mode 100644 index 6870a08..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/delivery/Delivery.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.tools.potato_field.delivery; - -import com.tools.potato_field.order.Order; -import jakarta.persistence.*; -import lombok.Data; - -@Entity -@Data -public class Delivery { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @OneToOne - @JoinColumn(name = "order_id") - private Order order; - - private String status; -} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/order/Order.java b/potato-field/src/main/java/com/tools/potato_field/order/Order.java deleted file mode 100644 index a319992..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/order/Order.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.tools.potato_field.order; - -import com.tools.potato_field.item.Item; -import com.tools.potato_field.member.Member; -import jakarta.persistence.*; -import lombok.Data; -import java.time.LocalDateTime; - -@Entity -@Data -@Table(name = "orders") // 'order'는 예약어이므로 'orders'로 사용 -public class Order { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "member_id") - private Member member; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "item_id") - private Item item; - - private LocalDateTime orderDate; - - private String orderStatus; -} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/order/OrderController.java b/potato-field/src/main/java/com/tools/potato_field/order/OrderController.java deleted file mode 100644 index 9e51d98..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/order/OrderController.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.tools.potato_field.order; - -import com.tools.potato_field.order.Order; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@RestController -@RequestMapping("/orders") -public class OrderController { - private final OrderService orderService; - - public OrderController(OrderService orderService) { - this.orderService = orderService; - } - - @PostMapping - public Order placeOrder(@RequestBody Order order) { - return orderService.placeOrder(order); - } - - @GetMapping("/{id}") - public Order getOrder(@PathVariable Long id) { - return orderService.findOrder(id); - } - - @GetMapping - public List getAllOrders() { - return orderService.findAllOrders(); - } -} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/order/OrderRepository.java b/potato-field/src/main/java/com/tools/potato_field/order/OrderRepository.java deleted file mode 100644 index 4960dea..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/order/OrderRepository.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tools.potato_field.order; - -import com.tools.potato_field.order.Order; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -public interface OrderRepository extends JpaRepository { - // 회원 ID로 주문 목록 조회 - List findByMemberId(Long memberId); - - // 주문 상태로 주문 목록 조회 - List findByOrderStatus(String orderStatus); - - // 추가적인 쿼리 메서드들을 필요에 따라 정의할 수 있습니다. -} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/order/OrderService.java b/potato-field/src/main/java/com/tools/potato_field/order/OrderService.java deleted file mode 100644 index fd14c93..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/order/OrderService.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.tools.potato_field.order; - -import com.tools.potato_field.order.Order; -import jakarta.transaction.Transactional; -import org.springframework.stereotype.Service; - - -import java.util.List; - -@Service -@Transactional - -public class OrderService { - private final OrderRepository orderRepository; - - public OrderService(OrderRepository orderRepository) { - this.orderRepository = orderRepository; - } - - public Order placeOrder(Order order) { - return orderRepository.save(order); - } - - public Order findOrder(Long id) { - return orderRepository.findById(id).orElseThrow(() -> new RuntimeException("Order not found")); - } - - public List findAllOrders() { - return orderRepository.findAll(); - } - - public void deleteOrder(Long id) { - orderRepository.deleteById(id); - } -} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/post/Post.java b/potato-field/src/main/java/com/tools/potato_field/post/Post.java new file mode 100644 index 0000000..29fe3f1 --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/post/Post.java @@ -0,0 +1,35 @@ +package com.tools.potato_field.post; + + +import com.tools.potato_field.member.Member; +import jakarta.persistence.*; + +import java.util.Set; + +@Entity +public class Post { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String title; + private String content; + + @ManyToOne + @JoinColumn(name = "gender_id") + private Category1 gender; + + @ManyToOne + @JoinColumn(name = "member_id") + private Member author; + + @OneToMany(mappedBy = "post") + private Set images; + + @OneToMany(mappedBy = "post") + private Set categories; + + // Getters and Setters +} + diff --git a/potato-field/src/main/java/com/tools/potato_field/post/PostController.java b/potato-field/src/main/java/com/tools/potato_field/post/PostController.java new file mode 100644 index 0000000..fa7eb2d --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/post/PostController.java @@ -0,0 +1,4 @@ +package com.tools.potato_field.post; + +public class PostController { +} diff --git a/potato-field/src/main/java/com/tools/potato_field/post/PostRepository.java b/potato-field/src/main/java/com/tools/potato_field/post/PostRepository.java new file mode 100644 index 0000000..5c39f62 --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/post/PostRepository.java @@ -0,0 +1,9 @@ +package com.tools.potato_field.post; + +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface PostRepository extends JpaRepository { + Optional findByTitle(String title); +} diff --git a/potato-field/src/main/java/com/tools/potato_field/post/PostService.java b/potato-field/src/main/java/com/tools/potato_field/post/PostService.java new file mode 100644 index 0000000..4c62bbc --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/post/PostService.java @@ -0,0 +1,4 @@ +package com.tools.potato_field.post; + +public class PostService { +} From cd474f2c3cfce9a6c9feb9e60dedf613986b7fc5 Mon Sep 17 00:00:00 2001 From: pepcsy Date: Mon, 12 Aug 2024 17:15:59 +0900 Subject: [PATCH 06/45] test --- .../com/tools/potato_field/likes/LikesRepository.java | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 potato-field/src/main/java/com/tools/potato_field/likes/LikesRepository.java diff --git a/potato-field/src/main/java/com/tools/potato_field/likes/LikesRepository.java b/potato-field/src/main/java/com/tools/potato_field/likes/LikesRepository.java new file mode 100644 index 0000000..805993f --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/likes/LikesRepository.java @@ -0,0 +1,9 @@ +package com.tools.potato_field.likes; + +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface LikesRepository extends JpaRepository { +// Optional findByMemberIdAndPostId(Long memberId, Long postId); +} \ No newline at end of file From 7d0d0dd0b9092c2fc9b2f2b45d33537eca83dc69 Mon Sep 17 00:00:00 2001 From: pepcsy Date: Mon, 12 Aug 2024 17:17:54 +0900 Subject: [PATCH 07/45] test! --- .../main/java/com/tools/potato_field/likes/LikesRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/potato-field/src/main/java/com/tools/potato_field/likes/LikesRepository.java b/potato-field/src/main/java/com/tools/potato_field/likes/LikesRepository.java index 805993f..9ea0dc7 100644 --- a/potato-field/src/main/java/com/tools/potato_field/likes/LikesRepository.java +++ b/potato-field/src/main/java/com/tools/potato_field/likes/LikesRepository.java @@ -4,6 +4,6 @@ import java.util.Optional; -public interface LikesRepository extends JpaRepository { +public interface LikesRepository extends JpaRepository { // Optional findByMemberIdAndPostId(Long memberId, Long postId); } \ No newline at end of file From f9445bd6313339225cdadcc2ae0950f81d1555b9 Mon Sep 17 00:00:00 2001 From: pepcsy Date: Mon, 12 Aug 2024 17:21:23 +0900 Subject: [PATCH 08/45] test!!! --- .../main/java/com/tools/potato_field/likes/LikesRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/potato-field/src/main/java/com/tools/potato_field/likes/LikesRepository.java b/potato-field/src/main/java/com/tools/potato_field/likes/LikesRepository.java index 9ea0dc7..29ef313 100644 --- a/potato-field/src/main/java/com/tools/potato_field/likes/LikesRepository.java +++ b/potato-field/src/main/java/com/tools/potato_field/likes/LikesRepository.java @@ -5,5 +5,5 @@ import java.util.Optional; public interface LikesRepository extends JpaRepository { -// Optional findByMemberIdAndPostId(Long memberId, Long postId); + Optional findByMemberIdAndPostId(Long memberId, Long postId); } \ No newline at end of file From a455f3b62f794f33f62f5d720d834513aacc4e31 Mon Sep 17 00:00:00 2001 From: jeongminuk Date: Mon, 12 Aug 2024 17:44:31 +0900 Subject: [PATCH 09/45] =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EC=98=AC=EB=A0=A4~~?= =?UTF-8?q?~?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/tools/potato_field/post/Post.java | 14 ------- .../potato_field/postimage/PostImage.java | 40 +++++++++++++++++++ 2 files changed, 40 insertions(+), 14 deletions(-) create mode 100644 potato-field/src/main/java/com/tools/potato_field/postimage/PostImage.java diff --git a/potato-field/src/main/java/com/tools/potato_field/post/Post.java b/potato-field/src/main/java/com/tools/potato_field/post/Post.java index 29fe3f1..d2695e3 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/Post.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/Post.java @@ -16,20 +16,6 @@ public class Post { private String title; private String content; - @ManyToOne - @JoinColumn(name = "gender_id") - private Category1 gender; - @ManyToOne - @JoinColumn(name = "member_id") - private Member author; - - @OneToMany(mappedBy = "post") - private Set images; - - @OneToMany(mappedBy = "post") - private Set categories; - - // Getters and Setters } diff --git a/potato-field/src/main/java/com/tools/potato_field/postimage/PostImage.java b/potato-field/src/main/java/com/tools/potato_field/postimage/PostImage.java new file mode 100644 index 0000000..8dd778b --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/postimage/PostImage.java @@ -0,0 +1,40 @@ +package com.tools.potato_field.postimage; + +public class PostImage { + private Long id; + private String imageUrl; + private Long postId; + + public PostImage() { + } + + public PostImage(Long id, String imageUrl, Long postId) { + this.id = id; + this.imageUrl = imageUrl; + this.postId = postId; + } + + public Long getId() { + return id; + } + + public String getImageUrl() { + return imageUrl; + } + + public Long getPostId() { + return postId; + } + + public void setId(Long id) { + this.id = id; + } + + public void setImageUrl(String imageUrl) { + this.imageUrl = imageUrl; + } + + public void setPostId(Long postId) { + this.postId = postId; + } +} From 2d1e06d3b7b8d91f22900718dd8def482c46df6a Mon Sep 17 00:00:00 2001 From: hwi-hwi-hwi <164748897+hwi-hwi-hwi@users.noreply.github.com> Date: Mon, 12 Aug 2024 17:46:10 +0900 Subject: [PATCH 10/45] feat --- .../main/java/com/tools/potato_field/entity/Category.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/potato-field/src/main/java/com/tools/potato_field/entity/Category.java b/potato-field/src/main/java/com/tools/potato_field/entity/Category.java index 90413ca..a7f920a 100644 --- a/potato-field/src/main/java/com/tools/potato_field/entity/Category.java +++ b/potato-field/src/main/java/com/tools/potato_field/entity/Category.java @@ -1,5 +1,10 @@ package com.tools.potato_field.entity; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; + @Entity public class Category { @Id From 88f4664074ace00848477a50dbdf3122bec75732 Mon Sep 17 00:00:00 2001 From: pepcsy Date: Mon, 12 Aug 2024 17:54:45 +0900 Subject: [PATCH 11/45] test --- .../com/tools/potato_field/like/Like.java | 24 ++++++++++++++ .../potato_field/like/LikeController.java | 28 ++++++++++++++++ .../LikeRepository.java} | 8 ++--- .../tools/potato_field/like/LikeService.java | 33 +++++++++++++++++++ 4 files changed, 89 insertions(+), 4 deletions(-) create mode 100644 potato-field/src/main/java/com/tools/potato_field/like/Like.java create mode 100644 potato-field/src/main/java/com/tools/potato_field/like/LikeController.java rename potato-field/src/main/java/com/tools/potato_field/{likes/LikesRepository.java => like/LikeRepository.java} (60%) create mode 100644 potato-field/src/main/java/com/tools/potato_field/like/LikeService.java diff --git a/potato-field/src/main/java/com/tools/potato_field/like/Like.java b/potato-field/src/main/java/com/tools/potato_field/like/Like.java new file mode 100644 index 0000000..8fd6105 --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/like/Like.java @@ -0,0 +1,24 @@ +package com.tools.potato_field.like; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Entity +@Getter +@Setter +@NoArgsConstructor +public class Like { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private Long memberId; // 회원 ID + private Long postId; // 포스트 ID +} + diff --git a/potato-field/src/main/java/com/tools/potato_field/like/LikeController.java b/potato-field/src/main/java/com/tools/potato_field/like/LikeController.java new file mode 100644 index 0000000..c144548 --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/like/LikeController.java @@ -0,0 +1,28 @@ +package com.tools.potato_field.like; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/likes") +public class LikeController { + + private final LikeService likeService; + + public LikeController(LikeService likeService) { + this.likeService = likeService; + } + + @PostMapping + public ResponseEntity addLike(@RequestParam Long memberId, @RequestParam Long postId) { + Like like = likeService.addLike(memberId, postId); + return ResponseEntity.ok(like); + } + + @DeleteMapping + public ResponseEntity removeLike(@RequestParam Long memberId, @RequestParam Long postId) { + likeService.removeLike(memberId, postId); + return ResponseEntity.ok().body("Like removed successfully"); + } +} + diff --git a/potato-field/src/main/java/com/tools/potato_field/likes/LikesRepository.java b/potato-field/src/main/java/com/tools/potato_field/like/LikeRepository.java similarity index 60% rename from potato-field/src/main/java/com/tools/potato_field/likes/LikesRepository.java rename to potato-field/src/main/java/com/tools/potato_field/like/LikeRepository.java index 29ef313..d780150 100644 --- a/potato-field/src/main/java/com/tools/potato_field/likes/LikesRepository.java +++ b/potato-field/src/main/java/com/tools/potato_field/like/LikeRepository.java @@ -1,9 +1,9 @@ -package com.tools.potato_field.likes; - +package com.tools.potato_field.like; import org.springframework.data.jpa.repository.JpaRepository; import java.util.Optional; -public interface LikesRepository extends JpaRepository { +public interface LikeRepository extends JpaRepository { Optional findByMemberIdAndPostId(Long memberId, Long postId); -} \ No newline at end of file +} + diff --git a/potato-field/src/main/java/com/tools/potato_field/like/LikeService.java b/potato-field/src/main/java/com/tools/potato_field/like/LikeService.java new file mode 100644 index 0000000..d80f313 --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/like/LikeService.java @@ -0,0 +1,33 @@ +package com.tools.potato_field.like; + +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +public class LikeService { + private final LikeRepository likeRepository; + + public LikeService(LikeRepository likeRepository) { + this.likeRepository = likeRepository; + } + + public Like addLike(Long memberId, Long postId) { + Optional existingLike = likeRepository.findByMemberIdAndPostId(memberId, postId); + if (existingLike.isPresent()) { + throw new IllegalArgumentException("Already liked"); + } + + Like like = new Like(); + like.setMemberId(memberId); + like.setPostId(postId); + + return likeRepository.save(like); + } + + public void removeLike(Long memberId, Long postId) { + Optional existingLike = likeRepository.findByMemberIdAndPostId(memberId, postId); + existingLike.ifPresent(likeRepository::delete); + } +} + From 63f01ef236df16e8f79615fce4eeba317a2b04c9 Mon Sep 17 00:00:00 2001 From: hwi-hwi-hwi <164748897+hwi-hwi-hwi@users.noreply.github.com> Date: Mon, 12 Aug 2024 17:57:36 +0900 Subject: [PATCH 12/45] editttt --- .../{entity => category}/Category.java | 2 +- .../tools/potato_field/category/Category_1.java | 15 +++++++++++++++ .../com/tools/potato_field/entity/Category_1.java | 10 ---------- 3 files changed, 16 insertions(+), 11 deletions(-) rename potato-field/src/main/java/com/tools/potato_field/{entity => category}/Category.java (88%) create mode 100644 potato-field/src/main/java/com/tools/potato_field/category/Category_1.java delete mode 100644 potato-field/src/main/java/com/tools/potato_field/entity/Category_1.java diff --git a/potato-field/src/main/java/com/tools/potato_field/entity/Category.java b/potato-field/src/main/java/com/tools/potato_field/category/Category.java similarity index 88% rename from potato-field/src/main/java/com/tools/potato_field/entity/Category.java rename to potato-field/src/main/java/com/tools/potato_field/category/Category.java index a7f920a..190af07 100644 --- a/potato-field/src/main/java/com/tools/potato_field/entity/Category.java +++ b/potato-field/src/main/java/com/tools/potato_field/category/Category.java @@ -1,4 +1,4 @@ -package com.tools.potato_field.entity; +package com.tools.potato_field.category; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; diff --git a/potato-field/src/main/java/com/tools/potato_field/category/Category_1.java b/potato-field/src/main/java/com/tools/potato_field/category/Category_1.java new file mode 100644 index 0000000..e6f8692 --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/category/Category_1.java @@ -0,0 +1,15 @@ +package com.tools.potato_field.category; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; + +@Entity +public class Category_1 { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String genderName; +} diff --git a/potato-field/src/main/java/com/tools/potato_field/entity/Category_1.java b/potato-field/src/main/java/com/tools/potato_field/entity/Category_1.java deleted file mode 100644 index 551d783..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/entity/Category_1.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.tools.potato_field.entity; - -@Entity -public class Category_1 { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - private String genderName; -} From 66217a4ca8b8d4e65e373abe8a2ca4afc86e023e Mon Sep 17 00:00:00 2001 From: hwi-hwi-hwi <164748897+hwi-hwi-hwi@users.noreply.github.com> Date: Mon, 12 Aug 2024 18:08:32 +0900 Subject: [PATCH 13/45] end --- .../potato_field/category/{Category.java => Category_2.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename potato-field/src/main/java/com/tools/potato_field/category/{Category.java => Category_2.java} (92%) diff --git a/potato-field/src/main/java/com/tools/potato_field/category/Category.java b/potato-field/src/main/java/com/tools/potato_field/category/Category_2.java similarity index 92% rename from potato-field/src/main/java/com/tools/potato_field/category/Category.java rename to potato-field/src/main/java/com/tools/potato_field/category/Category_2.java index 190af07..2f5fda0 100644 --- a/potato-field/src/main/java/com/tools/potato_field/category/Category.java +++ b/potato-field/src/main/java/com/tools/potato_field/category/Category_2.java @@ -6,7 +6,7 @@ import jakarta.persistence.Id; @Entity -public class Category { +public class Category_2 { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; From 4f67bc23846b64821553388be31a1654d56eea28 Mon Sep 17 00:00:00 2001 From: pepcsy Date: Mon, 12 Aug 2024 18:18:01 +0900 Subject: [PATCH 14/45] post,like one to many --- .../com/tools/potato_field/like/Like.java | 60 +++++++++++++++---- .../com/tools/potato_field/post/Post.java | 39 +++++++++++- .../potato_field/post/PostController.java | 24 ++++++++ .../tools/potato_field/post/PostService.java | 39 ++++++++++++ 4 files changed, 147 insertions(+), 15 deletions(-) diff --git a/potato-field/src/main/java/com/tools/potato_field/like/Like.java b/potato-field/src/main/java/com/tools/potato_field/like/Like.java index 8fd6105..69c2156 100644 --- a/potato-field/src/main/java/com/tools/potato_field/like/Like.java +++ b/potato-field/src/main/java/com/tools/potato_field/like/Like.java @@ -1,24 +1,58 @@ package com.tools.potato_field.like; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; +import com.tools.potato_field.member.Member; +import com.tools.potato_field.post.Post; +import jakarta.persistence.*; + +import java.time.LocalDateTime; @Entity -@Getter -@Setter -@NoArgsConstructor public class Like { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - private Long memberId; // 회원 ID - private Long postId; // 포스트 ID -} + @ManyToOne + @JoinColumn(name = "member_id", nullable = false) + private Member member; + + @ManyToOne + @JoinColumn(name = "post_id", nullable = false) + private Post post; + + private LocalDateTime createdAt = LocalDateTime.now(); + + // Getters and Setters + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + public Member getMember() { + return member; + } + + public void setMember(Member member) { + this.member = member; + } + + public Post getPost() { + return post; + } + + public void setPost(Post post) { + this.post = post; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(LocalDateTime createdAt) { + this.createdAt = createdAt; + } +} diff --git a/potato-field/src/main/java/com/tools/potato_field/post/Post.java b/potato-field/src/main/java/com/tools/potato_field/post/Post.java index d2695e3..d9f9580 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/Post.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/Post.java @@ -1,9 +1,9 @@ package com.tools.potato_field.post; - -import com.tools.potato_field.member.Member; +import com.tools.potato_field.like.Like; import jakarta.persistence.*; +import java.util.HashSet; import java.util.Set; @Entity @@ -16,6 +16,41 @@ public class Post { private String title; private String content; + @OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true) + private Set likes = new HashSet<>(); + + // Getters and Setters + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Set getLikes() { + return likes; + } + + public void setLikes(Set likes) { + this.likes = likes; + } } + diff --git a/potato-field/src/main/java/com/tools/potato_field/post/PostController.java b/potato-field/src/main/java/com/tools/potato_field/post/PostController.java index fa7eb2d..f8c12f2 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/PostController.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/PostController.java @@ -1,4 +1,28 @@ package com.tools.potato_field.post; +import com.tools.potato_field.like.Like; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/posts") public class PostController { + + private final PostService postService; + + public PostController(PostService postService) { + this.postService = postService; + } + + @PostMapping + public ResponseEntity createPost(@RequestParam String title, @RequestParam String content) { + Post post = postService.createPost(title, content); + return ResponseEntity.ok(post); + } + + @PostMapping("/{postId}/like") + public ResponseEntity likePost(@PathVariable Long postId, @RequestParam Long memberId) { + Like like = postService.addLikeToPost(postId, memberId); + return ResponseEntity.ok(like); + } } diff --git a/potato-field/src/main/java/com/tools/potato_field/post/PostService.java b/potato-field/src/main/java/com/tools/potato_field/post/PostService.java index 4c62bbc..831792a 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/PostService.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/PostService.java @@ -1,4 +1,43 @@ package com.tools.potato_field.post; +import com.tools.potato_field.like.Like; +import com.tools.potato_field.like.LikeRepository; +import com.tools.potato_field.member.Member; +import com.tools.potato_field.member.MemberRepository; +import org.springframework.stereotype.Service; + +@Service public class PostService { + + private final PostRepository postRepository; + private final LikeRepository likeRepository; + private final MemberRepository memberRepository; + + public PostService(PostRepository postRepository, LikeRepository likeRepository, MemberRepository memberRepository) { + this.postRepository = postRepository; + this.likeRepository = likeRepository; + this.memberRepository = memberRepository; + } + + public Post createPost(String title, String content) { + Post post = new Post(); + post.setTitle(title); + post.setContent(content); + return postRepository.save(post); + } + + public Like addLikeToPost(Long postId, Long memberId) { + Post post = postRepository.findById(postId) + .orElseThrow(() -> new IllegalArgumentException("Post not found")); + Member member = memberRepository.findById(memberId) + .orElseThrow(() -> new IllegalArgumentException("Member not found")); + + Like like = new Like(); + like.setPost(post); + like.setMember(member); // Member 객체를 설정합니다. + post.getLikes().add(like); + + return likeRepository.save(like); + } } + From 68a1f78cbf31e03193a5b5461acf10fc91e3778c Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 13 Aug 2024 23:12:05 +0900 Subject: [PATCH 15/45] =?UTF-8?q?=EA=B6=8C=EC=A4=80=EC=98=81=200813=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=EB=B3=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../potato_field/JwtAuthenticationFilter.java | 4 +- .../java/com/tools/potato_field/JwtUtil.java | 19 +++++++--- .../delivery/DeliveryController.java | 37 ------------------- .../delivery/DeliveryRepository.java | 8 ---- .../delivery/DeliveryService.java | 35 ------------------ .../tools/potato_field/dto/LoginRequest.java | 4 ++ .../member/CustomUserDetailsService.java | 1 + .../potato_field/order/OrderController.java | 31 ---------------- .../potato_field/order/OrderRepository.java | 18 --------- .../potato_field/order/OrderService.java | 35 ------------------ 10 files changed, 20 insertions(+), 172 deletions(-) delete mode 100644 potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryController.java delete mode 100644 potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryRepository.java delete mode 100644 potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryService.java delete mode 100644 potato-field/src/main/java/com/tools/potato_field/order/OrderController.java delete mode 100644 potato-field/src/main/java/com/tools/potato_field/order/OrderRepository.java delete mode 100644 potato-field/src/main/java/com/tools/potato_field/order/OrderService.java diff --git a/potato-field/src/main/java/com/tools/potato_field/JwtAuthenticationFilter.java b/potato-field/src/main/java/com/tools/potato_field/JwtAuthenticationFilter.java index 7a165c0..164fcd2 100644 --- a/potato-field/src/main/java/com/tools/potato_field/JwtAuthenticationFilter.java +++ b/potato-field/src/main/java/com/tools/potato_field/JwtAuthenticationFilter.java @@ -1,7 +1,5 @@ package com.tools.potato_field; - -import com.tools.potato_field.CustomUserDetailsService; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; @@ -13,7 +11,7 @@ import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; - +import com.tools.potato_field.member.CustomUserDetailsService; import java.io.IOException; @Component diff --git a/potato-field/src/main/java/com/tools/potato_field/JwtUtil.java b/potato-field/src/main/java/com/tools/potato_field/JwtUtil.java index 6a5046e..871b1e9 100644 --- a/potato-field/src/main/java/com/tools/potato_field/JwtUtil.java +++ b/potato-field/src/main/java/com/tools/potato_field/JwtUtil.java @@ -3,7 +3,7 @@ import io.jsonwebtoken.*; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; - +import org.springframework.security.core.userdetails.UserDetails; import java.util.Date; @Component @@ -24,16 +24,25 @@ public String generateToken(String username) { .compact(); } - public boolean validateToken(String token) { + public boolean validateToken(String token, UserDetails userDetails) { try { - Jwts.parser().setSigningKey(secret).parseClaimsJws(token); - return true; + Claims claims = Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody(); + String username = claims.getSubject(); + Date expirationDate = claims.getExpiration(); + + return (username.equals(userDetails.getUsername()) && + expirationDate.after(new Date())); } catch (JwtException | IllegalArgumentException e) { return false; } } public String getUsernameFromToken(String token) { - return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody().getSubject(); + try { + Claims claims = Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody(); + return claims.getSubject(); + } catch (JwtException | IllegalArgumentException e) { + return null; + } } } \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryController.java b/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryController.java deleted file mode 100644 index 14adb67..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryController.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.tools.potato_field.controller; - -import com.tools.potato_field.entity.Delivery; -import com.tools.potato_field.service.DeliveryService; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@RestController -@RequestMapping("/deliveries") -public class DeliveryController { - private final DeliveryService deliveryService; - - public DeliveryController(DeliveryService deliveryService) { - this.deliveryService = deliveryService; - } - - @PostMapping - public Delivery createDelivery(@RequestBody Delivery delivery) { - return deliveryService.createDelivery(delivery); - } - - @GetMapping("/{id}") - public Delivery getDelivery(@PathVariable Long id) { - return deliveryService.findDelivery(id); - } - - @GetMapping - public List getAllDeliveries() { - return deliveryService.findAllDeliveries(); - } - - @DeleteMapping("/{id}") - public void deleteDelivery(@PathVariable Long id) { - deliveryService.deleteDelivery(id); - } -} diff --git a/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryRepository.java b/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryRepository.java deleted file mode 100644 index b1771d1..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.tools.potato_field.delivery; - -import com.tools.potato_field.delivery -.Delivery; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface DeliveryRepository extends JpaRepository { -} diff --git a/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryService.java b/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryService.java deleted file mode 100644 index 40dbc08..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/delivery/DeliveryService.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.tools.potato_field.delivery; - -import com.tools.potato_field.delivery -.Delivery; -import com.tools.potato_field.delivery.DeliveryRepository; -import org.springframework.stereotype.Service; - -import jakarta.transaction.Transactional; -import java.util.List; - -@Service -@Transactional -public class DeliveryService { - private final DeliveryRepository deliveryRepository; - - public DeliveryService(DeliveryRepository deliveryRepository) { - this.deliveryRepository = deliveryRepository; - } - - public Delivery createDelivery(Delivery delivery) { - return deliveryRepository.save(delivery); - } - - public Delivery findDelivery(Long id) { - return deliveryRepository.findById(id).orElseThrow(() -> new RuntimeException("Delivery not found")); - } - - public List findAllDeliveries() { - return deliveryRepository.findAll(); - } - - public void deleteDelivery(Long id) { - deliveryRepository.deleteById(id); - } -} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/dto/LoginRequest.java b/potato-field/src/main/java/com/tools/potato_field/dto/LoginRequest.java index a512031..1d7d065 100644 --- a/potato-field/src/main/java/com/tools/potato_field/dto/LoginRequest.java +++ b/potato-field/src/main/java/com/tools/potato_field/dto/LoginRequest.java @@ -1,7 +1,11 @@ package com.tools.potato_field.dto; import lombok.Data; +import lombok.Getter; +import lombok.Setter; +@Getter +@Setter @Data public class LoginRequest { private String username; diff --git a/potato-field/src/main/java/com/tools/potato_field/member/CustomUserDetailsService.java b/potato-field/src/main/java/com/tools/potato_field/member/CustomUserDetailsService.java index b910076..8e3595c 100644 --- a/potato-field/src/main/java/com/tools/potato_field/member/CustomUserDetailsService.java +++ b/potato-field/src/main/java/com/tools/potato_field/member/CustomUserDetailsService.java @@ -3,6 +3,7 @@ import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; diff --git a/potato-field/src/main/java/com/tools/potato_field/order/OrderController.java b/potato-field/src/main/java/com/tools/potato_field/order/OrderController.java deleted file mode 100644 index 9e51d98..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/order/OrderController.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.tools.potato_field.order; - -import com.tools.potato_field.order.Order; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@RestController -@RequestMapping("/orders") -public class OrderController { - private final OrderService orderService; - - public OrderController(OrderService orderService) { - this.orderService = orderService; - } - - @PostMapping - public Order placeOrder(@RequestBody Order order) { - return orderService.placeOrder(order); - } - - @GetMapping("/{id}") - public Order getOrder(@PathVariable Long id) { - return orderService.findOrder(id); - } - - @GetMapping - public List getAllOrders() { - return orderService.findAllOrders(); - } -} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/order/OrderRepository.java b/potato-field/src/main/java/com/tools/potato_field/order/OrderRepository.java deleted file mode 100644 index 4960dea..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/order/OrderRepository.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tools.potato_field.order; - -import com.tools.potato_field.order.Order; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -public interface OrderRepository extends JpaRepository { - // 회원 ID로 주문 목록 조회 - List findByMemberId(Long memberId); - - // 주문 상태로 주문 목록 조회 - List findByOrderStatus(String orderStatus); - - // 추가적인 쿼리 메서드들을 필요에 따라 정의할 수 있습니다. -} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/order/OrderService.java b/potato-field/src/main/java/com/tools/potato_field/order/OrderService.java deleted file mode 100644 index fd14c93..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/order/OrderService.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.tools.potato_field.order; - -import com.tools.potato_field.order.Order; -import jakarta.transaction.Transactional; -import org.springframework.stereotype.Service; - - -import java.util.List; - -@Service -@Transactional - -public class OrderService { - private final OrderRepository orderRepository; - - public OrderService(OrderRepository orderRepository) { - this.orderRepository = orderRepository; - } - - public Order placeOrder(Order order) { - return orderRepository.save(order); - } - - public Order findOrder(Long id) { - return orderRepository.findById(id).orElseThrow(() -> new RuntimeException("Order not found")); - } - - public List findAllOrders() { - return orderRepository.findAll(); - } - - public void deleteOrder(Long id) { - orderRepository.deleteById(id); - } -} \ No newline at end of file From 39f16a60f19488e7566b6a775ad0c13712296f9c Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 16 Aug 2024 02:11:03 +0900 Subject: [PATCH 16/45] =?UTF-8?q?0816=20=ED=9A=8C=EC=9D=98=EC=A0=84=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=EB=B3=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../potato_field/JwtAuthenticationFilter.java | 23 +------------------ .../potato_field/PotatoFieldApplication.java | 6 ++--- .../tools/potato_field/SecurityConfig.java | 16 ++++++------- 3 files changed, 11 insertions(+), 34 deletions(-) diff --git a/potato-field/src/main/java/com/tools/potato_field/JwtAuthenticationFilter.java b/potato-field/src/main/java/com/tools/potato_field/JwtAuthenticationFilter.java index 164fcd2..0d971f4 100644 --- a/potato-field/src/main/java/com/tools/potato_field/JwtAuthenticationFilter.java +++ b/potato-field/src/main/java/com/tools/potato_field/JwtAuthenticationFilter.java @@ -13,7 +13,6 @@ import org.springframework.web.filter.OncePerRequestFilter; import com.tools.potato_field.member.CustomUserDetailsService; import java.io.IOException; - @Component public class JwtAuthenticationFilter extends OncePerRequestFilter { @@ -27,27 +26,7 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { - final String authorizationHeader = request.getHeader("Authorization"); - - String username = null; - String jwt = null; - if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) { - jwt = authorizationHeader.substring(7); - username = jwtUtil.getUsernameFromToken(jwt); - } - - if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { - UserDetails userDetails = this.customUserDetailsService.loadUserByUsername(username); - - if (jwtUtil.validateToken(jwt, userDetails)) { - UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken( - userDetails, null, userDetails.getAuthorities()); - usernamePasswordAuthenticationToken - .setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); - SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken); - } - } - filterChain.doFilter(request, response); + final String authorizationHeader = request.getHeader("Authorization"); } } \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/PotatoFieldApplication.java b/potato-field/src/main/java/com/tools/potato_field/PotatoFieldApplication.java index d295b4a..c62fde0 100644 --- a/potato-field/src/main/java/com/tools/potato_field/PotatoFieldApplication.java +++ b/potato-field/src/main/java/com/tools/potato_field/PotatoFieldApplication.java @@ -2,12 +2,12 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; - +import org.springframework.context.annotation.ComponentScan; @SpringBootApplication +@ComponentScan(basePackages = "com.tools.potato_field") public class PotatoFieldApplication { public static void main(String[] args) { SpringApplication.run(PotatoFieldApplication.class, args); } - -} +} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/SecurityConfig.java b/potato-field/src/main/java/com/tools/potato_field/SecurityConfig.java index c20bbe3..74e22a8 100644 --- a/potato-field/src/main/java/com/tools/potato_field/SecurityConfig.java +++ b/potato-field/src/main/java/com/tools/potato_field/SecurityConfig.java @@ -1,6 +1,5 @@ package com.tools.potato_field; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; @@ -14,17 +13,16 @@ @Configuration @EnableWebSecurity public class SecurityConfig { - @Autowired - private JwtAuthenticationFilter jwtAuthenticationFilter; - @Bean - public PasswordEncoder passwordEncoder() { - return new BCryptPasswordEncoder(); + private final JwtAuthenticationFilter jwtAuthenticationFilter; + + public SecurityConfig(JwtAuthenticationFilter jwtAuthenticationFilter) { + this.jwtAuthenticationFilter = jwtAuthenticationFilter; } @Bean - public JwtAuthenticationFilter jwtAuthenticationFilter() { - return new JwtAuthenticationFilter(); + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); } @Bean @@ -36,7 +34,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .requestMatchers("/api/members/register", "/api/members/login").permitAll() .anyRequest().authenticated() ) - .addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); + .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); return http.build(); } From 5b1c57260f91e248de113395aa199cb6f3ea9d10 Mon Sep 17 00:00:00 2001 From: pepcsy Date: Fri, 16 Aug 2024 04:25:36 +0900 Subject: [PATCH 17/45] =?UTF-8?q?=EC=98=A4=EB=A5=98=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/tools/potato_field/like/Like.java | 44 +++---------------- .../tools/potato_field/like/LikeService.java | 21 +++++++-- .../com/tools/potato_field/post/Post.java | 37 +++------------- 3 files changed, 29 insertions(+), 73 deletions(-) diff --git a/potato-field/src/main/java/com/tools/potato_field/like/Like.java b/potato-field/src/main/java/com/tools/potato_field/like/Like.java index 69c2156..9b18e0b 100644 --- a/potato-field/src/main/java/com/tools/potato_field/like/Like.java +++ b/potato-field/src/main/java/com/tools/potato_field/like/Like.java @@ -3,56 +3,24 @@ import com.tools.potato_field.member.Member; import com.tools.potato_field.post.Post; import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; -import java.time.LocalDateTime; - +@Setter +@Getter @Entity public class Like { + // Getters and Setters @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne - @JoinColumn(name = "member_id", nullable = false) + @JoinColumn(name = "member_id", nullable = false)//데이터베이스 테이블에서 Member 엔티티의 id를 참조하는 외래키 private Member member; @ManyToOne @JoinColumn(name = "post_id", nullable = false) private Post post; - - private LocalDateTime createdAt = LocalDateTime.now(); - - // Getters and Setters - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public Member getMember() { - return member; - } - - public void setMember(Member member) { - this.member = member; - } - - public Post getPost() { - return post; - } - - public void setPost(Post post) { - this.post = post; - } - - public LocalDateTime getCreatedAt() { - return createdAt; - } - - public void setCreatedAt(LocalDateTime createdAt) { - this.createdAt = createdAt; - } } diff --git a/potato-field/src/main/java/com/tools/potato_field/like/LikeService.java b/potato-field/src/main/java/com/tools/potato_field/like/LikeService.java index d80f313..ee031c3 100644 --- a/potato-field/src/main/java/com/tools/potato_field/like/LikeService.java +++ b/potato-field/src/main/java/com/tools/potato_field/like/LikeService.java @@ -1,5 +1,9 @@ package com.tools.potato_field.like; +import com.tools.potato_field.member.Member; +import com.tools.potato_field.member.MemberRepository; +import com.tools.potato_field.post.Post; +import com.tools.potato_field.post.PostRepository; import org.springframework.stereotype.Service; import java.util.Optional; @@ -7,9 +11,13 @@ @Service public class LikeService { private final LikeRepository likeRepository; + private final MemberRepository memberRepository; + private final PostRepository postRepository; - public LikeService(LikeRepository likeRepository) { + public LikeService(LikeRepository likeRepository, MemberRepository memberRepository, PostRepository postRepository) { this.likeRepository = likeRepository; + this.memberRepository = memberRepository; + this.postRepository = postRepository; } public Like addLike(Long memberId, Long postId) { @@ -18,9 +26,14 @@ public Like addLike(Long memberId, Long postId) { throw new IllegalArgumentException("Already liked"); } + Member member = memberRepository.findById(memberId) + .orElseThrow(() -> new IllegalArgumentException("Invalid member ID")); + Post post = postRepository.findById(postId) + .orElseThrow(() -> new IllegalArgumentException("Invalid post ID")); + Like like = new Like(); - like.setMemberId(memberId); - like.setPostId(postId); + like.setMember(member); // Member 객체 설정 + like.setPost(post); // Post 객체 설정 return likeRepository.save(like); } @@ -31,3 +44,5 @@ public void removeLike(Long memberId, Long postId) { } } + + diff --git a/potato-field/src/main/java/com/tools/potato_field/post/Post.java b/potato-field/src/main/java/com/tools/potato_field/post/Post.java index d9f9580..8dccae9 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/Post.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/Post.java @@ -2,13 +2,18 @@ import com.tools.potato_field.like.Like; import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; import java.util.HashSet; import java.util.Set; +@Setter +@Getter @Entity public class Post { + // Getters and Setters @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @@ -19,38 +24,6 @@ public class Post { @OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true) private Set likes = new HashSet<>(); - // Getters and Setters - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } - - public Set getLikes() { - return likes; - } - - public void setLikes(Set likes) { - this.likes = likes; - } } From 456169c976ba0e672f4277f30a0f7d35fd22e732 Mon Sep 17 00:00:00 2001 From: hwi-hwi-hwi <164748897+hwi-hwi-hwi@users.noreply.github.com> Date: Fri, 16 Aug 2024 06:18:24 +0900 Subject: [PATCH 18/45] edit --- .../category/Category1Controller.java | 51 ++++++++++++++++++ .../category/Category1Repository.java | 7 +++ .../category/Category2Controller.java | 51 ++++++++++++++++++ .../category/Category2Repository.java | 7 +++ .../potato_field/category/Category_1.java | 16 ++++++ .../potato_field/category/Category_2.java | 16 ++++++ .../com/tools/potato_field/item/Item.java | 2 + .../potato_field/item/ItemController.java | 54 +++++++++++++++---- .../potato_field/item/ItemRepository.java | 1 + .../src/main/resources/application.properties | 9 ++++ 10 files changed, 204 insertions(+), 10 deletions(-) create mode 100644 potato-field/src/main/java/com/tools/potato_field/category/Category1Controller.java create mode 100644 potato-field/src/main/java/com/tools/potato_field/category/Category1Repository.java create mode 100644 potato-field/src/main/java/com/tools/potato_field/category/Category2Controller.java create mode 100644 potato-field/src/main/java/com/tools/potato_field/category/Category2Repository.java create mode 100644 potato-field/src/main/resources/application.properties diff --git a/potato-field/src/main/java/com/tools/potato_field/category/Category1Controller.java b/potato-field/src/main/java/com/tools/potato_field/category/Category1Controller.java new file mode 100644 index 0000000..fcbae42 --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/category/Category1Controller.java @@ -0,0 +1,51 @@ +package com.tools.potato_field.category; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Optional; + +@RestController +@RequestMapping("/category1") +public class Category1Controller { + + @Autowired + private Category1Repository category1Repository; + + // Create + @PostMapping + public Category_1 createCategory1(@RequestBody Category_1 category1) { + return category1Repository.save(category1); + } + + // Read + @GetMapping("/{id}") + public Optional getCategory1(@PathVariable Long id) { + return category1Repository.findById(id); + } + + // Read All + @GetMapping + public List getAllCategories1() { + return category1Repository.findAll(); + } + + // Update + @PutMapping("/{id}") + public Category_1 updateCategory1(@PathVariable Long id, @RequestBody Category_1 category1Details) { + Category_1 category1 = category1Repository.findById(id).orElseThrow(); + + if (category1Details.getGenderName() != null) { + category1.setGenderName(category1Details.getGenderName()); + } + + return category1Repository.save(category1); + } + + // Delete + @DeleteMapping("/{id}") + public void deleteCategory1(@PathVariable Long id) { + category1Repository.deleteById(id); + } +} diff --git a/potato-field/src/main/java/com/tools/potato_field/category/Category1Repository.java b/potato-field/src/main/java/com/tools/potato_field/category/Category1Repository.java new file mode 100644 index 0000000..d424456 --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/category/Category1Repository.java @@ -0,0 +1,7 @@ +package com.tools.potato_field.category; + +import com.tools.potato_field.category.Category_1; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface Category1Repository extends JpaRepository { +} diff --git a/potato-field/src/main/java/com/tools/potato_field/category/Category2Controller.java b/potato-field/src/main/java/com/tools/potato_field/category/Category2Controller.java new file mode 100644 index 0000000..b502bf2 --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/category/Category2Controller.java @@ -0,0 +1,51 @@ +package com.tools.potato_field.category; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Optional; + +@RestController +@RequestMapping("/category2") +public class Category2Controller { + + @Autowired + private Category2Repository category2Repository; + + // Create + @PostMapping + public Category_2 createCategory2(@RequestBody Category_2 category2) { + return category2Repository.save(category2); + } + + // Read + @GetMapping("/{id}") + public Optional getCategory2(@PathVariable Long id) { + return category2Repository.findById(id); + } + + // Read All + @GetMapping + public List getAllCategories2() { + return category2Repository.findAll(); + } + + // Update + @PutMapping("/{id}") + public Category_2 updateCategory2(@PathVariable Long id, @RequestBody Category_2 category2Details) { + Category_2 category2 = category2Repository.findById(id).orElseThrow(); + + if (category2Details.getPlaceName() != null) { + category2.setPlaceName(category2Details.getPlaceName()); + } + + return category2Repository.save(category2); + } + + // Delete + @DeleteMapping("/{id}") + public void deleteCategory2(@PathVariable Long id) { + category2Repository.deleteById(id); + } +} diff --git a/potato-field/src/main/java/com/tools/potato_field/category/Category2Repository.java b/potato-field/src/main/java/com/tools/potato_field/category/Category2Repository.java new file mode 100644 index 0000000..0c92a6f --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/category/Category2Repository.java @@ -0,0 +1,7 @@ +package com.tools.potato_field.category; + +import com.tools.potato_field.category.Category_2; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface Category2Repository extends JpaRepository { +} diff --git a/potato-field/src/main/java/com/tools/potato_field/category/Category_1.java b/potato-field/src/main/java/com/tools/potato_field/category/Category_1.java index e6f8692..14453a1 100644 --- a/potato-field/src/main/java/com/tools/potato_field/category/Category_1.java +++ b/potato-field/src/main/java/com/tools/potato_field/category/Category_1.java @@ -12,4 +12,20 @@ public class Category_1 { private Long id; private String genderName; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getGenderName() { + return genderName; + } + + public void setGenderName(String genderName) { + this.genderName = genderName; + } } diff --git a/potato-field/src/main/java/com/tools/potato_field/category/Category_2.java b/potato-field/src/main/java/com/tools/potato_field/category/Category_2.java index 2f5fda0..b1c0d29 100644 --- a/potato-field/src/main/java/com/tools/potato_field/category/Category_2.java +++ b/potato-field/src/main/java/com/tools/potato_field/category/Category_2.java @@ -12,4 +12,20 @@ public class Category_2 { private Long id; private String placeName; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getPlaceName() { + return placeName; + } + + public void setPlaceName(String placeName) { + this.placeName = placeName; + } } diff --git a/potato-field/src/main/java/com/tools/potato_field/item/Item.java b/potato-field/src/main/java/com/tools/potato_field/item/Item.java index 0ff8d60..190e251 100644 --- a/potato-field/src/main/java/com/tools/potato_field/item/Item.java +++ b/potato-field/src/main/java/com/tools/potato_field/item/Item.java @@ -1,7 +1,9 @@ package com.tools.potato_field.item; import com.tools.potato_field.member.Member; + import jakarta.persistence.*; + import lombok.Data; @Entity diff --git a/potato-field/src/main/java/com/tools/potato_field/item/ItemController.java b/potato-field/src/main/java/com/tools/potato_field/item/ItemController.java index 959e134..7df1358 100644 --- a/potato-field/src/main/java/com/tools/potato_field/item/ItemController.java +++ b/potato-field/src/main/java/com/tools/potato_field/item/ItemController.java @@ -1,35 +1,69 @@ package com.tools.potato_field.item; +import com.tools.potato_field.member.Member; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.Optional; @RestController @RequestMapping("/items") public class ItemController { - private final ItemService itemService; - public ItemController(ItemService itemService) { - this.itemService = itemService; - } + @Autowired + private ItemRepository itemRepository; + // Create @PostMapping - public Item addItem(@RequestBody Item item) { - return itemService.addItem(item); + public Item createItem(@RequestBody Item item) { + return itemRepository.save(item); } + // Read @GetMapping("/{id}") - public Item getItem(@PathVariable Long id) { - return itemService.findItem(id); + public Optional getItem(@PathVariable Long id) { + return itemRepository.findById(id); } + // Read All @GetMapping public List getAllItems() { - return itemService.findAllItems(); + return itemRepository.findAll(); + } + + // Update + @PutMapping("/{id}") + public Item updateItem(@PathVariable Long id, @RequestBody Item itemDetails) { + Item item = itemRepository.findById(id).orElseThrow(); + + if (itemDetails.getItemName() != null) { + item.setItemName(itemDetails.getItemName()); + } + + if (itemDetails.getItemURL() != null) { + item.setItemURL(itemDetails.getItemURL()); + } + + if (itemDetails.getIconNumber() != null) { + item.setIconNumber(itemDetails.getIconNumber()); + } + + if (itemDetails.getId2() != null) { + item.setId2(itemDetails.getId2()); + } + + if (itemDetails.getMember() != null) { + item.setMember(itemDetails.getMember()); + } + + return itemRepository.save(item); } + // Delete @DeleteMapping("/{id}") public void deleteItem(@PathVariable Long id) { - itemService.deleteItem(id); + itemRepository.deleteById(id); } } + diff --git a/potato-field/src/main/java/com/tools/potato_field/item/ItemRepository.java b/potato-field/src/main/java/com/tools/potato_field/item/ItemRepository.java index 991065d..4b45d7a 100644 --- a/potato-field/src/main/java/com/tools/potato_field/item/ItemRepository.java +++ b/potato-field/src/main/java/com/tools/potato_field/item/ItemRepository.java @@ -1,5 +1,6 @@ package com.tools.potato_field.item; +import com.tools.potato_field.item.Item; import org.springframework.data.jpa.repository.JpaRepository; public interface ItemRepository extends JpaRepository { diff --git a/potato-field/src/main/resources/application.properties b/potato-field/src/main/resources/application.properties new file mode 100644 index 0000000..b48cb27 --- /dev/null +++ b/potato-field/src/main/resources/application.properties @@ -0,0 +1,9 @@ +# H2 Database Configuration +spring.h2.console.enabled=true +spring.h2.console.path=/h2-console +spring.datasource.url=jdbc:h2:mem:testdb +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.username=sa +spring.datasource.password=password +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect +spring.jpa.hibernate.ddl-auto=update From 317fdc762efd3a085f4a0102d1f6ba85c54ed4dc Mon Sep 17 00:00:00 2001 From: jeongminuk Date: Fri, 16 Aug 2024 13:05:43 +0900 Subject: [PATCH 19/45] =?UTF-8?q?=EB=82=9C=20=EB=AA=B0=EB=9D=BC=EC=9A=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/modules.xml | 1 + .idea/modules/potato-field.main.iml | 8 ++++ .../com/tools/potato_field/PostCategory.java | 4 ++ .../com/tools/potato_field/post/Post.java | 20 +++++++-- .../potato_field/postimage/PostImage.java | 43 +++++-------------- 5 files changed, 40 insertions(+), 36 deletions(-) create mode 100644 .idea/modules/potato-field.main.iml create mode 100644 potato-field/src/main/java/com/tools/potato_field/PostCategory.java diff --git a/.idea/modules.xml b/.idea/modules.xml index 1c0db2d..f1d544a 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -3,6 +3,7 @@ + \ No newline at end of file diff --git a/.idea/modules/potato-field.main.iml b/.idea/modules/potato-field.main.iml new file mode 100644 index 0000000..4404cf4 --- /dev/null +++ b/.idea/modules/potato-field.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/PostCategory.java b/potato-field/src/main/java/com/tools/potato_field/PostCategory.java new file mode 100644 index 0000000..98e4905 --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/PostCategory.java @@ -0,0 +1,4 @@ +package com.tools.potato_field; + +public class PostCategory { +} diff --git a/potato-field/src/main/java/com/tools/potato_field/post/Post.java b/potato-field/src/main/java/com/tools/potato_field/post/Post.java index 8dccae9..dccfc3f 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/Post.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/Post.java @@ -1,6 +1,10 @@ package com.tools.potato_field.post; +import com.tools.potato_field.PostCategory; +import com.tools.potato_field.category.Category_1; import com.tools.potato_field.like.Like; +import com.tools.potato_field.member.Member; +import com.tools.potato_field.postimage.PostImage; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; @@ -13,7 +17,6 @@ @Entity public class Post { - // Getters and Setters @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @@ -21,9 +24,20 @@ public class Post { private String title; private String content; - @OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true) - private Set likes = new HashSet<>(); + @ManyToOne + @JoinColumn(name = "gender_id") + private Category_1 gender; + @ManyToOne + @JoinColumn(name = "member_id") + private Member author; + + @OneToMany(mappedBy = "post") + private Set images; + + @OneToMany(mappedBy = "post") + private Set categories; } + diff --git a/potato-field/src/main/java/com/tools/potato_field/postimage/PostImage.java b/potato-field/src/main/java/com/tools/potato_field/postimage/PostImage.java index 8dd778b..e407a99 100644 --- a/potato-field/src/main/java/com/tools/potato_field/postimage/PostImage.java +++ b/potato-field/src/main/java/com/tools/potato_field/postimage/PostImage.java @@ -1,40 +1,17 @@ package com.tools.potato_field.postimage; -public class PostImage { - private Long id; - private String imageUrl; - private Long postId; - - public PostImage() { - } - - public PostImage(Long id, String imageUrl, Long postId) { - this.id = id; - this.imageUrl = imageUrl; - this.postId = postId; - } +import jakarta.persistence.Entity; - public Long getId() { - return id; - } - - public String getImageUrl() { - return imageUrl; - } - - public Long getPostId() { - return postId; - } +@Entity +public class PostImage { - public void setId(Long id) { - this.id = id; - } + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; - public void setImageUrl(String imageUrl) { - this.imageUrl = imageUrl; - } + @ManyToOne + @JoinColumn(name = "post_id") + private Post post; - public void setPostId(Long postId) { - this.postId = postId; - } + // Getters and Setters } From 20da65ac7dbb5a8ec2dd9bb2c5477ccf442ed0d3 Mon Sep 17 00:00:00 2001 From: jeongminuk Date: Fri, 16 Aug 2024 14:04:38 +0900 Subject: [PATCH 20/45] update postimagerepository --- .../java/com/tools/potato_field/postimage/PostImage.java | 5 ++--- .../tools/potato_field/postimage/PostImageRepository.java | 5 +++++ 2 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 potato-field/src/main/java/com/tools/potato_field/postimage/PostImageRepository.java diff --git a/potato-field/src/main/java/com/tools/potato_field/postimage/PostImage.java b/potato-field/src/main/java/com/tools/potato_field/postimage/PostImage.java index e407a99..c869849 100644 --- a/potato-field/src/main/java/com/tools/potato_field/postimage/PostImage.java +++ b/potato-field/src/main/java/com/tools/potato_field/postimage/PostImage.java @@ -1,6 +1,7 @@ package com.tools.potato_field.postimage; -import jakarta.persistence.Entity; +import com.tools.potato_field.post.Post; +import jakarta.persistence.*; @Entity public class PostImage { @@ -12,6 +13,4 @@ public class PostImage { @ManyToOne @JoinColumn(name = "post_id") private Post post; - - // Getters and Setters } diff --git a/potato-field/src/main/java/com/tools/potato_field/postimage/PostImageRepository.java b/potato-field/src/main/java/com/tools/potato_field/postimage/PostImageRepository.java new file mode 100644 index 0000000..d55c7bc --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/postimage/PostImageRepository.java @@ -0,0 +1,5 @@ +package com.tools.potato_field.postimage; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PostImageRepository extends JpaRepository { } \ No newline at end of file From 9b6c0bd669bc614ae3fbd706843c95946cdaea2b Mon Sep 17 00:00:00 2001 From: jeongminuk Date: Fri, 16 Aug 2024 14:21:42 +0900 Subject: [PATCH 21/45] create post update --- .../com/tools/potato_field/dto/CreatePost.java | 16 ++++++++++++++++ .../tools/potato_field/dto/CreatePostNext.java | 7 +++++++ 2 files changed, 23 insertions(+) create mode 100644 potato-field/src/main/java/com/tools/potato_field/dto/CreatePost.java create mode 100644 potato-field/src/main/java/com/tools/potato_field/dto/CreatePostNext.java diff --git a/potato-field/src/main/java/com/tools/potato_field/dto/CreatePost.java b/potato-field/src/main/java/com/tools/potato_field/dto/CreatePost.java new file mode 100644 index 0000000..0fd3204 --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/dto/CreatePost.java @@ -0,0 +1,16 @@ +package com.tools.potato_field.dto; + +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Data +public class CreatePost { + private String title; + private String content; + private String author; + private String gender; + private String style; +} diff --git a/potato-field/src/main/java/com/tools/potato_field/dto/CreatePostNext.java b/potato-field/src/main/java/com/tools/potato_field/dto/CreatePostNext.java new file mode 100644 index 0000000..7c3fa97 --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/dto/CreatePostNext.java @@ -0,0 +1,7 @@ +package com.tools.potato_field.dto; + +public class CreatePostNext { + private String clothes_name; + private String link; + private String clothes_type; +} From 339aa79a33d0d97e6822fe66cbe90c4282a4d998 Mon Sep 17 00:00:00 2001 From: hwi-hwi-hwi <164748897+hwi-hwi-hwi@users.noreply.github.com> Date: Fri, 16 Aug 2024 14:34:30 +0900 Subject: [PATCH 22/45] =?UTF-8?q?h2=20=EC=BD=98=EC=86=94=20=EC=95=84?= =?UTF-8?q?=EC=A7=81=20=EB=AF=B8=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tools/potato_field/SecurityConfig.java | 5 ++ .../category/Category1Controller.java | 46 +++++++++++++------ .../src/main/resources/application.properties | 9 ---- 3 files changed, 37 insertions(+), 23 deletions(-) delete mode 100644 potato-field/src/main/resources/application.properties diff --git a/potato-field/src/main/java/com/tools/potato_field/SecurityConfig.java b/potato-field/src/main/java/com/tools/potato_field/SecurityConfig.java index 74e22a8..04bf0a9 100644 --- a/potato-field/src/main/java/com/tools/potato_field/SecurityConfig.java +++ b/potato-field/src/main/java/com/tools/potato_field/SecurityConfig.java @@ -32,10 +32,15 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authorizeHttpRequests(authz -> authz .requestMatchers("/api/members/register", "/api/members/login").permitAll() + // H2 콘솔에 대한 접근을 허용 + .requestMatchers("/h2-console/**").permitAll() .anyRequest().authenticated() ) + // H2 콘솔에서 iframe을 허용하기 위한 설정 + .headers(headers -> headers.frameOptions(frameOptions -> frameOptions.sameOrigin())) .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); return http.build(); } + } \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/category/Category1Controller.java b/potato-field/src/main/java/com/tools/potato_field/category/Category1Controller.java index fcbae42..02a4a9e 100644 --- a/potato-field/src/main/java/com/tools/potato_field/category/Category1Controller.java +++ b/potato-field/src/main/java/com/tools/potato_field/category/Category1Controller.java @@ -1,6 +1,8 @@ package com.tools.potato_field.category; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -15,37 +17,53 @@ public class Category1Controller { // Create @PostMapping - public Category_1 createCategory1(@RequestBody Category_1 category1) { - return category1Repository.save(category1); + public ResponseEntity createCategory1(@RequestBody Category_1 category1) { + Category_1 savedCategory = category1Repository.save(category1); + return new ResponseEntity<>(savedCategory, HttpStatus.CREATED); } // Read @GetMapping("/{id}") - public Optional getCategory1(@PathVariable Long id) { - return category1Repository.findById(id); + public ResponseEntity getCategory1(@PathVariable Long id) { + Optional category1 = category1Repository.findById(id); + return category1.map(ResponseEntity::ok) + .orElseGet(() -> new ResponseEntity<>(HttpStatus.NOT_FOUND)); } // Read All @GetMapping - public List getAllCategories1() { - return category1Repository.findAll(); + public ResponseEntity> getAllCategories1() { + List categories = category1Repository.findAll(); + return new ResponseEntity<>(categories, HttpStatus.OK); } // Update @PutMapping("/{id}") - public Category_1 updateCategory1(@PathVariable Long id, @RequestBody Category_1 category1Details) { - Category_1 category1 = category1Repository.findById(id).orElseThrow(); + public ResponseEntity updateCategory1(@PathVariable Long id, @RequestBody Category_1 category1Details) { + Optional category1Optional = category1Repository.findById(id); - if (category1Details.getGenderName() != null) { - category1.setGenderName(category1Details.getGenderName()); - } + if (category1Optional.isPresent()) { + Category_1 category1 = category1Optional.get(); + + if (category1Details.getGenderName() != null) { + category1.setGenderName(category1Details.getGenderName()); + } - return category1Repository.save(category1); + Category_1 updatedCategory = category1Repository.save(category1); + return new ResponseEntity<>(updatedCategory, HttpStatus.OK); + } else { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } } // Delete @DeleteMapping("/{id}") - public void deleteCategory1(@PathVariable Long id) { - category1Repository.deleteById(id); + public ResponseEntity deleteCategory1(@PathVariable Long id) { + if (category1Repository.existsById(id)) { + category1Repository.deleteById(id); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } else { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } } } diff --git a/potato-field/src/main/resources/application.properties b/potato-field/src/main/resources/application.properties deleted file mode 100644 index b48cb27..0000000 --- a/potato-field/src/main/resources/application.properties +++ /dev/null @@ -1,9 +0,0 @@ -# H2 Database Configuration -spring.h2.console.enabled=true -spring.h2.console.path=/h2-console -spring.datasource.url=jdbc:h2:mem:testdb -spring.datasource.driverClassName=org.h2.Driver -spring.datasource.username=sa -spring.datasource.password=password -spring.jpa.database-platform=org.hibernate.dialect.H2Dialect -spring.jpa.hibernate.ddl-auto=update From 9fef7ef7aaf134d7e99e2ae745ebb43855a70cdc Mon Sep 17 00:00:00 2001 From: pepcsy Date: Fri, 16 Aug 2024 14:37:08 +0900 Subject: [PATCH 23/45] feat: like -> likes --- .../potato_field/like/LikeController.java | 28 ------------------- .../potato_field/like/LikeRepository.java | 9 ------ .../like/{Like.java => Likes.java} | 2 +- .../potato_field/like/LikesController.java | 28 +++++++++++++++++++ .../potato_field/like/LikesRepository.java | 9 ++++++ .../{LikeService.java => LikesService.java} | 24 ++++++++-------- .../com/tools/potato_field/post/Post.java | 2 -- .../tools/potato_field/post/PostService.java | 22 +++++++-------- 8 files changed, 61 insertions(+), 63 deletions(-) delete mode 100644 potato-field/src/main/java/com/tools/potato_field/like/LikeController.java delete mode 100644 potato-field/src/main/java/com/tools/potato_field/like/LikeRepository.java rename potato-field/src/main/java/com/tools/potato_field/like/{Like.java => Likes.java} (96%) create mode 100644 potato-field/src/main/java/com/tools/potato_field/like/LikesController.java create mode 100644 potato-field/src/main/java/com/tools/potato_field/like/LikesRepository.java rename potato-field/src/main/java/com/tools/potato_field/like/{LikeService.java => LikesService.java} (57%) diff --git a/potato-field/src/main/java/com/tools/potato_field/like/LikeController.java b/potato-field/src/main/java/com/tools/potato_field/like/LikeController.java deleted file mode 100644 index c144548..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/like/LikeController.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.tools.potato_field.like; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -@RestController -@RequestMapping("/api/likes") -public class LikeController { - - private final LikeService likeService; - - public LikeController(LikeService likeService) { - this.likeService = likeService; - } - - @PostMapping - public ResponseEntity addLike(@RequestParam Long memberId, @RequestParam Long postId) { - Like like = likeService.addLike(memberId, postId); - return ResponseEntity.ok(like); - } - - @DeleteMapping - public ResponseEntity removeLike(@RequestParam Long memberId, @RequestParam Long postId) { - likeService.removeLike(memberId, postId); - return ResponseEntity.ok().body("Like removed successfully"); - } -} - diff --git a/potato-field/src/main/java/com/tools/potato_field/like/LikeRepository.java b/potato-field/src/main/java/com/tools/potato_field/like/LikeRepository.java deleted file mode 100644 index d780150..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/like/LikeRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.tools.potato_field.like; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.Optional; - -public interface LikeRepository extends JpaRepository { - Optional findByMemberIdAndPostId(Long memberId, Long postId); -} - diff --git a/potato-field/src/main/java/com/tools/potato_field/like/Like.java b/potato-field/src/main/java/com/tools/potato_field/like/Likes.java similarity index 96% rename from potato-field/src/main/java/com/tools/potato_field/like/Like.java rename to potato-field/src/main/java/com/tools/potato_field/like/Likes.java index 9b18e0b..13bc7b3 100644 --- a/potato-field/src/main/java/com/tools/potato_field/like/Like.java +++ b/potato-field/src/main/java/com/tools/potato_field/like/Likes.java @@ -9,7 +9,7 @@ @Setter @Getter @Entity -public class Like { +public class Likes { // Getters and Setters @Id diff --git a/potato-field/src/main/java/com/tools/potato_field/like/LikesController.java b/potato-field/src/main/java/com/tools/potato_field/like/LikesController.java new file mode 100644 index 0000000..d5f317c --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/like/LikesController.java @@ -0,0 +1,28 @@ +package com.tools.potato_field.like; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/likes") +public class LikesController { + + private final LikesService likesService; + + public LikesController(LikesService likesService) { + this.likesService = likesService; + } + + @PostMapping + public ResponseEntity addLike(@RequestParam Long memberId, @RequestParam Long postId) { + Likes likes = likesService.addLike(memberId, postId); + return ResponseEntity.ok(likes); + } + + @DeleteMapping + public ResponseEntity removeLike(@RequestParam Long memberId, @RequestParam Long postId) { + likesService.removeLike(memberId, postId); + return ResponseEntity.ok().body("Like removed successfully"); + } +} + diff --git a/potato-field/src/main/java/com/tools/potato_field/like/LikesRepository.java b/potato-field/src/main/java/com/tools/potato_field/like/LikesRepository.java new file mode 100644 index 0000000..0e474fe --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/like/LikesRepository.java @@ -0,0 +1,9 @@ +package com.tools.potato_field.like; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface LikesRepository extends JpaRepository { + Optional findByMemberIdAndPostId(Long memberId, Long postId); +} + diff --git a/potato-field/src/main/java/com/tools/potato_field/like/LikeService.java b/potato-field/src/main/java/com/tools/potato_field/like/LikesService.java similarity index 57% rename from potato-field/src/main/java/com/tools/potato_field/like/LikeService.java rename to potato-field/src/main/java/com/tools/potato_field/like/LikesService.java index ee031c3..feabef0 100644 --- a/potato-field/src/main/java/com/tools/potato_field/like/LikeService.java +++ b/potato-field/src/main/java/com/tools/potato_field/like/LikesService.java @@ -9,19 +9,19 @@ import java.util.Optional; @Service -public class LikeService { - private final LikeRepository likeRepository; +public class LikesService { + private final LikesRepository likesRepository; private final MemberRepository memberRepository; private final PostRepository postRepository; - public LikeService(LikeRepository likeRepository, MemberRepository memberRepository, PostRepository postRepository) { - this.likeRepository = likeRepository; + public LikesService(LikesRepository likesRepository, MemberRepository memberRepository, PostRepository postRepository) { + this.likesRepository = likesRepository; this.memberRepository = memberRepository; this.postRepository = postRepository; } - public Like addLike(Long memberId, Long postId) { - Optional existingLike = likeRepository.findByMemberIdAndPostId(memberId, postId); + public Likes addLike(Long memberId, Long postId) { + Optional existingLike = likesRepository.findByMemberIdAndPostId(memberId, postId); if (existingLike.isPresent()) { throw new IllegalArgumentException("Already liked"); } @@ -31,16 +31,16 @@ public Like addLike(Long memberId, Long postId) { Post post = postRepository.findById(postId) .orElseThrow(() -> new IllegalArgumentException("Invalid post ID")); - Like like = new Like(); - like.setMember(member); // Member 객체 설정 - like.setPost(post); // Post 객체 설정 + Likes likes = new Likes(); + likes.setMember(member); // Member 객체 설정 + likes.setPost(post); // Post 객체 설정 - return likeRepository.save(like); + return likesRepository.save(likes); } public void removeLike(Long memberId, Long postId) { - Optional existingLike = likeRepository.findByMemberIdAndPostId(memberId, postId); - existingLike.ifPresent(likeRepository::delete); + Optional existingLike = likesRepository.findByMemberIdAndPostId(memberId, postId); + existingLike.ifPresent(likesRepository::delete); } } diff --git a/potato-field/src/main/java/com/tools/potato_field/post/Post.java b/potato-field/src/main/java/com/tools/potato_field/post/Post.java index dccfc3f..47c2c69 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/Post.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/Post.java @@ -2,14 +2,12 @@ import com.tools.potato_field.PostCategory; import com.tools.potato_field.category.Category_1; -import com.tools.potato_field.like.Like; import com.tools.potato_field.member.Member; import com.tools.potato_field.postimage.PostImage; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; -import java.util.HashSet; import java.util.Set; @Setter diff --git a/potato-field/src/main/java/com/tools/potato_field/post/PostService.java b/potato-field/src/main/java/com/tools/potato_field/post/PostService.java index 831792a..8846536 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/PostService.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/PostService.java @@ -1,7 +1,7 @@ package com.tools.potato_field.post; -import com.tools.potato_field.like.Like; -import com.tools.potato_field.like.LikeRepository; +import com.tools.potato_field.like.Likes; +import com.tools.potato_field.like.LikesRepository; import com.tools.potato_field.member.Member; import com.tools.potato_field.member.MemberRepository; import org.springframework.stereotype.Service; @@ -10,12 +10,12 @@ public class PostService { private final PostRepository postRepository; - private final LikeRepository likeRepository; + private final LikesRepository likesRepository; private final MemberRepository memberRepository; - public PostService(PostRepository postRepository, LikeRepository likeRepository, MemberRepository memberRepository) { + public PostService(PostRepository postRepository, LikesRepository likesRepository, MemberRepository memberRepository) { this.postRepository = postRepository; - this.likeRepository = likeRepository; + this.likesRepository = likesRepository; this.memberRepository = memberRepository; } @@ -26,18 +26,18 @@ public Post createPost(String title, String content) { return postRepository.save(post); } - public Like addLikeToPost(Long postId, Long memberId) { + public Likes addLikeToPost(Long postId, Long memberId) { Post post = postRepository.findById(postId) .orElseThrow(() -> new IllegalArgumentException("Post not found")); Member member = memberRepository.findById(memberId) .orElseThrow(() -> new IllegalArgumentException("Member not found")); - Like like = new Like(); - like.setPost(post); - like.setMember(member); // Member 객체를 설정합니다. - post.getLikes().add(like); + Likes likes = new Likes(); + likes.setPost(post); + likes.setMember(member); // Member 객체를 설정합니다. + post.getLikes().add(likes); - return likeRepository.save(like); + return likesRepository.save(likes); } } From 18688f13920f3095fc8f733ba88692a5ceb28bd1 Mon Sep 17 00:00:00 2001 From: hwi-hwi-hwi <164748897+hwi-hwi-hwi@users.noreply.github.com> Date: Fri, 16 Aug 2024 14:46:38 +0900 Subject: [PATCH 24/45] =?UTF-8?q?feat:=20post=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=97=90=EB=9F=AC=20=EC=A3=BC=EC=84=9D=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/tools/potato_field/PostCategory.java | 4 ++-- .../src/main/java/com/tools/potato_field/post/Post.java | 7 ++++--- .../main/java/com/tools/potato_field/post/PostService.java | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/potato-field/src/main/java/com/tools/potato_field/PostCategory.java b/potato-field/src/main/java/com/tools/potato_field/PostCategory.java index 98e4905..c2f2672 100644 --- a/potato-field/src/main/java/com/tools/potato_field/PostCategory.java +++ b/potato-field/src/main/java/com/tools/potato_field/PostCategory.java @@ -1,4 +1,4 @@ package com.tools.potato_field; -public class PostCategory { -} +//public class PostCategory { +//} diff --git a/potato-field/src/main/java/com/tools/potato_field/post/Post.java b/potato-field/src/main/java/com/tools/potato_field/post/Post.java index 47c2c69..054a8bb 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/Post.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/Post.java @@ -1,6 +1,5 @@ package com.tools.potato_field.post; -import com.tools.potato_field.PostCategory; import com.tools.potato_field.category.Category_1; import com.tools.potato_field.member.Member; import com.tools.potato_field.postimage.PostImage; @@ -33,8 +32,10 @@ public class Post { @OneToMany(mappedBy = "post") private Set images; - @OneToMany(mappedBy = "post") - private Set categories; +// @OneToMany(mappedBy = "post") +// private Set categories; +// + } diff --git a/potato-field/src/main/java/com/tools/potato_field/post/PostService.java b/potato-field/src/main/java/com/tools/potato_field/post/PostService.java index 8846536..3433ec1 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/PostService.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/PostService.java @@ -35,7 +35,7 @@ public Likes addLikeToPost(Long postId, Long memberId) { Likes likes = new Likes(); likes.setPost(post); likes.setMember(member); // Member 객체를 설정합니다. - post.getLikes().add(likes); +// post.().add(likes); return likesRepository.save(likes); } From 9db2fe36ed4cb4ce90985739ff75266dcba918f8 Mon Sep 17 00:00:00 2001 From: jeongminuk Date: Fri, 16 Aug 2024 14:57:53 +0900 Subject: [PATCH 25/45] =?UTF-8?q?pull=EC=9A=A9=20commit=2001?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/tools/potato_field/post/Post.java | 1 + .../tools/potato_field/post/PostController.java | 16 ++++++++++++++++ .../com/tools/potato_field/post/PostService.java | 5 +++++ 3 files changed, 22 insertions(+) diff --git a/potato-field/src/main/java/com/tools/potato_field/post/Post.java b/potato-field/src/main/java/com/tools/potato_field/post/Post.java index dccfc3f..90ce5ca 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/Post.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/Post.java @@ -9,6 +9,7 @@ import lombok.Getter; import lombok.Setter; +import java.util.Collection; import java.util.HashSet; import java.util.Set; diff --git a/potato-field/src/main/java/com/tools/potato_field/post/PostController.java b/potato-field/src/main/java/com/tools/potato_field/post/PostController.java index fa7eb2d..dd18f56 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/PostController.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/PostController.java @@ -1,4 +1,20 @@ package com.tools.potato_field.post; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/posts") public class PostController { + + @Autowired + private PostService postService; + + @GetMapping("/{id}") + public Post getPost(@PathVariable Long id) { + return postService.findById(id); + } + + // 추가적인 엔드포인트 구현 } + diff --git a/potato-field/src/main/java/com/tools/potato_field/post/PostService.java b/potato-field/src/main/java/com/tools/potato_field/post/PostService.java index 831792a..0e6ceb1 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/PostService.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/PostService.java @@ -39,5 +39,10 @@ public Like addLikeToPost(Long postId, Long memberId) { return likeRepository.save(like); } + + public Post findById(Long id) { + return postRepository.findById(id) + .orElseThrow(() -> new IllegalArgumentException("Post not found")); + } } From 49672770c90e17365d843271097a7474c1d66658 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 16 Aug 2024 15:08:56 +0900 Subject: [PATCH 26/45] revised ver using JWT token --- .../potato_field/JwtAuthenticationFilter.java | 41 +++++++++++++---- .../java/com/tools/potato_field/JwtUtil.java | 42 ++++++++++------- .../potato_field/PotatoFieldApplication.java | 2 +- .../tools/potato_field/SecurityConfig.java | 3 -- .../potato_field/member/MemberController.java | 46 ++++++++----------- .../potato_field/member/MemberService.java | 5 ++ .../src/main/resources/application.yml | 10 +--- 7 files changed, 87 insertions(+), 62 deletions(-) diff --git a/potato-field/src/main/java/com/tools/potato_field/JwtAuthenticationFilter.java b/potato-field/src/main/java/com/tools/potato_field/JwtAuthenticationFilter.java index 0d971f4..4c24885 100644 --- a/potato-field/src/main/java/com/tools/potato_field/JwtAuthenticationFilter.java +++ b/potato-field/src/main/java/com/tools/potato_field/JwtAuthenticationFilter.java @@ -4,7 +4,7 @@ import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.lang.NonNull; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; @@ -12,21 +12,46 @@ import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; import com.tools.potato_field.member.CustomUserDetailsService; + import java.io.IOException; + @Component public class JwtAuthenticationFilter extends OncePerRequestFilter { - @Autowired - private JwtUtil jwtUtil; + private final JwtUtil jwtUtil; + private final CustomUserDetailsService customUserDetailsService; - @Autowired - private CustomUserDetailsService customUserDetailsService; + public JwtAuthenticationFilter(JwtUtil jwtUtil, CustomUserDetailsService customUserDetailsService) { + this.jwtUtil = jwtUtil; + this.customUserDetailsService = customUserDetailsService; + } @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) - throws ServletException, IOException { + protected void doFilterInternal( + @NonNull HttpServletRequest request, + @NonNull HttpServletResponse response, + @NonNull FilterChain filterChain + ) throws ServletException, IOException { + final String authorizationHeader = request.getHeader("Authorization"); + String username = null; + String jwt = null; - final String authorizationHeader = request.getHeader("Authorization"); + if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) { + jwt = authorizationHeader.substring(7); + username = jwtUtil.extractUsername(jwt); + } + + if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { + UserDetails userDetails = this.customUserDetailsService.loadUserByUsername(username); + + if (jwtUtil.validateToken(jwt, userDetails)) { + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken( + userDetails, null, userDetails.getAuthorities()); + authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + SecurityContextHolder.getContext().setAuthentication(authenticationToken); + } + } + filterChain.doFilter(request, response); } } \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/JwtUtil.java b/potato-field/src/main/java/com/tools/potato_field/JwtUtil.java index 871b1e9..23d0eff 100644 --- a/potato-field/src/main/java/com/tools/potato_field/JwtUtil.java +++ b/potato-field/src/main/java/com/tools/potato_field/JwtUtil.java @@ -2,9 +2,11 @@ import io.jsonwebtoken.*; import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Component; + import java.util.Date; +import java.util.function.Function; @Component public class JwtUtil { @@ -25,24 +27,32 @@ public String generateToken(String username) { } public boolean validateToken(String token, UserDetails userDetails) { - try { - Claims claims = Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody(); - String username = claims.getSubject(); - Date expirationDate = claims.getExpiration(); - - return (username.equals(userDetails.getUsername()) && - expirationDate.after(new Date())); - } catch (JwtException | IllegalArgumentException e) { - return false; - } + final String username = extractUsername(token); + return (username.equals(userDetails.getUsername()) && !isTokenExpired(token)); + } + + public String extractUsername(String token) { + return extractClaim(token, Claims::getSubject); } - public String getUsernameFromToken(String token) { + public Date extractExpiration(String token) { + return extractClaim(token, Claims::getExpiration); + } + + public T extractClaim(String token, Function claimsResolver) { + final Claims claims = extractAllClaims(token); + return claimsResolver.apply(claims); + } + + private Claims extractAllClaims(String token) { try { - Claims claims = Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody(); - return claims.getSubject(); - } catch (JwtException | IllegalArgumentException e) { - return null; + return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody(); + } catch (ExpiredJwtException | UnsupportedJwtException | MalformedJwtException | SignatureException | IllegalArgumentException e) { + throw new JwtException("Invalid JWT token", e); } } + + private Boolean isTokenExpired(String token) { + return extractExpiration(token).before(new Date()); + } } \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/PotatoFieldApplication.java b/potato-field/src/main/java/com/tools/potato_field/PotatoFieldApplication.java index c62fde0..f0e79f6 100644 --- a/potato-field/src/main/java/com/tools/potato_field/PotatoFieldApplication.java +++ b/potato-field/src/main/java/com/tools/potato_field/PotatoFieldApplication.java @@ -4,7 +4,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; @SpringBootApplication -@ComponentScan(basePackages = "com.tools.potato_field") + public class PotatoFieldApplication { public static void main(String[] args) { diff --git a/potato-field/src/main/java/com/tools/potato_field/SecurityConfig.java b/potato-field/src/main/java/com/tools/potato_field/SecurityConfig.java index 04bf0a9..4b11da9 100644 --- a/potato-field/src/main/java/com/tools/potato_field/SecurityConfig.java +++ b/potato-field/src/main/java/com/tools/potato_field/SecurityConfig.java @@ -32,15 +32,12 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authorizeHttpRequests(authz -> authz .requestMatchers("/api/members/register", "/api/members/login").permitAll() - // H2 콘솔에 대한 접근을 허용 .requestMatchers("/h2-console/**").permitAll() .anyRequest().authenticated() ) - // H2 콘솔에서 iframe을 허용하기 위한 설정 .headers(headers -> headers.frameOptions(frameOptions -> frameOptions.sameOrigin())) .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); return http.build(); } - } \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/member/MemberController.java b/potato-field/src/main/java/com/tools/potato_field/member/MemberController.java index 70e7085..d5dfe90 100644 --- a/potato-field/src/main/java/com/tools/potato_field/member/MemberController.java +++ b/potato-field/src/main/java/com/tools/potato_field/member/MemberController.java @@ -1,12 +1,13 @@ package com.tools.potato_field.member; import com.tools.potato_field.dto.LoginRequest; +import com.tools.potato_field.JwtUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.security.core.Authentication; import org.springframework.web.bind.annotation.*; -import jakarta.servlet.http.HttpSession; import java.util.List; @RestController @@ -14,10 +15,12 @@ public class MemberController { private final MemberService memberService; + private final JwtUtil jwtUtil; @Autowired - public MemberController(MemberService memberService) { + public MemberController(MemberService memberService, JwtUtil jwtUtil) { this.memberService = memberService; + this.jwtUtil = jwtUtil; } @PostMapping("/register") @@ -26,49 +29,40 @@ public ResponseEntity registerMember(@RequestBody Member member) { } @PostMapping("/login") - public ResponseEntity loginMember(@RequestBody LoginRequest loginRequest, HttpSession session) { + public ResponseEntity loginMember(@RequestBody LoginRequest loginRequest) { Member member = memberService.loginMember(loginRequest.getUsername(), loginRequest.getPassword()); - session.setAttribute("MEMBER_ID", member.getId()); - return ResponseEntity.ok("Login successful"); + String token = jwtUtil.generateToken(member.getUsername()); + return ResponseEntity.ok(token); } @PostMapping("/logout") - public ResponseEntity logoutMember(HttpSession session) { - session.invalidate(); - return ResponseEntity.ok("Logout successful"); + public ResponseEntity logoutMember() { + // JWT는 서버 측에서 세션을 유지하지 않으므로, 클라이언트에서 토큰을 삭제하도록 안내 + return ResponseEntity.ok("Logout successful. Please remove the token from the client side."); } @GetMapping("/me") - public ResponseEntity getCurrentMember(HttpSession session) { - Long memberId = (Long) session.getAttribute("MEMBER_ID"); - if (memberId == null) { - return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); - } - Member member = memberService.findMember(memberId); + public ResponseEntity getCurrentMember(Authentication authentication) { + String username = authentication.getName(); + Member member = memberService.findByUsername(username); return ResponseEntity.ok(member); } @GetMapping("/{id}") - public ResponseEntity getMember(@PathVariable Long id, HttpSession session) { - if (session.getAttribute("MEMBER_ID") == null) { - return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); - } + public ResponseEntity getMember(@PathVariable Long id, Authentication authentication) { + // 인증된 사용자만 접근 가능 return ResponseEntity.ok(memberService.findMember(id)); } @GetMapping - public ResponseEntity> getAllMembers(HttpSession session) { - if (session.getAttribute("MEMBER_ID") == null) { - return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); - } + public ResponseEntity> getAllMembers(Authentication authentication) { + // 인증된 사용자만 접근 가능 return ResponseEntity.ok(memberService.findAllMembers()); } @DeleteMapping("/{id}") - public ResponseEntity deleteMember(@PathVariable Long id, HttpSession session) { - if (session.getAttribute("MEMBER_ID") == null) { - return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); - } + public ResponseEntity deleteMember(@PathVariable Long id, Authentication authentication) { + // 인증된 사용자만 접근 가능 memberService.deleteMember(id); return ResponseEntity.ok().build(); } diff --git a/potato-field/src/main/java/com/tools/potato_field/member/MemberService.java b/potato-field/src/main/java/com/tools/potato_field/member/MemberService.java index d45e336..663e988 100644 --- a/potato-field/src/main/java/com/tools/potato_field/member/MemberService.java +++ b/potato-field/src/main/java/com/tools/potato_field/member/MemberService.java @@ -18,6 +18,11 @@ public MemberService(MemberRepository memberRepository, PasswordEncoder password this.passwordEncoder = passwordEncoder; } + public Member findByUsername(String username) { + return memberRepository.findByUsername(username) + .orElseThrow(() -> new RuntimeException("User not found with username: " + username)); + } + public Member registerMember(Member member) { if (memberRepository.findByUsername(member.getUsername()).isPresent()) { throw new RuntimeException("Username already exists"); diff --git a/potato-field/src/main/resources/application.yml b/potato-field/src/main/resources/application.yml index 47ed651..7cbda4e 100644 --- a/potato-field/src/main/resources/application.yml +++ b/potato-field/src/main/resources/application.yml @@ -15,14 +15,8 @@ spring: console: enabled: true path: /h2-console - data: - redis: - host: localhost - port: 6379 - session: - store-type: redis - main: - allow-bean-definition-overriding: true + + server: port: 8080 From 14ef30755e63f89803f3fc71c7625dbaee022ad4 Mon Sep 17 00:00:00 2001 From: hwi-hwi-hwi <164748897+hwi-hwi-hwi@users.noreply.github.com> Date: Fri, 16 Aug 2024 15:11:49 +0900 Subject: [PATCH 27/45] feat --- .../java/com/tools/potato_field/JwtAuthenticationFilter.java | 2 ++ .../src/main/java/com/tools/potato_field/SecurityConfig.java | 5 ----- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/potato-field/src/main/java/com/tools/potato_field/JwtAuthenticationFilter.java b/potato-field/src/main/java/com/tools/potato_field/JwtAuthenticationFilter.java index 0d971f4..2d97a90 100644 --- a/potato-field/src/main/java/com/tools/potato_field/JwtAuthenticationFilter.java +++ b/potato-field/src/main/java/com/tools/potato_field/JwtAuthenticationFilter.java @@ -29,4 +29,6 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse final String authorizationHeader = request.getHeader("Authorization"); } + + } \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/SecurityConfig.java b/potato-field/src/main/java/com/tools/potato_field/SecurityConfig.java index 04bf0a9..74e22a8 100644 --- a/potato-field/src/main/java/com/tools/potato_field/SecurityConfig.java +++ b/potato-field/src/main/java/com/tools/potato_field/SecurityConfig.java @@ -32,15 +32,10 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authorizeHttpRequests(authz -> authz .requestMatchers("/api/members/register", "/api/members/login").permitAll() - // H2 콘솔에 대한 접근을 허용 - .requestMatchers("/h2-console/**").permitAll() .anyRequest().authenticated() ) - // H2 콘솔에서 iframe을 허용하기 위한 설정 - .headers(headers -> headers.frameOptions(frameOptions -> frameOptions.sameOrigin())) .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); return http.build(); } - } \ No newline at end of file From 2a18fc3f190aef689b127cb2c1642fe1df66ccf2 Mon Sep 17 00:00:00 2001 From: jeongminuk Date: Fri, 16 Aug 2024 15:13:29 +0900 Subject: [PATCH 28/45] =?UTF-8?q?=EC=97=90=EB=9F=AC=20=EC=88=98=EC=A0=95:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/tools/potato_field/post/Post.java | 3 --- .../src/main/java/com/tools/potato_field/post/PostService.java | 1 - 2 files changed, 4 deletions(-) diff --git a/potato-field/src/main/java/com/tools/potato_field/post/Post.java b/potato-field/src/main/java/com/tools/potato_field/post/Post.java index 90ce5ca..ffb394c 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/Post.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/Post.java @@ -35,9 +35,6 @@ public class Post { @OneToMany(mappedBy = "post") private Set images; - - @OneToMany(mappedBy = "post") - private Set categories; } diff --git a/potato-field/src/main/java/com/tools/potato_field/post/PostService.java b/potato-field/src/main/java/com/tools/potato_field/post/PostService.java index 0e6ceb1..2b230f3 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/PostService.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/PostService.java @@ -35,7 +35,6 @@ public Like addLikeToPost(Long postId, Long memberId) { Like like = new Like(); like.setPost(post); like.setMember(member); // Member 객체를 설정합니다. - post.getLikes().add(like); return likeRepository.save(like); } From 6ec6b76472d87b2f46b5c5311f0d7deeea493b85 Mon Sep 17 00:00:00 2001 From: pepcsy Date: Fri, 16 Aug 2024 15:23:38 +0900 Subject: [PATCH 29/45] =?UTF-8?q?likescontroller=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/modules/potato-field.main.iml | 1 + .../java/com/tools/potato_field/like/LikesController.java | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.idea/modules/potato-field.main.iml b/.idea/modules/potato-field.main.iml index 4404cf4..41af0c5 100644 --- a/.idea/modules/potato-field.main.iml +++ b/.idea/modules/potato-field.main.iml @@ -3,6 +3,7 @@ + \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/like/LikesController.java b/potato-field/src/main/java/com/tools/potato_field/like/LikesController.java index d5f317c..1e656a6 100644 --- a/potato-field/src/main/java/com/tools/potato_field/like/LikesController.java +++ b/potato-field/src/main/java/com/tools/potato_field/like/LikesController.java @@ -13,14 +13,14 @@ public LikesController(LikesService likesService) { this.likesService = likesService; } - @PostMapping - public ResponseEntity addLike(@RequestParam Long memberId, @RequestParam Long postId) { + @PostMapping("/posts/{postId}") + public ResponseEntity addLike(@RequestParam Long memberId, @PathVariable Long postId) { Likes likes = likesService.addLike(memberId, postId); return ResponseEntity.ok(likes); } - @DeleteMapping - public ResponseEntity removeLike(@RequestParam Long memberId, @RequestParam Long postId) { + @DeleteMapping("/posts/{postId}") + public ResponseEntity removeLike(@RequestParam Long memberId, @PathVariable Long postId) { likesService.removeLike(memberId, postId); return ResponseEntity.ok().body("Like removed successfully"); } From 3bc5054e5ceb79f2288d056b79908d10348edeed Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 16 Aug 2024 15:55:34 +0900 Subject: [PATCH 30/45] revised ver completed JWT --- .../main/java/com/tools/potato_field/JwtUtil.java | 12 +++++++----- .../com/tools/potato_field/dto/LoginRequest.java | 2 +- .../member/CustomUserDetailsService.java | 4 ++-- .../java/com/tools/potato_field/member/Member.java | 2 +- .../tools/potato_field/member/MemberController.java | 8 +++++--- .../tools/potato_field/member/MemberRepository.java | 2 +- .../com/tools/potato_field/member/MemberService.java | 11 ++++++----- 7 files changed, 23 insertions(+), 18 deletions(-) diff --git a/potato-field/src/main/java/com/tools/potato_field/JwtUtil.java b/potato-field/src/main/java/com/tools/potato_field/JwtUtil.java index 23d0eff..5690efe 100644 --- a/potato-field/src/main/java/com/tools/potato_field/JwtUtil.java +++ b/potato-field/src/main/java/com/tools/potato_field/JwtUtil.java @@ -1,18 +1,20 @@ package com.tools.potato_field; import io.jsonwebtoken.*; +import io.jsonwebtoken.security.Keys; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Component; +import javax.crypto.SecretKey; import java.util.Date; import java.util.function.Function; @Component public class JwtUtil { - @Value("${jwt.secret}") - private String secret; + // SecretKey를 더 안전하게 생성 + private final SecretKey secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS512); @Value("${jwt.expiration}") private long expiration; @@ -22,7 +24,7 @@ public String generateToken(String username) { .setSubject(username) .setIssuedAt(new Date(System.currentTimeMillis())) .setExpiration(new Date(System.currentTimeMillis() + expiration)) - .signWith(SignatureAlgorithm.HS512, secret) + .signWith(secretKey) // 여기서 안전한 키 사용 .compact(); } @@ -46,7 +48,7 @@ public T extractClaim(String token, Function claimsResolver) { private Claims extractAllClaims(String token) { try { - return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody(); + return Jwts.parserBuilder().setSigningKey(secretKey).build().parseClaimsJws(token).getBody(); } catch (ExpiredJwtException | UnsupportedJwtException | MalformedJwtException | SignatureException | IllegalArgumentException e) { throw new JwtException("Invalid JWT token", e); } @@ -55,4 +57,4 @@ private Claims extractAllClaims(String token) { private Boolean isTokenExpired(String token) { return extractExpiration(token).before(new Date()); } -} \ No newline at end of file +} diff --git a/potato-field/src/main/java/com/tools/potato_field/dto/LoginRequest.java b/potato-field/src/main/java/com/tools/potato_field/dto/LoginRequest.java index 1d7d065..e27aaef 100644 --- a/potato-field/src/main/java/com/tools/potato_field/dto/LoginRequest.java +++ b/potato-field/src/main/java/com/tools/potato_field/dto/LoginRequest.java @@ -8,7 +8,7 @@ @Setter @Data public class LoginRequest { - private String username; + private String userID; private String password; } \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/member/CustomUserDetailsService.java b/potato-field/src/main/java/com/tools/potato_field/member/CustomUserDetailsService.java index 8e3595c..a3e6424 100644 --- a/potato-field/src/main/java/com/tools/potato_field/member/CustomUserDetailsService.java +++ b/potato-field/src/main/java/com/tools/potato_field/member/CustomUserDetailsService.java @@ -20,8 +20,8 @@ public class CustomUserDetailsService implements UserDetailsService { @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - Member member = memberRepository.findByUsername(username) + Member member = memberRepository.findByUserID(username) .orElseThrow(() -> new UsernameNotFoundException("User not found with username: " + username)); - return new User(member.getUsername(), member.getPassword(), new ArrayList<>()); + return new User(member.getUserID(), member.getPassword(), new ArrayList<>()); } } \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/member/Member.java b/potato-field/src/main/java/com/tools/potato_field/member/Member.java index bfcc40c..158eb98 100644 --- a/potato-field/src/main/java/com/tools/potato_field/member/Member.java +++ b/potato-field/src/main/java/com/tools/potato_field/member/Member.java @@ -26,7 +26,7 @@ public class Member { private String password; @Column(nullable = false, unique = true) - private String username; + private String userID; @Column(name = "phone_number") diff --git a/potato-field/src/main/java/com/tools/potato_field/member/MemberController.java b/potato-field/src/main/java/com/tools/potato_field/member/MemberController.java index d5dfe90..a3a28ca 100644 --- a/potato-field/src/main/java/com/tools/potato_field/member/MemberController.java +++ b/potato-field/src/main/java/com/tools/potato_field/member/MemberController.java @@ -30,8 +30,8 @@ public ResponseEntity registerMember(@RequestBody Member member) { @PostMapping("/login") public ResponseEntity loginMember(@RequestBody LoginRequest loginRequest) { - Member member = memberService.loginMember(loginRequest.getUsername(), loginRequest.getPassword()); - String token = jwtUtil.generateToken(member.getUsername()); + Member member = memberService.loginMember(loginRequest.getUserID(), loginRequest.getPassword()); + String token = jwtUtil.generateToken(member.getUserID()); return ResponseEntity.ok(token); } @@ -44,7 +44,9 @@ public ResponseEntity logoutMember() { @GetMapping("/me") public ResponseEntity getCurrentMember(Authentication authentication) { String username = authentication.getName(); - Member member = memberService.findByUsername(username); + Member member = memberService.findByUserID + +(username); return ResponseEntity.ok(member); } diff --git a/potato-field/src/main/java/com/tools/potato_field/member/MemberRepository.java b/potato-field/src/main/java/com/tools/potato_field/member/MemberRepository.java index 429205b..90df395 100644 --- a/potato-field/src/main/java/com/tools/potato_field/member/MemberRepository.java +++ b/potato-field/src/main/java/com/tools/potato_field/member/MemberRepository.java @@ -8,5 +8,5 @@ @Repository public interface MemberRepository extends JpaRepository { Optional findByEmail(String email); - OptionalfindByUsername(String username); + OptionalfindByUserID(String userID); } \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/member/MemberService.java b/potato-field/src/main/java/com/tools/potato_field/member/MemberService.java index 663e988..a6e3698 100644 --- a/potato-field/src/main/java/com/tools/potato_field/member/MemberService.java +++ b/potato-field/src/main/java/com/tools/potato_field/member/MemberService.java @@ -18,13 +18,14 @@ public MemberService(MemberRepository memberRepository, PasswordEncoder password this.passwordEncoder = passwordEncoder; } - public Member findByUsername(String username) { - return memberRepository.findByUsername(username) + public Member findByUserID(String username) { + return memberRepository.findByUserID(username) .orElseThrow(() -> new RuntimeException("User not found with username: " + username)); } public Member registerMember(Member member) { - if (memberRepository.findByUsername(member.getUsername()).isPresent()) { + if (memberRepository.findByUserID + (member.getUserID()).isPresent()) { throw new RuntimeException("Username already exists"); } if (memberRepository.findByEmail(member.getEmail()).isPresent()) { @@ -46,8 +47,8 @@ public void deleteMember(Long id) { memberRepository.deleteById(id); } - public Member loginMember(String email, String password) { - Member member = memberRepository.findByEmail(email) + public Member loginMember(String userID, String password) { + Member member = memberRepository.findByUserID(userID) .orElseThrow(() -> new RuntimeException("Member not found")); if (!passwordEncoder.matches(password, member.getPassword())) { throw new RuntimeException("Invalid password"); From 70ec4753ca1d2842ef39fa89adaa6b0a6e58233e Mon Sep 17 00:00:00 2001 From: jeongminuk Date: Fri, 16 Aug 2024 16:05:04 +0900 Subject: [PATCH 31/45] post renew --- .../com/tools/potato_field/post/Post.java | 95 +++++++++++++++---- .../potato_field/post/PostController.java | 29 ++++-- .../potato_field/post/PostRepository.java | 1 - .../tools/potato_field/post/PostRequest.java | 57 +++++++++++ .../tools/potato_field/post/PostService.java | 34 ++++--- .../potato_field/postimage/PostImage.java | 46 ++++++++- 6 files changed, 218 insertions(+), 44 deletions(-) create mode 100644 potato-field/src/main/java/com/tools/potato_field/post/PostRequest.java diff --git a/potato-field/src/main/java/com/tools/potato_field/post/Post.java b/potato-field/src/main/java/com/tools/potato_field/post/Post.java index 5acd7b3..45329a6 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/Post.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/Post.java @@ -1,19 +1,11 @@ package com.tools.potato_field.post; -import com.tools.potato_field.PostCategory; import com.tools.potato_field.category.Category_1; -import com.tools.potato_field.like.Likes; +import jakarta.persistence.*; +import java.util.List; import com.tools.potato_field.member.Member; import com.tools.potato_field.postimage.PostImage; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; - -import java.util.HashSet; -import java.util.Set; -@Setter -@Getter @Entity public class Post { @@ -25,16 +17,85 @@ public class Post { private String content; @ManyToOne - @JoinColumn(name = "gender_id") - private Category_1 gender; + @JoinColumn(name = "id2") + private Category_1 category; // 성별 카테고리와의 관계 @ManyToOne - @JoinColumn(name = "member_id") - private Member author; + @JoinColumn(name = "id3") + private Member member; // 회원과의 관계 - @OneToMany(mappedBy = "post") - private Set images; -} + @OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true) + private List postImages; // 게시물 이미지와의 관계 + + // 기본 생성자 + public Post() {} + + // 모든 필드를 포함하는 생성자 + public Post(String title, String content, Category_1 category, Member member) { + this.title = title; + this.content = content; + this.category = category; + this.member = member; + } + + // Getter 및 Setter 메서드 + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + public void setTitle(String title) { + this.title = title; + } + public String getContent() { + return content; + } + public void setContent(String content) { + this.content = content; + } + + public Category_1 getCategory() { + return category; + } + + public void setCategory(Category_1 category) { + this.category = category; + } + + public Member getMember() { + return member; + } + + public void setMember(Member member) { + this.member = member; + } + + public List getPostImages() { + return postImages; + } + + public void setPostImages(List postImages) { + this.postImages = postImages; + } + + // 편의 메서드 (양방향 관계에서의 데이터 처리 편의성) + public void addPostImage(PostImage postImage) { + postImages.add(postImage); + postImage.setPost(this); + } + + public void removePostImage(PostImage postImage) { + postImages.remove(postImage); + postImage.setPost(null); + } +} diff --git a/potato-field/src/main/java/com/tools/potato_field/post/PostController.java b/potato-field/src/main/java/com/tools/potato_field/post/PostController.java index dd18f56..89661e3 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/PostController.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/PostController.java @@ -1,20 +1,33 @@ package com.tools.potato_field.post; -import org.springframework.beans.factory.annotation.Autowired; +import com.tools.potato_field.member.Member; +import com.tools.potato_field.member.MemberRepository; import org.springframework.web.bind.annotation.*; +import java.util.List; + @RestController @RequestMapping("/posts") public class PostController { - @Autowired - private PostService postService; + private final PostService postService; + private final MemberRepository memberRepository; - @GetMapping("/{id}") - public Post getPost(@PathVariable Long id) { - return postService.findById(id); + public PostController(PostService postService, MemberRepository memberRepository) { + this.postService = postService; + this.memberRepository = memberRepository; } - // 추가적인 엔드포인트 구현 -} + @PostMapping + public Post createPost(@RequestBody PostRequest request) { + Member member = memberRepository.findById(request.getMemberId()) + .orElseThrow(() -> new RuntimeException("Member not found")); + return postService.createPostWithImages( + request.getTitle(), + request.getContent(), + member, + request.getImageUrls() + ); + } +} diff --git a/potato-field/src/main/java/com/tools/potato_field/post/PostRepository.java b/potato-field/src/main/java/com/tools/potato_field/post/PostRepository.java index 5c39f62..2274b21 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/PostRepository.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/PostRepository.java @@ -5,5 +5,4 @@ import java.util.Optional; public interface PostRepository extends JpaRepository { - Optional findByTitle(String title); } diff --git a/potato-field/src/main/java/com/tools/potato_field/post/PostRequest.java b/potato-field/src/main/java/com/tools/potato_field/post/PostRequest.java new file mode 100644 index 0000000..07b478c --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/post/PostRequest.java @@ -0,0 +1,57 @@ +package com.tools.potato_field.post; + +import java.util.List; + +public class PostRequest { + + private String title; + private String content; + private Long memberId; // Member ID로 받기 + private List imageUrls; // 이미지 URL 리스트 + + // 기본 생성자 + public PostRequest() {} + + // 모든 필드를 포함하는 생성자 + public PostRequest(String title, String content, Long memberId, List imageUrls) { + this.title = title; + this.content = content; + this.memberId = memberId; + this.imageUrls = imageUrls; + } + + // Getter 및 Setter 메서드 + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Long getMemberId() { + return memberId; + } + + public void setMemberId(Long memberId) { + this.memberId = memberId; + } + + public List getImageUrls() { + return imageUrls; + } + + public void setImageUrls(List imageUrls) { + this.imageUrls = imageUrls; + } +} + diff --git a/potato-field/src/main/java/com/tools/potato_field/post/PostService.java b/potato-field/src/main/java/com/tools/potato_field/post/PostService.java index 4ca1690..d270811 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/PostService.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/PostService.java @@ -1,28 +1,34 @@ package com.tools.potato_field.post; -import com.tools.potato_field.like.Likes; -import com.tools.potato_field.like.LikesRepository; import com.tools.potato_field.member.Member; -import com.tools.potato_field.member.MemberRepository; +import com.tools.potato_field.postimage.PostImage; +import com.tools.potato_field.postimage.PostImageRepository; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; @Service public class PostService { private final PostRepository postRepository; - private final LikesRepository likeRepository; - private final MemberRepository memberRepository; + private final PostImageRepository postImageRepository; - public PostService(PostRepository postRepository, LikesRepository likeRepository, MemberRepository memberRepository) { + public PostService(PostRepository postRepository, PostImageRepository postImageRepository) { this.postRepository = postRepository; - this.likeRepository = likeRepository; - this.memberRepository = memberRepository; + this.postImageRepository = postImageRepository; } - public Post createPost(String title, String content) { - Post post = new Post(); - post.setTitle(title); - post.setContent(content); - return postRepository.save(post); + @Transactional + public Post createPostWithImages(String title, String content, Member member, List imageUrls) { + Post post = new Post(title, content, null, member); // Category는 null로 임시 설정 + postRepository.save(post); + + for (String imageUrl : imageUrls) { + PostImage postImage = new PostImage(imageUrl, post); + postImageRepository.save(postImage); + } + + return post; } -} \ No newline at end of file +} diff --git a/potato-field/src/main/java/com/tools/potato_field/postimage/PostImage.java b/potato-field/src/main/java/com/tools/potato_field/postimage/PostImage.java index c869849..9231a40 100644 --- a/potato-field/src/main/java/com/tools/potato_field/postimage/PostImage.java +++ b/potato-field/src/main/java/com/tools/potato_field/postimage/PostImage.java @@ -1,16 +1,54 @@ package com.tools.potato_field.postimage; import com.tools.potato_field.post.Post; -import jakarta.persistence.*; +import jakarta.persistence.* +import jakarta.persistence.Id; @Entity public class PostImage { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; + private Long imageId; + + private String imageUrl; @ManyToOne - @JoinColumn(name = "post_id") - private Post post; + @JoinColumn(name = "id") + private Post post; // 게시물과의 관계 + + // 기본 생성자 + public PostImage() {} + + // 모든 필드를 포함하는 생성자 + public PostImage(String imageUrl, Post post) { + this.imageUrl = imageUrl; + this.post = post; + } + + // Getter 및 Setter 메서드 + + public Long getImageId() { + return imageId; + } + + public void setImageId(Long imageId) { + this.imageId = imageId; + } + + public String getImageUrl() { + return imageUrl; + } + + public void setImageUrl(String imageUrl) { + this.imageUrl = imageUrl; + } + + public Post getPost() { + return post; + } + + public void setPost(Post post) { + this.post = post; + } } From 84db68300707bfb77784724191b0e8b9d95735f6 Mon Sep 17 00:00:00 2001 From: jeongminuk Date: Fri, 16 Aug 2024 16:05:50 +0900 Subject: [PATCH 32/45] post renew2 --- .../main/java/com/tools/potato_field/postimage/PostImage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/potato-field/src/main/java/com/tools/potato_field/postimage/PostImage.java b/potato-field/src/main/java/com/tools/potato_field/postimage/PostImage.java index 9231a40..20105c0 100644 --- a/potato-field/src/main/java/com/tools/potato_field/postimage/PostImage.java +++ b/potato-field/src/main/java/com/tools/potato_field/postimage/PostImage.java @@ -1,7 +1,7 @@ package com.tools.potato_field.postimage; import com.tools.potato_field.post.Post; -import jakarta.persistence.* +import jakarta.persistence.*; import jakarta.persistence.Id; @Entity From 896e16bd0ba1281582fdb1023429929622e80731 Mon Sep 17 00:00:00 2001 From: jeongminuk Date: Fri, 16 Aug 2024 16:10:27 +0900 Subject: [PATCH 33/45] =?UTF-8?q?8=EC=9B=9416=EC=9D=BC=20=EB=A7=88?= =?UTF-8?q?=EB=AC=B4=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/tools/potato_field/post/Post.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/potato-field/src/main/java/com/tools/potato_field/post/Post.java b/potato-field/src/main/java/com/tools/potato_field/post/Post.java index 45329a6..8fbb461 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/Post.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/Post.java @@ -28,7 +28,9 @@ public class Post { private List postImages; // 게시물 이미지와의 관계 // 기본 생성자 - public Post() {} + public Post() { + + } // 모든 필드를 포함하는 생성자 public Post(String title, String content, Category_1 category, Member member) { From 0c400f81fe25fbcf31ed2839c6dfe10cd01450b9 Mon Sep 17 00:00:00 2001 From: jeongminuk Date: Fri, 16 Aug 2024 16:48:50 +0900 Subject: [PATCH 34/45] =?UTF-8?q?=EB=A7=88=EB=AC=B4=EB=A6=AC2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/tools/potato_field/post/Post.java | 1 - .../tools/potato_field/post/PostController.java | 17 +++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/potato-field/src/main/java/com/tools/potato_field/post/Post.java b/potato-field/src/main/java/com/tools/potato_field/post/Post.java index 8fbb461..3852772 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/Post.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/Post.java @@ -12,7 +12,6 @@ public class Post { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - private String title; private String content; diff --git a/potato-field/src/main/java/com/tools/potato_field/post/PostController.java b/potato-field/src/main/java/com/tools/potato_field/post/PostController.java index 89661e3..ea90fd0 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/PostController.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/PostController.java @@ -2,12 +2,14 @@ import com.tools.potato_field.member.Member; import com.tools.potato_field.member.MemberRepository; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController -@RequestMapping("/posts") +@RequestMapping("/api/posts") public class PostController { private final PostService postService; @@ -18,16 +20,23 @@ public PostController(PostService postService, MemberRepository memberRepository this.memberRepository = memberRepository; } - @PostMapping - public Post createPost(@RequestBody PostRequest request) { + @PostMapping(consumes = "application/json", produces = "application/json") + public ResponseEntity createPost(@RequestBody PostRequest request) { Member member = memberRepository.findById(request.getMemberId()) .orElseThrow(() -> new RuntimeException("Member not found")); - return postService.createPostWithImages( + Post post = postService.createPostWithImages( request.getTitle(), request.getContent(), member, request.getImageUrls() ); + + return new ResponseEntity<>(post, HttpStatus.CREATED); + } + + @ExceptionHandler(RuntimeException.class) + public ResponseEntity handleRuntimeException(RuntimeException e) { + return new ResponseEntity<>(e.getMessage(), HttpStatus.NOT_FOUND); } } From 38f178c87636bc770b0732b7dc2a503eff98b196 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 19 Aug 2024 16:36:26 +0900 Subject: [PATCH 35/45] revised ver 0819 study --- .../com/tools/potato_field/WebConfig.java | 3 +- .../dto/MemberRegistrationDto.java | 59 +++++++++++++++++++ .../com/tools/potato_field/member/Member.java | 13 ++-- .../potato_field/member/MemberController.java | 10 +++- .../potato_field/member/MemberService.java | 5 +- 5 files changed, 81 insertions(+), 9 deletions(-) create mode 100644 potato-field/src/main/java/com/tools/potato_field/dto/MemberRegistrationDto.java diff --git a/potato-field/src/main/java/com/tools/potato_field/WebConfig.java b/potato-field/src/main/java/com/tools/potato_field/WebConfig.java index bd16347..ed24bfe 100644 --- a/potato-field/src/main/java/com/tools/potato_field/WebConfig.java +++ b/potato-field/src/main/java/com/tools/potato_field/WebConfig.java @@ -10,7 +10,8 @@ public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") - .allowedOrigins("http://localhost:3000") // 프론트엔드 서버 주소 + .allowedOrigins("http://localhost:3000", + "http://172.30.1.78:3000") // 프론트엔드 서버 주소 .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .allowedHeaders("*") .allowCredentials(true) diff --git a/potato-field/src/main/java/com/tools/potato_field/dto/MemberRegistrationDto.java b/potato-field/src/main/java/com/tools/potato_field/dto/MemberRegistrationDto.java new file mode 100644 index 0000000..20f0c9e --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/dto/MemberRegistrationDto.java @@ -0,0 +1,59 @@ +package com.tools.potato_field.dto; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Data +public class MemberRegistrationDto { + private String name; + private String email; + private String userID; + private String password; + private String number; + + +} + // getters and setters + + /*public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getUserID() { + return userID; + } + + public void setUserID(String userID) { + this.userID = userID; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getNumber() { + return number; + } + + public void setNumber(String number) { + this.number = number; + } +}*/ \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/member/Member.java b/potato-field/src/main/java/com/tools/potato_field/member/Member.java index 158eb98..432a1de 100644 --- a/potato-field/src/main/java/com/tools/potato_field/member/Member.java +++ b/potato-field/src/main/java/com/tools/potato_field/member/Member.java @@ -17,7 +17,7 @@ public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; + private Long id; @Column(nullable = false, unique = true) private String email; @@ -29,15 +29,20 @@ public class Member { private String userID; - @Column(name = "phone_number") + @Column(name = "number") private String number; @Column(nullable = false) private String name; - @Column(nullable = false) - private String address; + public String getUserID() { + return userID; + } + + public void setUserID(String userID) { + this.userID = userID; + } // 추가적인 필드들 (예: 생년월일, 전화번호 등) } \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/member/MemberController.java b/potato-field/src/main/java/com/tools/potato_field/member/MemberController.java index a3a28ca..0c9eb87 100644 --- a/potato-field/src/main/java/com/tools/potato_field/member/MemberController.java +++ b/potato-field/src/main/java/com/tools/potato_field/member/MemberController.java @@ -7,6 +7,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.security.core.Authentication; import org.springframework.web.bind.annotation.*; +import com.tools.potato_field.dto.MemberRegistrationDto; import java.util.List; @@ -24,7 +25,14 @@ public MemberController(MemberService memberService, JwtUtil jwtUtil) { } @PostMapping("/register") - public ResponseEntity registerMember(@RequestBody Member member) { + public ResponseEntity registerMember(@RequestBody MemberRegistrationDto registrationDto) { + Member member = new Member(); + member.setName(registrationDto.getName()); + member.setEmail(registrationDto.getEmail()); + member.setUserID(registrationDto.getUserID()); + member.setPassword(registrationDto.getPassword()); + member.setNumber(registrationDto.getNumber()); + return ResponseEntity.ok(memberService.registerMember(member)); } diff --git a/potato-field/src/main/java/com/tools/potato_field/member/MemberService.java b/potato-field/src/main/java/com/tools/potato_field/member/MemberService.java index a6e3698..f5ed207 100644 --- a/potato-field/src/main/java/com/tools/potato_field/member/MemberService.java +++ b/potato-field/src/main/java/com/tools/potato_field/member/MemberService.java @@ -24,9 +24,8 @@ public Member findByUserID(String username) { } public Member registerMember(Member member) { - if (memberRepository.findByUserID - (member.getUserID()).isPresent()) { - throw new RuntimeException("Username already exists"); + if (memberRepository.findByUserID(member.getUserID()).isPresent()) { + throw new RuntimeException("User ID already exists"); } if (memberRepository.findByEmail(member.getEmail()).isPresent()) { throw new RuntimeException("Email already exists"); From a929bd18514e9519abfbf06809e776324bc87433 Mon Sep 17 00:00:00 2001 From: hwi-hwi-hwi <164748897+hwi-hwi-hwi@users.noreply.github.com> Date: Mon, 19 Aug 2024 17:08:55 +0900 Subject: [PATCH 36/45] edit_08_19_Mon --- .../main/java/com/tools/potato_field/SecurityConfig.java | 2 +- .../src/main/java/com/tools/potato_field/item/Item.java | 6 +++++- .../java/com/tools/potato_field/item/ItemController.java | 4 ---- .../java/com/tools/potato_field/item/ItemRepository.java | 4 +++- .../main/java/com/tools/potato_field/item/ItemService.java | 5 +++++ .../src/main/java/com/tools/potato_field/member/Member.java | 2 +- .../com/tools/potato_field/member/MemberController.java | 4 +--- 7 files changed, 16 insertions(+), 11 deletions(-) diff --git a/potato-field/src/main/java/com/tools/potato_field/SecurityConfig.java b/potato-field/src/main/java/com/tools/potato_field/SecurityConfig.java index 4b11da9..b883e7b 100644 --- a/potato-field/src/main/java/com/tools/potato_field/SecurityConfig.java +++ b/potato-field/src/main/java/com/tools/potato_field/SecurityConfig.java @@ -31,7 +31,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .csrf(csrf -> csrf.disable()) .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authorizeHttpRequests(authz -> authz - .requestMatchers("/api/members/register", "/api/members/login").permitAll() + .requestMatchers("/api/members/register", "/api/members/login", "/api/**").permitAll() .requestMatchers("/h2-console/**").permitAll() .anyRequest().authenticated() ) diff --git a/potato-field/src/main/java/com/tools/potato_field/item/Item.java b/potato-field/src/main/java/com/tools/potato_field/item/Item.java index 190e251..3552b27 100644 --- a/potato-field/src/main/java/com/tools/potato_field/item/Item.java +++ b/potato-field/src/main/java/com/tools/potato_field/item/Item.java @@ -2,6 +2,7 @@ import com.tools.potato_field.member.Member; +import com.tools.potato_field.post.Post; import jakarta.persistence.*; import lombok.Data; @@ -15,11 +16,14 @@ public class Item { private String itemName; private String itemURL; private Integer iconNumber; - private Long id2; @ManyToOne @JoinColumn(name = "member_id") private Member member; + @ManyToOne + @JoinColumn(name = "post_id") + private Post post; + // Getters and Setters } \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/item/ItemController.java b/potato-field/src/main/java/com/tools/potato_field/item/ItemController.java index 8271022..278b41e 100644 --- a/potato-field/src/main/java/com/tools/potato_field/item/ItemController.java +++ b/potato-field/src/main/java/com/tools/potato_field/item/ItemController.java @@ -54,10 +54,6 @@ public ResponseEntity updateItem(@PathVariable Long id, @RequestBody Item item.setIconNumber(itemDetails.getIconNumber()); } - if (itemDetails.getId2() != null) { - item.setId2(itemDetails.getId2()); - } - if (itemDetails.getMember() != null) { item.setMember(itemDetails.getMember()); } diff --git a/potato-field/src/main/java/com/tools/potato_field/item/ItemRepository.java b/potato-field/src/main/java/com/tools/potato_field/item/ItemRepository.java index 4b45d7a..7ac56b4 100644 --- a/potato-field/src/main/java/com/tools/potato_field/item/ItemRepository.java +++ b/potato-field/src/main/java/com/tools/potato_field/item/ItemRepository.java @@ -1,7 +1,9 @@ package com.tools.potato_field.item; -import com.tools.potato_field.item.Item; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + public interface ItemRepository extends JpaRepository { + List findByPostId(Long postId); } diff --git a/potato-field/src/main/java/com/tools/potato_field/item/ItemService.java b/potato-field/src/main/java/com/tools/potato_field/item/ItemService.java index 1cb55f7..b40c042 100644 --- a/potato-field/src/main/java/com/tools/potato_field/item/ItemService.java +++ b/potato-field/src/main/java/com/tools/potato_field/item/ItemService.java @@ -1,5 +1,6 @@ package com.tools.potato_field.item; +import com.tools.potato_field.post.Post; import jakarta.transaction.Transactional; import org.springframework.stereotype.Service; @@ -29,4 +30,8 @@ public List findAllItems() { public void deleteItem(Long id) { itemRepository.deleteById(id); } + + public List findItemsBydPostId(Long postId) { + return itemRepository.findByPostId(postId); + } } \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/member/Member.java b/potato-field/src/main/java/com/tools/potato_field/member/Member.java index 158eb98..8e0c32e 100644 --- a/potato-field/src/main/java/com/tools/potato_field/member/Member.java +++ b/potato-field/src/main/java/com/tools/potato_field/member/Member.java @@ -29,7 +29,7 @@ public class Member { private String userID; - @Column(name = "phone_number") + @Column(name = "phoneNumber") private String number; diff --git a/potato-field/src/main/java/com/tools/potato_field/member/MemberController.java b/potato-field/src/main/java/com/tools/potato_field/member/MemberController.java index a3a28ca..c5af7cd 100644 --- a/potato-field/src/main/java/com/tools/potato_field/member/MemberController.java +++ b/potato-field/src/main/java/com/tools/potato_field/member/MemberController.java @@ -44,9 +44,7 @@ public ResponseEntity logoutMember() { @GetMapping("/me") public ResponseEntity getCurrentMember(Authentication authentication) { String username = authentication.getName(); - Member member = memberService.findByUserID - -(username); + Member member = memberService.findByUserID(username); return ResponseEntity.ok(member); } From 17d65c9682562bad74b0bccf528dd635035fe307 Mon Sep 17 00:00:00 2001 From: jeongminuk Date: Thu, 22 Aug 2024 17:22:35 +0900 Subject: [PATCH 37/45] 8/22 2nd --- .../ResourceNotFoundException.java | 15 +++++ .../potato_field/post/PostController.java | 56 +++++++++------- .../com/tools/potato_field/post/PostDto.java | 51 +++++++++++++++ .../tools/potato_field/post/PostRequest.java | 57 ---------------- .../tools/potato_field/post/PostService.java | 65 ++++++++++++++----- .../postimage/PostImageController.java | 40 ++++++++++++ .../postimage/PostImageService.java | 4 ++ 7 files changed, 191 insertions(+), 97 deletions(-) create mode 100644 potato-field/src/main/java/com/tools/potato_field/ResourceNotFoundException.java create mode 100644 potato-field/src/main/java/com/tools/potato_field/post/PostDto.java delete mode 100644 potato-field/src/main/java/com/tools/potato_field/post/PostRequest.java create mode 100644 potato-field/src/main/java/com/tools/potato_field/postimage/PostImageController.java create mode 100644 potato-field/src/main/java/com/tools/potato_field/postimage/PostImageService.java diff --git a/potato-field/src/main/java/com/tools/potato_field/ResourceNotFoundException.java b/potato-field/src/main/java/com/tools/potato_field/ResourceNotFoundException.java new file mode 100644 index 0000000..3f9514d --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/ResourceNotFoundException.java @@ -0,0 +1,15 @@ +package com.tools.potato_field; + +public class ResourceNotFoundException extends RuntimeException { + public ResourceNotFoundException() { + super(); + } + + public ResourceNotFoundException(String message) { + super(message); + } + + public ResourceNotFoundException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/potato-field/src/main/java/com/tools/potato_field/post/PostController.java b/potato-field/src/main/java/com/tools/potato_field/post/PostController.java index ea90fd0..1eade74 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/PostController.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/PostController.java @@ -1,9 +1,7 @@ package com.tools.potato_field.post; -import com.tools.potato_field.member.Member; -import com.tools.potato_field.member.MemberRepository; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; +import com.tools.potato_field.ResourceNotFoundException; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -12,31 +10,43 @@ @RequestMapping("/api/posts") public class PostController { - private final PostService postService; - private final MemberRepository memberRepository; + @Autowired + private PostRepository postRepository; - public PostController(PostService postService, MemberRepository memberRepository) { - this.postService = postService; - this.memberRepository = memberRepository; + @GetMapping + public List getAllPosts() { + return postRepository.findAll(); } - @PostMapping(consumes = "application/json", produces = "application/json") - public ResponseEntity createPost(@RequestBody PostRequest request) { - Member member = memberRepository.findById(request.getMemberId()) - .orElseThrow(() -> new RuntimeException("Member not found")); + @GetMapping("/{id}") + public Post getPostById(@PathVariable Long id) { + return postRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException("Post not found with id " + id)); + } + + @PostMapping + public Post createPost(@RequestBody Post post) { + return postRepository.save(post); + } - Post post = postService.createPostWithImages( - request.getTitle(), - request.getContent(), - member, - request.getImageUrls() - ); + @PutMapping("/{id}") + public Post updatePost(@PathVariable Long id, @RequestBody Post postDetails) { + Post post = postRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException("Post not found with id " + id)); - return new ResponseEntity<>(post, HttpStatus.CREATED); + post.setTitle(postDetails.getTitle()); + post.setContent(postDetails.getContent()); + post.setMember(postDetails.getMember()); + + return postRepository.save(post); } - @ExceptionHandler(RuntimeException.class) - public ResponseEntity handleRuntimeException(RuntimeException e) { - return new ResponseEntity<>(e.getMessage(), HttpStatus.NOT_FOUND); + @DeleteMapping("/{id}") + public void deletePost(@PathVariable Long id) { + Post post = postRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException("Post not found with id " + id)); + + postRepository.delete(post); } } + diff --git a/potato-field/src/main/java/com/tools/potato_field/post/PostDto.java b/potato-field/src/main/java/com/tools/potato_field/post/PostDto.java new file mode 100644 index 0000000..2274e32 --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/post/PostDto.java @@ -0,0 +1,51 @@ +package com.tools.potato_field.post; + +public class PostDto { + private Long id; + private String title; + private String content; + private String member; + + // 기본 생성자 + public PostDto() {} + + // 매개변수를 받는 생성자 + public PostDto(Long id, String title, String content, String author) { + this.id = id; + this.title = title; + this.content = content; + this.member = member; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getMember() { + return member; + } + + public void setAuthor(String member) { + this.member= member; + } +} diff --git a/potato-field/src/main/java/com/tools/potato_field/post/PostRequest.java b/potato-field/src/main/java/com/tools/potato_field/post/PostRequest.java deleted file mode 100644 index 07b478c..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/post/PostRequest.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.tools.potato_field.post; - -import java.util.List; - -public class PostRequest { - - private String title; - private String content; - private Long memberId; // Member ID로 받기 - private List imageUrls; // 이미지 URL 리스트 - - // 기본 생성자 - public PostRequest() {} - - // 모든 필드를 포함하는 생성자 - public PostRequest(String title, String content, Long memberId, List imageUrls) { - this.title = title; - this.content = content; - this.memberId = memberId; - this.imageUrls = imageUrls; - } - - // Getter 및 Setter 메서드 - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } - - public Long getMemberId() { - return memberId; - } - - public void setMemberId(Long memberId) { - this.memberId = memberId; - } - - public List getImageUrls() { - return imageUrls; - } - - public void setImageUrls(List imageUrls) { - this.imageUrls = imageUrls; - } -} - diff --git a/potato-field/src/main/java/com/tools/potato_field/post/PostService.java b/potato-field/src/main/java/com/tools/potato_field/post/PostService.java index d270811..e89ced1 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/PostService.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/PostService.java @@ -1,34 +1,65 @@ package com.tools.potato_field.post; -import com.tools.potato_field.member.Member; -import com.tools.potato_field.postimage.PostImage; -import com.tools.potato_field.postimage.PostImageRepository; +import com.tools.potato_field.ResourceNotFoundException; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.stream.Collectors; @Service public class PostService { - private final PostRepository postRepository; - private final PostImageRepository postImageRepository; + @Autowired + private PostRepository postRepository; - public PostService(PostRepository postRepository, PostImageRepository postImageRepository) { - this.postRepository = postRepository; - this.postImageRepository = postImageRepository; + public List getAllPosts() { + return postRepository.findAll().stream() + .map(this::convertToDto) + .collect(Collectors.toList()); } - @Transactional - public Post createPostWithImages(String title, String content, Member member, List imageUrls) { - Post post = new Post(title, content, null, member); // Category는 null로 임시 설정 - postRepository.save(post); + public PostDto getPostById(Long id) { + Post post = postRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException("Post not found with id " + id)); + return convertToDto(post); + } + + public PostDto createPost(PostDto postDto) { + Post post = convertToEntity(postDto); + Post savedPost = postRepository.save(post); + return convertToDto(savedPost); + } + + public PostDto updatePost(Long id, PostDto postDto) { + Post post = postRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException("Post not found with id " + id)); + + post.setTitle(postDto.getTitle()); + post.setContent(postDto.getContent()); + post.setMember(postDto.getMember()); - for (String imageUrl : imageUrls) { - PostImage postImage = new PostImage(imageUrl, post); - postImageRepository.save(postImage); - } + Post updatedPost = postRepository.save(post); + return convertToDto(updatedPost); + } + + public void deletePost(Long id) { + Post post = postRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException("Post not found with id " + id)); + postRepository.delete(post); + } + + // Entity를 DTO로 변환하는 메서드 + private PostDto convertToDto(Post post) { + return new PostDto(post.getId(), post.getTitle(), post.getContent(), post.getMember()); + } + // DTO를 Entity로 변환하는 메서드 + private Post convertToEntity(PostDto postDto) { + Post post = new Post(); + post.setTitle(postDto.getTitle()); + post.setContent(postDto.getContent()); + post.setMember(postDto.getMember()); return post; } } diff --git a/potato-field/src/main/java/com/tools/potato_field/postimage/PostImageController.java b/potato-field/src/main/java/com/tools/potato_field/postimage/PostImageController.java new file mode 100644 index 0000000..116ca9b --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/postimage/PostImageController.java @@ -0,0 +1,40 @@ +package com.tools.potato_field.postimage; + +import com.tools.potato_field.ResourceNotFoundException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/post-images") +public class PostImageController { + + @Autowired + private PostImageRepository postImageRepository; + + @GetMapping + public List getAllPostImages() { + return postImageRepository.findAll(); + } + + @GetMapping("/{id}") + public PostImage getPostImageById(@PathVariable Long id) { + return postImageRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException("PostImage not found with id " + id)); + } + + @PostMapping + public PostImage createPostImage(@RequestBody PostImage postImage) { + return postImageRepository.save(postImage); + } + + @DeleteMapping("/{id}") + public void deletePostImage(@PathVariable Long id) { + PostImage postImage = postImageRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException("PostImage not found with id " + id)); + + postImageRepository.delete(postImage); + } +} + diff --git a/potato-field/src/main/java/com/tools/potato_field/postimage/PostImageService.java b/potato-field/src/main/java/com/tools/potato_field/postimage/PostImageService.java new file mode 100644 index 0000000..c87d3de --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/postimage/PostImageService.java @@ -0,0 +1,4 @@ +package com.tools.potato_field.postimage; + +public class PostImageService { +} From d6c50b2e041304db442e7ebee5f629904945e398 Mon Sep 17 00:00:00 2001 From: hwi-hwi-hwi <164748897+hwi-hwi-hwi@users.noreply.github.com> Date: Fri, 23 Aug 2024 03:23:23 +0900 Subject: [PATCH 38/45] item-edit --- .../exception/ItemNotFoundException.java | 7 ++++ .../com/tools/potato_field/item/Item.java | 13 ++++-- .../potato_field/item/ItemController.java | 42 ++++++++----------- .../potato_field/item/ItemRepository.java | 5 ++- .../tools/potato_field/item/ItemService.java | 21 +++++++--- .../com/tools/potato_field/member/Member.java | 10 ++--- 6 files changed, 58 insertions(+), 40 deletions(-) create mode 100644 potato-field/src/main/java/com/tools/potato_field/exception/ItemNotFoundException.java diff --git a/potato-field/src/main/java/com/tools/potato_field/exception/ItemNotFoundException.java b/potato-field/src/main/java/com/tools/potato_field/exception/ItemNotFoundException.java new file mode 100644 index 0000000..adf51fd --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/exception/ItemNotFoundException.java @@ -0,0 +1,7 @@ +package com.tools.potato_field.exception; + +public class ItemNotFoundException extends RuntimeException { + public ItemNotFoundException(String message) { + super(message); + } +} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/item/Item.java b/potato-field/src/main/java/com/tools/potato_field/item/Item.java index 3552b27..b8815c1 100644 --- a/potato-field/src/main/java/com/tools/potato_field/item/Item.java +++ b/potato-field/src/main/java/com/tools/potato_field/item/Item.java @@ -1,10 +1,10 @@ package com.tools.potato_field.item; import com.tools.potato_field.member.Member; - import com.tools.potato_field.post.Post; import jakarta.persistence.*; - +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.Data; @Entity @@ -13,16 +13,21 @@ public class Item { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + + @NotBlank(message = "Item name cannot be blank") private String itemName; + + @NotBlank(message = "Item URL cannot be blank") private String itemURL; + private Integer iconNumber; @ManyToOne - @JoinColumn(name = "member_id") + @JoinColumn(name = "member_id", nullable = false) private Member member; @ManyToOne - @JoinColumn(name = "post_id") + @JoinColumn(name = "post_id", nullable = false) private Post post; // Getters and Setters diff --git a/potato-field/src/main/java/com/tools/potato_field/item/ItemController.java b/potato-field/src/main/java/com/tools/potato_field/item/ItemController.java index 278b41e..6c7f711 100644 --- a/potato-field/src/main/java/com/tools/potato_field/item/ItemController.java +++ b/potato-field/src/main/java/com/tools/potato_field/item/ItemController.java @@ -1,71 +1,65 @@ package com.tools.potato_field.item; -import com.tools.potato_field.member.Member; +import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.Optional; +import com.tools.potato_field.member.Member; @RestController @RequestMapping("/api/items") public class ItemController { @Autowired - private ItemRepository itemRepository; + private ItemService itemService; // Create @PostMapping - public ResponseEntity createItem(@RequestBody Item item) { - Item savedItem = itemRepository.save(item); + public ResponseEntity createItem(@Valid @RequestBody Item item, @AuthenticationPrincipal Member member) { + item.setMember(member); // 현재 로그인한 멤버를 아이템의 소유자로 설정 + Item savedItem = itemService.addItem(item); return ResponseEntity.ok(savedItem); } // Read @GetMapping("/{id}") public ResponseEntity getItem(@PathVariable Long id) { - Optional item = itemRepository.findById(id); - return item.map(ResponseEntity::ok) - .orElseGet(() -> ResponseEntity.notFound().build()); + Item item = itemService.findItem(id); + return ResponseEntity.ok(item); } - // Read All + // Read All with Pagination @GetMapping - public ResponseEntity> getAllItems() { - List items = itemRepository.findAll(); + public ResponseEntity> getAllItems(Pageable pageable) { + Page items = itemService.findAllItems(pageable); return ResponseEntity.ok(items); } // Update @PutMapping("/{id}") - public ResponseEntity updateItem(@PathVariable Long id, @RequestBody Item itemDetails) { - Item item = itemRepository.findById(id).orElseThrow(() -> new RuntimeException("Item not found")); + public ResponseEntity updateItem(@PathVariable Long id, @Valid @RequestBody Item itemDetails) { + Item item = itemService.findItem(id); if (itemDetails.getItemName() != null) { item.setItemName(itemDetails.getItemName()); } - if (itemDetails.getItemURL() != null) { item.setItemURL(itemDetails.getItemURL()); } - if (itemDetails.getIconNumber() != null) { item.setIconNumber(itemDetails.getIconNumber()); } - - if (itemDetails.getMember() != null) { - item.setMember(itemDetails.getMember()); - } - - Item updatedItem = itemRepository.save(item); + Item updatedItem = itemService.addItem(item); return ResponseEntity.ok(updatedItem); } // Delete @DeleteMapping("/{id}") public ResponseEntity deleteItem(@PathVariable Long id) { - itemRepository.deleteById(id); + itemService.deleteItem(id); return ResponseEntity.noContent().build(); } } diff --git a/potato-field/src/main/java/com/tools/potato_field/item/ItemRepository.java b/potato-field/src/main/java/com/tools/potato_field/item/ItemRepository.java index 7ac56b4..f6e5bc6 100644 --- a/potato-field/src/main/java/com/tools/potato_field/item/ItemRepository.java +++ b/potato-field/src/main/java/com/tools/potato_field/item/ItemRepository.java @@ -1,9 +1,12 @@ package com.tools.potato_field.item; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; - import java.util.List; public interface ItemRepository extends JpaRepository { List findByPostId(Long postId); + + Page findAll(Pageable pageable); // 페이징 처리 } diff --git a/potato-field/src/main/java/com/tools/potato_field/item/ItemService.java b/potato-field/src/main/java/com/tools/potato_field/item/ItemService.java index b40c042..cb3e2d6 100644 --- a/potato-field/src/main/java/com/tools/potato_field/item/ItemService.java +++ b/potato-field/src/main/java/com/tools/potato_field/item/ItemService.java @@ -1,9 +1,10 @@ package com.tools.potato_field.item; -import com.tools.potato_field.post.Post; -import jakarta.transaction.Transactional; +import com.tools.potato_field.exception.ItemNotFoundException; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; - +import jakarta.transaction.Transactional; import java.util.List; @Service @@ -20,18 +21,26 @@ public Item addItem(Item item) { } public Item findItem(Long id) { - return itemRepository.findById(id).orElseThrow(() -> new RuntimeException("Item not found")); + return itemRepository.findById(id) + .orElseThrow(() -> new ItemNotFoundException("Item not found with id: " + id)); } public List findAllItems() { return itemRepository.findAll(); } + public Page findAllItems(Pageable pageable) { // 페이징 처리 + return itemRepository.findAll(pageable); + } + public void deleteItem(Long id) { + if (!itemRepository.existsById(id)) { + throw new ItemNotFoundException("Item not found with id: " + id); + } itemRepository.deleteById(id); } - public List findItemsBydPostId(Long postId) { + public List findItemsByPostId(Long postId) { return itemRepository.findByPostId(postId); } -} \ No newline at end of file +} diff --git a/potato-field/src/main/java/com/tools/potato_field/member/Member.java b/potato-field/src/main/java/com/tools/potato_field/member/Member.java index f34f4bf..50dbdc1 100644 --- a/potato-field/src/main/java/com/tools/potato_field/member/Member.java +++ b/potato-field/src/main/java/com/tools/potato_field/member/Member.java @@ -29,11 +29,11 @@ public class Member { private String userID; -<<<<<<< HEAD - @Column(name = "phoneNumber") -======= - @Column(name = "number") ->>>>>>> 913897a1cb54f39bbed74d77e545982945bfd320 +//<<<<<<< HEAD +// @Column(name = "phoneNumber") +//======= +// @Column(name = "number") +//>>>>>>> 913897a1cb54f39bbed74d77e545982945bfd320 private String number; From a6d02a6f3499a267d161d1052c190a4bc71d1ef3 Mon Sep 17 00:00:00 2001 From: jeongminuk Date: Fri, 23 Aug 2024 15:03:00 +0900 Subject: [PATCH 39/45] check_1 --- .../com/tools/potato_field/member/Member.java | 5 -- .../com/tools/potato_field/post/Post.java | 49 +++-------- .../potato_field/post/PostController.java | 57 ++++++------ .../com/tools/potato_field/post/PostDto.java | 34 +++++--- .../tools/potato_field/post/PostService.java | 87 ++++++++++++------- 5 files changed, 123 insertions(+), 109 deletions(-) diff --git a/potato-field/src/main/java/com/tools/potato_field/member/Member.java b/potato-field/src/main/java/com/tools/potato_field/member/Member.java index f34f4bf..066eabc 100644 --- a/potato-field/src/main/java/com/tools/potato_field/member/Member.java +++ b/potato-field/src/main/java/com/tools/potato_field/member/Member.java @@ -28,12 +28,7 @@ public class Member { @Column(nullable = false, unique = true) private String userID; - -<<<<<<< HEAD @Column(name = "phoneNumber") -======= - @Column(name = "number") ->>>>>>> 913897a1cb54f39bbed74d77e545982945bfd320 private String number; diff --git a/potato-field/src/main/java/com/tools/potato_field/post/Post.java b/potato-field/src/main/java/com/tools/potato_field/post/Post.java index 3852772..c316ebb 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/Post.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/Post.java @@ -12,35 +12,31 @@ public class Post { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + private String title; private String content; @ManyToOne - @JoinColumn(name = "id2") - private Category_1 category; // 성별 카테고리와의 관계 + @JoinColumn(name = "member_id", nullable = false) + private Member member; @ManyToOne - @JoinColumn(name = "id3") - private Member member; // 회원과의 관계 - - @OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true) - private List postImages; // 게시물 이미지와의 관계 + @JoinColumn(name = "category_id", nullable = false) + private Category_1 category; // 기본 생성자 public Post() { - } - // 모든 필드를 포함하는 생성자 - public Post(String title, String content, Category_1 category, Member member) { + // 모든 필드를 받는 생성자 + public Post(String title, String content, Member member, Category_1 category) { this.title = title; this.content = content; - this.category = category; this.member = member; + this.category = category; } - // Getter 및 Setter 메서드 - + // Getters and Setters public Long getId() { return id; } @@ -65,14 +61,6 @@ public void setContent(String content) { this.content = content; } - public Category_1 getCategory() { - return category; - } - - public void setCategory(Category_1 category) { - this.category = category; - } - public Member getMember() { return member; } @@ -81,22 +69,11 @@ public void setMember(Member member) { this.member = member; } - public List getPostImages() { - return postImages; - } - - public void setPostImages(List postImages) { - this.postImages = postImages; - } - - // 편의 메서드 (양방향 관계에서의 데이터 처리 편의성) - public void addPostImage(PostImage postImage) { - postImages.add(postImage); - postImage.setPost(this); + public Category_1 getCategory() { + return category; } - public void removePostImage(PostImage postImage) { - postImages.remove(postImage); - postImage.setPost(null); + public void setCategory(Category_1 category) { + this.category = category; } } diff --git a/potato-field/src/main/java/com/tools/potato_field/post/PostController.java b/potato-field/src/main/java/com/tools/potato_field/post/PostController.java index 1eade74..4431311 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/PostController.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/PostController.java @@ -1,7 +1,8 @@ package com.tools.potato_field.post; import com.tools.potato_field.ResourceNotFoundException; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -10,43 +11,47 @@ @RequestMapping("/api/posts") public class PostController { - @Autowired - private PostRepository postRepository; + private final PostService postService; - @GetMapping - public List getAllPosts() { - return postRepository.findAll(); + // 생성자 주입 방식으로 PostService를 주입합니다. + public PostController(PostService postService) { + this.postService = postService; } + // 1. 포스트 생성 API (POST 요청) + @PostMapping + public ResponseEntity createPost(@RequestBody PostDto postDto) { + PostDto createdPost = postService.createPost(postDto); + return new ResponseEntity<>(createdPost, HttpStatus.CREATED); + } + + // 2. 포스트 조회 API (GET 요청) - 특정 ID로 조회 @GetMapping("/{id}") - public Post getPostById(@PathVariable Long id) { - return postRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException("Post not found with id " + id)); + public ResponseEntity getPostById(@PathVariable Long id) { + PostDto postDto = postService.getPostById(id) + .orElseThrow(() -> new ResourceNotFoundException("Post not found with id: " + id)); + return new ResponseEntity<>(postDto, HttpStatus.OK); } - @PostMapping - public Post createPost(@RequestBody Post post) { - return postRepository.save(post); + // 3. 포스트 목록 조회 API (GET 요청) - 전체 조회 + @GetMapping + public ResponseEntity> getAllPosts() { + List posts = postService.getAllPosts(); + return new ResponseEntity<>(posts, HttpStatus.OK); } + // 4. 포스트 수정 API (PUT 요청) @PutMapping("/{id}") - public Post updatePost(@PathVariable Long id, @RequestBody Post postDetails) { - Post post = postRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException("Post not found with id " + id)); - - post.setTitle(postDetails.getTitle()); - post.setContent(postDetails.getContent()); - post.setMember(postDetails.getMember()); - - return postRepository.save(post); + public ResponseEntity updatePost(@PathVariable Long id, @RequestBody PostDto postDto) { + PostDto updatedPost = postService.updatePost(id, postDto); + return new ResponseEntity<>(updatedPost, HttpStatus.OK); } + // 5. 포스트 삭제 API (DELETE 요청) @DeleteMapping("/{id}") - public void deletePost(@PathVariable Long id) { - Post post = postRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException("Post not found with id " + id)); - - postRepository.delete(post); + public ResponseEntity deletePost(@PathVariable Long id) { + postService.deletePost(id); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); } } diff --git a/potato-field/src/main/java/com/tools/potato_field/post/PostDto.java b/potato-field/src/main/java/com/tools/potato_field/post/PostDto.java index 2274e32..24e48b7 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/PostDto.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/PostDto.java @@ -4,19 +4,23 @@ public class PostDto { private Long id; private String title; private String content; - private String member; + private Long memberId; + private Long categoryId; - // 기본 생성자 - public PostDto() {} + // 기본 생성자 (No-Args Constructor) + public PostDto() { + } - // 매개변수를 받는 생성자 - public PostDto(Long id, String title, String content, String author) { + // 모든 필드를 받는 생성자 (All-Args Constructor) + public PostDto(Long id, String title, String content, Long memberId, Long categoryId) { this.id = id; this.title = title; this.content = content; - this.member = member; + this.memberId = memberId; + this.categoryId = categoryId; } + // Getters and Setters public Long getId() { return id; } @@ -41,11 +45,19 @@ public void setContent(String content) { this.content = content; } - public String getMember() { - return member; + public Long getMemberId() { + return memberId; + } + + public void setMemberId(Long memberId) { + this.memberId = memberId; + } + + public Long getCategoryId() { + return categoryId; } - public void setAuthor(String member) { - this.member= member; + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; } -} +} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/post/PostService.java b/potato-field/src/main/java/com/tools/potato_field/post/PostService.java index e89ced1..252b269 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/PostService.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/PostService.java @@ -1,65 +1,90 @@ package com.tools.potato_field.post; -import com.tools.potato_field.ResourceNotFoundException; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; - import java.util.List; +import java.util.Optional; +import com.tools.potato_field.ResourceNotFoundException; import java.util.stream.Collectors; @Service public class PostService { - @Autowired - private PostRepository postRepository; + private final PostRepository postRepository; - public List getAllPosts() { - return postRepository.findAll().stream() - .map(this::convertToDto) - .collect(Collectors.toList()); + public PostService(PostRepository postRepository) { + this.postRepository = postRepository; } - public PostDto getPostById(Long id) { + // 1. Post 생성 + public PostDto createPost(PostDto postDto) { + // PostDto를 Post 엔티티로 변환 + Post post = mapToEntity(postDto); + // Post 엔티티를 저장 + Post savedPost = postRepository.save(post); + // 저장된 Post 엔티티를 다시 PostDto로 변환하여 반환 + return mapToDto(savedPost); + } + + // 2. 특정 ID로 Post 조회 + public Optional getPostById(Long id) { + // ID로 Post 엔티티 조회 Post post = postRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException("Post not found with id " + id)); - return convertToDto(post); + .orElseThrow(() -> new ResourceNotFoundException("Post not found with id: " + id)); + // 조회된 Post 엔티티를 PostDto로 변환하여 반환 + return Optional.of(mapToDto(post)); } - public PostDto createPost(PostDto postDto) { - Post post = convertToEntity(postDto); - Post savedPost = postRepository.save(post); - return convertToDto(savedPost); + // 3. 모든 Post 조회 + public List getAllPosts() { + // 모든 Post 엔티티 조회 + List posts = postRepository.findAll(); + // 조회된 모든 Post 엔티티를 PostDto 리스트로 변환하여 반환 + return posts.stream().map(this::mapToDto).collect(Collectors.toList()); } + // 4. Post 수정 public PostDto updatePost(Long id, PostDto postDto) { + // ID로 Post 엔티티 조회 Post post = postRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException("Post not found with id " + id)); - + .orElseThrow(() -> new ResourceNotFoundException("Post not found with id: " + id)); + // Post 엔티티 업데이트 post.setTitle(postDto.getTitle()); post.setContent(postDto.getContent()); - post.setMember(postDto.getMember()); - + post.setMember(postDto.getMemberId()); + post.setCategory(postDto.getCategoryId()); + // 업데이트된 Post 엔티티 저장 Post updatedPost = postRepository.save(post); - return convertToDto(updatedPost); + // 저장된 Post 엔티티를 다시 PostDto로 변환하여 반환 + return mapToDto(updatedPost); } + // 5. Post 삭제 public void deletePost(Long id) { + // ID로 Post 엔티티 조회 Post post = postRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException("Post not found with id " + id)); + .orElseThrow(() -> new ResourceNotFoundException("Post not found with id: " + id)); + // Post 엔티티 삭제 postRepository.delete(post); } - // Entity를 DTO로 변환하는 메서드 - private PostDto convertToDto(Post post) { - return new PostDto(post.getId(), post.getTitle(), post.getContent(), post.getMember()); - } - - // DTO를 Entity로 변환하는 메서드 - private Post convertToEntity(PostDto postDto) { + // PostDto를 Post 엔티티로 변환하는 헬퍼 메서드 + private Post mapToEntity(PostDto postDto) { Post post = new Post(); post.setTitle(postDto.getTitle()); post.setContent(postDto.getContent()); - post.setMember(postDto.getMember()); + post.setMember(postDto.getMemberId()); + post.setCategory(postDto.getCategoryId()); return post; } -} + + // Post 엔티티를 PostDto로 변환하는 헬퍼 메서드 + private PostDto mapToDto(Post post) { + PostDto postDto = new PostDto(); + postDto.setId(post.getId()); + postDto.setTitle(post.getTitle()); + postDto.setContent(post.getContent()); + postDto.setMemberId(post.getMember()); + postDto.setCategoryId(post.getCategory()); + return postDto; + } +} \ No newline at end of file From 4987b98fc8057f0a41032c07796e0aa2c5db5514 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 25 Aug 2024 21:05:43 +0900 Subject: [PATCH 40/45] 0825 revised ver --- .../com/tools/potato_field/WebConfig.java | 2 +- .../potato_field/dto/AccountInfoDto.java | 11 +++++ .../tools/potato_field/dto/ProfileDto.java | 16 ++++++ .../com/tools/potato_field/member/Member.java | 21 ++++---- .../potato_field/member/MemberService.java | 49 +++++++++++++++++++ .../potato_field/post/PostRepository.java | 5 ++ .../tools/potato_field/post/PostService.java | 10 +++- 7 files changed, 101 insertions(+), 13 deletions(-) create mode 100644 potato-field/src/main/java/com/tools/potato_field/dto/AccountInfoDto.java create mode 100644 potato-field/src/main/java/com/tools/potato_field/dto/ProfileDto.java diff --git a/potato-field/src/main/java/com/tools/potato_field/WebConfig.java b/potato-field/src/main/java/com/tools/potato_field/WebConfig.java index ed24bfe..62d67b2 100644 --- a/potato-field/src/main/java/com/tools/potato_field/WebConfig.java +++ b/potato-field/src/main/java/com/tools/potato_field/WebConfig.java @@ -11,7 +11,7 @@ public class WebConfig implements WebMvcConfigurer { public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("http://localhost:3000", - "http://172.30.1.78:3000") // 프론트엔드 서버 주소 + "http://10.50.44.159:3000") // 프론트엔드 서버 주소 .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .allowedHeaders("*") .allowCredentials(true) diff --git a/potato-field/src/main/java/com/tools/potato_field/dto/AccountInfoDto.java b/potato-field/src/main/java/com/tools/potato_field/dto/AccountInfoDto.java new file mode 100644 index 0000000..8faef96 --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/dto/AccountInfoDto.java @@ -0,0 +1,11 @@ +package com.tools.potato_field.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter @Setter +public class AccountInfoDto { + private String userID; + private String phoneNumber; + private String email; +} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/dto/ProfileDto.java b/potato-field/src/main/java/com/tools/potato_field/dto/ProfileDto.java new file mode 100644 index 0000000..508e073 --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/dto/ProfileDto.java @@ -0,0 +1,16 @@ +package com.tools.potato_field.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter @Setter +public class ProfileDto { + private String name; + private String description; + private String profileImageUrl; + private Integer height; + private String gender; + private Integer age; + private boolean isProfilePublic; + private String statusMessage; +} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/member/Member.java b/potato-field/src/main/java/com/tools/potato_field/member/Member.java index 50dbdc1..b518721 100644 --- a/potato-field/src/main/java/com/tools/potato_field/member/Member.java +++ b/potato-field/src/main/java/com/tools/potato_field/member/Member.java @@ -1,11 +1,8 @@ package com.tools.potato_field.member; import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import org.springframework.data.redis.core.RedisHash; +import lombok.*; + @Data @Builder @@ -13,6 +10,7 @@ @AllArgsConstructor @Entity @Table(name = "members") +@Getter@Setter public class Member { @Id @@ -28,17 +26,18 @@ public class Member { @Column(nullable = false, unique = true) private String userID; - -//<<<<<<< HEAD -// @Column(name = "phoneNumber") -//======= -// @Column(name = "number") -//>>>>>>> 913897a1cb54f39bbed74d77e545982945bfd320 private String number; @Column(nullable = false) private String name; + private Integer height; + private String gender; + private Integer age; + private String profileImageUrl; + private String statusMessage; + private String description; + private boolean isProfilePublic; public String getUserID() { return userID; diff --git a/potato-field/src/main/java/com/tools/potato_field/member/MemberService.java b/potato-field/src/main/java/com/tools/potato_field/member/MemberService.java index f5ed207..1fbdeb8 100644 --- a/potato-field/src/main/java/com/tools/potato_field/member/MemberService.java +++ b/potato-field/src/main/java/com/tools/potato_field/member/MemberService.java @@ -3,6 +3,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; +import com.tools.potato_field.dto.ProfileDto; +import com.tools.potato_field.dto.AccountInfoDto; import java.util.List; @@ -33,6 +35,7 @@ public Member registerMember(Member member) { member.setPassword(passwordEncoder.encode(member.getPassword())); return memberRepository.save(member); } + public Member findMember(Long id) { return memberRepository.findById(id) .orElseThrow(() -> new RuntimeException("Member not found")); @@ -54,4 +57,50 @@ public Member loginMember(String userID, String password) { } return member; } + + // 새로 추가된 메소드: 프로필 정보 조회 + public ProfileDto getProfile(String userID) { + Member member = findByUserID(userID); + ProfileDto profileDTO = new ProfileDto(); + profileDTO.setName(member.getName()); + profileDTO.setDescription(member.getDescription()); + profileDTO.setProfileImageUrl(member.getProfileImageUrl()); + profileDTO.setHeight(member.getHeight()); + profileDTO.setGender(member.getGender()); + profileDTO.setAge(member.getAge()); + profileDTO.setProfilePublic(member.isProfilePublic()); + profileDTO.setStatusMessage(member.getStatusMessage()); + return profileDTO; + } + + // 새로 추가된 메소드: 계정 정보 조회 + public AccountInfoDto getAccountInfo(String userID) { + Member member = findByUserID(userID); + AccountInfoDto accountInfoDTO = new AccountInfoDto(); + accountInfoDTO.setUserID(member.getUserID()); + accountInfoDTO.setPhoneNumber(member.getNumber()); + accountInfoDTO.setEmail(member.getEmail()); + return accountInfoDTO; + } + + // 새로 추가된 메소드: 프로필 정보 업데이트 + public void updateProfile(String userID, ProfileDto profileDTO) { + Member member = findByUserID(userID); + member.setName(profileDTO.getName()); + member.setDescription(profileDTO.getDescription()); + member.setProfileImageUrl(profileDTO.getProfileImageUrl()); + member.setHeight(profileDTO.getHeight()); + member.setGender(profileDTO.getGender()); + member.setAge(profileDTO.getAge()); + member.setProfilePublic(profileDTO.isProfilePublic()); + member.setStatusMessage(profileDTO.getStatusMessage()); + memberRepository.save(member); + } + + // 새로 추가된 메소드: 프로필 공개 설정 업데이트 + public void updatePrivacySettings(String userID, boolean isProfilePublic) { + Member member = findByUserID(userID); + member.setProfilePublic(isProfilePublic); + memberRepository.save(member); + } } \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/post/PostRepository.java b/potato-field/src/main/java/com/tools/potato_field/post/PostRepository.java index 2274b21..4781e8c 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/PostRepository.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/PostRepository.java @@ -1,8 +1,13 @@ package com.tools.potato_field.post; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import java.util.Optional; public interface PostRepository extends JpaRepository { + //권준영 + Page findByMemberUserID(String userID, Pageable pageable); + //권준영 } diff --git a/potato-field/src/main/java/com/tools/potato_field/post/PostService.java b/potato-field/src/main/java/com/tools/potato_field/post/PostService.java index d270811..3d95500 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/PostService.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/PostService.java @@ -1,5 +1,9 @@ package com.tools.potato_field.post; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; import com.tools.potato_field.member.Member; import com.tools.potato_field.postimage.PostImage; import com.tools.potato_field.postimage.PostImageRepository; @@ -18,7 +22,11 @@ public PostService(PostRepository postRepository, PostImageRepository postImageR this.postRepository = postRepository; this.postImageRepository = postImageRepository; } - + //권준영 + public List getPostsByUserID(String userID, int page, int size) { + Pageable pageable = PageRequest.of(page, size); + return postRepository.findByMemberUserID(userID, pageable).getContent(); + }//권준영 @Transactional public Post createPostWithImages(String title, String content, Member member, List imageUrls) { Post post = new Post(title, content, null, member); // Category는 null로 임시 설정 From 875b53609ad076255e4b87f8647082fcb6830c62 Mon Sep 17 00:00:00 2001 From: jeongminuk Date: Sun, 25 Aug 2024 22:03:18 +0900 Subject: [PATCH 41/45] =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tools/potato_field/dto/CreatePost.java | 16 ------- .../potato_field/dto/CreatePostNext.java | 7 --- .../com/tools/potato_field/post/Post.java | 46 ++----------------- .../com/tools/potato_field/post/PostDto.java | 46 +++---------------- .../tools/potato_field/post/PostService.java | 12 ++--- 5 files changed, 17 insertions(+), 110 deletions(-) delete mode 100644 potato-field/src/main/java/com/tools/potato_field/dto/CreatePost.java delete mode 100644 potato-field/src/main/java/com/tools/potato_field/dto/CreatePostNext.java diff --git a/potato-field/src/main/java/com/tools/potato_field/dto/CreatePost.java b/potato-field/src/main/java/com/tools/potato_field/dto/CreatePost.java deleted file mode 100644 index 0fd3204..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/dto/CreatePost.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tools.potato_field.dto; - -import lombok.Data; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Data -public class CreatePost { - private String title; - private String content; - private String author; - private String gender; - private String style; -} diff --git a/potato-field/src/main/java/com/tools/potato_field/dto/CreatePostNext.java b/potato-field/src/main/java/com/tools/potato_field/dto/CreatePostNext.java deleted file mode 100644 index 7c3fa97..0000000 --- a/potato-field/src/main/java/com/tools/potato_field/dto/CreatePostNext.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.tools.potato_field.dto; - -public class CreatePostNext { - private String clothes_name; - private String link; - private String clothes_type; -} diff --git a/potato-field/src/main/java/com/tools/potato_field/post/Post.java b/potato-field/src/main/java/com/tools/potato_field/post/Post.java index c316ebb..c72416f 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/Post.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/Post.java @@ -2,11 +2,14 @@ import com.tools.potato_field.category.Category_1; import jakarta.persistence.*; -import java.util.List; import com.tools.potato_field.member.Member; -import com.tools.potato_field.postimage.PostImage; +import lombok.Getter; +import lombok.Setter; @Entity +@Getter +@Setter + public class Post { @Id @@ -37,43 +40,4 @@ public Post(String title, String content, Member member, Category_1 category) { } // Getters and Setters - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } - - public Member getMember() { - return member; - } - - public void setMember(Member member) { - this.member = member; - } - - public Category_1 getCategory() { - return category; - } - - public void setCategory(Category_1 category) { - this.category = category; - } } diff --git a/potato-field/src/main/java/com/tools/potato_field/post/PostDto.java b/potato-field/src/main/java/com/tools/potato_field/post/PostDto.java index 24e48b7..e7d7e42 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/PostDto.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/PostDto.java @@ -1,5 +1,11 @@ package com.tools.potato_field.post; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter public class PostDto { private Long id; private String title; @@ -20,44 +26,4 @@ public PostDto(Long id, String title, String content, Long memberId, Long catego this.categoryId = categoryId; } - // Getters and Setters - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } - - public Long getMemberId() { - return memberId; - } - - public void setMemberId(Long memberId) { - this.memberId = memberId; - } - - public Long getCategoryId() { - return categoryId; - } - - public void setCategoryId(Long categoryId) { - this.categoryId = categoryId; - } } \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/post/PostService.java b/potato-field/src/main/java/com/tools/potato_field/post/PostService.java index 252b269..04c8712 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/PostService.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/PostService.java @@ -50,8 +50,8 @@ public PostDto updatePost(Long id, PostDto postDto) { // Post 엔티티 업데이트 post.setTitle(postDto.getTitle()); post.setContent(postDto.getContent()); - post.setMember(postDto.getMemberId()); - post.setCategory(postDto.getCategoryId()); + post.setMember(postDto.getMember().getId()); + post.setCategory(postDto.getCategoryId().getId()); // 업데이트된 Post 엔티티 저장 Post updatedPost = postRepository.save(post); // 저장된 Post 엔티티를 다시 PostDto로 변환하여 반환 @@ -72,8 +72,8 @@ private Post mapToEntity(PostDto postDto) { Post post = new Post(); post.setTitle(postDto.getTitle()); post.setContent(postDto.getContent()); - post.setMember(postDto.getMemberId()); - post.setCategory(postDto.getCategoryId()); + post.setMemberId(postDto.getMember().getId()); + post.setCategoryId(postDto.getCategory().getId()); return post; } @@ -83,8 +83,8 @@ private PostDto mapToDto(Post post) { postDto.setId(post.getId()); postDto.setTitle(post.getTitle()); postDto.setContent(post.getContent()); - postDto.setMemberId(post.getMember()); - postDto.setCategoryId(post.getCategory()); + postDto.setMemberId(post.getMember().getId()); + postDto.setCategoryId(post.getCategory().getId()); return postDto; } } \ No newline at end of file From dcaa169afdefd4f68bbafc67c775842487d27e36 Mon Sep 17 00:00:00 2001 From: jeongminuk Date: Sun, 25 Aug 2024 22:09:36 +0900 Subject: [PATCH 42/45] =?UTF-8?q?=20=EC=98=A4=EB=A5=98=EC=88=98=EC=A0=95?= =?UTF-8?q?=EC=A4=912?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tools/potato_field/post/PostService.java | 33 ++++--------------- 1 file changed, 7 insertions(+), 26 deletions(-) diff --git a/potato-field/src/main/java/com/tools/potato_field/post/PostService.java b/potato-field/src/main/java/com/tools/potato_field/post/PostService.java index 04c8712..b915cb9 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/PostService.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/PostService.java @@ -25,6 +25,13 @@ public PostDto createPost(PostDto postDto) { return mapToDto(savedPost); } + private Post mapToEntity(PostDto postDto) { + Post post = new Post(); + post.setTitle(postDto.getTitle()); + post.setContent(postDto.getContent()); + return post; + } + // 2. 특정 ID로 Post 조회 public Optional getPostById(Long id) { // ID로 Post 엔티티 조회 @@ -42,22 +49,6 @@ public List getAllPosts() { return posts.stream().map(this::mapToDto).collect(Collectors.toList()); } - // 4. Post 수정 - public PostDto updatePost(Long id, PostDto postDto) { - // ID로 Post 엔티티 조회 - Post post = postRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException("Post not found with id: " + id)); - // Post 엔티티 업데이트 - post.setTitle(postDto.getTitle()); - post.setContent(postDto.getContent()); - post.setMember(postDto.getMember().getId()); - post.setCategory(postDto.getCategoryId().getId()); - // 업데이트된 Post 엔티티 저장 - Post updatedPost = postRepository.save(post); - // 저장된 Post 엔티티를 다시 PostDto로 변환하여 반환 - return mapToDto(updatedPost); - } - // 5. Post 삭제 public void deletePost(Long id) { // ID로 Post 엔티티 조회 @@ -67,16 +58,6 @@ public void deletePost(Long id) { postRepository.delete(post); } - // PostDto를 Post 엔티티로 변환하는 헬퍼 메서드 - private Post mapToEntity(PostDto postDto) { - Post post = new Post(); - post.setTitle(postDto.getTitle()); - post.setContent(postDto.getContent()); - post.setMemberId(postDto.getMember().getId()); - post.setCategoryId(postDto.getCategory().getId()); - return post; - } - // Post 엔티티를 PostDto로 변환하는 헬퍼 메서드 private PostDto mapToDto(Post post) { PostDto postDto = new PostDto(); From 94850f59ebf1f0c6b0e91d3a24e3e10dff544a96 Mon Sep 17 00:00:00 2001 From: jeongminuk Date: Sun, 25 Aug 2024 22:42:37 +0900 Subject: [PATCH 43/45] =?UTF-8?q?=EC=98=A4=EB=A5=98=EC=88=98=EC=A0=953?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/tools/potato_field/post/PostService.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/potato-field/src/main/java/com/tools/potato_field/post/PostService.java b/potato-field/src/main/java/com/tools/potato_field/post/PostService.java index b915cb9..825b79f 100644 --- a/potato-field/src/main/java/com/tools/potato_field/post/PostService.java +++ b/potato-field/src/main/java/com/tools/potato_field/post/PostService.java @@ -68,4 +68,14 @@ private PostDto mapToDto(Post post) { postDto.setCategoryId(post.getCategory().getId()); return postDto; } + + public PostDto updatePost(Long id, PostDto postDto) { + Post post = postRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException("Post not found with id: " + id)); + post.setTitle(postDto.getTitle()); + post.setContent(postDto.getContent()); + Post updatedPost = postRepository.save(post); + return mapToDto(updatedPost); + } // 4. Post 수정 + } \ No newline at end of file From b5b59c5d30dcdb77862a23f1e9d408328ae80f52 Mon Sep 17 00:00:00 2001 From: pepcsy Date: Tue, 10 Sep 2024 21:58:14 +0900 Subject: [PATCH 44/45] =?UTF-8?q?=20=EC=A2=8B=EC=95=84=EC=9A=94=20=C3=AA?= =?UTF-8?q?=C2=B0=EA=B0=9C=EC=88=98=20=EC=A1=B0=ED=9A=8C=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 --- .../com/tools/potato_field/dto/LikesDTO.java | 13 +++++ .../tools/potato_field/dto/PostLikesDTO.java | 12 ++++ .../potato_field/like/LikesController.java | 26 ++++++++- .../potato_field/like/LikesRepository.java | 5 +- .../tools/potato_field/like/LikesService.java | 55 +++++++++++++++++-- 5 files changed, 102 insertions(+), 9 deletions(-) create mode 100644 potato-field/src/main/java/com/tools/potato_field/dto/LikesDTO.java create mode 100644 potato-field/src/main/java/com/tools/potato_field/dto/PostLikesDTO.java diff --git a/potato-field/src/main/java/com/tools/potato_field/dto/LikesDTO.java b/potato-field/src/main/java/com/tools/potato_field/dto/LikesDTO.java new file mode 100644 index 0000000..2273399 --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/dto/LikesDTO.java @@ -0,0 +1,13 @@ +package com.tools.potato_field.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class LikesDTO { + private Long id; + private Long memberId; + private Long postId; +} + diff --git a/potato-field/src/main/java/com/tools/potato_field/dto/PostLikesDTO.java b/potato-field/src/main/java/com/tools/potato_field/dto/PostLikesDTO.java new file mode 100644 index 0000000..ec8dc04 --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/dto/PostLikesDTO.java @@ -0,0 +1,12 @@ +package com.tools.potato_field.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class PostLikesDTO { + private Long postId; + private String postTitle; // 포스트 제목 또는 관련 정보 + private int likeCount; // 좋아요 개수 +} diff --git a/potato-field/src/main/java/com/tools/potato_field/like/LikesController.java b/potato-field/src/main/java/com/tools/potato_field/like/LikesController.java index 1e656a6..ccb3ac0 100644 --- a/potato-field/src/main/java/com/tools/potato_field/like/LikesController.java +++ b/potato-field/src/main/java/com/tools/potato_field/like/LikesController.java @@ -1,8 +1,12 @@ package com.tools.potato_field.like; +import com.tools.potato_field.dto.LikesDTO; +import com.tools.potato_field.dto.PostLikesDTO; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.List; + @RestController @RequestMapping("/api/likes") public class LikesController { @@ -13,16 +17,32 @@ public LikesController(LikesService likesService) { this.likesService = likesService; } + //좋아요 추가 @PostMapping("/posts/{postId}") - public ResponseEntity addLike(@RequestParam Long memberId, @PathVariable Long postId) { - Likes likes = likesService.addLike(memberId, postId); - return ResponseEntity.ok(likes); + public ResponseEntity addLike(@RequestParam Long memberId, @PathVariable Long postId) { + LikesDTO likesDTO = likesService.addLike(memberId, postId); + return ResponseEntity.ok(likesDTO); } + //좋아요 삭제 @DeleteMapping("/posts/{postId}") public ResponseEntity removeLike(@RequestParam Long memberId, @PathVariable Long postId) { likesService.removeLike(memberId, postId); return ResponseEntity.ok().body("Like removed successfully"); } + + // 포스트별 좋아요 개수 조회 + @GetMapping("/posts/{postId}/count") + public ResponseEntity getPostLikeCount(@PathVariable Long postId) { + PostLikesDTO postLikesDTO = likesService.getPostLikeCount(postId); + return ResponseEntity.ok(postLikesDTO); + } + + // 사용자가 좋아요한 포스트 목록 조회 + @GetMapping("/members/{memberId}/liked-posts") + public ResponseEntity> getUserLikedPosts(@PathVariable Long memberId) { + List likedPosts = likesService.getUserLikedPosts(memberId); + return ResponseEntity.ok(likedPosts); + } } diff --git a/potato-field/src/main/java/com/tools/potato_field/like/LikesRepository.java b/potato-field/src/main/java/com/tools/potato_field/like/LikesRepository.java index 0e474fe..ca550e9 100644 --- a/potato-field/src/main/java/com/tools/potato_field/like/LikesRepository.java +++ b/potato-field/src/main/java/com/tools/potato_field/like/LikesRepository.java @@ -1,9 +1,12 @@ package com.tools.potato_field.like; + import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; import java.util.Optional; public interface LikesRepository extends JpaRepository { Optional findByMemberIdAndPostId(Long memberId, Long postId); + int countByPostId(Long postId); // 포스트별 좋아요 개수 조회 + List findByMemberId(Long memberId); // 사용자가 좋아요한 포스트 목록 조회 } - diff --git a/potato-field/src/main/java/com/tools/potato_field/like/LikesService.java b/potato-field/src/main/java/com/tools/potato_field/like/LikesService.java index feabef0..5d38a5c 100644 --- a/potato-field/src/main/java/com/tools/potato_field/like/LikesService.java +++ b/potato-field/src/main/java/com/tools/potato_field/like/LikesService.java @@ -1,12 +1,16 @@ package com.tools.potato_field.like; +import com.tools.potato_field.dto.LikesDTO; +import com.tools.potato_field.dto.PostLikesDTO; import com.tools.potato_field.member.Member; import com.tools.potato_field.member.MemberRepository; import com.tools.potato_field.post.Post; import com.tools.potato_field.post.PostRepository; import org.springframework.stereotype.Service; +import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; @Service public class LikesService { @@ -20,7 +24,8 @@ public LikesService(LikesRepository likesRepository, MemberRepository memberRepo this.postRepository = postRepository; } - public Likes addLike(Long memberId, Long postId) { + // 좋아요 추가 + public LikesDTO addLike(Long memberId, Long postId) { Optional existingLike = likesRepository.findByMemberIdAndPostId(memberId, postId); if (existingLike.isPresent()) { throw new IllegalArgumentException("Already liked"); @@ -32,17 +37,57 @@ public Likes addLike(Long memberId, Long postId) { .orElseThrow(() -> new IllegalArgumentException("Invalid post ID")); Likes likes = new Likes(); - likes.setMember(member); // Member 객체 설정 - likes.setPost(post); // Post 객체 설정 + likes.setMember(member); + likes.setPost(post); - return likesRepository.save(likes); + Likes savedLike = likesRepository.save(likes); + return mapToDTO(savedLike); } + // 좋아요 삭제 public void removeLike(Long memberId, Long postId) { Optional existingLike = likesRepository.findByMemberIdAndPostId(memberId, postId); existingLike.ifPresent(likesRepository::delete); } -} + // 포스트별 좋아요 개수 조회 + public PostLikesDTO getPostLikeCount(Long postId) { + Post post = postRepository.findById(postId) + .orElseThrow(() -> new IllegalArgumentException("Invalid post ID")); + + int likeCount = likesRepository.countByPostId(postId); + + PostLikesDTO postLikesDTO = new PostLikesDTO(); + postLikesDTO.setPostId(postId); + postLikesDTO.setPostTitle(post.getTitle()); // 포스트의 제목을 설정 + postLikesDTO.setLikeCount(likeCount); + + return postLikesDTO; + } + + // 사용자가 좋아요한 포스트 목록 조회 + public List getUserLikedPosts(Long memberId) { + Member member = memberRepository.findById(memberId) + .orElseThrow(() -> new IllegalArgumentException("Invalid member ID")); + List likedPosts = likesRepository.findByMemberId(memberId); + return likedPosts.stream() + .map(like -> { + PostLikesDTO dto = new PostLikesDTO(); + dto.setPostId(like.getPost().getId()); + dto.setPostTitle(like.getPost().getTitle()); // 포스트 제목 + dto.setLikeCount(likesRepository.countByPostId(like.getPost().getId())); + return dto; + }) + .collect(Collectors.toList()); + } + + private LikesDTO mapToDTO(Likes likes) { + LikesDTO dto = new LikesDTO(); + dto.setId(likes.getId()); + dto.setMemberId(likes.getMember().getId()); + dto.setPostId(likes.getPost().getId()); + return dto; + } +} From dd55b7afd2bbb0d727d61bbf20c99eb8d842365d Mon Sep 17 00:00:00 2001 From: junyoung6215 Date: Tue, 1 Oct 2024 23:11:32 +0900 Subject: [PATCH 45/45] comment add --- potato-field/build.gradle | 18 +++--- .../ResourceNotFoundException.java | 2 +- .../tools/potato_field/comment/Comment.java | 39 +++++++++++++ .../comment/CommentController.java | 29 ++++++++++ .../comment/CommentRepository.java | 9 +++ .../potato_field/comment/CommentService.java | 56 +++++++++++++++++++ .../tools/potato_field/dto/CommentDto.java | 17 ++++++ 7 files changed, 160 insertions(+), 10 deletions(-) create mode 100644 potato-field/src/main/java/com/tools/potato_field/comment/Comment.java create mode 100644 potato-field/src/main/java/com/tools/potato_field/comment/CommentController.java create mode 100644 potato-field/src/main/java/com/tools/potato_field/comment/CommentRepository.java create mode 100644 potato-field/src/main/java/com/tools/potato_field/comment/CommentService.java create mode 100644 potato-field/src/main/java/com/tools/potato_field/dto/CommentDto.java diff --git a/potato-field/build.gradle b/potato-field/build.gradle index b720aed..df1867a 100644 --- a/potato-field/build.gradle +++ b/potato-field/build.gradle @@ -1,6 +1,6 @@ plugins { id 'java' - id 'org.springframework.boot' version '3.3.2' + id 'org.springframework.boot' version '3.3.2' // 버전 변경 id 'io.spring.dependency-management' version '1.1.6' } @@ -28,24 +28,24 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springframework.session:spring-session-core' + implementation 'org.springframework.boot:spring-boot-starter-data-redis' + implementation 'org.springframework.session:spring-session-data-redis' + + // JWT 관련 의존성 (중복 제거) implementation 'io.jsonwebtoken:jjwt-api:0.11.5' runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5' runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5' + runtimeOnly 'com.h2database:h2' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' + testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' - implementation 'org.springframework.session:spring-session-core' - implementation 'org.springframework.boot:spring-boot-starter-data-redis' - implementation 'org.springframework.session:spring-session-data-redis' - implementation 'io.jsonwebtoken:jjwt-api:0.11.5' - runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5' - runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5' - } tasks.named('test') { useJUnitPlatform() -} +} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/ResourceNotFoundException.java b/potato-field/src/main/java/com/tools/potato_field/ResourceNotFoundException.java index 3f9514d..17d16ac 100644 --- a/potato-field/src/main/java/com/tools/potato_field/ResourceNotFoundException.java +++ b/potato-field/src/main/java/com/tools/potato_field/ResourceNotFoundException.java @@ -12,4 +12,4 @@ public ResourceNotFoundException(String message) { public ResourceNotFoundException(String message, Throwable cause) { super(message, cause); } -} +} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/comment/Comment.java b/potato-field/src/main/java/com/tools/potato_field/comment/Comment.java new file mode 100644 index 0000000..a276f1f --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/comment/Comment.java @@ -0,0 +1,39 @@ +package com.tools.potato_field.comment; + + +import com.tools.potato_field.member.Member; +import com.tools.potato_field.post.Post; +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Entity +@Getter +@Setter +public class Comment { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String content; + + @ManyToOne + @JoinColumn(name = "post_id", nullable = false) + private Post post; + + @ManyToOne + @JoinColumn(name = "member_id", nullable = false) + private Member member; + + @Column(nullable = false) + private LocalDateTime createdAt; + + @PrePersist + protected void onCreate() { + createdAt = LocalDateTime.now(); + } +} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/comment/CommentController.java b/potato-field/src/main/java/com/tools/potato_field/comment/CommentController.java new file mode 100644 index 0000000..3ce1e68 --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/comment/CommentController.java @@ -0,0 +1,29 @@ +package com.tools.potato_field.comment; + +import com.tools.potato_field.dto.CommentDto; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/comments") +public class CommentController { + + @Autowired + private CommentService commentService; + + @PostMapping + public ResponseEntity createComment(@RequestBody CommentDto commentDto) { + CommentDto createdComment = commentService.createComment(commentDto); + return new ResponseEntity<>(createdComment, HttpStatus.CREATED); + } + + @GetMapping("/post/{postId}") + public ResponseEntity> getCommentsByPostId(@PathVariable Long postId) { + List comments = commentService.getCommentsByPostId(postId); + return new ResponseEntity<>(comments, HttpStatus.OK); + } +} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/comment/CommentRepository.java b/potato-field/src/main/java/com/tools/potato_field/comment/CommentRepository.java new file mode 100644 index 0000000..e68bf51 --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/comment/CommentRepository.java @@ -0,0 +1,9 @@ +package com.tools.potato_field.comment; + +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface CommentRepository extends JpaRepository { + List findByPostId(Long postId); +} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/comment/CommentService.java b/potato-field/src/main/java/com/tools/potato_field/comment/CommentService.java new file mode 100644 index 0000000..ea119e6 --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/comment/CommentService.java @@ -0,0 +1,56 @@ +package com.tools.potato_field.comment; + +import com.tools.potato_field.dto.CommentDto; +import com.tools.potato_field.member.Member; +import com.tools.potato_field.member.MemberRepository; +import com.tools.potato_field.post.Post; +import com.tools.potato_field.post.PostRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class CommentService { + + @Autowired + private CommentRepository commentRepository; + + @Autowired + private PostRepository postRepository; + + @Autowired + private MemberRepository memberRepository; + + public CommentDto createComment(CommentDto commentDto) { + Comment comment = new Comment(); + comment.setContent(commentDto.getContent()); + + Post post = postRepository.findById(commentDto.getPostId()) + .orElseThrow(() -> new RuntimeException("Post not found")); + comment.setPost(post); + + Member member = memberRepository.findById(commentDto.getMemberId()) + .orElseThrow(() -> new RuntimeException("Member not found")); + comment.setMember(member); + + Comment savedComment = commentRepository.save(comment); + return mapToDto(savedComment); + } + + public List getCommentsByPostId(Long postId) { + List comments = commentRepository.findByPostId(postId); + return comments.stream().map(this::mapToDto).collect(Collectors.toList()); + } + + private CommentDto mapToDto(Comment comment) { + CommentDto dto = new CommentDto(); + dto.setId(comment.getId()); + dto.setContent(comment.getContent()); + dto.setPostId(comment.getPost().getId()); + dto.setMemberId(comment.getMember().getId()); + dto.setCreatedAt(comment.getCreatedAt()); + return dto; + } +} \ No newline at end of file diff --git a/potato-field/src/main/java/com/tools/potato_field/dto/CommentDto.java b/potato-field/src/main/java/com/tools/potato_field/dto/CommentDto.java new file mode 100644 index 0000000..51d254e --- /dev/null +++ b/potato-field/src/main/java/com/tools/potato_field/dto/CommentDto.java @@ -0,0 +1,17 @@ +package com.tools.potato_field.dto; + + +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Getter +@Setter +public class CommentDto { + private Long id; + private String content; + private Long postId; + private Long memberId; + private LocalDateTime createdAt; +} \ No newline at end of file