From 4e5f32143106fc859acdd6bcc6a35811df2f313b Mon Sep 17 00:00:00 2001 From: tinon1004 Date: Sat, 2 Mar 2024 05:17:59 +0900 Subject: [PATCH 01/17] =?UTF-8?q?feat:=20#62=20=EA=B3=B5=EC=97=B0=EC=9E=A5?= =?UTF-8?q?=20entity=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../constant/ConcertHallProgressStatus.java | 15 +++ .../concert_hall/dto/ConcertHallImageDto.java | 25 ++++ .../concert_hall/entity/ConcertHall.java | 113 ++++++++++++++++++ .../entity/ConcertHallHashtag.java | 39 ++++++ .../entity/ConcertHallHashtags.java | 29 +++++ .../concert_hall/entity/ConcertHallImage.java | 46 +++++++ .../entity/ConcertHallImages.java | 30 +++++ 7 files changed, 297 insertions(+) create mode 100644 src/main/java/com/ajou/hertz/domain/concert_hall/constant/ConcertHallProgressStatus.java create mode 100644 src/main/java/com/ajou/hertz/domain/concert_hall/dto/ConcertHallImageDto.java create mode 100644 src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java create mode 100644 src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHallHashtag.java create mode 100644 src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHallHashtags.java create mode 100644 src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHallImage.java create mode 100644 src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHallImages.java diff --git a/src/main/java/com/ajou/hertz/domain/concert_hall/constant/ConcertHallProgressStatus.java b/src/main/java/com/ajou/hertz/domain/concert_hall/constant/ConcertHallProgressStatus.java new file mode 100644 index 0000000..eac7d15 --- /dev/null +++ b/src/main/java/com/ajou/hertz/domain/concert_hall/constant/ConcertHallProgressStatus.java @@ -0,0 +1,15 @@ +package com.ajou.hertz.domain.concert_hall.constant; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum ConcertHallProgressStatus { + + SELLING("판매중"), + RESERVED("예약중"), + SOLD_OUT("판매 완료"); + + private final String description; +} diff --git a/src/main/java/com/ajou/hertz/domain/concert_hall/dto/ConcertHallImageDto.java b/src/main/java/com/ajou/hertz/domain/concert_hall/dto/ConcertHallImageDto.java new file mode 100644 index 0000000..96deb8d --- /dev/null +++ b/src/main/java/com/ajou/hertz/domain/concert_hall/dto/ConcertHallImageDto.java @@ -0,0 +1,25 @@ +package com.ajou.hertz.domain.concert_hall.dto; + +import com.ajou.hertz.domain.concert_hall.entity.ConcertHallImage; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@Getter +public class ConcertHallImageDto { + private Long id; + private String name; + private String url; + + public static ConcertHallImageDto from(ConcertHallImage concertHallImage) { + return new ConcertHallImageDto( + concertHallImage.getId(), + concertHallImage.getOriginalName(), + concertHallImage.getUrl() + ); + } +} diff --git a/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java b/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java new file mode 100644 index 0000000..13f6e31 --- /dev/null +++ b/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java @@ -0,0 +1,113 @@ +package com.ajou.hertz.domain.concert_hall.entity; + +import com.ajou.hertz.common.entity.TimeTrackedBaseEntity; +import com.ajou.hertz.domain.instrument.constant.InstrumentProgressStatus; +import com.ajou.hertz.domain.user.entity.User; + +import jakarta.persistence.Column; +import jakarta.persistence.Embedded; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Inheritance; +import jakarta.persistence.InheritanceType; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Getter +@Inheritance(strategy = InheritanceType.JOINED) +@Entity +public class ConcertHall extends TimeTrackedBaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "concert_hall_id", nullable = false) + private Long id; + + @JoinColumn(name = "seller_id", nullable = false) + @ManyToOne(fetch = FetchType.LAZY) + private User seller; + + @Column(nullable = false) + private String title; + + @Column(nullable = false) + @Enumerated(EnumType.STRING) + private InstrumentProgressStatus progressStatus; + + @Column(nullable = false) + private String address; + + @Column(nullable = false) + private String detailAddress; + + @Column(nullable = false) + private Boolean hasSoundEquipment; + + @Column(nullable = false) + private Boolean hasStaff; + + @Column(nullable = false) + private Boolean hasAdditionalSpace; + + @Column(nullable = false) + private Integer pricePerDay; + + @Column(nullable = false) + private Integer pricePerHour; + + @Column(columnDefinition = "smallint", nullable = false) + private Integer capacity; + + @Column(nullable = false) + private String size; + + @Column(length = 1000, nullable = false) + private String description; + + @Embedded + private ConcertHallImages images = new ConcertHallImages(); + + @Embedded + private ConcertHallHashtags hashtags = new ConcertHallHashtags(); + + protected ConcertHall( + Long id, + User seller, + String title, + InstrumentProgressStatus progressStatus, + String address, + String detailAddress, + Boolean hasSoundEquipment, + Boolean hasStaff, + Boolean hasAdditionalSpace, + Integer pricePerDay, + Integer pricePerHour, + Integer capacity, + String size, + String description + ) { + this.id = id; + this.seller = seller; + this.title = title; + this.progressStatus = progressStatus; + this.address = address; + this.detailAddress = detailAddress; + this.hasSoundEquipment = hasSoundEquipment; + this.hasStaff = hasStaff; + this.hasAdditionalSpace = hasAdditionalSpace; + this.pricePerDay = pricePerDay; + this.pricePerHour = pricePerHour; + this.capacity = capacity; + this.size = size; + this.description = description; + } +} diff --git a/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHallHashtag.java b/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHallHashtag.java new file mode 100644 index 0000000..bd609dc --- /dev/null +++ b/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHallHashtag.java @@ -0,0 +1,39 @@ +package com.ajou.hertz.domain.concert_hall.entity; + +import com.ajou.hertz.common.entity.BaseEntity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Getter +@Entity +public class ConcertHallHashtag extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "concert_hall_hashtag_id", nullable = false) + private Long id; + + @JoinColumn(name = "concert_hall_id", nullable = false) + @ManyToOne(fetch = FetchType.LAZY) + private ConcertHall concertHall; + + @Column(length = 10, nullable = false) + private String content; + + public static ConcertHallHashtag create(ConcertHall concertHall, String content) { + return new ConcertHallHashtag(null, concertHall, content); + } +} diff --git a/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHallHashtags.java b/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHallHashtags.java new file mode 100644 index 0000000..527f697 --- /dev/null +++ b/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHallHashtags.java @@ -0,0 +1,29 @@ +package com.ajou.hertz.domain.concert_hall.entity; + +import java.util.LinkedList; +import java.util.List; + +import jakarta.persistence.Embeddable; +import jakarta.persistence.OneToMany; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Embeddable +public class ConcertHallHashtags { + + @OneToMany(mappedBy = "concertHall") + private List content = new LinkedList<>(); + + public void addAll(List hashtags) { + content.addAll(hashtags); + } + + public List toStrings() { + return content.stream() + .map(ConcertHallHashtag::getContent) + .toList(); + } +} diff --git a/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHallImage.java b/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHallImage.java new file mode 100644 index 0000000..cfabc59 --- /dev/null +++ b/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHallImage.java @@ -0,0 +1,46 @@ +package com.ajou.hertz.domain.concert_hall.entity; + +import com.ajou.hertz.common.entity.FileEntity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Getter +@Entity +public class ConcertHallImage extends FileEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "concert_hall_image_id", nullable = false) + private Long id; + + @JoinColumn(name = "concert_hall", nullable = false) + @ManyToOne(fetch = FetchType.LAZY) + private ConcertHall concertHall; + + private ConcertHallImage(Long id, ConcertHall concertHall, String originalName, String storedName, String url) { + super(originalName, storedName, url); + this.id = id; + this.concertHall = concertHall; + } + + public static ConcertHallImage create(ConcertHall concertHall, String originalName, String storedName, String url) { + return new ConcertHallImage( + null, + concertHall, + originalName, + storedName, + url + ); + } +} diff --git a/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHallImages.java b/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHallImages.java new file mode 100644 index 0000000..9a2a3c6 --- /dev/null +++ b/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHallImages.java @@ -0,0 +1,30 @@ +package com.ajou.hertz.domain.concert_hall.entity; + +import java.util.LinkedList; +import java.util.List; + +import com.ajou.hertz.domain.concert_hall.dto.ConcertHallImageDto; + +import jakarta.persistence.Embeddable; +import jakarta.persistence.OneToMany; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Embeddable +public class ConcertHallImages { + @OneToMany(mappedBy = "concertHall") + private List content = new LinkedList<>(); + + public void addAll(List images) { + content.addAll(images); + } + + public List toDtos() { + return content.stream() + .map(ConcertHallImageDto::from) + .toList(); + } +} From eef3c60d610fc1c67ef6e486fe4314a2c9ee0b75 Mon Sep 17 00:00:00 2001 From: tinon1004 Date: Tue, 5 Mar 2024 09:13:09 +0900 Subject: [PATCH 02/17] =?UTF-8?q?refactor:=20#62=20fullAderss=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=B0=8F=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ajou/hertz/common/entity/FullAddress.java | 42 +++++++++++++++++++ .../concert_hall/entity/ConcertHall.java | 28 +++++++++---- .../entity/ConcertHallHashtags.java | 9 ---- .../entity/ConcertHallImages.java | 11 ----- 4 files changed, 63 insertions(+), 27 deletions(-) create mode 100644 src/main/java/com/ajou/hertz/common/entity/FullAddress.java diff --git a/src/main/java/com/ajou/hertz/common/entity/FullAddress.java b/src/main/java/com/ajou/hertz/common/entity/FullAddress.java new file mode 100644 index 0000000..2d36476 --- /dev/null +++ b/src/main/java/com/ajou/hertz/common/entity/FullAddress.java @@ -0,0 +1,42 @@ +package com.ajou.hertz.common.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Getter +@Embeddable +public class FullAddress { + + @Column(nullable = false) + private String sido; + + @Column(nullable = false) + private String sgg; + + private String lotNumberAddress; + + private String roadAddress; + + @Column(nullable = false) + private String detailAddress; + + public static FullAddress of(String fulladdress, String detailAddress) { + + String[] parsedAddress = fulladdress.split(" "); + + if (parsedAddress.length < 2) { + throw new IllegalArgumentException("주소 형식이 올바르지 않습니다."); + } + + String sido = parsedAddress[0]; + String sgg = parsedAddress[1]; + + return new FullAddress(sido, sgg, null, null, detailAddress); + } +} diff --git a/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java b/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java index 13f6e31..74a4e40 100644 --- a/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java +++ b/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java @@ -1,7 +1,8 @@ package com.ajou.hertz.domain.concert_hall.entity; +import com.ajou.hertz.common.entity.FullAddress; import com.ajou.hertz.common.entity.TimeTrackedBaseEntity; -import com.ajou.hertz.domain.instrument.constant.InstrumentProgressStatus; +import com.ajou.hertz.domain.concert_hall.constant.ConcertHallProgressStatus; import com.ajou.hertz.domain.user.entity.User; import jakarta.persistence.Column; @@ -41,14 +42,20 @@ public class ConcertHall extends TimeTrackedBaseEntity { @Column(nullable = false) @Enumerated(EnumType.STRING) - private InstrumentProgressStatus progressStatus; + private ConcertHallProgressStatus progressStatus; @Column(nullable = false) - private String address; + private FullAddress fullAddress; @Column(nullable = false) private String detailAddress; + @Column(nullable = false) + private String sido; + + @Column(nullable = false) + private String sgg; + @Column(nullable = false) private Boolean hasSoundEquipment; @@ -70,6 +77,9 @@ public class ConcertHall extends TimeTrackedBaseEntity { @Column(nullable = false) private String size; + @Column(nullable = false) + private Boolean hasParkingLot; + @Column(length = 1000, nullable = false) private String description; @@ -79,12 +89,12 @@ public class ConcertHall extends TimeTrackedBaseEntity { @Embedded private ConcertHallHashtags hashtags = new ConcertHallHashtags(); - protected ConcertHall( + private ConcertHall( Long id, User seller, String title, - InstrumentProgressStatus progressStatus, - String address, + ConcertHallProgressStatus progressStatus, + FullAddress fullAddress, String detailAddress, Boolean hasSoundEquipment, Boolean hasStaff, @@ -93,14 +103,17 @@ protected ConcertHall( Integer pricePerHour, Integer capacity, String size, + Boolean hasParkingLot, String description ) { this.id = id; this.seller = seller; this.title = title; this.progressStatus = progressStatus; - this.address = address; + this.fullAddress = fullAddress; this.detailAddress = detailAddress; + this.sido = fullAddress.getSido(); + this.sgg = fullAddress.getSgg(); this.hasSoundEquipment = hasSoundEquipment; this.hasStaff = hasStaff; this.hasAdditionalSpace = hasAdditionalSpace; @@ -108,6 +121,7 @@ protected ConcertHall( this.pricePerHour = pricePerHour; this.capacity = capacity; this.size = size; + this.hasParkingLot = hasParkingLot; this.description = description; } } diff --git a/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHallHashtags.java b/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHallHashtags.java index 527f697..2bb34b3 100644 --- a/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHallHashtags.java +++ b/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHallHashtags.java @@ -17,13 +17,4 @@ public class ConcertHallHashtags { @OneToMany(mappedBy = "concertHall") private List content = new LinkedList<>(); - public void addAll(List hashtags) { - content.addAll(hashtags); - } - - public List toStrings() { - return content.stream() - .map(ConcertHallHashtag::getContent) - .toList(); - } } diff --git a/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHallImages.java b/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHallImages.java index 9a2a3c6..c8b2ba5 100644 --- a/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHallImages.java +++ b/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHallImages.java @@ -3,8 +3,6 @@ import java.util.LinkedList; import java.util.List; -import com.ajou.hertz.domain.concert_hall.dto.ConcertHallImageDto; - import jakarta.persistence.Embeddable; import jakarta.persistence.OneToMany; import lombok.AccessLevel; @@ -18,13 +16,4 @@ public class ConcertHallImages { @OneToMany(mappedBy = "concertHall") private List content = new LinkedList<>(); - public void addAll(List images) { - content.addAll(images); - } - - public List toDtos() { - return content.stream() - .map(ConcertHallImageDto::from) - .toList(); - } } From f867e85f3ef060ebb4de5501cc34bb0d67066c94 Mon Sep 17 00:00:00 2001 From: tinon1004 Date: Wed, 6 Mar 2024 09:39:59 +0900 Subject: [PATCH 03/17] =?UTF-8?q?refactor:=20#62=20fullAderss=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20=EC=97=94=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ajou/hertz/common/entity/FullAddress.java | 27 ++++++++++++++++--- .../concert_hall/entity/ConcertHall.java | 9 +------ 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/ajou/hertz/common/entity/FullAddress.java b/src/main/java/com/ajou/hertz/common/entity/FullAddress.java index 2d36476..7c4626c 100644 --- a/src/main/java/com/ajou/hertz/common/entity/FullAddress.java +++ b/src/main/java/com/ajou/hertz/common/entity/FullAddress.java @@ -1,5 +1,7 @@ package com.ajou.hertz.common.entity; +import java.util.Arrays; + import jakarta.persistence.Column; import jakarta.persistence.Embeddable; import lombok.AccessLevel; @@ -35,8 +37,27 @@ public static FullAddress of(String fulladdress, String detailAddress) { } String sido = parsedAddress[0]; - String sgg = parsedAddress[1]; + StringBuilder sggBuilder = new StringBuilder(); + String lotNumberAddress = null; + String roadAddress = null; + + int i; + for (i = 1; i < parsedAddress.length; i++) { + if (parsedAddress[i].matches(".*[동면읍소로길]$")) { + break; + } + sggBuilder.append(parsedAddress[i]).append(" "); + } + + String sgg = sggBuilder.toString().trim(); - return new FullAddress(sido, sgg, null, null, detailAddress); + if (fulladdress.matches(".+[로길].+")) { + roadAddress = String.join(" ", Arrays.copyOfRange(parsedAddress, i, parsedAddress.length)); + } else { + lotNumberAddress = String.join(" ", Arrays.copyOfRange(parsedAddress, i, parsedAddress.length)); + } + + return new FullAddress(sido, sgg, lotNumberAddress, roadAddress, detailAddress); } -} + +} \ No newline at end of file diff --git a/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java b/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java index 74a4e40..edca4ff 100644 --- a/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java +++ b/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java @@ -45,17 +45,12 @@ public class ConcertHall extends TimeTrackedBaseEntity { private ConcertHallProgressStatus progressStatus; @Column(nullable = false) + @Embedded private FullAddress fullAddress; @Column(nullable = false) private String detailAddress; - @Column(nullable = false) - private String sido; - - @Column(nullable = false) - private String sgg; - @Column(nullable = false) private Boolean hasSoundEquipment; @@ -112,8 +107,6 @@ private ConcertHall( this.progressStatus = progressStatus; this.fullAddress = fullAddress; this.detailAddress = detailAddress; - this.sido = fullAddress.getSido(); - this.sgg = fullAddress.getSgg(); this.hasSoundEquipment = hasSoundEquipment; this.hasStaff = hasStaff; this.hasAdditionalSpace = hasAdditionalSpace; From 0d4955829596cfc94581fbb7265c86d7801d0504 Mon Sep 17 00:00:00 2001 From: tinon1004 Date: Wed, 6 Mar 2024 21:47:28 +0900 Subject: [PATCH 04/17] =?UTF-8?q?refactor:=20#62=20=ED=95=84=EC=9A=94=20?= =?UTF-8?q?=EC=97=86=EB=8A=94=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hertz/domain/concert_hall/entity/ConcertHall.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java b/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java index edca4ff..0a76bd6 100644 --- a/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java +++ b/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java @@ -14,17 +14,16 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import jakarta.persistence.Inheritance; -import jakarta.persistence.InheritanceType; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import lombok.AccessLevel; +import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; +@AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter -@Inheritance(strategy = InheritanceType.JOINED) @Entity public class ConcertHall extends TimeTrackedBaseEntity { @@ -48,9 +47,6 @@ public class ConcertHall extends TimeTrackedBaseEntity { @Embedded private FullAddress fullAddress; - @Column(nullable = false) - private String detailAddress; - @Column(nullable = false) private Boolean hasSoundEquipment; @@ -90,7 +86,6 @@ private ConcertHall( String title, ConcertHallProgressStatus progressStatus, FullAddress fullAddress, - String detailAddress, Boolean hasSoundEquipment, Boolean hasStaff, Boolean hasAdditionalSpace, @@ -106,7 +101,6 @@ private ConcertHall( this.title = title; this.progressStatus = progressStatus; this.fullAddress = fullAddress; - this.detailAddress = detailAddress; this.hasSoundEquipment = hasSoundEquipment; this.hasStaff = hasStaff; this.hasAdditionalSpace = hasAdditionalSpace; From f49628dd56e24fdc5ab8ad4cdfd331792b421a6f Mon Sep 17 00:00:00 2001 From: tinon1004 Date: Wed, 6 Mar 2024 21:47:53 +0900 Subject: [PATCH 05/17] =?UTF-8?q?feat:=20#62=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/fulladdress/FullAddressTest.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/test/java/com/ajou/hertz/unit/common/fulladdress/FullAddressTest.java diff --git a/src/test/java/com/ajou/hertz/unit/common/fulladdress/FullAddressTest.java b/src/test/java/com/ajou/hertz/unit/common/fulladdress/FullAddressTest.java new file mode 100644 index 0000000..87b4e00 --- /dev/null +++ b/src/test/java/com/ajou/hertz/unit/common/fulladdress/FullAddressTest.java @@ -0,0 +1,36 @@ +package com.ajou.hertz.unit.common.fulladdress; + +import static org.junit.jupiter.api.Assertions.*; + +import java.util.stream.Stream; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import com.ajou.hertz.common.entity.FullAddress; + +public class FullAddressTest { + + @ParameterizedTest + @MethodSource("FullAddressesParsingTest") + void testAddressParsing(String fullAddress, String detailAddress, String expectedSido, String expectedSgg) { + FullAddress parsedAddress = FullAddress.of(fullAddress, detailAddress); + assertEquals(expectedSido, parsedAddress.getSido()); + assertEquals(expectedSgg, parsedAddress.getSgg()); + } + + private static Stream FullAddressesParsingTest() { + return Stream.of( + Arguments.of("경기 성남시 분당구 판교역로 152", "12층", "경기", "성남시 분당구"), + Arguments.of("경북 안동시 일직면 감시골길 63", "빌라 202호", "경북", "안동시"), + Arguments.of("경기 여주시 가남읍 가남로 15", "아파트 101호", "경기", "여주시"), + Arguments.of("제주특별자치도 제주시 가령골길 1", "빌라 202호", "제주특별자치도", "제주시"), + Arguments.of("인천 서구 가남로 51", "아파트 101호", "인천", "서구"), + Arguments.of("강원특별자치도 원주시 지정면 신평리 469", "빌라 202호", "강원특별자치도", "원주시"), + Arguments.of("전남 고흥군 고흥읍 등암리 1679", "아파트 101호", "전남", "고흥군"), + Arguments.of("충북 청주시 서원구 모충동 372", "빌라 202호", "충북", "청주시 서원구"), + Arguments.of("인천 서구 가좌동 157-21 ", "빌라 202호", "인천", "서구") + ); + } +} From 923605d1579bb5b8b591c9e2b8ea2f94e1855157 Mon Sep 17 00:00:00 2001 From: tinon1004 Date: Wed, 6 Mar 2024 23:09:19 +0900 Subject: [PATCH 06/17] =?UTF-8?q?refactor:=20#62=20private=20annotation=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concert_hall/entity/ConcertHall.java | 33 +------------------ 1 file changed, 1 insertion(+), 32 deletions(-) diff --git a/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java b/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java index 0a76bd6..93c9015 100644 --- a/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java +++ b/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java @@ -21,7 +21,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; -@AllArgsConstructor +@AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @Entity @@ -80,35 +80,4 @@ public class ConcertHall extends TimeTrackedBaseEntity { @Embedded private ConcertHallHashtags hashtags = new ConcertHallHashtags(); - private ConcertHall( - Long id, - User seller, - String title, - ConcertHallProgressStatus progressStatus, - FullAddress fullAddress, - Boolean hasSoundEquipment, - Boolean hasStaff, - Boolean hasAdditionalSpace, - Integer pricePerDay, - Integer pricePerHour, - Integer capacity, - String size, - Boolean hasParkingLot, - String description - ) { - this.id = id; - this.seller = seller; - this.title = title; - this.progressStatus = progressStatus; - this.fullAddress = fullAddress; - this.hasSoundEquipment = hasSoundEquipment; - this.hasStaff = hasStaff; - this.hasAdditionalSpace = hasAdditionalSpace; - this.pricePerDay = pricePerDay; - this.pricePerHour = pricePerHour; - this.capacity = capacity; - this.size = size; - this.hasParkingLot = hasParkingLot; - this.description = description; - } } From da04b07c1cc8151664422f283b23fbbec30641f3 Mon Sep 17 00:00:00 2001 From: tinon1004 Date: Mon, 11 Mar 2024 18:12:41 +0900 Subject: [PATCH 07/17] =?UTF-8?q?refactor:=20#62=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 12 ++-- .../ajou/hertz/common/entity/FullAddress.java | 25 ++++---- .../constant/CustomExceptionType.java | 6 ++ .../concert_hall/entity/ConcertHall.java | 4 +- .../full_address/FullAddressParsingTest.java | 63 +++++++++++++++++++ .../common/fulladdress/FullAddressTest.java | 36 ----------- 6 files changed, 92 insertions(+), 54 deletions(-) create mode 100644 src/test/java/com/ajou/hertz/unit/common/entity/full_address/FullAddressParsingTest.java delete mode 100644 src/test/java/com/ajou/hertz/unit/common/fulladdress/FullAddressTest.java diff --git a/build.gradle b/build.gradle index 7cd4f77..88197c2 100644 --- a/build.gradle +++ b/build.gradle @@ -105,12 +105,15 @@ jacocoTestReport { afterEvaluate { classDirectories.setFrom(files(classDirectories.files.collect { - fileTree(dir: it, + fileTree( + dir: it, excludes: [] + Qdomains, includes: [ '**/service/**', - '**/controller/**' - ]) + '**/controller/**', + '**/common/entity/FullAddress*' + ] + ) })) } } @@ -138,7 +141,8 @@ jacocoTestCoverageVerification { includes = [ '*service.*Service*', - '*controller.*Controller*' + '*controller.*Controller*', + '*common.entity.FullAddress*' ] } } diff --git a/src/main/java/com/ajou/hertz/common/entity/FullAddress.java b/src/main/java/com/ajou/hertz/common/entity/FullAddress.java index 7c4626c..f01fc2e 100644 --- a/src/main/java/com/ajou/hertz/common/entity/FullAddress.java +++ b/src/main/java/com/ajou/hertz/common/entity/FullAddress.java @@ -2,6 +2,9 @@ import java.util.Arrays; +import com.ajou.hertz.common.exception.constant.CustomExceptionType; +import com.ajou.hertz.common.exception.full_address.InvalidAddressFormatException; + import jakarta.persistence.Column; import jakarta.persistence.Embeddable; import lombok.AccessLevel; @@ -9,7 +12,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; -@AllArgsConstructor +@AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @Embeddable @@ -28,12 +31,12 @@ public class FullAddress { @Column(nullable = false) private String detailAddress; - public static FullAddress of(String fulladdress, String detailAddress) { + public static FullAddress of(String fullAddress, String detailAddress) throws InvalidAddressFormatException { - String[] parsedAddress = fulladdress.split(" "); + String[] parsedAddress = fullAddress.split(" "); if (parsedAddress.length < 2) { - throw new IllegalArgumentException("주소 형식이 올바르지 않습니다."); + throw new InvalidAddressFormatException(CustomExceptionType.INVALID_ADDRESS_FORMAT); } String sido = parsedAddress[0]; @@ -41,17 +44,15 @@ public static FullAddress of(String fulladdress, String detailAddress) { String lotNumberAddress = null; String roadAddress = null; - int i; - for (i = 1; i < parsedAddress.length; i++) { - if (parsedAddress[i].matches(".*[동면읍소로길]$")) { - break; - } - sggBuilder.append(parsedAddress[i]).append(" "); - } + int i = Arrays.stream(parsedAddress) + .skip(1) + .takeWhile(part -> !part.matches(".*[동면읍소로길]$")) + .peek(part -> sggBuilder.append(part).append(" ")) + .toArray().length + 1; String sgg = sggBuilder.toString().trim(); - if (fulladdress.matches(".+[로길].+")) { + if (fullAddress.matches(".+[로길].+")) { roadAddress = String.join(" ", Arrays.copyOfRange(parsedAddress, i, parsedAddress.length)); } else { lotNumberAddress = String.join(" ", Arrays.copyOfRange(parsedAddress, i, parsedAddress.length)); diff --git a/src/main/java/com/ajou/hertz/common/exception/constant/CustomExceptionType.java b/src/main/java/com/ajou/hertz/common/exception/constant/CustomExceptionType.java index 657e68b..cc64662 100644 --- a/src/main/java/com/ajou/hertz/common/exception/constant/CustomExceptionType.java +++ b/src/main/java/com/ajou/hertz/common/exception/constant/CustomExceptionType.java @@ -11,6 +11,7 @@ *
  • 1001 ~ 1999: 일반 예외. 아래 항목에 해당하지 않는 대부분의 예외가 여기에 해당한다.
  • *
  • 2000 ~ 2199: 인증 관련 예외
  • *
  • 2200 ~ 2399: 유저 관련 예외
  • + *
  • 2400 ~ 2599: 주소 관련 예외
  • * */ @AllArgsConstructor(access = AccessLevel.PRIVATE) @@ -40,6 +41,11 @@ public enum CustomExceptionType { USER_NOT_FOUND_BY_PHONE(2206, "일치하는 회원을 찾을 수 없습니다."), KAKAO_CLIENT(10000, "카카오 서버와의 통신 중 오류가 발생했습니다."), + + /** + * 주소 관련 예외 + */ + INVALID_ADDRESS_FORMAT(2400, "주소 형식이 올바르지 않습니다."), ; private final Integer code; diff --git a/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java b/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java index 93c9015..7fab8fe 100644 --- a/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java +++ b/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java @@ -62,8 +62,8 @@ public class ConcertHall extends TimeTrackedBaseEntity { @Column(nullable = false) private Integer pricePerHour; - @Column(columnDefinition = "smallint", nullable = false) - private Integer capacity; + @Column(nullable = false) + private Short capacity; @Column(nullable = false) private String size; diff --git a/src/test/java/com/ajou/hertz/unit/common/entity/full_address/FullAddressParsingTest.java b/src/test/java/com/ajou/hertz/unit/common/entity/full_address/FullAddressParsingTest.java new file mode 100644 index 0000000..a418369 --- /dev/null +++ b/src/test/java/com/ajou/hertz/unit/common/entity/full_address/FullAddressParsingTest.java @@ -0,0 +1,63 @@ +package com.ajou.hertz.unit.common.entity.full_address; + +import static org.junit.jupiter.api.Assertions.*; + +import java.lang.reflect.Constructor; +import java.util.stream.Stream; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import com.ajou.hertz.common.entity.FullAddress; +import com.ajou.hertz.common.exception.full_address.InvalidAddressFormatException; + +@DisplayName("[Unit] Service - FullAddress") +public class FullAddressParsingTest { + @ParameterizedTest + @MethodSource("fullAddressesParsingTest") + void 전체_주소를_파싱하고_결과와_일치하는지_확인한다(String fullAddress, String detailAddress, String expectedSido, String expectedSgg) { + FullAddress parsedAddress = FullAddress.of(fullAddress, detailAddress); + assertEquals(expectedSido, parsedAddress.getSido()); + assertEquals(expectedSgg, parsedAddress.getSgg()); + assertEquals(detailAddress, parsedAddress.getDetailAddress()); + } + + @Test + void 기본_생성자의_작동을_확인한다() throws Exception { + Constructor constructor = FullAddress.class.getDeclaredConstructor(); + constructor.setAccessible(true); + FullAddress fullAddress = constructor.newInstance(); + assertNotNull(fullAddress); + } + + @Test + void 잘못된_형식의_주소이면_예외가_발생하는지_확인한다() { + assertThrows(InvalidAddressFormatException.class, () -> FullAddress.of("전라북도", "상세주소")); + } + + @Test + void 혼합된_주소의_파싱이_정상작동하는지_확인한다() { + FullAddress address = FullAddress.of("서울특별시 강남구 역삼동 테헤란로 152", "아파트 101호"); + assertEquals("서울특별시", address.getSido()); + assertEquals("강남구", address.getSgg()); + assertNotNull(address.getRoadAddress()); + assertNull(address.getLotNumberAddress()); + } + + private static Stream fullAddressesParsingTest() { + return Stream.of( + Arguments.of("경기 성남시 분당구 판교역로 152", "12층", "경기", "성남시 분당구"), + Arguments.of("경북 안동시 일직면 감시골길 63", "빌라 202호", "경북", "안동시"), + Arguments.of("경기 여주시 가남읍 가남로 15", "아파트 101호", "경기", "여주시"), + Arguments.of("제주특별자치도 제주시 가령골길 1", "빌라 202호", "제주특별자치도", "제주시"), + Arguments.of("인천 서구 가남로 51", "아파트 101호", "인천", "서구"), + Arguments.of("강원특별자치도 원주시 지정면 신평리 469", "빌라 202호", "강원특별자치도", "원주시"), + Arguments.of("전남 고흥군 고흥읍 등암리 1679", "아파트 101호", "전남", "고흥군"), + Arguments.of("충북 청주시 서원구 모충동 372", "빌라 202호", "충북", "청주시 서원구"), + Arguments.of("인천 서구 가좌동 157-21 ", "빌라 202호", "인천", "서구") + ); + } +} diff --git a/src/test/java/com/ajou/hertz/unit/common/fulladdress/FullAddressTest.java b/src/test/java/com/ajou/hertz/unit/common/fulladdress/FullAddressTest.java deleted file mode 100644 index 87b4e00..0000000 --- a/src/test/java/com/ajou/hertz/unit/common/fulladdress/FullAddressTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.ajou.hertz.unit.common.fulladdress; - -import static org.junit.jupiter.api.Assertions.*; - -import java.util.stream.Stream; - -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -import com.ajou.hertz.common.entity.FullAddress; - -public class FullAddressTest { - - @ParameterizedTest - @MethodSource("FullAddressesParsingTest") - void testAddressParsing(String fullAddress, String detailAddress, String expectedSido, String expectedSgg) { - FullAddress parsedAddress = FullAddress.of(fullAddress, detailAddress); - assertEquals(expectedSido, parsedAddress.getSido()); - assertEquals(expectedSgg, parsedAddress.getSgg()); - } - - private static Stream FullAddressesParsingTest() { - return Stream.of( - Arguments.of("경기 성남시 분당구 판교역로 152", "12층", "경기", "성남시 분당구"), - Arguments.of("경북 안동시 일직면 감시골길 63", "빌라 202호", "경북", "안동시"), - Arguments.of("경기 여주시 가남읍 가남로 15", "아파트 101호", "경기", "여주시"), - Arguments.of("제주특별자치도 제주시 가령골길 1", "빌라 202호", "제주특별자치도", "제주시"), - Arguments.of("인천 서구 가남로 51", "아파트 101호", "인천", "서구"), - Arguments.of("강원특별자치도 원주시 지정면 신평리 469", "빌라 202호", "강원특별자치도", "원주시"), - Arguments.of("전남 고흥군 고흥읍 등암리 1679", "아파트 101호", "전남", "고흥군"), - Arguments.of("충북 청주시 서원구 모충동 372", "빌라 202호", "충북", "청주시 서원구"), - Arguments.of("인천 서구 가좌동 157-21 ", "빌라 202호", "인천", "서구") - ); - } -} From 540efaea018b3e152a8bca8b0bec3e993700ae69 Mon Sep 17 00:00:00 2001 From: tinon1004 Date: Mon, 11 Mar 2024 18:17:54 +0900 Subject: [PATCH 08/17] =?UTF-8?q?feat:=20#62=20=EC=A3=BC=EC=86=8C=20except?= =?UTF-8?q?ion=20=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InvalidAddressFormatException.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/main/java/com/ajou/hertz/common/exception/full_address/InvalidAddressFormatException.java diff --git a/src/main/java/com/ajou/hertz/common/exception/full_address/InvalidAddressFormatException.java b/src/main/java/com/ajou/hertz/common/exception/full_address/InvalidAddressFormatException.java new file mode 100644 index 0000000..86817ac --- /dev/null +++ b/src/main/java/com/ajou/hertz/common/exception/full_address/InvalidAddressFormatException.java @@ -0,0 +1,22 @@ +package com.ajou.hertz.common.exception.full_address; + +import com.ajou.hertz.common.exception.BadRequestException; +import com.ajou.hertz.common.exception.constant.CustomExceptionType; + +public class InvalidAddressFormatException extends BadRequestException { + public InvalidAddressFormatException(CustomExceptionType exceptionType) { + super(exceptionType); + } + + public InvalidAddressFormatException(CustomExceptionType exceptionType, String optionalMessage) { + super(exceptionType, optionalMessage); + } + + public InvalidAddressFormatException(CustomExceptionType exceptionType, Throwable cause) { + super(exceptionType, cause); + } + + public InvalidAddressFormatException(CustomExceptionType exceptionType, String optionalMessage, Throwable cause) { + super(exceptionType, optionalMessage, cause); + } +} From 4b9572828550dc7e5862450b8c152ec37820e5cb Mon Sep 17 00:00:00 2001 From: tinon1004 Date: Mon, 11 Mar 2024 18:32:14 +0900 Subject: [PATCH 09/17] =?UTF-8?q?chore:=20jacoco=20test=20coverage=20?= =?UTF-8?q?=EB=8C=80=EC=83=81=EC=97=90=20FullAddress=20layer=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 --- build.gradle | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/build.gradle b/build.gradle index 778d626..4a79f03 100644 --- a/build.gradle +++ b/build.gradle @@ -112,18 +112,14 @@ jacocoTestReport { afterEvaluate { classDirectories.setFrom(files(classDirectories.files.collect { - fileTree( - dir: it, + fileTree(dir: it, excludes: [] + Qdomains, includes: [ '**/service/**', '**/controller/**', - '**/common/entity/FullAddress*' - ] - ) + '**/common/entity/FullAddress*', '**/repository/**' ]) - })) } } @@ -152,7 +148,7 @@ jacocoTestCoverageVerification { includes = [ '*service.*Service*', '*controller.*Controller*', - '*common.entity.FullAddress*' + '*common.entity.FullAddress*', '*repository.*Repository*' ] } From 8ec8aef04dde026443ce3a28fbbead6da09bc880 Mon Sep 17 00:00:00 2001 From: tinon1004 Date: Mon, 11 Mar 2024 23:24:49 +0900 Subject: [PATCH 10/17] =?UTF-8?q?refactor:=20#62=20exception=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ajou/hertz/common/entity/FullAddress.java | 24 ++++++++++--------- .../InvalidAddressFormatException.java | 9 +++++++ .../InvalidAddressFormatException.java | 22 ----------------- .../full_address/FullAddressParsingTest.java | 22 ++++++++--------- 4 files changed, 32 insertions(+), 45 deletions(-) create mode 100644 src/main/java/com/ajou/hertz/common/exception/InvalidAddressFormatException.java delete mode 100644 src/main/java/com/ajou/hertz/common/exception/full_address/InvalidAddressFormatException.java diff --git a/src/main/java/com/ajou/hertz/common/entity/FullAddress.java b/src/main/java/com/ajou/hertz/common/entity/FullAddress.java index f01fc2e..d06ae79 100644 --- a/src/main/java/com/ajou/hertz/common/entity/FullAddress.java +++ b/src/main/java/com/ajou/hertz/common/entity/FullAddress.java @@ -2,8 +2,7 @@ import java.util.Arrays; -import com.ajou.hertz.common.exception.constant.CustomExceptionType; -import com.ajou.hertz.common.exception.full_address.InvalidAddressFormatException; +import com.ajou.hertz.common.exception.InvalidAddressFormatException; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; @@ -31,12 +30,13 @@ public class FullAddress { @Column(nullable = false) private String detailAddress; - public static FullAddress of(String fullAddress, String detailAddress) throws InvalidAddressFormatException { + public static FullAddress of(String fullAddress, String detailAddress) { String[] parsedAddress = fullAddress.split(" "); if (parsedAddress.length < 2) { - throw new InvalidAddressFormatException(CustomExceptionType.INVALID_ADDRESS_FORMAT); + throw new InvalidAddressFormatException(fullAddress); + } String sido = parsedAddress[0]; @@ -44,18 +44,20 @@ public static FullAddress of(String fullAddress, String detailAddress) throws In String lotNumberAddress = null; String roadAddress = null; - int i = Arrays.stream(parsedAddress) - .skip(1) - .takeWhile(part -> !part.matches(".*[동면읍소로길]$")) - .peek(part -> sggBuilder.append(part).append(" ")) - .toArray().length + 1; + int num; + for (num = 1; num < parsedAddress.length; num++) { + if (parsedAddress[num].matches(".*[동면읍소로길]$")) { + break; + } + sggBuilder.append(parsedAddress[num]).append(" "); + } String sgg = sggBuilder.toString().trim(); if (fullAddress.matches(".+[로길].+")) { - roadAddress = String.join(" ", Arrays.copyOfRange(parsedAddress, i, parsedAddress.length)); + roadAddress = String.join(" ", Arrays.copyOfRange(parsedAddress, num, parsedAddress.length)); } else { - lotNumberAddress = String.join(" ", Arrays.copyOfRange(parsedAddress, i, parsedAddress.length)); + lotNumberAddress = String.join(" ", Arrays.copyOfRange(parsedAddress, num, parsedAddress.length)); } return new FullAddress(sido, sgg, lotNumberAddress, roadAddress, detailAddress); diff --git a/src/main/java/com/ajou/hertz/common/exception/InvalidAddressFormatException.java b/src/main/java/com/ajou/hertz/common/exception/InvalidAddressFormatException.java new file mode 100644 index 0000000..66f8d95 --- /dev/null +++ b/src/main/java/com/ajou/hertz/common/exception/InvalidAddressFormatException.java @@ -0,0 +1,9 @@ +package com.ajou.hertz.common.exception; + +import com.ajou.hertz.common.exception.constant.CustomExceptionType; + +public class InvalidAddressFormatException extends BadRequestException { + public InvalidAddressFormatException(String address) { + super(CustomExceptionType.INVALID_ADDRESS_FORMAT, "address=" + address); + } +} diff --git a/src/main/java/com/ajou/hertz/common/exception/full_address/InvalidAddressFormatException.java b/src/main/java/com/ajou/hertz/common/exception/full_address/InvalidAddressFormatException.java deleted file mode 100644 index 86817ac..0000000 --- a/src/main/java/com/ajou/hertz/common/exception/full_address/InvalidAddressFormatException.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.ajou.hertz.common.exception.full_address; - -import com.ajou.hertz.common.exception.BadRequestException; -import com.ajou.hertz.common.exception.constant.CustomExceptionType; - -public class InvalidAddressFormatException extends BadRequestException { - public InvalidAddressFormatException(CustomExceptionType exceptionType) { - super(exceptionType); - } - - public InvalidAddressFormatException(CustomExceptionType exceptionType, String optionalMessage) { - super(exceptionType, optionalMessage); - } - - public InvalidAddressFormatException(CustomExceptionType exceptionType, Throwable cause) { - super(exceptionType, cause); - } - - public InvalidAddressFormatException(CustomExceptionType exceptionType, String optionalMessage, Throwable cause) { - super(exceptionType, optionalMessage, cause); - } -} diff --git a/src/test/java/com/ajou/hertz/unit/common/entity/full_address/FullAddressParsingTest.java b/src/test/java/com/ajou/hertz/unit/common/entity/full_address/FullAddressParsingTest.java index a418369..0eead71 100644 --- a/src/test/java/com/ajou/hertz/unit/common/entity/full_address/FullAddressParsingTest.java +++ b/src/test/java/com/ajou/hertz/unit/common/entity/full_address/FullAddressParsingTest.java @@ -12,9 +12,9 @@ import org.junit.jupiter.params.provider.MethodSource; import com.ajou.hertz.common.entity.FullAddress; -import com.ajou.hertz.common.exception.full_address.InvalidAddressFormatException; +import com.ajou.hertz.common.exception.InvalidAddressFormatException; -@DisplayName("[Unit] Service - FullAddress") +@DisplayName("[Unit] Entity - FullAddress") public class FullAddressParsingTest { @ParameterizedTest @MethodSource("fullAddressesParsingTest") @@ -23,6 +23,13 @@ public class FullAddressParsingTest { assertEquals(expectedSido, parsedAddress.getSido()); assertEquals(expectedSgg, parsedAddress.getSgg()); assertEquals(detailAddress, parsedAddress.getDetailAddress()); + if (fullAddress.contains("로 ") || fullAddress.contains("길 ")) { + assertNull(parsedAddress.getLotNumberAddress()); + assertNotNull(parsedAddress.getRoadAddress()); + } else { + assertNull(parsedAddress.getRoadAddress()); + assertNotNull(parsedAddress.getLotNumberAddress()); + } } @Test @@ -38,15 +45,6 @@ public class FullAddressParsingTest { assertThrows(InvalidAddressFormatException.class, () -> FullAddress.of("전라북도", "상세주소")); } - @Test - void 혼합된_주소의_파싱이_정상작동하는지_확인한다() { - FullAddress address = FullAddress.of("서울특별시 강남구 역삼동 테헤란로 152", "아파트 101호"); - assertEquals("서울특별시", address.getSido()); - assertEquals("강남구", address.getSgg()); - assertNotNull(address.getRoadAddress()); - assertNull(address.getLotNumberAddress()); - } - private static Stream fullAddressesParsingTest() { return Stream.of( Arguments.of("경기 성남시 분당구 판교역로 152", "12층", "경기", "성남시 분당구"), @@ -57,7 +55,7 @@ private static Stream fullAddressesParsingTest() { Arguments.of("강원특별자치도 원주시 지정면 신평리 469", "빌라 202호", "강원특별자치도", "원주시"), Arguments.of("전남 고흥군 고흥읍 등암리 1679", "아파트 101호", "전남", "고흥군"), Arguments.of("충북 청주시 서원구 모충동 372", "빌라 202호", "충북", "청주시 서원구"), - Arguments.of("인천 서구 가좌동 157-21 ", "빌라 202호", "인천", "서구") + Arguments.of("인천 서구", "빌라 202호", "인천", "서구") ); } } From 9374c06dd9286503515e3c9f8862b93e94ae9c15 Mon Sep 17 00:00:00 2001 From: tinon1004 Date: Tue, 12 Mar 2024 00:07:32 +0900 Subject: [PATCH 11/17] =?UTF-8?q?feat:=20#62=20ConcertHall=20entity?= =?UTF-8?q?=EC=97=90=20coordinate=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ajou/hertz/common/entity/Coordinate.java | 26 +++++++++++++++++++ .../concert_hall/entity/ConcertHall.java | 5 ++++ 2 files changed, 31 insertions(+) create mode 100644 src/main/java/com/ajou/hertz/common/entity/Coordinate.java diff --git a/src/main/java/com/ajou/hertz/common/entity/Coordinate.java b/src/main/java/com/ajou/hertz/common/entity/Coordinate.java new file mode 100644 index 0000000..8c2b8e9 --- /dev/null +++ b/src/main/java/com/ajou/hertz/common/entity/Coordinate.java @@ -0,0 +1,26 @@ +package com.ajou.hertz.common.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Getter +@Embeddable +public class Coordinate { + + @Column(nullable = false) + private Double latitude; + + @Column(nullable = false) + private Double longitude; + + public static Coordinate of(double latitude, double longitude) { + return new Coordinate(latitude, longitude); + } + +} diff --git a/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java b/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java index 7fab8fe..d670c71 100644 --- a/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java +++ b/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java @@ -1,5 +1,6 @@ package com.ajou.hertz.domain.concert_hall.entity; +import com.ajou.hertz.common.entity.Coordinate; import com.ajou.hertz.common.entity.FullAddress; import com.ajou.hertz.common.entity.TimeTrackedBaseEntity; import com.ajou.hertz.domain.concert_hall.constant.ConcertHallProgressStatus; @@ -74,6 +75,10 @@ public class ConcertHall extends TimeTrackedBaseEntity { @Column(length = 1000, nullable = false) private String description; + @Column(nullable = false) + @Embedded + private Coordinate coordinate; + @Embedded private ConcertHallImages images = new ConcertHallImages(); From 308f808f901cd7921f37245be423c0691e7c139c Mon Sep 17 00:00:00 2001 From: tinon1004 Date: Tue, 12 Mar 2024 00:22:16 +0900 Subject: [PATCH 12/17] =?UTF-8?q?refactor:=20#62=20coordinate=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ajou/hertz/common/entity/Coordinate.java | 10 +++++----- .../hertz/domain/concert_hall/entity/ConcertHall.java | 3 +-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/ajou/hertz/common/entity/Coordinate.java b/src/main/java/com/ajou/hertz/common/entity/Coordinate.java index 8c2b8e9..2c4a90e 100644 --- a/src/main/java/com/ajou/hertz/common/entity/Coordinate.java +++ b/src/main/java/com/ajou/hertz/common/entity/Coordinate.java @@ -7,19 +7,19 @@ import lombok.Getter; import lombok.NoArgsConstructor; -@AllArgsConstructor(access = AccessLevel.PRIVATE) -@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PUBLIC) +@NoArgsConstructor(access = AccessLevel.PRIVATE) @Getter @Embeddable public class Coordinate { @Column(nullable = false) - private Double latitude; + private String latitude; @Column(nullable = false) - private Double longitude; + private String longitude; - public static Coordinate of(double latitude, double longitude) { + public static Coordinate of(String latitude, String longitude) { return new Coordinate(latitude, longitude); } diff --git a/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java b/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java index d670c71..990640d 100644 --- a/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java +++ b/src/main/java/com/ajou/hertz/domain/concert_hall/entity/ConcertHall.java @@ -74,8 +74,7 @@ public class ConcertHall extends TimeTrackedBaseEntity { @Column(length = 1000, nullable = false) private String description; - - @Column(nullable = false) + @Embedded private Coordinate coordinate; From 33ba1eb9a3fd2ce99f853aef470e36ab068018ac Mon Sep 17 00:00:00 2001 From: tinon1004 Date: Tue, 12 Mar 2024 00:24:52 +0900 Subject: [PATCH 13/17] =?UTF-8?q?refactor:=20#62=20`@AllArgsConstructor`?= =?UTF-8?q?=20=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20=EC=86=8D=EC=84=B1=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 --- src/main/java/com/ajou/hertz/common/entity/Coordinate.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/ajou/hertz/common/entity/Coordinate.java b/src/main/java/com/ajou/hertz/common/entity/Coordinate.java index 2c4a90e..91a04d7 100644 --- a/src/main/java/com/ajou/hertz/common/entity/Coordinate.java +++ b/src/main/java/com/ajou/hertz/common/entity/Coordinate.java @@ -7,7 +7,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; -@AllArgsConstructor(access = AccessLevel.PUBLIC) +@AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PRIVATE) @Getter @Embeddable From 4387db80357183adbb15ac2399f5501da7e4c240 Mon Sep 17 00:00:00 2001 From: tinon1004 Date: Tue, 12 Mar 2024 00:27:12 +0900 Subject: [PATCH 14/17] =?UTF-8?q?refactor:=20#62=20Coordinate=20=EC=9C=84?= =?UTF-8?q?=EB=8F=84,=EA=B2=BD=EB=8F=84=20=EB=B3=80=EC=88=98=EB=AA=85=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ajou/hertz/common/entity/Coordinate.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/ajou/hertz/common/entity/Coordinate.java b/src/main/java/com/ajou/hertz/common/entity/Coordinate.java index 91a04d7..1b24fbe 100644 --- a/src/main/java/com/ajou/hertz/common/entity/Coordinate.java +++ b/src/main/java/com/ajou/hertz/common/entity/Coordinate.java @@ -14,13 +14,13 @@ public class Coordinate { @Column(nullable = false) - private String latitude; + private String lat; @Column(nullable = false) - private String longitude; + private String lng; - public static Coordinate of(String latitude, String longitude) { - return new Coordinate(latitude, longitude); + public static Coordinate of(String lat, String lng) { + return new Coordinate(lat, lng); } } From 4f9e44faeca92cb3ce259ce1332908a6d3a271d5 Mon Sep 17 00:00:00 2001 From: Wo-ogie Date: Tue, 12 Mar 2024 00:54:41 +0900 Subject: [PATCH 15/17] =?UTF-8?q?test:=20#62=20`FullAddress`=20=EC=A0=84?= =?UTF-8?q?=EC=B2=B4=20=EC=A3=BC=EC=86=8C=20=ED=8C=8C=EC=8B=B1=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../full_address/FullAddressParsingTest.java | 55 ++++++++++--------- 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/src/test/java/com/ajou/hertz/unit/common/entity/full_address/FullAddressParsingTest.java b/src/test/java/com/ajou/hertz/unit/common/entity/full_address/FullAddressParsingTest.java index 0eead71..228b9e9 100644 --- a/src/test/java/com/ajou/hertz/unit/common/entity/full_address/FullAddressParsingTest.java +++ b/src/test/java/com/ajou/hertz/unit/common/entity/full_address/FullAddressParsingTest.java @@ -1,5 +1,6 @@ package com.ajou.hertz.unit.common.entity.full_address; +import static org.assertj.core.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*; import java.lang.reflect.Constructor; @@ -16,20 +17,38 @@ @DisplayName("[Unit] Entity - FullAddress") public class FullAddressParsingTest { + @ParameterizedTest @MethodSource("fullAddressesParsingTest") - void 전체_주소를_파싱하고_결과와_일치하는지_확인한다(String fullAddress, String detailAddress, String expectedSido, String expectedSgg) { + void 전체_주소를_파싱하고_결과와_일치하는지_확인한다( + String fullAddress, + String detailAddress, + String expectedSido, + String expectedSgg, + String expectedLotNumberAddress, + String expectedRoadAddress, + String expectedDetailAddress + ) { FullAddress parsedAddress = FullAddress.of(fullAddress, detailAddress); - assertEquals(expectedSido, parsedAddress.getSido()); - assertEquals(expectedSgg, parsedAddress.getSgg()); - assertEquals(detailAddress, parsedAddress.getDetailAddress()); - if (fullAddress.contains("로 ") || fullAddress.contains("길 ")) { - assertNull(parsedAddress.getLotNumberAddress()); - assertNotNull(parsedAddress.getRoadAddress()); - } else { - assertNull(parsedAddress.getRoadAddress()); - assertNotNull(parsedAddress.getLotNumberAddress()); - } + assertThat(parsedAddress.getSido()).isEqualTo(expectedSido); + assertThat(parsedAddress.getSgg()).isEqualTo(expectedSgg); + assertThat(parsedAddress.getLotNumberAddress()).isEqualTo(expectedLotNumberAddress); + assertThat(parsedAddress.getRoadAddress()).isEqualTo(expectedRoadAddress); + assertThat(parsedAddress.getDetailAddress()).isEqualTo(expectedDetailAddress); + } + + private static Stream fullAddressesParsingTest() { + return Stream.of( + Arguments.of("경기 성남시 분당구 판교역로 152", "12층", "경기", "성남시 분당구", null, "판교역로 152", "12층"), + Arguments.of("경북 안동시 일직면 감시골길 63", "빌라 202호", "경북", "안동시", null, "일직면 감시골길 63", "빌라 202호"), + Arguments.of("경기 여주시 가남읍 가남로 15", "아파트 101호", "경기", "여주시", null, "가남읍 가남로 15", "아파트 101호"), + Arguments.of("제주특별자치도 제주시 가령골길 1", "빌라 202호", "제주특별자치도", "제주시", null, "가령골길 1", "빌라 202호"), + Arguments.of("인천 서구 가남로 51", "아파트 101호", "인천", "서구", null, "가남로 51", "아파트 101호"), + Arguments.of("강원특별자치도 원주시 지정면 신평리 469", "빌라 202호", "강원특별자치도", "원주시", "지정면 신평리 469", null, "빌라 202호"), + Arguments.of("전남 고흥군 고흥읍 등암리 1679", "아파트 101호", "전남", "고흥군", "고흥읍 등암리 1679", null, "아파트 101호"), + Arguments.of("충북 청주시 서원구 모충동 372", "빌라 202호", "충북", "청주시 서원구", "모충동 372", null, "빌라 202호"), + Arguments.of("인천 서구", "빌라 202호", "인천", "서구", null, null, "빌라 202호") + ); } @Test @@ -44,18 +63,4 @@ public class FullAddressParsingTest { void 잘못된_형식의_주소이면_예외가_발생하는지_확인한다() { assertThrows(InvalidAddressFormatException.class, () -> FullAddress.of("전라북도", "상세주소")); } - - private static Stream fullAddressesParsingTest() { - return Stream.of( - Arguments.of("경기 성남시 분당구 판교역로 152", "12층", "경기", "성남시 분당구"), - Arguments.of("경북 안동시 일직면 감시골길 63", "빌라 202호", "경북", "안동시"), - Arguments.of("경기 여주시 가남읍 가남로 15", "아파트 101호", "경기", "여주시"), - Arguments.of("제주특별자치도 제주시 가령골길 1", "빌라 202호", "제주특별자치도", "제주시"), - Arguments.of("인천 서구 가남로 51", "아파트 101호", "인천", "서구"), - Arguments.of("강원특별자치도 원주시 지정면 신평리 469", "빌라 202호", "강원특별자치도", "원주시"), - Arguments.of("전남 고흥군 고흥읍 등암리 1679", "아파트 101호", "전남", "고흥군"), - Arguments.of("충북 청주시 서원구 모충동 372", "빌라 202호", "충북", "청주시 서원구"), - Arguments.of("인천 서구", "빌라 202호", "인천", "서구") - ); - } } From 4a8c6784bcc09d6e1793b7c03c0221f41b189ef8 Mon Sep 17 00:00:00 2001 From: tinon1004 Date: Tue, 12 Mar 2024 01:24:32 +0900 Subject: [PATCH 16/17] =?UTF-8?q?refactor:=20#62=20Coordinate=20=EB=B6=88?= =?UTF-8?q?=ED=95=84=EC=9A=94=ED=95=9C=20method=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/ajou/hertz/common/entity/Coordinate.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/com/ajou/hertz/common/entity/Coordinate.java b/src/main/java/com/ajou/hertz/common/entity/Coordinate.java index 1b24fbe..bcc5153 100644 --- a/src/main/java/com/ajou/hertz/common/entity/Coordinate.java +++ b/src/main/java/com/ajou/hertz/common/entity/Coordinate.java @@ -19,8 +19,4 @@ public class Coordinate { @Column(nullable = false) private String lng; - public static Coordinate of(String lat, String lng) { - return new Coordinate(lat, lng); - } - } From 5b7786c6192c2c2b328bf342568751626956ec3d Mon Sep 17 00:00:00 2001 From: tinon1004 Date: Tue, 12 Mar 2024 01:24:52 +0900 Subject: [PATCH 17/17] =?UTF-8?q?refactor:=20#62=20FullAddress=20entity=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20=EC=B2=98=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 --- .../java/com/ajou/hertz/common/entity/FullAddress.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/ajou/hertz/common/entity/FullAddress.java b/src/main/java/com/ajou/hertz/common/entity/FullAddress.java index d06ae79..9421c3d 100644 --- a/src/main/java/com/ajou/hertz/common/entity/FullAddress.java +++ b/src/main/java/com/ajou/hertz/common/entity/FullAddress.java @@ -54,10 +54,12 @@ public static FullAddress of(String fullAddress, String detailAddress) { String sgg = sggBuilder.toString().trim(); - if (fullAddress.matches(".+[로길].+")) { - roadAddress = String.join(" ", Arrays.copyOfRange(parsedAddress, num, parsedAddress.length)); - } else { - lotNumberAddress = String.join(" ", Arrays.copyOfRange(parsedAddress, num, parsedAddress.length)); + if (parsedAddress.length > num) { + if (fullAddress.matches(".+[로길].+")) { + roadAddress = String.join(" ", Arrays.copyOfRange(parsedAddress, num, parsedAddress.length)); + } else { + lotNumberAddress = String.join(" ", Arrays.copyOfRange(parsedAddress, num, parsedAddress.length)); + } } return new FullAddress(sido, sgg, lotNumberAddress, roadAddress, detailAddress);