Skip to content

Commit ce1f3e8

Browse files
authored
Merge pull request Kernel360#282 from Kernel360/refactor#281-bad-word-validation
[refactor] 비속어 필터링 용 커스텀 어노테이션 추가
2 parents 634d827 + a3c4e0f commit ce1f3e8

File tree

21 files changed

+173
-81
lines changed

21 files changed

+173
-81
lines changed
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.kernelsquare.adminapi.domain.auth.dto;
22

33
import com.kernelsquare.core.validation.ValidationGroups;
4-
import com.kernelsquare.core.validation.constants.AuthValidationConstants;
4+
import com.kernelsquare.core.validation.constants.AuthValidationMessage;
55

66
import jakarta.validation.constraints.Email;
77
import jakarta.validation.constraints.NotBlank;
@@ -12,10 +12,10 @@
1212
@Builder
1313
public record CheckDuplicateEmailRequest(
1414

15-
@NotBlank(message = AuthValidationConstants.EMAIL_NOT_BLANK, groups = ValidationGroups.NotBlankGroup.class)
16-
@Size(min = 5, max = 40, message = AuthValidationConstants.EMAIL_SIZE, groups = ValidationGroups.SizeGroup.class)
17-
@Pattern(regexp = "^[^ㄱ-ㅎㅏ-ㅣ가-힣]*$", message = AuthValidationConstants.EMAIL_PATTERN, groups = ValidationGroups.PatternGroup.class)
18-
@Email(message = AuthValidationConstants.EMAIL, groups = ValidationGroups.EmailGroup.class)
15+
@NotBlank(message = AuthValidationMessage.EMAIL_NOT_BLANK, groups = ValidationGroups.NotBlankGroup.class)
16+
@Size(min = 5, max = 40, message = AuthValidationMessage.EMAIL_SIZE, groups = ValidationGroups.SizeGroup.class)
17+
@Pattern(regexp = "^[^ㄱ-ㅎㅏ-ㅣ가-힣]*$", message = AuthValidationMessage.EMAIL_PATTERN, groups = ValidationGroups.PatternGroup.class)
18+
@Email(message = AuthValidationMessage.EMAIL, groups = ValidationGroups.EmailGroup.class)
1919
String email
2020
) {
2121
}
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.kernelsquare.adminapi.domain.auth.dto;
22

33
import com.kernelsquare.core.validation.ValidationGroups;
4-
import com.kernelsquare.core.validation.constants.AuthValidationConstants;
4+
import com.kernelsquare.core.validation.constants.AuthValidationMessage;
55

66
import jakarta.validation.constraints.NotBlank;
77
import jakarta.validation.constraints.Pattern;
@@ -10,9 +10,9 @@
1010

1111
@Builder
1212
public record CheckDuplicateNicknameRequest(
13-
@NotBlank(message = AuthValidationConstants.NICKNAME_NOT_BLANK, groups = ValidationGroups.NotBlankGroup.class)
14-
@Size(min = 2, max = 8, message = AuthValidationConstants.NICKNAME_SIZE, groups = ValidationGroups.SizeGroup.class)
15-
@Pattern(regexp = "^[가-힣a-zA-Z]+$", message = AuthValidationConstants.NICKNAME_PATTERN, groups = ValidationGroups.PatternGroup.class)
13+
@NotBlank(message = AuthValidationMessage.NICKNAME_NOT_BLANK, groups = ValidationGroups.NotBlankGroup.class)
14+
@Size(min = 2, max = 8, message = AuthValidationMessage.NICKNAME_SIZE, groups = ValidationGroups.SizeGroup.class)
15+
@Pattern(regexp = "^[가-힣a-zA-Z]+$", message = AuthValidationMessage.NICKNAME_PATTERN, groups = ValidationGroups.PatternGroup.class)
1616
String nickname
1717
) {
1818
}
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.kernelsquare.adminapi.domain.auth.dto;
22

33
import com.kernelsquare.core.validation.ValidationGroups;
4-
import com.kernelsquare.core.validation.constants.AuthValidationConstants;
4+
import com.kernelsquare.core.validation.constants.AuthValidationMessage;
55

