-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[DDING-83] Form 및 FormField 엔터티 세팅 #229
Changes from 4 commits
0bede78
7a5e32d
b9b1c9e
19c2137
912d11c
045d957
35b4267
cd082b7
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
package ddingdong.ddingdongBE.common.converter; | ||
|
||
import com.fasterxml.jackson.core.JsonProcessingException; | ||
import com.fasterxml.jackson.databind.ObjectMapper; | ||
import jakarta.persistence.AttributeConverter; | ||
import jakarta.persistence.Converter; | ||
import java.util.List; | ||
|
||
@Converter | ||
public class StringListConverter implements AttributeConverter<List<String>, String> { | ||
|
||
private final ObjectMapper mapper = new ObjectMapper(); | ||
|
||
@Override | ||
public String convertToDatabaseColumn(List<String> dataList) { | ||
try { | ||
return mapper.writeValueAsString(dataList); | ||
} catch (JsonProcessingException e) { | ||
throw new RuntimeException(e); | ||
} | ||
} | ||
|
||
@Override | ||
public List<String> convertToEntityAttribute(String data) { | ||
try { | ||
return mapper.readValue(data, List.class); | ||
} catch (JsonProcessingException e) { | ||
throw new RuntimeException(e); | ||
} | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
package ddingdong.ddingdongBE.domain.form.entity; | ||
|
||
public enum FieldType { | ||
CHECK_BOX, | ||
RADIO, | ||
TEXT, | ||
LONG_TEXT, | ||
FILE | ||
} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,50 @@ | ||||||||||||||||||||||||||||||||||||||||||
package ddingdong.ddingdongBE.domain.form.entity; | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
import ddingdong.ddingdongBE.domain.club.entity.Club; | ||||||||||||||||||||||||||||||||||||||||||
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.ManyToOne; | ||||||||||||||||||||||||||||||||||||||||||
import java.time.LocalDate; | ||||||||||||||||||||||||||||||||||||||||||
import lombok.AccessLevel; | ||||||||||||||||||||||||||||||||||||||||||
import lombok.Builder; | ||||||||||||||||||||||||||||||||||||||||||
import lombok.Getter; | ||||||||||||||||||||||||||||||||||||||||||
import lombok.NoArgsConstructor; | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
@Entity | ||||||||||||||||||||||||||||||||||||||||||
@NoArgsConstructor(access = AccessLevel.PROTECTED) | ||||||||||||||||||||||||||||||||||||||||||
@Getter | ||||||||||||||||||||||||||||||||||||||||||
public class Form { | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
@Id | ||||||||||||||||||||||||||||||||||||||||||
@GeneratedValue(strategy = GenerationType.IDENTITY) | ||||||||||||||||||||||||||||||||||||||||||
private Long id; | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
@Column(nullable = false) | ||||||||||||||||||||||||||||||||||||||||||
private String title; | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
private String description; | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
@Column(nullable = false) | ||||||||||||||||||||||||||||||||||||||||||
private LocalDate startDate; | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
@Column(nullable = false) | ||||||||||||||||||||||||||||||||||||||||||
private LocalDate endDate; | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
@Column(nullable = false) | ||||||||||||||||||||||||||||||||||||||||||
private boolean hasInterview; | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
@ManyToOne(fetch = FetchType.LAZY) | ||||||||||||||||||||||||||||||||||||||||||
private Club club; | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion 감사 필드 및 날짜 유효성 검증 추가 필요
+ @Column(nullable = false, updatable = false)
+ private LocalDateTime createdAt;
+
+ @Column(nullable = false)
+ private LocalDateTime updatedAt;
private void validateDates() {
if (startDate.isAfter(endDate)) {
throw new IllegalArgumentException("시작일은 종료일보다 이후일 수 없습니다.");
}
} |
||||||||||||||||||||||||||||||||||||||||||
@Builder | ||||||||||||||||||||||||||||||||||||||||||
private Form(String title, String description, Club club) { | ||||||||||||||||||||||||||||||||||||||||||
this.title = title; | ||||||||||||||||||||||||||||||||||||||||||
this.description = description; | ||||||||||||||||||||||||||||||||||||||||||
this.club = club; | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 필수 필드가 빌더에서 누락됨 다음 필수 필드들이 빌더에 포함되어 있지 않습니다:
@Builder
-private Form(String title, String description, Club club) {
+private Form(String title, String description, LocalDate startDate, LocalDate endDate, boolean hasInterview, Club club) {
this.title = title;
this.description = description;
+ this.startDate = startDate;
+ this.endDate = endDate;
+ this.hasInterview = hasInterview;
this.club = club;
+ validateDates();
} 📝 Committable suggestion
Suggested change
|
Original file line number | Diff line number | Diff line change | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,62 @@ | ||||||||||
package ddingdong.ddingdongBE.domain.form.entity; | ||||||||||
|
||||||||||
import ddingdong.ddingdongBE.common.converter.StringListConverter; | ||||||||||
import jakarta.persistence.Column; | ||||||||||
import jakarta.persistence.Convert; | ||||||||||
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.ManyToOne; | ||||||||||
import java.util.List; | ||||||||||
import lombok.AccessLevel; | ||||||||||
import lombok.Builder; | ||||||||||
import lombok.Getter; | ||||||||||
import lombok.NoArgsConstructor; | ||||||||||
|
||||||||||
@Entity | ||||||||||
@NoArgsConstructor(access = AccessLevel.PROTECTED) | ||||||||||
@Getter | ||||||||||
public class FormField { | ||||||||||
|
||||||||||
@Id | ||||||||||
@GeneratedValue(strategy = GenerationType.IDENTITY) | ||||||||||
private Long id; | ||||||||||
|
||||||||||
@Column(nullable = false) | ||||||||||
private String question; | ||||||||||
|
||||||||||
@Column(nullable = false) | ||||||||||
private boolean required; | ||||||||||
|
||||||||||
@Column(nullable = false) | ||||||||||
private int order; | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion 예약어 사용 주의
필드명을 @Column(nullable = false)
- private int order;
+ private int orderNumber; 📝 Committable suggestion
Suggested change
|
||||||||||
|
||||||||||
@Column(nullable = false) | ||||||||||
private String section; | ||||||||||
|
||||||||||
@Convert(converter = StringListConverter.class) | ||||||||||
private List<String> options; | ||||||||||
|
||||||||||
@Enumerated(EnumType.STRING) | ||||||||||
@Column(nullable = false) | ||||||||||
private FieldType fieldType; | ||||||||||
|
||||||||||
@ManyToOne(fetch = FetchType.LAZY) | ||||||||||
private Form form; | ||||||||||
|
||||||||||
@Builder | ||||||||||
private FormField(String question, FieldType fieldType, boolean required, int order, String section, | ||||||||||
List<String> options, Form form) { | ||||||||||
this.question = question; | ||||||||||
this.fieldType = fieldType; | ||||||||||
this.required = required; | ||||||||||
this.order = order; | ||||||||||
this.section = section; | ||||||||||
this.options = options; | ||||||||||
this.form = form; | ||||||||||
} | ||||||||||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
package ddingdong.ddingdongBE.domain.form.repository; | ||
|
||
import ddingdong.ddingdongBE.domain.form.entity.FormField; | ||
import org.springframework.data.jpa.repository.JpaRepository; | ||
|
||
public interface FormFieldRepository extends JpaRepository<FormField, Long> { | ||
|
||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
package ddingdong.ddingdongBE.domain.form.repository; | ||
|
||
import ddingdong.ddingdongBE.domain.form.entity.Form; | ||
import org.springframework.data.jpa.repository.JpaRepository; | ||
|
||
public interface FormRepository extends JpaRepository<Form, Long> { | ||
|
||
} |
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -0,0 +1,24 @@ | ||||||
CREATE TABLE form | ||||||
( | ||||||
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, | ||||||
title VARCHAR(255) NOT NULL, | ||||||
description VARCHAR(255), | ||||||
start_date DATE NOT NULL, | ||||||
end_date DATE NOT NULL, | ||||||
has_interview BOOLEAN NOT NULL, | ||||||
club_id BIGINT, | ||||||
CONSTRAINT fk_form_club FOREIGN KEY (club_id) REFERENCES club (id) ON DELETE CASCADE | ||||||
); | ||||||
|
||||||
CREATE TABLE form_field | ||||||
( | ||||||
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, | ||||||
question VARCHAR(255) NOT NULL, | ||||||
field_type VARCHAR(50) NOT NULL, | ||||||
required BOOLEAN NOT NULL, | ||||||
`order` INT NOT NULL, | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion SQL 예약어 사용 수정 필요
- `order` INT NOT NULL,
+ order_number INT NOT NULL, 📝 Committable suggestion
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 코드래빗 ai 말대로 이 부분만 수정해주시면 된다고 생각합니다! There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 수정했습니다~! |
||||||
section VARCHAR(255) NOT NULL, | ||||||
options TEXT, | ||||||
form_id BIGINT, | ||||||
CONSTRAINT fk_form_field_form FOREIGN KEY (form_id) REFERENCES form (id) ON DELETE CASCADE | ||||||
); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
List 타입 안정성 개선 필요
mapper.readValue(data, List.class)
는 raw type을 사용하고 있어 타입 안정성이 보장되지 않습니다.다음과 같이 TypeReference를 사용하여 타입 안정성을 보장하는 것이 좋습니다:
📝 Committable suggestion