From 183e2123e285d97ec0d63cb42148aeddf929b8d6 Mon Sep 17 00:00:00 2001 From: leebs0521 Date: Wed, 20 Nov 2024 22:30:03 +0900 Subject: [PATCH 01/17] =?UTF-8?q?chore(test):=20test=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20yml=20=EC=84=A4=EC=A0=95=20=ED=8C=8C=EC=9D=BC=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 --- src/test/resources/application-test.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/test/resources/application-test.yml diff --git a/src/test/resources/application-test.yml b/src/test/resources/application-test.yml new file mode 100644 index 000000000..5e687f767 --- /dev/null +++ b/src/test/resources/application-test.yml @@ -0,0 +1,22 @@ +spring: + config: + activate: + on-profile: test + + datasource: + url: jdbc:h2:mem:~/somemore + driver-class-name: org.h2.Driver + username: sa + password: + + jpa: + hibernate: + ddl-auto: create + show-sql: true + properties: + hibernate: + format_sql: true + + sql: + init: + mode: never \ No newline at end of file From 2845a9e9b928aa485a831a35e0400ced28b21702 Mon Sep 17 00:00:00 2001 From: leebs0521 Date: Wed, 20 Nov 2024 22:31:25 +0900 Subject: [PATCH 02/17] =?UTF-8?q?test(init):=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EB=A5=BC=20=EC=9C=84=ED=95=9C=20=EC=B4=88=EA=B8=B0=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=20-=20JpaAuditing=20annotation=20=20-=20=ED=86=B5?= =?UTF-8?q?=ED=95=A9=20=ED=85=8C=EC=8A=A4=ED=8A=B8:=20=EC=8A=A4=ED=94=84?= =?UTF-8?q?=EB=A7=81=20=EC=84=9C=EB=B2=84=EB=A5=BC=20=ED=95=9C=EB=B2=88=20?= =?UTF-8?q?=EB=9D=84=EC=9A=B0=EA=B8=B0=20=EC=9C=84=ED=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/somemore/IntegrationTestSupport.java | 12 ++++++++++++ .../java/com/somemore/SomemoreApplicationTests.java | 8 ++++---- 2 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 src/test/java/com/somemore/IntegrationTestSupport.java diff --git a/src/test/java/com/somemore/IntegrationTestSupport.java b/src/test/java/com/somemore/IntegrationTestSupport.java new file mode 100644 index 000000000..3a6c6934d --- /dev/null +++ b/src/test/java/com/somemore/IntegrationTestSupport.java @@ -0,0 +1,12 @@ +package com.somemore; + +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +import org.springframework.test.context.ActiveProfiles; + +@ActiveProfiles("test") +@EnableJpaAuditing +@SpringBootTest +public abstract class IntegrationTestSupport { + +} diff --git a/src/test/java/com/somemore/SomemoreApplicationTests.java b/src/test/java/com/somemore/SomemoreApplicationTests.java index 024ac3f28..c1b2bc6c2 100644 --- a/src/test/java/com/somemore/SomemoreApplicationTests.java +++ b/src/test/java/com/somemore/SomemoreApplicationTests.java @@ -3,11 +3,11 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; -@SpringBootTest +//@SpringBootTest class SomemoreApplicationTests { - @Test - void contextLoads() { - } +// @Test +// void contextLoads() { +// } } From 4938cb83b1695387737ce9ec7395d6d6769e2874 Mon Sep 17 00:00:00 2001 From: leebs0521 Date: Wed, 20 Nov 2024 22:32:00 +0900 Subject: [PATCH 03/17] =?UTF-8?q?feat(location):=20Location=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0,=20=EB=A0=88=ED=8F=AC=EC=A7=80=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/somemore/Location.java | 26 ------------ .../somemore/location/domain/Location.java | 40 +++++++++++++++++++ .../repository/LocationRepository.java | 8 ++++ 3 files changed, 48 insertions(+), 26 deletions(-) delete mode 100644 src/main/java/com/somemore/Location.java create mode 100644 src/main/java/com/somemore/location/domain/Location.java create mode 100644 src/main/java/com/somemore/location/repository/LocationRepository.java diff --git a/src/main/java/com/somemore/Location.java b/src/main/java/com/somemore/Location.java deleted file mode 100644 index 65a41af32..000000000 --- a/src/main/java/com/somemore/Location.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.somemore; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Entity -public class Location { - @Id - @Column(name = "id", nullable = false) - private Long id; - - @Column(name = "address", nullable = false) - private String address; - - @Column(name = "latitude", nullable = false) - private String latitude; - - @Column(name = "longitude", nullable = false) - private String longitude; - -} \ No newline at end of file diff --git a/src/main/java/com/somemore/location/domain/Location.java b/src/main/java/com/somemore/location/domain/Location.java new file mode 100644 index 000000000..120fbe106 --- /dev/null +++ b/src/main/java/com/somemore/location/domain/Location.java @@ -0,0 +1,40 @@ +package com.somemore.location.domain; + +import static jakarta.persistence.GenerationType.IDENTITY; +import static lombok.AccessLevel.PROTECTED; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = PROTECTED) +@Entity +@Table(name = "location") +public class Location { + + @Id @GeneratedValue(strategy = IDENTITY) + private Long id; + + @Column(name = "address", nullable = false) + private String address; + + @Column(name = "latitude", nullable = false) + private String latitude; + + @Column(name = "longitude", nullable = false) + private String longitude; + + @Builder + public Location(String address, String latitude, String longitude) { + this.address = address; + this.latitude = latitude; + this.longitude = longitude; + } +} \ No newline at end of file diff --git a/src/main/java/com/somemore/location/repository/LocationRepository.java b/src/main/java/com/somemore/location/repository/LocationRepository.java new file mode 100644 index 000000000..e68ae0abc --- /dev/null +++ b/src/main/java/com/somemore/location/repository/LocationRepository.java @@ -0,0 +1,8 @@ +package com.somemore.location.repository; + +import com.somemore.location.domain.Location; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface LocationRepository extends JpaRepository { + +} From 926d2f80bea2fd0c7cd2b5d93e283baba601776c Mon Sep 17 00:00:00 2001 From: leebs0521 Date: Wed, 20 Nov 2024 22:33:17 +0900 Subject: [PATCH 04/17] =?UTF-8?q?feat(location):=20Location=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20usecase=20interface,=20Dto=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EB=B0=8F=20=EA=B5=AC=ED=98=84=EC=B2=B4=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/request/LocationCreateRequestDto.java | 32 +++++++++++++++++++ .../service/CreateLocationService.java | 25 +++++++++++++++ .../usecase/CreateLocationUseCase.java | 9 ++++++ 3 files changed, 66 insertions(+) create mode 100644 src/main/java/com/somemore/location/dto/request/LocationCreateRequestDto.java create mode 100644 src/main/java/com/somemore/location/service/CreateLocationService.java create mode 100644 src/main/java/com/somemore/location/usecase/CreateLocationUseCase.java diff --git a/src/main/java/com/somemore/location/dto/request/LocationCreateRequestDto.java b/src/main/java/com/somemore/location/dto/request/LocationCreateRequestDto.java new file mode 100644 index 000000000..0fef10359 --- /dev/null +++ b/src/main/java/com/somemore/location/dto/request/LocationCreateRequestDto.java @@ -0,0 +1,32 @@ +package com.somemore.location.dto.request; + + +import com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy; +import com.fasterxml.jackson.databind.annotation.JsonNaming; +import com.somemore.location.domain.Location; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Builder; + +@JsonNaming(SnakeCaseStrategy.class) +@Builder +public record LocationCreateRequestDto( + @Schema(description = "도로명 주소", example = "서울특별시 서초구 반포대로 45, 4층(서초동, 명정빌딩)") + @NotBlank(message = "주소는 필수 입력 값입니다.") + String address, + @Schema(description = "주소에 해당하는 위도 정보", example = "37.4845373748015") + @NotBlank(message = "위도는 필수 입력 값입니다.") + String latitude, + @Schema(description = "주소에 해당하는 경도 정보", example = "127.010842267696") + @NotBlank(message = "경도는 필수 입력 값입니다.") + String longitude +) { + + public Location toEntity() { + return Location.builder() + .address(address) + .latitude(latitude) + .longitude(longitude) + .build(); + } +} diff --git a/src/main/java/com/somemore/location/service/CreateLocationService.java b/src/main/java/com/somemore/location/service/CreateLocationService.java new file mode 100644 index 000000000..87787635d --- /dev/null +++ b/src/main/java/com/somemore/location/service/CreateLocationService.java @@ -0,0 +1,25 @@ +package com.somemore.location.service; + +import com.somemore.location.domain.Location; +import com.somemore.location.dto.request.LocationCreateRequestDto; +import com.somemore.location.repository.LocationRepository; +import com.somemore.location.usecase.CreateLocationUseCase; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@RequiredArgsConstructor +@Transactional +@Service +public class CreateLocationService implements CreateLocationUseCase { + + private final LocationRepository locationRepository; + + @Override + public Long createLocation(LocationCreateRequestDto requestDto) { + Location location = requestDto.toEntity(); + locationRepository.save(location); + return location.getId(); + } + +} diff --git a/src/main/java/com/somemore/location/usecase/CreateLocationUseCase.java b/src/main/java/com/somemore/location/usecase/CreateLocationUseCase.java new file mode 100644 index 000000000..68efa7acc --- /dev/null +++ b/src/main/java/com/somemore/location/usecase/CreateLocationUseCase.java @@ -0,0 +1,9 @@ +package com.somemore.location.usecase; + +import com.somemore.location.dto.request.LocationCreateRequestDto; + +public interface CreateLocationUseCase { + + Long createLocation(LocationCreateRequestDto requestDto); + +} From fb111e70d68962de750a28efb8b3a4b0f0990997 Mon Sep 17 00:00:00 2001 From: leebs0521 Date: Wed, 20 Nov 2024 22:33:23 +0900 Subject: [PATCH 05/17] =?UTF-8?q?test(location):=20Location=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EA=B8=B0=EB=8A=A5=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/CreateLocationServiceTest.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/test/java/com/somemore/location/service/CreateLocationServiceTest.java diff --git a/src/test/java/com/somemore/location/service/CreateLocationServiceTest.java b/src/test/java/com/somemore/location/service/CreateLocationServiceTest.java new file mode 100644 index 000000000..0c3e1e265 --- /dev/null +++ b/src/test/java/com/somemore/location/service/CreateLocationServiceTest.java @@ -0,0 +1,50 @@ +package com.somemore.location.service; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +import com.somemore.IntegrationTestSupport; +import com.somemore.location.domain.Location; +import com.somemore.location.dto.request.LocationCreateRequestDto; +import com.somemore.location.repository.LocationRepository; +import java.util.Optional; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +class CreateLocationServiceTest extends IntegrationTestSupport { + + @Autowired + private CreateLocationService createLocationService; + + @Autowired + private LocationRepository locationRepository; + + @AfterEach + void tearDown() { + locationRepository.deleteAllInBatch(); + } + + @DisplayName("위치 생성 정보를 받아 위치를 저장한다") + @Test + void createLocationWithCreateRequestDto() { + // given + LocationCreateRequestDto dto = LocationCreateRequestDto.builder() + .address("위치위치") + .latitude("위도위도") + .longitude("경도경도") + .build(); + + // when + Long locationId = createLocationService.createLocation(dto); + Optional location = locationRepository.findById(locationId); + + // then + assertThat(location.isPresent()).isTrue(); + assertThat(location.get().getId()).isEqualTo(locationId); + + } + + +} \ No newline at end of file From f5d3c11b15d0589ec70e791df69af75604eed584 Mon Sep 17 00:00:00 2001 From: leebs0521 Date: Thu, 21 Nov 2024 00:08:43 +0900 Subject: [PATCH 06/17] =?UTF-8?q?feat(recruit-board):=20recruitBoard=20?= =?UTF-8?q?=EC=97=94=ED=8B=B0=ED=8B=B0=20=EB=B0=8F=20=EB=A0=88=ED=8F=AC?= =?UTF-8?q?=EC=A7=80=ED=86=A0=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/somemore/RecruitBoard.java | 44 ---------- .../recruitboard/domain/RecruitBoard.java | 88 +++++++++++++++++++ .../recruitboard/domain/RecruitStatus.java | 16 ++++ .../recruitboard/domain/VolunteerType.java | 27 ++++++ .../repository/RecruitBoardRepository.java | 8 ++ 5 files changed, 139 insertions(+), 44 deletions(-) delete mode 100644 src/main/java/com/somemore/RecruitBoard.java create mode 100644 src/main/java/com/somemore/recruitboard/domain/RecruitBoard.java create mode 100644 src/main/java/com/somemore/recruitboard/domain/RecruitStatus.java create mode 100644 src/main/java/com/somemore/recruitboard/domain/VolunteerType.java create mode 100644 src/main/java/com/somemore/recruitboard/repository/RecruitBoardRepository.java diff --git a/src/main/java/com/somemore/RecruitBoard.java b/src/main/java/com/somemore/RecruitBoard.java deleted file mode 100644 index 62665b9e5..000000000 --- a/src/main/java/com/somemore/RecruitBoard.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.somemore; - -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; - -import java.time.Instant; -import java.util.UUID; - -@Getter -@Setter -@Entity -@Table(name = "Recruit_board") -public class RecruitBoard { - @Id - @GeneratedValue(strategy = GenerationType.UUID) - private UUID id; - - @Column(name = "title", nullable = false) - private String title; - - @Lob - @Column(name = "content", nullable = false) - private String content; - - @Column(name = "recruit_status", nullable = false, length = 20) - private String recruitStatus; - - @Column(name = "img_url") - private String imgUrl; - - @Column(name = "volunteer_date", nullable = false) - private Instant volunteerDate; - - @Column(name = "volunteer_type", nullable = false, length = 20) - private String volunteerType; - - @Column(name = "volunteer_hours", nullable = false) - private Integer volunteerHours; - - @Column(name = "admitted", nullable = false) - private Boolean admitted = false; - -} \ No newline at end of file diff --git a/src/main/java/com/somemore/recruitboard/domain/RecruitBoard.java b/src/main/java/com/somemore/recruitboard/domain/RecruitBoard.java new file mode 100644 index 000000000..1949ed9f6 --- /dev/null +++ b/src/main/java/com/somemore/recruitboard/domain/RecruitBoard.java @@ -0,0 +1,88 @@ +package com.somemore.recruitboard.domain; + +import static com.somemore.recruitboard.domain.RecruitStatus.RECRUITING; +import static jakarta.persistence.EnumType.STRING; +import static jakarta.persistence.GenerationType.IDENTITY; +import static lombok.AccessLevel.PROTECTED; + +import com.somemore.global.common.BaseEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.Lob; +import jakarta.persistence.Table; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.UUID; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = PROTECTED) +@Entity +@Table(name = "recruit_board") +public class RecruitBoard extends BaseEntity { + + @Id + @GeneratedValue(strategy = IDENTITY) + private Long id; + + @Column(name = "center_id", nullable = false) + private UUID centerId; + + @Column(name = "location_id", nullable = false) + private Long locationId; + + @Column(name = "title", nullable = false) + private String title; + + @Lob + @Column(name = "content", nullable = false) + private String content; + + @Column(name = "region", nullable = false) + private String region; + + @Column(name = "recruitment_count", nullable = false) + private Integer recruitmentCount; + + @Column(name = "img_url", nullable = false) + private String imgUrl; + + @Enumerated(value = STRING) + @Column(name = "recruit_status", nullable = false, length = 20) + private RecruitStatus recruitStatus = RECRUITING; + + @Column(name = "volunteer_date", nullable = false) + private LocalDateTime volunteerDate; + + @Enumerated(value = STRING) + @Column(name = "volunteer_type", nullable = false, length = 30) + private VolunteerType volunteerType; + + @Column(name = "volunteer_hours", nullable = false) + private LocalTime volunteerHours; + + @Column(name = "admitted", nullable = false) + private Boolean admitted; + + @Builder + public RecruitBoard(UUID centerId, Long locationId, String title, String content, String region, + Integer recruitmentCount, String imgUrl, LocalDateTime volunteerDate, + VolunteerType volunteerType, LocalTime volunteerHours, Boolean admitted) { + this.centerId = centerId; + this.locationId = locationId; + this.title = title; + this.content = content; + this.region = region; + this.recruitmentCount = recruitmentCount; + this.imgUrl = imgUrl; + this.volunteerDate = volunteerDate; + this.volunteerType = volunteerType; + this.volunteerHours = volunteerHours; + this.admitted = admitted; + } +} \ No newline at end of file diff --git a/src/main/java/com/somemore/recruitboard/domain/RecruitStatus.java b/src/main/java/com/somemore/recruitboard/domain/RecruitStatus.java new file mode 100644 index 000000000..a10eee42d --- /dev/null +++ b/src/main/java/com/somemore/recruitboard/domain/RecruitStatus.java @@ -0,0 +1,16 @@ +package com.somemore.recruitboard.domain; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum RecruitStatus { + RECRUITING("모집중"), + CLOSED("마감"), + COMPLETED("종료"), + + ; + private final String text; + +} diff --git a/src/main/java/com/somemore/recruitboard/domain/VolunteerType.java b/src/main/java/com/somemore/recruitboard/domain/VolunteerType.java new file mode 100644 index 000000000..65e54601e --- /dev/null +++ b/src/main/java/com/somemore/recruitboard/domain/VolunteerType.java @@ -0,0 +1,27 @@ +package com.somemore.recruitboard.domain; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum VolunteerType { + + LIVING_SUPPORT("생활편의지원"), + HOUSING_ENVIRONMENT("주거환경"), + COUNSELING("상담"), + EDUCATION("교육"), + HEALTHCARE("보건의료"), + RURAL_SUPPORT("농어촌봉사"), + CULTURAL_EVENT("문화행사"), + ENVIRONMENTAL_PROTECTION("환경보호"), + ADMINISTRATIVE_SUPPORT("행정보조"), + SAFETY_PREVENTION("안전예방"), + PUBLIC_INTEREST_HUMAN_RIGHTS("공익인권"), + DISASTER_RELIEF("재해재난"), + MENTORING("멘토링"), + OTHER("기타"), + + ; + private final String text; +} diff --git a/src/main/java/com/somemore/recruitboard/repository/RecruitBoardRepository.java b/src/main/java/com/somemore/recruitboard/repository/RecruitBoardRepository.java new file mode 100644 index 000000000..8544032b0 --- /dev/null +++ b/src/main/java/com/somemore/recruitboard/repository/RecruitBoardRepository.java @@ -0,0 +1,8 @@ +package com.somemore.recruitboard.repository; + +import com.somemore.recruitboard.domain.RecruitBoard; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface RecruitBoardRepository extends JpaRepository { + +} From 6c593c9263e9aeb9b7878f6961049d90ac3c1b31 Mon Sep 17 00:00:00 2001 From: leebs0521 Date: Thu, 21 Nov 2024 00:10:13 +0900 Subject: [PATCH 07/17] =?UTF-8?q?feat(recruit-board):=20recruitBoard=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20UseCase,=20Dto=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EB=B0=8F=20Service=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../request/RecruitBoardCreateRequestDto.java | 65 +++++++++++++++++++ .../service/CreateRecruitBoardService.java | 36 ++++++++++ .../usecase/CreateRecruitBoardUseCase.java | 9 +++ 3 files changed, 110 insertions(+) create mode 100644 src/main/java/com/somemore/recruitboard/dto/request/RecruitBoardCreateRequestDto.java create mode 100644 src/main/java/com/somemore/recruitboard/service/CreateRecruitBoardService.java create mode 100644 src/main/java/com/somemore/recruitboard/usecase/CreateRecruitBoardUseCase.java diff --git a/src/main/java/com/somemore/recruitboard/dto/request/RecruitBoardCreateRequestDto.java b/src/main/java/com/somemore/recruitboard/dto/request/RecruitBoardCreateRequestDto.java new file mode 100644 index 000000000..f419f9b5e --- /dev/null +++ b/src/main/java/com/somemore/recruitboard/dto/request/RecruitBoardCreateRequestDto.java @@ -0,0 +1,65 @@ +package com.somemore.recruitboard.dto.request; + +import com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy; +import com.fasterxml.jackson.databind.annotation.JsonNaming; +import com.somemore.location.dto.request.LocationCreateRequestDto; +import com.somemore.recruitboard.domain.RecruitBoard; +import com.somemore.recruitboard.domain.VolunteerType; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.UUID; +import lombok.Builder; + +@JsonNaming(SnakeCaseStrategy.class) +@Builder +public record RecruitBoardCreateRequestDto( + @Schema(description = "봉사 모집글 제목", example = "서울 청계천 환경 미화 봉사 모집") + @NotBlank(message = "모집글 제목은 필수 값입니다.") + String title, + @Schema(description = "봉사 모집글 내용", example = "서울 청계천 주변 환경 미화 봉사 모집합니다.
") + @NotBlank(message = "모집글 내용은 필수 값입니다.") + String content, + @Schema(description = "봉사 지역", example = "서울") + @NotBlank(message = "봉사 지역은 필수 값입니다.") + String region, + @Schema(description = "예상 모집 인원", example = "4") + @NotNull(message = "예상 모집 인원은 필수 값입니다.") + Integer recruitmentCount, + @Schema(description = "봉사 일시", example = "2024-11-20T10:00:00") + @NotNull(message = "봉사 일시는 필수 값입니다.") + LocalDateTime volunteerDate, + @Schema(description = "봉사 활동 유형", example = "ENVIRONMENTAL_PROTECTION") + @NotNull(message = "봉사 활동 유형은 필수 값입니다.") + VolunteerType volunteerType, + @Schema(description = "봉사 시간(시)", example = "1") + @Positive(message = "봉사 시간(시)은 1이상 이어야 합니다.") + Integer volunteerHours, + @Schema(description = "봉사 시간(분)", example = "30") + @Positive(message = "봉사 시간(분)은 1이상 이어야 합니다.") + Integer volunteerMinutes, + @Schema(description = "봉사 시간 인정 여부", example = "true") + @NotNull(message = "시간 인정 여부는 필수 값입니다.") + Boolean admitted, + @NotNull(message = "위치 정보는 필수 값입니다.") + LocationCreateRequestDto location +){ + public RecruitBoard toEntity(UUID centerId, Long locationId, String imgUrl) { + return RecruitBoard.builder() + .centerId(centerId) + .locationId(locationId) + .title(title) + .content(content) + .region(region) + .recruitmentCount(recruitmentCount) + .imgUrl(imgUrl) + .volunteerDate(volunteerDate) + .volunteerType(volunteerType) + .volunteerHours(LocalTime.of(volunteerHours, volunteerMinutes)) + .admitted(admitted) + .build(); + } +} diff --git a/src/main/java/com/somemore/recruitboard/service/CreateRecruitBoardService.java b/src/main/java/com/somemore/recruitboard/service/CreateRecruitBoardService.java new file mode 100644 index 000000000..a848b771a --- /dev/null +++ b/src/main/java/com/somemore/recruitboard/service/CreateRecruitBoardService.java @@ -0,0 +1,36 @@ +package com.somemore.recruitboard.service; + +import com.somemore.location.usecase.CreateLocationUseCase; +import com.somemore.recruitboard.domain.RecruitBoard; +import com.somemore.recruitboard.dto.request.RecruitBoardCreateRequestDto; +import com.somemore.recruitboard.repository.RecruitBoardRepository; +import com.somemore.recruitboard.usecase.CreateRecruitBoardUseCase; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + + +@RequiredArgsConstructor +@Transactional +@Service +public class CreateRecruitBoardService implements CreateRecruitBoardUseCase { + + private final RecruitBoardRepository recruitBoardRepository; + private final CreateLocationUseCase createLocationUseCase; + + @Override + public Long createRecruitBoard( + RecruitBoardCreateRequestDto requestDto, + UUID centerId, + String imgUrl + ) { + Long locationId = createLocationUseCase.createLocation(requestDto.location()); + RecruitBoard recruitBoard = requestDto.toEntity(centerId, locationId, imgUrl); + + recruitBoardRepository.save(recruitBoard); + + return recruitBoard.getId(); + } + +} diff --git a/src/main/java/com/somemore/recruitboard/usecase/CreateRecruitBoardUseCase.java b/src/main/java/com/somemore/recruitboard/usecase/CreateRecruitBoardUseCase.java new file mode 100644 index 000000000..8c72a3080 --- /dev/null +++ b/src/main/java/com/somemore/recruitboard/usecase/CreateRecruitBoardUseCase.java @@ -0,0 +1,9 @@ +package com.somemore.recruitboard.usecase; + +import com.somemore.recruitboard.dto.request.RecruitBoardCreateRequestDto; +import java.util.UUID; + +public interface CreateRecruitBoardUseCase { + + Long createRecruitBoard(RecruitBoardCreateRequestDto requestDto, UUID centerId, String imgUrl); +} From 69f47feac6afc5e68cc8c14e39a6e6d4f6ddaa0f Mon Sep 17 00:00:00 2001 From: leebs0521 Date: Thu, 21 Nov 2024 00:10:27 +0900 Subject: [PATCH 08/17] =?UTF-8?q?test(recruit-board):=20recruitBoard=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EA=B8=B0=EB=8A=A5=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/CreateLocationServiceTest.java | 1 - .../recruitboard/domain/RecruitBoardTest.java | 39 ++++++++++ .../CreateRecruitBoardServiceTest.java | 76 +++++++++++++++++++ 3 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/somemore/recruitboard/domain/RecruitBoardTest.java create mode 100644 src/test/java/com/somemore/recruitboard/service/CreateRecruitBoardServiceTest.java diff --git a/src/test/java/com/somemore/location/service/CreateLocationServiceTest.java b/src/test/java/com/somemore/location/service/CreateLocationServiceTest.java index 0c3e1e265..1e1bcc28d 100644 --- a/src/test/java/com/somemore/location/service/CreateLocationServiceTest.java +++ b/src/test/java/com/somemore/location/service/CreateLocationServiceTest.java @@ -1,7 +1,6 @@ package com.somemore.location.service; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; import com.somemore.IntegrationTestSupport; import com.somemore.location.domain.Location; diff --git a/src/test/java/com/somemore/recruitboard/domain/RecruitBoardTest.java b/src/test/java/com/somemore/recruitboard/domain/RecruitBoardTest.java new file mode 100644 index 000000000..3e6939ea3 --- /dev/null +++ b/src/test/java/com/somemore/recruitboard/domain/RecruitBoardTest.java @@ -0,0 +1,39 @@ +package com.somemore.recruitboard.domain; + +import static com.somemore.recruitboard.domain.RecruitStatus.RECRUITING; +import static com.somemore.recruitboard.domain.VolunteerType.OTHER; +import static org.assertj.core.api.Assertions.assertThat; + +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.UUID; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class RecruitBoardTest { + + @DisplayName("봉사 모집글 생성시 모집상태는 모집중이다") + @Test + void CreateRecruitBoardWithDefaultStatus() { + // given + RecruitBoard board = RecruitBoard.builder() + .centerId(UUID.randomUUID()) + .locationId(1L) + .title("봉사모집제목") + .content("봉사모집내용") + .region("경기") + .recruitmentCount(10) + .imgUrl("https://image.domain.com/links") + .volunteerDate(LocalDateTime.now()) + .volunteerType(OTHER) + .volunteerHours(LocalTime.of(7, 30)) + .admitted(true) + .build(); + + // when + RecruitStatus recruitStatus = board.getRecruitStatus(); + + // then + assertThat(recruitStatus).isEqualTo(RECRUITING); + } +} \ No newline at end of file diff --git a/src/test/java/com/somemore/recruitboard/service/CreateRecruitBoardServiceTest.java b/src/test/java/com/somemore/recruitboard/service/CreateRecruitBoardServiceTest.java new file mode 100644 index 000000000..47779b42c --- /dev/null +++ b/src/test/java/com/somemore/recruitboard/service/CreateRecruitBoardServiceTest.java @@ -0,0 +1,76 @@ +package com.somemore.recruitboard.service; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.somemore.IntegrationTestSupport; +import com.somemore.location.dto.request.LocationCreateRequestDto; +import com.somemore.location.repository.LocationRepository; +import com.somemore.recruitboard.domain.RecruitBoard; +import com.somemore.recruitboard.domain.VolunteerType; +import com.somemore.recruitboard.dto.request.RecruitBoardCreateRequestDto; +import com.somemore.recruitboard.repository.RecruitBoardRepository; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.Optional; +import java.util.UUID; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +class CreateRecruitBoardServiceTest extends IntegrationTestSupport { + + @Autowired + private CreateRecruitBoardService createRecruitBoardService; + + @Autowired + private RecruitBoardRepository recruitBoardRepository; + + @Autowired + private LocationRepository locationRepository; + + @AfterEach + void tearDown() { + recruitBoardRepository.deleteAllInBatch(); + locationRepository.deleteAllInBatch(); + } + + @DisplayName("봉사 모집글 생성 정보로 모집글을 저장한다") + @Test + void createRecruitBoardWithDto() { + // given + LocationCreateRequestDto locationDto = LocationCreateRequestDto.builder() + .address("도로명 주소 33") + .latitude("위도 정보") + .longitude("경도 정보") + .build(); + + RecruitBoardCreateRequestDto dto = RecruitBoardCreateRequestDto.builder() + .title("봉사 모집글 작성") + .content("봉사 하실분을 모집합니다.
") + .region("지역") + .recruitmentCount(10) + .volunteerDate(LocalDateTime.now()) + .volunteerType(VolunteerType.OTHER) + .volunteerHours(1) + .volunteerMinutes(30) + .admitted(true) + .location(locationDto) + .build(); + + UUID centerId = UUID.randomUUID(); + String imgUrl = "https://image.domain.com/links"; + + // when + Long saveId = createRecruitBoardService.createRecruitBoard(dto, centerId, imgUrl); + Optional recruitBoard = recruitBoardRepository.findById(saveId); + + // then + assertThat(recruitBoard.isPresent()).isTrue(); + assertThat(recruitBoard.get().getId()).isEqualTo(saveId); + assertThat(recruitBoard.get().getCenterId()).isEqualTo(centerId); + assertThat(recruitBoard.get().getImgUrl()).isEqualTo(imgUrl); + assertThat(recruitBoard.get().getVolunteerHours()).isEqualTo(LocalTime.of(1, 30)); + } + +} \ No newline at end of file From 9613cd00ecc0b054ca3ac3157a08b839d237837e Mon Sep 17 00:00:00 2001 From: leebs0521 Date: Thu, 21 Nov 2024 00:12:08 +0900 Subject: [PATCH 09/17] =?UTF-8?q?chore:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20import=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/com/somemore/SomemoreApplicationTests.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/test/java/com/somemore/SomemoreApplicationTests.java b/src/test/java/com/somemore/SomemoreApplicationTests.java index c1b2bc6c2..35501d59f 100644 --- a/src/test/java/com/somemore/SomemoreApplicationTests.java +++ b/src/test/java/com/somemore/SomemoreApplicationTests.java @@ -1,8 +1,5 @@ package com.somemore; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - //@SpringBootTest class SomemoreApplicationTests { From 23c0cd686f29c4ce1236f0ed0032bf9edcb3cbfe Mon Sep 17 00:00:00 2001 From: leebs0521 Date: Thu, 21 Nov 2024 10:03:18 +0900 Subject: [PATCH 10/17] =?UTF-8?q?refactor(location):=20BaseEntity=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20import=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/somemore/location/domain/Location.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/somemore/location/domain/Location.java b/src/main/java/com/somemore/location/domain/Location.java index 120fbe106..6b283ff93 100644 --- a/src/main/java/com/somemore/location/domain/Location.java +++ b/src/main/java/com/somemore/location/domain/Location.java @@ -3,10 +3,10 @@ import static jakarta.persistence.GenerationType.IDENTITY; import static lombok.AccessLevel.PROTECTED; +import com.somemore.global.common.BaseEntity; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.Table; import lombok.Builder; @@ -17,9 +17,10 @@ @NoArgsConstructor(access = PROTECTED) @Entity @Table(name = "location") -public class Location { +public class Location extends BaseEntity { - @Id @GeneratedValue(strategy = IDENTITY) + @Id + @GeneratedValue(strategy = IDENTITY) private Long id; @Column(name = "address", nullable = false) From 4629198b39e2a4402512b76f427a5c4399095a13 Mon Sep 17 00:00:00 2001 From: leebs0521 Date: Thu, 21 Nov 2024 10:04:20 +0900 Subject: [PATCH 11/17] =?UTF-8?q?fix:=20WARNING=20=EB=B0=9C=EC=83=9D=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.gradle b/build.gradle index ca652bb9c..5831e7b7d 100644 --- a/build.gradle +++ b/build.gradle @@ -64,4 +64,6 @@ dependencies { tasks.named('test') { useJUnitPlatform() + jvmArgs("-XX:+EnableDynamicAgentLoading") } + From cd7c862102d2e58a5703387de7b5020b5e6daaa8 Mon Sep 17 00:00:00 2001 From: leebs0521 Date: Thu, 21 Nov 2024 10:05:48 +0900 Subject: [PATCH 12/17] =?UTF-8?q?chore:=20=EA=B8=B0=EB=B3=B8=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/somemore/SomemoreApplicationTests.java | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 src/test/java/com/somemore/SomemoreApplicationTests.java diff --git a/src/test/java/com/somemore/SomemoreApplicationTests.java b/src/test/java/com/somemore/SomemoreApplicationTests.java deleted file mode 100644 index 35501d59f..000000000 --- a/src/test/java/com/somemore/SomemoreApplicationTests.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.somemore; - -//@SpringBootTest -class SomemoreApplicationTests { - -// @Test -// void contextLoads() { -// } - -} From c2ca94446b7c2e612e8fd043bf160f12e73773a5 Mon Sep 17 00:00:00 2001 From: leebs0521 Date: Thu, 21 Nov 2024 10:08:13 +0900 Subject: [PATCH 13/17] =?UTF-8?q?refactor(location,=20recruit-board):=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../somemore/location/service/CreateLocationServiceTest.java | 4 ++-- .../recruitboard/service/CreateRecruitBoardServiceTest.java | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/somemore/location/service/CreateLocationServiceTest.java b/src/test/java/com/somemore/location/service/CreateLocationServiceTest.java index 1e1bcc28d..72bebb89b 100644 --- a/src/test/java/com/somemore/location/service/CreateLocationServiceTest.java +++ b/src/test/java/com/somemore/location/service/CreateLocationServiceTest.java @@ -37,10 +37,10 @@ void createLocationWithCreateRequestDto() { // when Long locationId = createLocationService.createLocation(dto); - Optional location = locationRepository.findById(locationId); // then - assertThat(location.isPresent()).isTrue(); + Optional location = locationRepository.findById(locationId); + assertThat(location).isPresent(); assertThat(location.get().getId()).isEqualTo(locationId); } diff --git a/src/test/java/com/somemore/recruitboard/service/CreateRecruitBoardServiceTest.java b/src/test/java/com/somemore/recruitboard/service/CreateRecruitBoardServiceTest.java index 47779b42c..3bc446178 100644 --- a/src/test/java/com/somemore/recruitboard/service/CreateRecruitBoardServiceTest.java +++ b/src/test/java/com/somemore/recruitboard/service/CreateRecruitBoardServiceTest.java @@ -63,10 +63,11 @@ void createRecruitBoardWithDto() { // when Long saveId = createRecruitBoardService.createRecruitBoard(dto, centerId, imgUrl); - Optional recruitBoard = recruitBoardRepository.findById(saveId); // then - assertThat(recruitBoard.isPresent()).isTrue(); + Optional recruitBoard = recruitBoardRepository.findById(saveId); + + assertThat(recruitBoard).isPresent(); assertThat(recruitBoard.get().getId()).isEqualTo(saveId); assertThat(recruitBoard.get().getCenterId()).isEqualTo(centerId); assertThat(recruitBoard.get().getImgUrl()).isEqualTo(imgUrl); From 2bcd131ef92bc1cdee787a52fad336a9b3bfd787 Mon Sep 17 00:00:00 2001 From: leebs0521 Date: Thu, 21 Nov 2024 11:18:33 +0900 Subject: [PATCH 14/17] =?UTF-8?q?feat(location):=20=EC=9C=84=EB=8F=84=20?= =?UTF-8?q?=EA=B2=BD=EB=8F=84=20=EC=9E=90=EB=A3=8C=ED=98=95=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=20-=20String=20->=20Decimal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/somemore/location/domain/Location.java | 11 ++++++----- .../dto/request/LocationCreateRequestDto.java | 17 +++++++++++++---- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/somemore/location/domain/Location.java b/src/main/java/com/somemore/location/domain/Location.java index 6b283ff93..3ac082619 100644 --- a/src/main/java/com/somemore/location/domain/Location.java +++ b/src/main/java/com/somemore/location/domain/Location.java @@ -9,6 +9,7 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import jakarta.persistence.Table; +import java.math.BigDecimal; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -26,14 +27,14 @@ public class Location extends BaseEntity { @Column(name = "address", nullable = false) private String address; - @Column(name = "latitude", nullable = false) - private String latitude; + @Column(name = "latitude", nullable = false, precision = 11, scale = 8) + private BigDecimal latitude; - @Column(name = "longitude", nullable = false) - private String longitude; + @Column(name = "longitude", nullable = false, precision = 12, scale = 8) + private BigDecimal longitude; @Builder - public Location(String address, String latitude, String longitude) { + public Location(String address, BigDecimal latitude, BigDecimal longitude) { this.address = address; this.latitude = latitude; this.longitude = longitude; diff --git a/src/main/java/com/somemore/location/dto/request/LocationCreateRequestDto.java b/src/main/java/com/somemore/location/dto/request/LocationCreateRequestDto.java index 0fef10359..7344e1e40 100644 --- a/src/main/java/com/somemore/location/dto/request/LocationCreateRequestDto.java +++ b/src/main/java/com/somemore/location/dto/request/LocationCreateRequestDto.java @@ -5,7 +5,11 @@ import com.fasterxml.jackson.databind.annotation.JsonNaming; import com.somemore.location.domain.Location; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.DecimalMax; +import jakarta.validation.constraints.DecimalMin; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import java.math.BigDecimal; import lombok.Builder; @JsonNaming(SnakeCaseStrategy.class) @@ -15,11 +19,16 @@ public record LocationCreateRequestDto( @NotBlank(message = "주소는 필수 입력 값입니다.") String address, @Schema(description = "주소에 해당하는 위도 정보", example = "37.4845373748015") - @NotBlank(message = "위도는 필수 입력 값입니다.") - String latitude, + @NotNull(message = "위도는 필수 입력 값입니다.") + @DecimalMin(value = "33", message = "위도는 33도 이상이어야 합니다.") + @DecimalMax(value = "39", message = "위도는 38도 이하이어야 합니다.") + BigDecimal latitude, + @Schema(description = "주소에 해당하는 경도 정보", example = "127.010842267696") - @NotBlank(message = "경도는 필수 입력 값입니다.") - String longitude + @NotNull(message = "경도는 필수 입력 값입니다.") + @DecimalMin(value = "124", message = "경도는 124도 이상이어야 합니다.") + @DecimalMax(value = "132", message = "경도는 132도 이하이어야 합니다.") + BigDecimal longitude ) { public Location toEntity() { From 8eb4a2a499fac14d63b72c3857e78f81f68e898f Mon Sep 17 00:00:00 2001 From: leebs0521 Date: Thu, 21 Nov 2024 11:18:52 +0900 Subject: [PATCH 15/17] =?UTF-8?q?test(location):=20=EC=9C=84=EB=8F=84=20?= =?UTF-8?q?=EA=B2=BD=EB=8F=84=20=EC=9E=90=EB=A3=8C=ED=98=95=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=EC=97=90=20=EB=94=B0=EB=A5=B8=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=9E=91=EC=84=B1=20=EB=B0=8F=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=20=20-=20String=20->=20Decimal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/LocationRepositoryTest.java | 64 +++++++++++++++++++ .../service/CreateLocationServiceTest.java | 5 +- .../CreateRecruitBoardServiceTest.java | 5 +- 3 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 src/test/java/com/somemore/location/repository/LocationRepositoryTest.java diff --git a/src/test/java/com/somemore/location/repository/LocationRepositoryTest.java b/src/test/java/com/somemore/location/repository/LocationRepositoryTest.java new file mode 100644 index 000000000..372b7a3c5 --- /dev/null +++ b/src/test/java/com/somemore/location/repository/LocationRepositoryTest.java @@ -0,0 +1,64 @@ +package com.somemore.location.repository; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.somemore.IntegrationTestSupport; +import com.somemore.location.domain.Location; +import java.math.BigDecimal; +import java.math.RoundingMode; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +class LocationRepositoryTest extends IntegrationTestSupport { + + @Autowired + private LocationRepository locationRepository; + + @AfterEach + void tearDown() { + locationRepository.deleteAllInBatch(); + } + + @Test + @DisplayName("위도와 경도는 각각 소수점 8자리까지 반올림되어 저장된다.") + void testLocationPrecisionWithRound() { + // given + Location locationWithRound = Location.builder() + .address("서울특별시 서초구 반포대로 45, 4층(서초동, 명정빌딩)") + .latitude( + new BigDecimal("37.484537379").setScale(8, RoundingMode.HALF_UP)) // 9자리 반올림 + .longitude( + new BigDecimal("127.010842349").setScale(8, RoundingMode.HALF_UP)) // 9자리 반올림 + .build(); + + // when + Location savedLocation = locationRepository.save(locationWithRound); + + // then + assertThat(savedLocation.getLatitude()).isEqualTo(new BigDecimal("37.48453738")); + assertThat(savedLocation.getLongitude()).isEqualTo(new BigDecimal("127.01084235")); + } + + @Test + @DisplayName("위도와 경도는 각각 소수점 8자리까지 정밀도를 보장하여 큰 값도 반올림한다.") + void testLocationPrecisionWithLargeValues() { + + // given + Location locationWithLargeValues = Location.builder() + .address("서울특별시 서초구 반포대로 45, 4층(서초동, 명정빌딩)") + .latitude( + new BigDecimal("89.999999999").setScale(8, RoundingMode.HALF_UP)) // 9자리 + .longitude( + new BigDecimal("179.999999999").setScale(8, RoundingMode.HALF_UP)) // 9자리 + .build(); + + // when + Location savedLocation = locationRepository.save(locationWithLargeValues); + + // then + assertThat(savedLocation.getLatitude()).isEqualTo(new BigDecimal("90.00000000")); + assertThat(savedLocation.getLongitude()).isEqualTo(new BigDecimal("180.00000000")); + } +} \ No newline at end of file diff --git a/src/test/java/com/somemore/location/service/CreateLocationServiceTest.java b/src/test/java/com/somemore/location/service/CreateLocationServiceTest.java index 72bebb89b..9242ac451 100644 --- a/src/test/java/com/somemore/location/service/CreateLocationServiceTest.java +++ b/src/test/java/com/somemore/location/service/CreateLocationServiceTest.java @@ -6,6 +6,7 @@ import com.somemore.location.domain.Location; import com.somemore.location.dto.request.LocationCreateRequestDto; import com.somemore.location.repository.LocationRepository; +import java.math.BigDecimal; import java.util.Optional; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; @@ -31,8 +32,8 @@ void createLocationWithCreateRequestDto() { // given LocationCreateRequestDto dto = LocationCreateRequestDto.builder() .address("위치위치") - .latitude("위도위도") - .longitude("경도경도") + .latitude(BigDecimal.valueOf(37.4845373748015)) + .longitude(BigDecimal.valueOf(127.010842267696)) .build(); // when diff --git a/src/test/java/com/somemore/recruitboard/service/CreateRecruitBoardServiceTest.java b/src/test/java/com/somemore/recruitboard/service/CreateRecruitBoardServiceTest.java index 3bc446178..c3d7ad242 100644 --- a/src/test/java/com/somemore/recruitboard/service/CreateRecruitBoardServiceTest.java +++ b/src/test/java/com/somemore/recruitboard/service/CreateRecruitBoardServiceTest.java @@ -9,6 +9,7 @@ import com.somemore.recruitboard.domain.VolunteerType; import com.somemore.recruitboard.dto.request.RecruitBoardCreateRequestDto; import com.somemore.recruitboard.repository.RecruitBoardRepository; +import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.LocalTime; import java.util.Optional; @@ -41,8 +42,8 @@ void createRecruitBoardWithDto() { // given LocationCreateRequestDto locationDto = LocationCreateRequestDto.builder() .address("도로명 주소 33") - .latitude("위도 정보") - .longitude("경도 정보") + .latitude(BigDecimal.valueOf(37.4845373748015)) + .longitude(BigDecimal.valueOf(127.010842267696)) .build(); RecruitBoardCreateRequestDto dto = RecruitBoardCreateRequestDto.builder() From 9ed48e62912d136d64987d8a4d4d02720d34f7d7 Mon Sep 17 00:00:00 2001 From: leebs0521 Date: Thu, 21 Nov 2024 11:34:00 +0900 Subject: [PATCH 16/17] =?UTF-8?q?refactor:=20usecase,=20service=20?= =?UTF-8?q?=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=84=B8=EB=B6=84=ED=99=94=20=20?= =?UTF-8?q?-=20command=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=ED=95=98=EC=9C=84?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/{ => command}/CreateLocationService.java | 4 ++-- .../usecase/{ => command}/CreateLocationUseCase.java | 2 +- .../service/{ => command}/CreateRecruitBoardService.java | 6 +++--- .../usecase/{ => command}/CreateRecruitBoardUseCase.java | 2 +- .../service/{ => command}/CreateLocationServiceTest.java | 3 ++- .../{ => command}/CreateRecruitBoardServiceTest.java | 3 ++- 6 files changed, 11 insertions(+), 9 deletions(-) rename src/main/java/com/somemore/location/service/{ => command}/CreateLocationService.java (86%) rename src/main/java/com/somemore/location/usecase/{ => command}/CreateLocationUseCase.java (78%) rename src/main/java/com/somemore/recruitboard/service/{ => command}/CreateRecruitBoardService.java (84%) rename src/main/java/com/somemore/recruitboard/usecase/{ => command}/CreateRecruitBoardUseCase.java (82%) rename src/test/java/com/somemore/location/service/{ => command}/CreateLocationServiceTest.java (92%) rename src/test/java/com/somemore/recruitboard/service/{ => command}/CreateRecruitBoardServiceTest.java (95%) diff --git a/src/main/java/com/somemore/location/service/CreateLocationService.java b/src/main/java/com/somemore/location/service/command/CreateLocationService.java similarity index 86% rename from src/main/java/com/somemore/location/service/CreateLocationService.java rename to src/main/java/com/somemore/location/service/command/CreateLocationService.java index 87787635d..5b927ed86 100644 --- a/src/main/java/com/somemore/location/service/CreateLocationService.java +++ b/src/main/java/com/somemore/location/service/command/CreateLocationService.java @@ -1,9 +1,9 @@ -package com.somemore.location.service; +package com.somemore.location.service.command; import com.somemore.location.domain.Location; import com.somemore.location.dto.request.LocationCreateRequestDto; import com.somemore.location.repository.LocationRepository; -import com.somemore.location.usecase.CreateLocationUseCase; +import com.somemore.location.usecase.command.CreateLocationUseCase; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/com/somemore/location/usecase/CreateLocationUseCase.java b/src/main/java/com/somemore/location/usecase/command/CreateLocationUseCase.java similarity index 78% rename from src/main/java/com/somemore/location/usecase/CreateLocationUseCase.java rename to src/main/java/com/somemore/location/usecase/command/CreateLocationUseCase.java index 68efa7acc..199cf4f15 100644 --- a/src/main/java/com/somemore/location/usecase/CreateLocationUseCase.java +++ b/src/main/java/com/somemore/location/usecase/command/CreateLocationUseCase.java @@ -1,4 +1,4 @@ -package com.somemore.location.usecase; +package com.somemore.location.usecase.command; import com.somemore.location.dto.request.LocationCreateRequestDto; diff --git a/src/main/java/com/somemore/recruitboard/service/CreateRecruitBoardService.java b/src/main/java/com/somemore/recruitboard/service/command/CreateRecruitBoardService.java similarity index 84% rename from src/main/java/com/somemore/recruitboard/service/CreateRecruitBoardService.java rename to src/main/java/com/somemore/recruitboard/service/command/CreateRecruitBoardService.java index a848b771a..c53f1f4d6 100644 --- a/src/main/java/com/somemore/recruitboard/service/CreateRecruitBoardService.java +++ b/src/main/java/com/somemore/recruitboard/service/command/CreateRecruitBoardService.java @@ -1,10 +1,10 @@ -package com.somemore.recruitboard.service; +package com.somemore.recruitboard.service.command; -import com.somemore.location.usecase.CreateLocationUseCase; +import com.somemore.location.usecase.command.CreateLocationUseCase; import com.somemore.recruitboard.domain.RecruitBoard; import com.somemore.recruitboard.dto.request.RecruitBoardCreateRequestDto; import com.somemore.recruitboard.repository.RecruitBoardRepository; -import com.somemore.recruitboard.usecase.CreateRecruitBoardUseCase; +import com.somemore.recruitboard.usecase.command.CreateRecruitBoardUseCase; import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/somemore/recruitboard/usecase/CreateRecruitBoardUseCase.java b/src/main/java/com/somemore/recruitboard/usecase/command/CreateRecruitBoardUseCase.java similarity index 82% rename from src/main/java/com/somemore/recruitboard/usecase/CreateRecruitBoardUseCase.java rename to src/main/java/com/somemore/recruitboard/usecase/command/CreateRecruitBoardUseCase.java index 8c72a3080..4a938aee7 100644 --- a/src/main/java/com/somemore/recruitboard/usecase/CreateRecruitBoardUseCase.java +++ b/src/main/java/com/somemore/recruitboard/usecase/command/CreateRecruitBoardUseCase.java @@ -1,4 +1,4 @@ -package com.somemore.recruitboard.usecase; +package com.somemore.recruitboard.usecase.command; import com.somemore.recruitboard.dto.request.RecruitBoardCreateRequestDto; import java.util.UUID; diff --git a/src/test/java/com/somemore/location/service/CreateLocationServiceTest.java b/src/test/java/com/somemore/location/service/command/CreateLocationServiceTest.java similarity index 92% rename from src/test/java/com/somemore/location/service/CreateLocationServiceTest.java rename to src/test/java/com/somemore/location/service/command/CreateLocationServiceTest.java index 9242ac451..b0d6f4c31 100644 --- a/src/test/java/com/somemore/location/service/CreateLocationServiceTest.java +++ b/src/test/java/com/somemore/location/service/command/CreateLocationServiceTest.java @@ -1,4 +1,4 @@ -package com.somemore.location.service; +package com.somemore.location.service.command; import static org.assertj.core.api.Assertions.assertThat; @@ -6,6 +6,7 @@ import com.somemore.location.domain.Location; import com.somemore.location.dto.request.LocationCreateRequestDto; import com.somemore.location.repository.LocationRepository; +import com.somemore.location.service.command.CreateLocationService; import java.math.BigDecimal; import java.util.Optional; import org.junit.jupiter.api.AfterEach; diff --git a/src/test/java/com/somemore/recruitboard/service/CreateRecruitBoardServiceTest.java b/src/test/java/com/somemore/recruitboard/service/command/CreateRecruitBoardServiceTest.java similarity index 95% rename from src/test/java/com/somemore/recruitboard/service/CreateRecruitBoardServiceTest.java rename to src/test/java/com/somemore/recruitboard/service/command/CreateRecruitBoardServiceTest.java index c3d7ad242..590b0a365 100644 --- a/src/test/java/com/somemore/recruitboard/service/CreateRecruitBoardServiceTest.java +++ b/src/test/java/com/somemore/recruitboard/service/command/CreateRecruitBoardServiceTest.java @@ -1,4 +1,4 @@ -package com.somemore.recruitboard.service; +package com.somemore.recruitboard.service.command; import static org.assertj.core.api.Assertions.assertThat; @@ -9,6 +9,7 @@ import com.somemore.recruitboard.domain.VolunteerType; import com.somemore.recruitboard.dto.request.RecruitBoardCreateRequestDto; import com.somemore.recruitboard.repository.RecruitBoardRepository; +import com.somemore.recruitboard.service.command.CreateRecruitBoardService; import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.LocalTime; From 2841533f54cec13f8fdc2c836ff9f415b7e0a448 Mon Sep 17 00:00:00 2001 From: leebs0521 Date: Thu, 21 Nov 2024 11:37:04 +0900 Subject: [PATCH 17/17] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20import=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../location/service/command/CreateLocationServiceTest.java | 1 - .../service/command/CreateRecruitBoardServiceTest.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/test/java/com/somemore/location/service/command/CreateLocationServiceTest.java b/src/test/java/com/somemore/location/service/command/CreateLocationServiceTest.java index b0d6f4c31..e0d85fd56 100644 --- a/src/test/java/com/somemore/location/service/command/CreateLocationServiceTest.java +++ b/src/test/java/com/somemore/location/service/command/CreateLocationServiceTest.java @@ -6,7 +6,6 @@ import com.somemore.location.domain.Location; import com.somemore.location.dto.request.LocationCreateRequestDto; import com.somemore.location.repository.LocationRepository; -import com.somemore.location.service.command.CreateLocationService; import java.math.BigDecimal; import java.util.Optional; import org.junit.jupiter.api.AfterEach; diff --git a/src/test/java/com/somemore/recruitboard/service/command/CreateRecruitBoardServiceTest.java b/src/test/java/com/somemore/recruitboard/service/command/CreateRecruitBoardServiceTest.java index 590b0a365..ba525cbcd 100644 --- a/src/test/java/com/somemore/recruitboard/service/command/CreateRecruitBoardServiceTest.java +++ b/src/test/java/com/somemore/recruitboard/service/command/CreateRecruitBoardServiceTest.java @@ -9,7 +9,6 @@ import com.somemore.recruitboard.domain.VolunteerType; import com.somemore.recruitboard.dto.request.RecruitBoardCreateRequestDto; import com.somemore.recruitboard.repository.RecruitBoardRepository; -import com.somemore.recruitboard.service.command.CreateRecruitBoardService; import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.LocalTime;