From 34a2ca5520144719e38d94b2bfb3be8ba2af6c66 Mon Sep 17 00:00:00 2001 From: Choi Seongwon Date: Wed, 25 Oct 2023 00:19:21 +0900 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20Club=20=EC=97=94=ED=8B=B0=ED=8B=B0,?= =?UTF-8?q?=20=EC=84=9C=EB=B9=84=EC=8A=A4,=20=EB=A0=88=ED=8F=AC=EC=A7=80?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../club/controller/ClubController.java | 5 +++ .../java/com/spaceclub/club/domain/Club.java | 43 +++++++++++++++++++ .../club/repository/ClubRepository.java | 8 ++++ .../spaceclub/club/service/ClubService.java | 14 ++++++ 4 files changed, 70 insertions(+) create mode 100644 src/main/java/com/spaceclub/club/domain/Club.java create mode 100644 src/main/java/com/spaceclub/club/repository/ClubRepository.java create mode 100644 src/main/java/com/spaceclub/club/service/ClubService.java diff --git a/src/main/java/com/spaceclub/club/controller/ClubController.java b/src/main/java/com/spaceclub/club/controller/ClubController.java index 28ef8ef4..d7e580a6 100644 --- a/src/main/java/com/spaceclub/club/controller/ClubController.java +++ b/src/main/java/com/spaceclub/club/controller/ClubController.java @@ -1,6 +1,8 @@ package com.spaceclub.club.controller; import com.spaceclub.club.controller.dto.CreateClubRequest; +import com.spaceclub.club.service.ClubService; +import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -14,8 +16,11 @@ @RestController @RequestMapping("/api/v1") +@RequiredArgsConstructor public class ClubController { + private final ClubService service; + @PostMapping("/club") public ResponseEntity createClub(@RequestBody CreateClubRequest request) { return ResponseEntity.created(URI.create("https://spaceclub.site/1")).build(); diff --git a/src/main/java/com/spaceclub/club/domain/Club.java b/src/main/java/com/spaceclub/club/domain/Club.java new file mode 100644 index 00000000..a87a7bd3 --- /dev/null +++ b/src/main/java/com/spaceclub/club/domain/Club.java @@ -0,0 +1,43 @@ +package com.spaceclub.club.domain; + +import com.spaceclub.global.BaseTimeEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.Lob; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.springframework.util.Assert; + +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Club extends BaseTimeEntity { + + @Id + @Column(name = "club_id") + @GeneratedValue + private Long id; + + @Column(length = 12, nullable = false) + private String name; + + @Lob + private String image; + + @Lob + private String info; + + protected Club(Long id, String name, String image, String info) { + Assert.notNull(id, "클럽 ID는 null 값이 올 수 없습니다"); + Assert.hasText(Long.toString(id), "클럽 ID는 빈 값이 올 수 없습니다"); + Assert.notNull(name, "이름에 null 값이 올 수 없습니다"); + Assert.hasText(name, "이름이 빈 값일 수 없습니다"); + + this.id = id; + this.name = name; + this.image = image; + this.info = info; + } + +} diff --git a/src/main/java/com/spaceclub/club/repository/ClubRepository.java b/src/main/java/com/spaceclub/club/repository/ClubRepository.java new file mode 100644 index 00000000..0aafa1ad --- /dev/null +++ b/src/main/java/com/spaceclub/club/repository/ClubRepository.java @@ -0,0 +1,8 @@ +package com.spaceclub.club.repository; + +import com.spaceclub.club.domain.Club; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ClubRepository extends JpaRepository { + +} diff --git a/src/main/java/com/spaceclub/club/service/ClubService.java b/src/main/java/com/spaceclub/club/service/ClubService.java new file mode 100644 index 00000000..3c0e4b9c --- /dev/null +++ b/src/main/java/com/spaceclub/club/service/ClubService.java @@ -0,0 +1,14 @@ +package com.spaceclub.club.service; + +import com.spaceclub.club.repository.ClubRepository; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class ClubService { + + private final ClubRepository repository; + +} From f3cb5a4d768c6325b3b6207c6179dd2727072cbb Mon Sep 17 00:00:00 2001 From: Choi Seongwon Date: Wed, 25 Oct 2023 13:59:12 +0900 Subject: [PATCH 2/5] =?UTF-8?q?feat:=20Club=20=EC=97=94=ED=8B=B0=ED=8B=B0?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=EC=9E=90=EC=97=90=20Builder=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/spaceclub/club/domain/Club.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/spaceclub/club/domain/Club.java b/src/main/java/com/spaceclub/club/domain/Club.java index a87a7bd3..8dc48bbf 100644 --- a/src/main/java/com/spaceclub/club/domain/Club.java +++ b/src/main/java/com/spaceclub/club/domain/Club.java @@ -7,6 +7,7 @@ import jakarta.persistence.Id; import jakarta.persistence.Lob; import lombok.AccessLevel; +import lombok.Builder; import lombok.NoArgsConstructor; import org.springframework.util.Assert; @@ -28,7 +29,8 @@ public class Club extends BaseTimeEntity { @Lob private String info; - protected Club(Long id, String name, String image, String info) { + @Builder + public Club(Long id, String name, String image, String info) { Assert.notNull(id, "클럽 ID는 null 값이 올 수 없습니다"); Assert.hasText(Long.toString(id), "클럽 ID는 빈 값이 올 수 없습니다"); Assert.notNull(name, "이름에 null 값이 올 수 없습니다"); From df301d1f77872b7fce58f5054ead933cfade5918 Mon Sep 17 00:00:00 2001 From: Choi Seongwon Date: Wed, 25 Oct 2023 14:10:27 +0900 Subject: [PATCH 3/5] =?UTF-8?q?test:=20ClubController=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EC=97=90=20Service=20Bean=20Mocking?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/spaceclub/club/service/ClubService.java | 3 +-- .../com/spaceclub/club/controller/ClubControllerTest.java | 5 +++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/spaceclub/club/service/ClubService.java b/src/main/java/com/spaceclub/club/service/ClubService.java index 3c0e4b9c..a3a2f7b7 100644 --- a/src/main/java/com/spaceclub/club/service/ClubService.java +++ b/src/main/java/com/spaceclub/club/service/ClubService.java @@ -1,12 +1,11 @@ package com.spaceclub.club.service; import com.spaceclub.club.repository.ClubRepository; -import lombok.AccessLevel; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @Service -@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +@RequiredArgsConstructor public class ClubService { private final ClubRepository repository; diff --git a/src/test/java/com/spaceclub/club/controller/ClubControllerTest.java b/src/test/java/com/spaceclub/club/controller/ClubControllerTest.java index 3f220b34..71e4e093 100644 --- a/src/test/java/com/spaceclub/club/controller/ClubControllerTest.java +++ b/src/test/java/com/spaceclub/club/controller/ClubControllerTest.java @@ -2,11 +2,13 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.spaceclub.club.controller.dto.CreateClubRequest; +import com.spaceclub.club.service.ClubService; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.restdocs.payload.JsonFieldType; import org.springframework.security.test.context.support.WithMockUser; @@ -36,6 +38,9 @@ class ClubControllerTest { @Autowired private ObjectMapper mapper; + @MockBean + private ClubService clubService; + @Test @DisplayName("클럽 생성에 성공한다") @WithMockUser From d9701f3a733b4965a5ec314a0236fbaa2e7f3b70 Mon Sep 17 00:00:00 2001 From: Choi Seongwon Date: Wed, 25 Oct 2023 18:09:17 +0900 Subject: [PATCH 4/5] =?UTF-8?q?feat:=20Club=20=EC=97=94=ED=8B=B0=ED=8B=B0?= =?UTF-8?q?=20owner=20=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80,=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EA=B8=B8=EC=9D=B4=20=EA=B2=80=EC=A6=9D=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/spaceclub/club/domain/Club.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/spaceclub/club/domain/Club.java b/src/main/java/com/spaceclub/club/domain/Club.java index 8dc48bbf..febef9dd 100644 --- a/src/main/java/com/spaceclub/club/domain/Club.java +++ b/src/main/java/com/spaceclub/club/domain/Club.java @@ -29,17 +29,22 @@ public class Club extends BaseTimeEntity { @Lob private String info; + private String owner; + + private boolean validateNameLength() { + return this.name.length() <= 12; + } + @Builder - public Club(Long id, String name, String image, String info) { - Assert.notNull(id, "클럽 ID는 null 값이 올 수 없습니다"); - Assert.hasText(Long.toString(id), "클럽 ID는 빈 값이 올 수 없습니다"); + public Club(String name, String image, String info, String owner) { Assert.notNull(name, "이름에 null 값이 올 수 없습니다"); Assert.hasText(name, "이름이 빈 값일 수 없습니다"); + Assert.isTrue(validateNameLength(), "이름의 길이는 12자를 넘을 수 없습니다"); - this.id = id; this.name = name; this.image = image; this.info = info; + this.owner = owner; } } From cb37f5482bcc6b7338d53b260b66c7733e5101d3 Mon Sep 17 00:00:00 2001 From: Choi Seongwon Date: Wed, 25 Oct 2023 22:48:53 +0900 Subject: [PATCH 5/5] =?UTF-8?q?fix:=20api=20endpoint=20=EC=88=98=EC=A0=95,?= =?UTF-8?q?=20location=20=EA=B0=92=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/spaceclub/club/controller/ClubController.java | 9 +++++---- .../spaceclub/club/controller/ClubControllerTest.java | 6 +++--- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/spaceclub/club/controller/ClubController.java b/src/main/java/com/spaceclub/club/controller/ClubController.java index d7e580a6..6b2a1abb 100644 --- a/src/main/java/com/spaceclub/club/controller/ClubController.java +++ b/src/main/java/com/spaceclub/club/controller/ClubController.java @@ -1,6 +1,7 @@ package com.spaceclub.club.controller; import com.spaceclub.club.controller.dto.CreateClubRequest; +import com.spaceclub.club.domain.Club; import com.spaceclub.club.service.ClubService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -21,17 +22,17 @@ public class ClubController { private final ClubService service; - @PostMapping("/club") + @PostMapping("/clubs") public ResponseEntity createClub(@RequestBody CreateClubRequest request) { - return ResponseEntity.created(URI.create("https://spaceclub.site/1")).build(); + return ResponseEntity.created(URI.create("api/v1/clubs/1")).build(); } - @GetMapping("/club/{clubId}") + @GetMapping("/clubs/{clubId}") public ResponseEntity getClub(@PathVariable Long clubId) { return ResponseEntity.ok("get club."); } - @DeleteMapping("/club/{clubId}") + @DeleteMapping("/clubs/{clubId}") public ResponseEntity deleteClub(@PathVariable Long clubId) { return ResponseEntity.ok("delete club."); } diff --git a/src/test/java/com/spaceclub/club/controller/ClubControllerTest.java b/src/test/java/com/spaceclub/club/controller/ClubControllerTest.java index 71e4e093..fdd9311c 100644 --- a/src/test/java/com/spaceclub/club/controller/ClubControllerTest.java +++ b/src/test/java/com/spaceclub/club/controller/ClubControllerTest.java @@ -49,7 +49,7 @@ void createClubTest() throws Exception { CreateClubRequest request = new CreateClubRequest("requiredInfo"); // when - ResultActions result = this.mockMvc.perform(post("/api/v1/club") + ResultActions result = this.mockMvc.perform(post("/api/v1/clubs") .with(csrf()) .contentType(MediaType.APPLICATION_JSON) .content(mapper.writeValueAsString(request))); @@ -73,7 +73,7 @@ void getClubTest() throws Exception { Long clubId = 1L; // when - ResultActions result = this.mockMvc.perform(get("/api/v1/club/{clubId}", clubId) + ResultActions result = this.mockMvc.perform(get("/api/v1/clubs/{clubId}", clubId) .with(csrf()) .contentType(MediaType.APPLICATION_JSON)); @@ -93,7 +93,7 @@ void deleteClubTest() throws Exception { Long clubId = 1L; // when - ResultActions result = this.mockMvc.perform(delete("/api/v1/club/{clubId}", clubId) + ResultActions result = this.mockMvc.perform(delete("/api/v1/clubs/{clubId}", clubId) .with(csrf()) .contentType(MediaType.APPLICATION_JSON));