Skip to content

Commit ef31229

Browse files
feat: 스페이스 생성 시 필드 복수개로 변경 (#46)
1 parent d1e7c44 commit ef31229

File tree

11 files changed

+92
-28
lines changed

11 files changed

+92
-28
lines changed

layer-api/src/main/java/org/layer/domain/space/dto/SpaceRequest.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.layer.domain.space.entity.SpaceCategory;
99
import org.layer.domain.space.entity.SpaceField;
1010

11+
import java.util.List;
1112
import java.util.Optional;
1213

1314
@Schema
@@ -23,8 +24,10 @@ public record CreateSpaceRequest(
2324
@NotNull
2425
SpaceCategory category,
2526
@Schema(description = "진행중인 프로젝트 유형")
27+
2628
@NotNull
27-
SpaceField field,
29+
List<SpaceField> fieldList,
30+
2831
@Schema(description = "이름")
2932
@NotNull
3033
String name,
@@ -35,7 +38,7 @@ public record CreateSpaceRequest(
3538
public Space toEntity(Long memberId) {
3639
return Space.builder()
3740
.category(category)
38-
.field(field)
41+
.fieldList(fieldList)
3942
.name(name)
4043
.introduction(introduction)
4144
.leaderId(memberId)
@@ -58,7 +61,7 @@ public record UpdateSpaceRequest(
5861
SpaceCategory category,
5962
@Schema(description = "진행중인 프로젝트 유형", nullable = true)
6063

61-
SpaceField field,
64+
List<SpaceField> fieldList,
6265
@Schema(description = "이름", nullable = true)
6366

6467
String name,
@@ -71,7 +74,7 @@ public Space toEntity(Long memberId) {
7174
return Space.builder()
7275
.id(id)
7376
.category(category)
74-
.field(field)
77+
.fieldList(fieldList)
7578
.name(name)
7679
.introduction(introduction)
7780
.leaderId(memberId)

layer-api/src/main/java/org/layer/domain/space/dto/SpaceResponse.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public record SpaceWithMemberCountInfo(
2727
SpaceCategory category,
2828
@Schema(description = "진행중인 프로젝트 유형")
2929
@NotNull
30-
SpaceField field,
30+
List<SpaceField> fieldList,
3131

3232
@Schema(description = "이름")
3333
@NotNull
@@ -45,7 +45,7 @@ public record SpaceWithMemberCountInfo(
4545
public static SpaceWithMemberCountInfo toResponse(SpaceWithMemberCount space) {
4646
return Optional.ofNullable(space)
4747
.map(it -> SpaceWithMemberCountInfo.builder().id(it.getId()).category(it.getCategory())
48-
.field(it.getField()).name(it.getName()).introduction(it.getIntroduction())
48+
.fieldList(it.getFieldList()).name(it.getName()).introduction(it.getIntroduction())
4949
.formId(it.getFormId()).memberCount(it.getMemberCount()).build())
5050
.orElseThrow(() -> new BaseCustomException(INVALID_REFRESH_TOKEN));
5151
}

layer-api/src/main/java/org/layer/domain/space/service/SpaceService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public void createSpace(Long memberId, SpaceRequest.CreateSpaceRequest mutateSpa
5454
@Transactional
5555
public void updateSpace(Long memberId, SpaceRequest.UpdateSpaceRequest updateSpaceRequest) {
5656
spaceRepository.findByIdAndJoinedMemberId(updateSpaceRequest.id(), memberId).orElseThrow(() -> new SpaceException(SPACE_NOT_FOUND));
57-
spaceRepository.updateSpace(updateSpaceRequest.id(), updateSpaceRequest.category(), updateSpaceRequest.field(), updateSpaceRequest.name(), updateSpaceRequest.introduction(), updateSpaceRequest.bannerUrl());
57+
spaceRepository.updateSpace(updateSpaceRequest.id(), updateSpaceRequest.category(), updateSpaceRequest.fieldList(), updateSpaceRequest.name(), updateSpaceRequest.introduction(), updateSpaceRequest.bannerUrl());
5858
}
5959

6060
public SpaceResponse.SpaceWithMemberCountInfo getSpaceById(Long memberId, Long spaceId) {

layer-common/src/main/java/org/layer/common/exception/GlobalExceptionHandler.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import lombok.extern.slf4j.Slf4j;
44
import org.springframework.http.HttpStatus;
55
import org.springframework.http.ResponseEntity;
6+
import org.springframework.http.converter.HttpMessageNotReadableException;
67
import org.springframework.web.bind.MethodArgumentNotValidException;
78
import org.springframework.web.bind.annotation.ExceptionHandler;
89
import org.springframework.web.bind.annotation.RestControllerAdvice;
@@ -30,10 +31,18 @@ public ResponseEntity<ExceptionResponse> handleException(Exception e) {
3031
@ExceptionHandler(MethodArgumentNotValidException.class)
3132
public ResponseEntity<ExceptionResponse> handleValidationException(MethodArgumentNotValidException e) {
3233
log.error(String.format(LOG_FORMAT, e.getMessage()), e);
33-
34+
3435
// TODO: ValidException 타입 정의 후 교체
3536
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
3637
.body(ExceptionResponse.of(HttpStatus.BAD_REQUEST.name(), "유효하지 않은 값"));
3738
}
3839

40+
//TODO: JSON deserialize 에러 시 해당 에러 반환 -> enum 배열 받는 방법이 있다면 적용 후 제거
41+
@ExceptionHandler(HttpMessageNotReadableException.class)
42+
public ResponseEntity<ExceptionResponse> handleHttpMessageNotReadableException(Exception e) {
43+
log.error(String.format(LOG_FORMAT, e.getMessage()), e);
44+
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
45+
.body(ExceptionResponse.of(HttpStatus.BAD_REQUEST.name(), "유효하지 않은 값."));
46+
}
47+
3948
}

layer-domain/src/main/java/org/layer/domain/form/entity/Form.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
package org.layer.domain.form.entity;
22

3-
import jakarta.persistence.*;
3+
import jakarta.persistence.Entity;
44
import jakarta.validation.constraints.NotNull;
55
import lombok.*;
6-
import org.hibernate.annotations.ColumnDefault;
76
import org.layer.domain.BaseEntity;
8-
import org.layer.domain.form.converter.FormPublishedByConverter;
9-
import org.layer.domain.form.enums.FormPublishedBy;
107

118

129
@Getter
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package org.layer.domain.space.converter;
2+
3+
import jakarta.persistence.AttributeConverter;
4+
import jakarta.persistence.Converter;
5+
import org.layer.domain.space.entity.SpaceField;
6+
7+
import java.util.Arrays;
8+
import java.util.List;
9+
import java.util.stream.Collectors;
10+
11+
@Converter
12+
public class SpaceFieldConverter implements AttributeConverter<List<SpaceField>, String> {
13+
14+
@Override
15+
public String convertToDatabaseColumn(List<SpaceField> attribute) {
16+
if (attribute == null || attribute.isEmpty()) {
17+
return "";
18+
}
19+
return attribute.stream()
20+
.map(Enum::name)
21+
.collect(Collectors.joining(","));
22+
}
23+
24+
@Override
25+
public List<SpaceField> convertToEntityAttribute(String fieldsOfCommaSeperated) {
26+
if (fieldsOfCommaSeperated == null || fieldsOfCommaSeperated.isEmpty()) {
27+
return List.of();
28+
}
29+
return Arrays.stream(fieldsOfCommaSeperated.split(","))
30+
.map(String::trim)
31+
.map(SpaceField::valueOf)
32+
.collect(Collectors.toList());
33+
}
34+
}

layer-domain/src/main/java/org/layer/domain/space/dto/SpaceWithMemberCount.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.layer.domain.space.entity.SpaceField;
99

1010
import java.time.LocalDateTime;
11+
import java.util.List;
1112

1213

1314
@Getter
@@ -20,7 +21,7 @@ public class SpaceWithMemberCount {
2021
@NotNull
2122
private SpaceCategory category;
2223
@NotNull
23-
private SpaceField field;
24+
private List<SpaceField> fieldList;
2425
@NotNull
2526
private String name;
2627
private String introduction;
@@ -30,12 +31,12 @@ public class SpaceWithMemberCount {
3031
private Long memberCount;
3132

3233
@QueryProjection
33-
public SpaceWithMemberCount(Long id, LocalDateTime createdAt, LocalDateTime updatedAt, SpaceCategory category, SpaceField field, String name, String introduction, Long leaderId, Long formId, Long memberCount) {
34+
public SpaceWithMemberCount(Long id, LocalDateTime createdAt, LocalDateTime updatedAt, SpaceCategory category, List<SpaceField> fieldList, String name, String introduction, Long leaderId, Long formId, Long memberCount) {
3435
this.id = id;
3536
this.createdAt = createdAt;
3637
this.updatedAt = updatedAt;
3738
this.category = category;
38-
this.field = field;
39+
this.fieldList = fieldList;
3940
this.name = name;
4041
this.introduction = introduction;
4142
this.leaderId = leaderId;

layer-domain/src/main/java/org/layer/domain/space/entity/Space.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
package org.layer.domain.space.entity;
22

3+
import jakarta.persistence.Convert;
34
import jakarta.persistence.Entity;
45
import jakarta.persistence.EnumType;
56
import jakarta.persistence.Enumerated;
67
import jakarta.validation.constraints.NotNull;
78
import lombok.*;
89
import lombok.experimental.SuperBuilder;
910
import org.layer.domain.BaseEntity;
11+
import org.layer.domain.space.converter.SpaceFieldConverter;
1012

13+
import java.util.ArrayList;
14+
import java.util.List;
1115
import java.util.Optional;
1216

1317
@Getter
@@ -25,8 +29,8 @@ public class Space extends BaseEntity {
2529
private SpaceCategory category;
2630

2731
@NotNull
28-
@Enumerated(EnumType.STRING)
29-
private SpaceField field;
32+
@Convert(converter = SpaceFieldConverter.class)
33+
private List<SpaceField> fieldList = new ArrayList<>();
3034

3135
@NotNull
3236
private String name;
Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,25 @@
11
package org.layer.domain.space.entity;
22

3+
4+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Getter;
7+
8+
@Getter
9+
@AllArgsConstructor
10+
@JsonDeserialize
311
public enum SpaceField {
4-
DESIGN,
5-
DEVELOPMENT,
6-
MARKETING,
7-
ACCOUNTING,
8-
SPORTS,
9-
ETC
12+
PLANNER("PLANNER", "기획"),
13+
EDUCATION("EDUCATION", "교육"),
14+
DEVELOPMENT("DEVELOPMENT", "개발"),
15+
DESIGN("DESIGN", "디자인"),
16+
MANAGEMENT("MANAGEMENT", "운영 및 관리"),
17+
DATA_ANALYSIS("DATA_ANALYSIS", "데이터 분석"),
18+
MARKETING("MARKETING", "마케팅"),
19+
RESEARCH("RESEARCH", "연구"),
20+
ETC("ETC", "기타");
21+
22+
23+
private final String value;
24+
private final String name;
1025
}

layer-domain/src/main/java/org/layer/domain/space/repository/SpaceCustomRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,6 @@ public interface SpaceCustomRepository {
1919

2020
Optional<SpaceWithMemberCount> findByIdAndJoinedMemberId(Long spaceId, Long memberId);
2121

22-
Long updateSpace(Long spaceId, SpaceCategory category, SpaceField field, String name, String introduction, String bannerUrl);
22+
Long updateSpace(Long spaceId, SpaceCategory category, List<SpaceField> fieldList, String name, String introduction, String bannerUrl);
2323

2424
}

0 commit comments

Comments
 (0)