66
import jakarta.validation.constraints.Email;
77
import jakarta.validation.constraints.NotBlank;
@@ -11,13 +11,13 @@
1111

1212
@Builder
1313
public record LoginRequest(
14-
@NotBlank(message = AuthValidationConstants.EMAIL_NOT_BLANK, groups = ValidationGroups.NotBlankGroup.class)
15-
@Size(min = 5, max = 40, message = AuthValidationConstants.EMAIL_SIZE, groups = ValidationGroups.SizeGroup.class)
16-
@Pattern(regexp = "^[^ㄱ-ㅎㅏ-ㅣ가-힣]*$", message = AuthValidationConstants.EMAIL_PATTERN, groups = ValidationGroups.PatternGroup.class)
17-
@Email(message = AuthValidationConstants.EMAIL, groups = ValidationGroups.EmailGroup.class)
14+
@NotBlank(message = AuthValidationMessage.EMAIL_NOT_BLANK, groups = ValidationGroups.NotBlankGroup.class)
15+
@Size(min = 5, max = 40, message = AuthValidationMessage.EMAIL_SIZE, groups = ValidationGroups.SizeGroup.class)
16+
@Pattern(regexp = "^[^ㄱ-ㅎㅏ-ㅣ가-힣]*$", message = AuthValidationMessage.EMAIL_PATTERN, groups = ValidationGroups.PatternGroup.class)
17+
@Email(message = AuthValidationMessage.EMAIL, groups = ValidationGroups.EmailGroup.class)
1818
String email,
1919

20-
@NotBlank(message = AuthValidationConstants.PASSWORD_NOT_BLANK, groups = ValidationGroups.NotBlankGroup.class)
20+
@NotBlank(message = AuthValidationMessage.PASSWORD_NOT_BLANK, groups = ValidationGroups.NotBlankGroup.class)
2121
String password
2222
) {
2323
}

admin-api/src/main/java/com/kernelsquare/adminapi/domain/auth/dto/SignUpRequest.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.kernelsquare.adminapi.domain.auth.dto;
22

33
import com.kernelsquare.core.validation.ValidationGroups;
4-
import com.kernelsquare.core.validation.constants.AuthValidationConstants;
4+
import com.kernelsquare.core.validation.constants.AuthValidationMessage;
55
import com.kernelsquare.domainmysql.domain.level.entity.Level;
66
import com.kernelsquare.domainmysql.domain.member.entity.Member;
77

@@ -13,21 +13,21 @@
1313

