From ca55448eee4118d3acb57e81ea04cb6f37a086e7 Mon Sep 17 00:00:00 2001 From: in seong Park <123macanic@naver.com> Date: Mon, 21 Oct 2024 14:25:45 +0900 Subject: [PATCH 1/5] =?UTF-8?q?refactor:=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EB=84=A4=EC=9E=84=20=EB=B3=80=EA=B2=BD=20request=20->=20projec?= =?UTF-8?q?t?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 변경된 점 : - Repository 메서드 수정 --- .../project/controller/ProjectController.java | 8 ++++---- .../devlinkbackend/project/service/ProjectService.java | 4 ++-- .../com/mtvs/devlinkbackend/crud/ProjectCRUDTest.java | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/mtvs/devlinkbackend/project/controller/ProjectController.java b/src/main/java/com/mtvs/devlinkbackend/project/controller/ProjectController.java index 8f68fec..af28f9f 100644 --- a/src/main/java/com/mtvs/devlinkbackend/project/controller/ProjectController.java +++ b/src/main/java/com/mtvs/devlinkbackend/project/controller/ProjectController.java @@ -16,7 +16,7 @@ import java.util.List; @RestController -@RequestMapping("/api/request") +@RequestMapping("/api/project") public class ProjectController { private final ProjectService projectService; @@ -47,9 +47,9 @@ public ResponseEntity registerProject( @ApiResponse(responseCode = "200", description = "프로젝트 의뢰가 성공적으로 조회됨"), @ApiResponse(responseCode = "404", description = "프로젝트 의뢰를 찾을 수 없음") }) - @GetMapping("/{requestId}") - public ResponseEntity getProjectById(@PathVariable Long requestId) { - Project project = projectService.findProjectByRequestId(requestId); + @GetMapping("/{projectId}") + public ResponseEntity getProjectById(@PathVariable Long projectId) { + Project project = projectService.findProjectByProjectId(projectId); if (project != null) { return ResponseEntity.ok(project); } else { diff --git a/src/main/java/com/mtvs/devlinkbackend/project/service/ProjectService.java b/src/main/java/com/mtvs/devlinkbackend/project/service/ProjectService.java index ebdf066..15151e0 100644 --- a/src/main/java/com/mtvs/devlinkbackend/project/service/ProjectService.java +++ b/src/main/java/com/mtvs/devlinkbackend/project/service/ProjectService.java @@ -40,8 +40,8 @@ public Project registProject(ProjectRegistRequestDTO projectRegistRequestDTO, St )); } - public Project findProjectByRequestId(Long requestId) { - return projectRepository.findById(requestId).orElse(null); + public Project findProjectByProjectId(Long projectId) { + return projectRepository.findById(projectId).orElse(null); } public List findProjectsByAccountId(String accountId) { diff --git a/src/test/java/com/mtvs/devlinkbackend/crud/ProjectCRUDTest.java b/src/test/java/com/mtvs/devlinkbackend/crud/ProjectCRUDTest.java index 19eac8c..8098ce9 100644 --- a/src/test/java/com/mtvs/devlinkbackend/crud/ProjectCRUDTest.java +++ b/src/test/java/com/mtvs/devlinkbackend/crud/ProjectCRUDTest.java @@ -110,7 +110,7 @@ public void testCreateRequest(ProjectRegistRequestDTO projectRegistRequestDTO, S @Order(1) public void testFindRequestByRequestId(long questionId) { Assertions.assertDoesNotThrow(() -> - System.out.println("Request = " + projectService.findProjectByRequestId(questionId))); + System.out.println("Request = " + projectService.findProjectByProjectId(questionId))); } @DisplayName("계정 ID에 따른 의뢰 paging 조회 테스트") From 040abd287f18c907cdcf2c1f1b1e1da834ae5a92 Mon Sep 17 00:00:00 2001 From: in seong Park <123macanic@naver.com> Date: Mon, 21 Oct 2024 14:26:32 +0900 Subject: [PATCH 2/5] =?UTF-8?q?feat:=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=20=EC=A7=80=EC=9B=90=20CRD=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 추가된 기능: - Entity - Repository - Service - DTO - Controller --- .../support/controller/SupportController.java | 86 +++++++++++++++++++ .../support/dto/SupportRegistRequestDTO.java | 12 +++ .../support/entity/Support.java | 43 ++++++++++ .../support/repository/SupportRepository.java | 13 +++ .../support/service/SupportService.java | 37 ++++++++ 5 files changed, 191 insertions(+) create mode 100644 src/main/java/com/mtvs/devlinkbackend/support/controller/SupportController.java create mode 100644 src/main/java/com/mtvs/devlinkbackend/support/dto/SupportRegistRequestDTO.java create mode 100644 src/main/java/com/mtvs/devlinkbackend/support/entity/Support.java create mode 100644 src/main/java/com/mtvs/devlinkbackend/support/repository/SupportRepository.java create mode 100644 src/main/java/com/mtvs/devlinkbackend/support/service/SupportService.java diff --git a/src/main/java/com/mtvs/devlinkbackend/support/controller/SupportController.java b/src/main/java/com/mtvs/devlinkbackend/support/controller/SupportController.java new file mode 100644 index 0000000..defbe9e --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/support/controller/SupportController.java @@ -0,0 +1,86 @@ +package com.mtvs.devlinkbackend.support.controller; + +import com.mtvs.devlinkbackend.support.dto.SupportRegistRequestDTO; +import com.mtvs.devlinkbackend.support.entity.Support; +import com.mtvs.devlinkbackend.support.service.SupportService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/support") +public class SupportController { + private final SupportService supportService; + + public SupportController(SupportService supportService) { + this.supportService = supportService; + } + + /** + * 프로젝트 지원을 생성하는 API + * @param supportRegistRequestDTO 지원 요청 데이터 + * @return 생성된 지원 정보 + */ + @Operation(summary = "프로젝트 지원 생성", description = "프로젝트에 대한 새로운 지원을 생성합니다.") + @ApiResponses(value = { + @ApiResponse(responseCode = "201", description = "지원이 성공적으로 생성됨"), + @ApiResponse(responseCode = "400", description = "잘못된 요청 데이터") + }) + @PostMapping + public ResponseEntity createSupport(@RequestBody SupportRegistRequestDTO supportRegistRequestDTO) { + Support createdSupport = supportService.createSupport(supportRegistRequestDTO); + return new ResponseEntity<>(createdSupport, HttpStatus.CREATED); + } + + /** + * 프로젝트 ID로 지원 목록을 조회하는 API + * @param projectId 프로젝트 ID + * @return 프로젝트에 대한 지원 목록 + */ + @Operation(summary = "프로젝트 ID로 지원 조회", description = "특정 프로젝트에 대한 모든 지원 목록을 조회합니다.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "지원 목록 조회 성공"), + @ApiResponse(responseCode = "404", description = "해당 프로젝트를 찾을 수 없음") + }) + @GetMapping("/project/{projectId}") + public ResponseEntity> getSupportsByProjectId(@PathVariable Long projectId) { + List supports = supportService.findSupportsByProjectId(projectId); + return new ResponseEntity<>(supports, HttpStatus.OK); + } + + /** + * 팀 ID로 지원 목록을 조회하는 API + * @param teamId 팀 ID + * @return 해당 팀의 지원 목록 + */ + @Operation(summary = "팀 ID로 지원 조회", description = "특정 팀에 대한 모든 지원 목록을 조회합니다.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "지원 목록 조회 성공"), + @ApiResponse(responseCode = "404", description = "해당 팀을 찾을 수 없음") + }) + @GetMapping("/team/{teamId}") + public ResponseEntity> getSupportsByTeamId(@PathVariable Long teamId) { + List supports = supportService.findSupportsByTeamId(teamId); + return new ResponseEntity<>(supports, HttpStatus.OK); + } + + /** + * 지원을 삭제하는 API + * @param supportId 삭제할 지원 ID + */ + @Operation(summary = "지원 삭제", description = "지정된 ID의 지원을 삭제합니다.") + @ApiResponses(value = { + @ApiResponse(responseCode = "204", description = "지원이 성공적으로 삭제됨"), + @ApiResponse(responseCode = "404", description = "해당 지원을 찾을 수 없음") + }) + @DeleteMapping("/{supportId}") + public ResponseEntity deleteSupport(@PathVariable Long supportId) { + supportService.deleteSupport(supportId); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } +} diff --git a/src/main/java/com/mtvs/devlinkbackend/support/dto/SupportRegistRequestDTO.java b/src/main/java/com/mtvs/devlinkbackend/support/dto/SupportRegistRequestDTO.java new file mode 100644 index 0000000..64bf592 --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/support/dto/SupportRegistRequestDTO.java @@ -0,0 +1,12 @@ +package com.mtvs.devlinkbackend.support.dto; + +import lombok.*; + +@Setter @Getter +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class SupportRegistRequestDTO { + private Long projectId; + private Long teamId; +} diff --git a/src/main/java/com/mtvs/devlinkbackend/support/entity/Support.java b/src/main/java/com/mtvs/devlinkbackend/support/entity/Support.java new file mode 100644 index 0000000..23504c6 --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/support/entity/Support.java @@ -0,0 +1,43 @@ +package com.mtvs.devlinkbackend.support.entity; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Table(name = "SUPPORT") +@Entity(name = "Support") +@NoArgsConstructor +@Getter +public class Support { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "SUPPORT_ID") + private Long supportId; + + @Column(name = "PROJECT_ID", nullable = false) + private Long projectId; + + @Column(name = "TEAM_ID", nullable = false) + private Long teamId; + + @Column(name = "SUPPORT_CONFIRMATION") + private String supportConfirmation; // 상태 : waiting, accepted, rejected + + public Support(Long projectId, Long teamId, String supportConfirmation) { + this.projectId = projectId; + this.teamId = teamId; + this.supportConfirmation = supportConfirmation; + } + + public void setProjectId(Long projectId) { + this.projectId = projectId; + } + + public void setTeamId(Long teamId) { + this.teamId = teamId; + } + + public void setSupportConfirmation(String supportConfirmation) { + this.supportConfirmation = supportConfirmation; + } +} diff --git a/src/main/java/com/mtvs/devlinkbackend/support/repository/SupportRepository.java b/src/main/java/com/mtvs/devlinkbackend/support/repository/SupportRepository.java new file mode 100644 index 0000000..ecbf827 --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/support/repository/SupportRepository.java @@ -0,0 +1,13 @@ +package com.mtvs.devlinkbackend.support.repository; + +import com.mtvs.devlinkbackend.support.entity.Support; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface SupportRepository extends JpaRepository { + List findSupportsByProjectId(Long projectId); + List findSupportsByTeamId(Long teamId); +} diff --git a/src/main/java/com/mtvs/devlinkbackend/support/service/SupportService.java b/src/main/java/com/mtvs/devlinkbackend/support/service/SupportService.java new file mode 100644 index 0000000..29d2526 --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/support/service/SupportService.java @@ -0,0 +1,37 @@ +package com.mtvs.devlinkbackend.support.service; + +import com.mtvs.devlinkbackend.support.dto.SupportRegistRequestDTO; +import com.mtvs.devlinkbackend.support.entity.Support; +import com.mtvs.devlinkbackend.support.repository.SupportRepository; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class SupportService { + private final SupportRepository supportRepository; + + public SupportService(SupportRepository supportRepository) { + this.supportRepository = supportRepository; + } + + public Support createSupport(SupportRegistRequestDTO supportRegistRequestDTO) { + return supportRepository.save(new Support( + supportRegistRequestDTO.getProjectId(), + supportRegistRequestDTO.getTeamId(), + "waiting" + )); + } + + public List findSupportsByProjectId(Long projectId) { + return supportRepository.findSupportsByProjectId(projectId); + } + + public List findSupportsByTeamId(Long teamId) { + return supportRepository.findSupportsByTeamId(teamId); + } + + public void deleteSupport(Long supportId) { + supportRepository.deleteById(supportId); + } +} From 24140f33d535b2fa724c76556688f462b1e54dc7 Mon Sep 17 00:00:00 2001 From: in seong Park <123macanic@naver.com> Date: Mon, 21 Oct 2024 14:27:01 +0900 Subject: [PATCH 3/5] =?UTF-8?q?refactor:=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EB=84=A4=EC=9E=84=20=EB=B3=80=EA=B2=BD=20request=20->=20projec?= =?UTF-8?q?t?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 변경된 점 : - Repository 메서드 수정 --- src/test/java/com/mtvs/devlinkbackend/crud/ProjectCRUDTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/mtvs/devlinkbackend/crud/ProjectCRUDTest.java b/src/test/java/com/mtvs/devlinkbackend/crud/ProjectCRUDTest.java index 8098ce9..01326f7 100644 --- a/src/test/java/com/mtvs/devlinkbackend/crud/ProjectCRUDTest.java +++ b/src/test/java/com/mtvs/devlinkbackend/crud/ProjectCRUDTest.java @@ -174,7 +174,7 @@ public void testFindRequestsByProgressClassification(String progressClassificati @Order(2) public void testFindRequestsByTitleContainingIgnoreCase(String title) { Assertions.assertDoesNotThrow(() -> - System.out.println("Request = " + projectService.findRequestsByTitleContainingIgnoreCase(title))); + System.out.println("Request = " + projectService.findProjectsByTitleContainingIgnoreCase(title))); } @DisplayName("필요 직군보다 더 많이 모집하는 의뢰 조회 테스트") From aa3e83472eb3da252c77f2147a6c67d401917b53 Mon Sep 17 00:00:00 2001 From: in seong Park <123macanic@naver.com> Date: Mon, 21 Oct 2024 16:01:04 +0900 Subject: [PATCH 4/5] =?UTF-8?q?test:=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=20=EC=A7=80=EC=9B=90=20CRUD=20TestCode=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 변경된 점: - Service에서 Create 메서드에 @Transactional로 트랜잭션 단위 명시 --- .../support/entity/Support.java | 2 + .../support/service/SupportService.java | 2 + .../devlinkbackend/crud/SupportCRUDTest.java | 94 +++++++++++++++++++ 3 files changed, 98 insertions(+) create mode 100644 src/test/java/com/mtvs/devlinkbackend/crud/SupportCRUDTest.java diff --git a/src/main/java/com/mtvs/devlinkbackend/support/entity/Support.java b/src/main/java/com/mtvs/devlinkbackend/support/entity/Support.java index 23504c6..ba97c60 100644 --- a/src/main/java/com/mtvs/devlinkbackend/support/entity/Support.java +++ b/src/main/java/com/mtvs/devlinkbackend/support/entity/Support.java @@ -3,11 +3,13 @@ import jakarta.persistence.*; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.ToString; @Table(name = "SUPPORT") @Entity(name = "Support") @NoArgsConstructor @Getter +@ToString public class Support { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/com/mtvs/devlinkbackend/support/service/SupportService.java b/src/main/java/com/mtvs/devlinkbackend/support/service/SupportService.java index 29d2526..d319f18 100644 --- a/src/main/java/com/mtvs/devlinkbackend/support/service/SupportService.java +++ b/src/main/java/com/mtvs/devlinkbackend/support/service/SupportService.java @@ -4,6 +4,7 @@ import com.mtvs.devlinkbackend.support.entity.Support; import com.mtvs.devlinkbackend.support.repository.SupportRepository; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -15,6 +16,7 @@ public SupportService(SupportRepository supportRepository) { this.supportRepository = supportRepository; } + @Transactional public Support createSupport(SupportRegistRequestDTO supportRegistRequestDTO) { return supportRepository.save(new Support( supportRegistRequestDTO.getProjectId(), diff --git a/src/test/java/com/mtvs/devlinkbackend/crud/SupportCRUDTest.java b/src/test/java/com/mtvs/devlinkbackend/crud/SupportCRUDTest.java new file mode 100644 index 0000000..6191b4c --- /dev/null +++ b/src/test/java/com/mtvs/devlinkbackend/crud/SupportCRUDTest.java @@ -0,0 +1,94 @@ +package com.mtvs.devlinkbackend.crud; + +import com.mtvs.devlinkbackend.support.dto.SupportRegistRequestDTO; +import com.mtvs.devlinkbackend.support.entity.Support; +import com.mtvs.devlinkbackend.support.repository.SupportRepository; +import com.mtvs.devlinkbackend.support.service.SupportService; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +@Transactional +public class SupportCRUDTest { + + private Support support1; + private Support support2; + @Autowired + private SupportRepository supportRepository; + @Autowired + private SupportService supportService; + + @BeforeEach + public void setUp() { + MockitoAnnotations.openMocks(this); + + // 미리 삽입할 Support 객체 생성 + support1 = new Support(1L, 2L, "waiting"); + support2 = new Support(1L, 3L, "accepted"); + + // Mocking the repository calls + supportRepository.save(support1); + supportRepository.save(support2); + } + + @Test + public void testCreateSupport() { + // given + SupportRegistRequestDTO supportRegistRequestDTO = new SupportRegistRequestDTO(1L, 2L); + + // when + Support createdSupport = supportService.createSupport(supportRegistRequestDTO); + + // then + assertNotNull(createdSupport, "Created support should not be null"); + assertEquals(support1.getProjectId(), createdSupport.getProjectId(), "Project ID should match"); + assertEquals(support1.getTeamId(), createdSupport.getTeamId(), "Team ID should match"); + assertEquals("waiting", createdSupport.getSupportConfirmation(), "Status should be 'waiting'"); + } + + @Test + public void testFindSupportsByProjectId() { + // when + List foundSupports = supportService.findSupportsByProjectId(1L); + + // then + assertNotNull(foundSupports, "Found supports should not be null"); + assertEquals(2, foundSupports.size(), "The size of found supports should be 2"); + assertEquals(support1.getProjectId(), foundSupports.get(0).getProjectId(), "First support project ID should match"); + assertEquals(support2.getTeamId(), foundSupports.get(1).getTeamId(), "Second support team ID should match"); + } + + @Test + public void testFindSupportsByTeamId() { + // when + List foundSupports = supportService.findSupportsByTeamId(2L); + + // then + assertNotNull(foundSupports, "Found supports should not be null"); + assertEquals(1, foundSupports.size(), "The size of found supports should be 1"); + assertEquals(support1.getTeamId(), foundSupports.get(0).getTeamId(), "Support team ID should match"); + assertEquals(support1.getSupportConfirmation(), foundSupports.get(0).getSupportConfirmation(), "Support status should match"); + } + + @Test + public void testDeleteSupport() { + // given + Long supportId = support1.getSupportId(); + + // when + supportService.deleteSupport(supportId); + List foundSupports = supportService.findSupportsByProjectId(1L); + System.out.println(foundSupports); + + // then + assertEquals(1, foundSupports.size()); + } +} From 8d5bd552ba1c48c921f99bfcf1e8fa3fc0f35e8f Mon Sep 17 00:00:00 2001 From: in seong Park <123macanic@naver.com> Date: Mon, 21 Oct 2024 16:04:27 +0900 Subject: [PATCH 5/5] =?UTF-8?q?fix:=20=EC=BA=90=EB=A6=AD=ED=84=B0=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=EC=9D=98=20Service=20Delete=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=98=A4=EB=A5=98=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 해결된 오류: - 트랜잭션을 명시하지 않아서 생기는 오류 발생 - 해당 메서드는 user_character 테이블 뿐만 아니라 status_list라는 테이블에서도 DELETE가 발생하기 때문 - 따라서 @Trasactional로 트랜잭션 명시 --- .../devlinkbackend/character/service/UserCharacterService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/mtvs/devlinkbackend/character/service/UserCharacterService.java b/src/main/java/com/mtvs/devlinkbackend/character/service/UserCharacterService.java index 618b07d..3c39a97 100644 --- a/src/main/java/com/mtvs/devlinkbackend/character/service/UserCharacterService.java +++ b/src/main/java/com/mtvs/devlinkbackend/character/service/UserCharacterService.java @@ -37,6 +37,7 @@ public UserCharacter updateCharacter(UserCharacterUpdateRequestDTO userCharacter return userCharacter; } + @Transactional public void deleteCharacterByAccountId(String accountId) { userCharacterRepository.deleteByAccountId(accountId); }