1414
@Builder
1515
public record SignUpRequest(
16-
@NotBlank(message = AuthValidationConstants.EMAIL_NOT_BLANK, groups = ValidationGroups.NotBlankGroup.class)
17-
@Size(min = 5, max = 40, message = AuthValidationConstants.EMAIL_SIZE, groups = ValidationGroups.SizeGroup.class)
18-
@Pattern(regexp = "^[^ㄱ-ㅎㅏ-ㅣ가-힣]*$", message = AuthValidationConstants.EMAIL_PATTERN, groups = ValidationGroups.PatternGroup.class)
19-
@Email(message = AuthValidationConstants.EMAIL, groups = ValidationGroups.EmailGroup.class)
16+
@NotBlank(message = AuthValidationMessage.EMAIL_NOT_BLANK, groups = ValidationGroups.NotBlankGroup.class)
17+
@Size(min = 5, max = 40, message = AuthValidationMessage.EMAIL_SIZE, groups = ValidationGroups.SizeGroup.class)
18+
@Pattern(regexp = "^[^ㄱ-ㅎㅏ-ㅣ가-힣]*$", message = AuthValidationMessage.EMAIL_PATTERN, groups = ValidationGroups.PatternGroup.class)
19+
@Email(message = AuthValidationMessage.EMAIL, groups = ValidationGroups.EmailGroup.class)
2020
String email,
2121

22-
@NotBlank(message = AuthValidationConstants.NICKNAME_NOT_BLANK, groups = ValidationGroups.NotBlankGroup.class)
23-
@Size(min = 2, max = 8, message = AuthValidationConstants.NICKNAME_SIZE, groups = ValidationGroups.SizeGroup.class)
24-
@Pattern(regexp = "^[가-힣a-zA-Z]+$", message = AuthValidationConstants.NICKNAME_PATTERN, groups = ValidationGroups.PatternGroup.class)
22+
@NotBlank(message = AuthValidationMessage.NICKNAME_NOT_BLANK, groups = ValidationGroups.NotBlankGroup.class)
23+
@Size(min = 2, max = 8, message = AuthValidationMessage.NICKNAME_SIZE, groups = ValidationGroups.SizeGroup.class)
24+
@Pattern(regexp = "^[가-힣a-zA-Z]+$", message = AuthValidationMessage.NICKNAME_PATTERN, groups = ValidationGroups.PatternGroup.class)
2525
String nickname,
2626

27-
@NotBlank(message = AuthValidationConstants.PASSWORD_NOT_BLANK, groups = ValidationGroups.NotBlankGroup.class)
28-
@Size(min = 8, max = 16, message = AuthValidationConstants.PASSWORD_SIZE, groups = ValidationGroups.SizeGroup.class)
27+
@NotBlank(message = AuthValidationMessage.PASSWORD_NOT_BLANK, groups = ValidationGroups.NotBlankGroup.class)
28+
@Size(min = 8, max = 16, message = AuthValidationMessage.PASSWORD_SIZE, groups = ValidationGroups.SizeGroup.class)
2929
@Pattern(regexp = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]+$",
30-
message = AuthValidationConstants.PASSWORD_PATTERN, groups = ValidationGroups.PatternGroup.class)
30+
message = AuthValidationMessage.PASSWORD_PATTERN, groups = ValidationGroups.PatternGroup.class)
3131
String password
3232
) {
3333

admin-api/src/main/java/com/kernelsquare/adminapi/domain/notice/dto/NoticeDto.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.time.LocalDateTime;
44

55
import com.fasterxml.jackson.annotation.JsonFormat;
6+
import com.kernelsquare.core.validation.annotations.EnumValue;
67
import com.kernelsquare.domainmysql.domain.notice.entity.Notice;
78

89
import jakarta.validation.constraints.NotBlank;
@@ -20,8 +21,8 @@ public record CreateRequest(
2021
@Size(min = 10, max = 10000, message = "공지 내용은 10자 이상 1000자 이하로 작성해 주세요")
2122
String noticeContent,
2223

23-
// @EnumValue(enumClass = Notice.NoticeCategory.class, message = "유효한 카테고리를 선택해주세요")
24-
Notice.NoticeCategory noticeCategory
24+
@EnumValue(enumClass = Notice.NoticeCategory.class, message = "유효한 카테고리를 선택해주세요")
25+
String noticeCategory
2526
) {
2627
}
2728

admin-api/src/test/java/com/kernelsquare/adminapi/domain/auth/dto/AuthRequestDtoTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import org.junit.jupiter.api.Test;
99

1010
import com.kernelsquare.core.validation.ValidationSequence;
11-
import com.kernelsquare.core.validation.constants.AuthValidationConstants;
11+
import com.kernelsquare.core.validation.constants.AuthValidationMessage;
1212

1313
import jakarta.validation.ConstraintViolation;
1414
import jakarta.validation.Validation;
@@ -54,7 +54,7 @@ void invalidNickname() {
5454

5555
// then
5656
assertThat(violations).hasSize(2);
57-
assertThat(violations).extracting("message").contains(AuthValidationConstants.NICKNAME_SIZE);
57+
assertThat(violations).extracting("message").contains(AuthValidationMessage.NICKNAME_SIZE);
5858
}
5959

6060
@Test
@@ -73,7 +73,7 @@ void invalidPassword() {
7373

7474
// then
7575
assertThat(violations).hasSize(1);
76-
assertThat(violations).extracting("message").contains(AuthValidationConstants.NICKNAME_SIZE);
76+
assertThat(violations).extracting("message").contains(AuthValidationMessage.NICKNAME_SIZE);
7777
}
7878

7979
@Test
@@ -90,7 +90,7 @@ void blankEmail() {
9090

9191
// then
9292
assertThat(violations).hasSize(1);
93-
assertThat(violations).extracting("message").contains(AuthValidationConstants.EMAIL_NOT_BLANK);
93+
assertThat(violations).extracting("message").contains(AuthValidationMessage.EMAIL_NOT_BLANK);
9494
}
9595

9696
@Test
@@ -107,7 +107,7 @@ void invalidEmail() {
107107

108108
// then
109109
assertThat(violations).hasSize(1);
110-
assertThat(violations).extracting("message").contains(AuthValidationConstants.EMAIL);
110+
assertThat(violations).extracting("message").contains(AuthValidationMessage.EMAIL);
111111
}
112112

113113
@Test

admin-api/src/test/java/com/kernelsquare/adminapi/domain/notice/controller/NoticeControllerTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public class NoticeControllerTest {
5454
void testCreateNotice() throws Exception {
5555
//given
5656
NoticeDto.CreateRequest request = NoticeDto.CreateRequest.builder()
57-
.noticeCategory(Notice.NoticeCategory.GENERAL)
57+
.noticeCategory("일반 공지")
5858
.noticeContent("Lets roll out")
5959
.noticeTitle("환불 관련 공지입니다.")
6060
.build();
@@ -86,7 +86,7 @@ void testCreateNotice() throws Exception {
8686
.andDo(document("notice-created", getDocumentRequest(), getDocumentResponse(),
8787
requestFields(fieldWithPath("notice_title").type(JsonFieldType.STRING).description("공지 제목"),
8888
fieldWithPath("notice_content").type(JsonFieldType.STRING).description("공지 내용"),
89-
fieldWithPath("notice_category").type(JsonFieldType.STRING).description("일반 공지")),
89+
fieldWithPath("notice_category").type(JsonFieldType.STRING).description("공지 카테고리")),
9090
responseFields(fieldWithPath("msg").type(JsonFieldType.STRING).description("응답 메시지"),
9191
fieldWithPath("code").type(JsonFieldType.NUMBER).description("응답 상태 코드"),
9292
fieldWithPath("data").type(JsonFieldType.OBJECT).description("응답"),

core/build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ dependencies {
2121
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
2222
implementation 'org.springframework.boot:spring-boot-starter-validation'
2323

24+
//User Language Filter
25+
implementation 'io.github.vaneproject:badwordfiltering:1.0.0'
26+
2427
testImplementation 'org.springframework.boot:spring-boot-starter-test'
2528

2629
compileOnly 'org.projectlombok:lombok'
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.kernelsquare.core.validation.annotations;
2+
3+
import static java.lang.annotation.ElementType.*;
4+
5+
import java.lang.annotation.Documented;
6+
import java.lang.annotation.Retention;
7+
import java.lang.annotation.RetentionPolicy;
8+
import java.lang.annotation.Target;
9+
10+
import com.kernelsquare.core.validation.validator.BadWordValidator;
11+
12+
import jakarta.validation.Constraint;
13+
import jakarta.validation.Payload;
14+
15+
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
16+
@Retention(RetentionPolicy.RUNTIME)
17+
@Documented
18+
@Constraint(validatedBy = BadWordValidator.class)
19+
public @interface BadWordFilter {
20+
String message() default "";
21+
22+
Class<?>[] groups() default {};
23+
24+
Class<? extends Payload>[] payload() default {};
25+
26+
boolean ignoreCase() default false;
27+
}

core/src/main/java/com/kernelsquare/core/validation/validator/EnumValue.java renamed to core/src/main/java/com/kernelsquare/core/validation/annotations/EnumValue.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.kernelsquare.core.validation.validator;
1+
package com.kernelsquare.core.validation.annotations;
22

33
import static java.lang.annotation.ElementType.*;
44

@@ -7,6 +7,8 @@
77
import java.lang.annotation.RetentionPolicy;
88
import java.lang.annotation.Target;
99

10+
import com.kernelsquare.core.validation.validator.ValueOfEnumValidator;
11+
1012
import jakarta.validation.Constraint;
1113
import jakarta.validation.Payload;
1214

0 commit comments

Comments
 (0)