๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป ํ”„๋กœ์ ํŠธ/๐Ÿ ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๐Ÿ 

[SpringBoot] (IntelliJ, vue.js, H2) ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ 1ํŽธ : dto ๋งŒ๋“ค๊ณ  ์ด๋ฆ„, ํŒจ์Šค์›Œ๋“œ, ์ „ํ™”๋ฒˆํ˜ธ ํŒจํ„ด ์ฒดํฌ ๋งŒ๋“ค๊ธฐ.

by ._.sori 2025. 8. 14.

 

 

 

๋Œ€๋ถ€๋ถ„์˜ ์›น์‚ฌ์ดํŠธ๋Š”
ํšŒ์›๊ฐ€์ž…๊ณผ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„๋‹ค.
๊ทธ ์ค‘ ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด๋ณด์ž!

 

 

 

 

 

1.  ํ™”๋ฉด ๋™์ž‘๊ณผ ์ „์ฒด์ฝ”๋“œ

  • ํšŒ์›๊ฐ€์ž… ์˜์ƒ

 

 

 

 

  • ํšŒ์›๊ฐ€์ž… ์ค‘๋ณต

 

 

 

  • ๋””๋ ‰ํ† ๋ฆฌ์™€ ํด๋ž˜์Šค

 

 

 

  • Vue์™€ Spring์„ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” dto 
 

Register-Web-backend/src/main/java/com/example/JoinWeb/dto at master · hyeong-ing/Register-Web-backend

์ผ๋ฐ˜ ํšŒ์›๊ฐ€์ž…๊ณผ ๋กœ๊ทธ์ธ, ๊ฐ„ํŽธ ํšŒ์›๊ฐ€์ž…๊ณผ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. Contribute to hyeong-ing/Register-Web-backend development by creating an account on GitHub.

github.com

 

 

 

  • ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’ ํŒจํ„ด ์ฒดํฌ
 

Register-Web-backend/src/main/java/com/example/JoinWeb/register/check at master · hyeong-ing/Register-Web-backend

์ผ๋ฐ˜ ํšŒ์›๊ฐ€์ž…๊ณผ ๋กœ๊ทธ์ธ, ๊ฐ„ํŽธ ํšŒ์›๊ฐ€์ž…๊ณผ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. Contribute to hyeong-ing/Register-Web-backend development by creating an account on GitHub.

github.com

 

 

 

  • ํšŒ์›๊ฐ€์ž… ์ปจํŠธ๋กค๋Ÿฌ + ์•„์ด๋””,์ด๋ฉ”์ผ ์ค‘๋ณต์ฒดํฌ ์ปจํŠธ๋กค๋Ÿฌ
 

Register-Web-backend/src/main/java/com/example/JoinWeb/register/controller at master · hyeong-ing/Register-Web-backend

์ผ๋ฐ˜ ํšŒ์›๊ฐ€์ž…๊ณผ ๋กœ๊ทธ์ธ, ๊ฐ„ํŽธ ํšŒ์›๊ฐ€์ž…๊ณผ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. Contribute to hyeong-ing/Register-Web-backend development by creating an account on GitHub.

github.com

 

 

 

  • ์ž…๋ ฅ๋œ ์ •๋ณด๋ฅผ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์™€ ์—ฐ๊ฒฐํ•  Member, MemberService
 

Register-Web-backend/src/main/java/com/example/JoinWeb/register at master · hyeong-ing/Register-Web-backend

์ผ๋ฐ˜ ํšŒ์›๊ฐ€์ž…๊ณผ ๋กœ๊ทธ์ธ, ๊ฐ„ํŽธ ํšŒ์›๊ฐ€์ž…๊ณผ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. Contribute to hyeong-ing/Register-Web-backend development by creating an account on GitHub.

github.com

 

 

 

  • ๋ ˆํฌ์ง€ํ† ๋ฆฌ
 

Register-Web-backend/src/main/java/com/example/JoinWeb/repository at master · hyeong-ing/Register-Web-backend

์ผ๋ฐ˜ ํšŒ์›๊ฐ€์ž…๊ณผ ๋กœ๊ทธ์ธ, ๊ฐ„ํŽธ ํšŒ์›๊ฐ€์ž…๊ณผ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. Contribute to hyeong-ing/Register-Web-backend development by creating an account on GitHub.

github.com

 

 

 

  • ํšŒ์›๊ฐ€์ž… vue 
 

Register-Web-frontend/src/views/BasicRegister.vue at master · hyeong-ing/Register-Web-frontend

์ผ๋ฐ˜ ํšŒ์›๊ฐ€์ž…๊ณผ ๋กœ๊ทธ์ธ, ๊ฐ„ํŽธ ํšŒ์›๊ฐ€์ž…๊ณผ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. WebStrom์œผ๋กœ Vue.js์™€ Vite๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. - hyeong-ing/Register-Web-frontend

github.com

 

 

 

 


 

 

 

 

 

2.  ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์ง€ ๊ตฌ์ƒ

  • ์ฒ˜์Œ์— ์ƒ๊ฐํ•œ ํ™”๋ฉด

 

 

 

 

  • ์‹ค์ œ๋กœ ๋งŒ๋“  ํ™”๋ฉด

์ด๋ฆ„, ์•„์ด๋””, ๋น„๋ฐ€๋ฒˆํ˜ธ, ์ „ํ™”๋ฒˆํ˜ธ, ์ด๋ฉ”์ผ์€ ๋ชจ๋‘ ํŒจํ„ด์ฒดํฌ๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค. ํŒจํ„ด์— ์–ด๊ธ‹๋‚˜๋ฉด ๊ฒฝ๊ณ ์ฐฝ์ด ์ถœ๋ ฅ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•„์ด๋””์™€ ์ด๋ฉ”์ผ์€ ์ค‘๋ณต์ฒดํฌ๋ฅผ ํ•ด์•ผํ•œ๋‹ค. ์ค‘๋ณต์ฒดํฌ๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฒฝ๊ณ ์ฐฝ์ด ์ถœ๋ ฅ๋œ๋‹ค.

 

 

 

 


 

 

 

 

3.  ํ™•์ธํ•ด์•ผํ•  ๊ฒƒ

  ์ด๋ฆ„ ์•„์ด๋”” ๋น„๋ฐ€๋ฒˆํ˜ธ
1 ํ•œ๊ธ€๋งŒ ๊ฐ€๋Šฅ ์•ž๊ธ€์ž๋Š” ๋ฌด์กฐ๊ฑด ์˜์–ด ๋Œ€๋ฌธ์ž, ํŠน์ˆ˜๋ฌธ์ž ์‚ฌ์šฉํ•˜์—ฌ 8์ž ์ด์ƒ
2 2์ž์ด์ƒ 5์ž ์ดํ•˜ ์˜์–ด์™€ ์ˆซ์ž๊ฐ€ ํ•จ๊ป˜ ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ์ด ๋‹ค๋ฅด๋ฉด
๊ฐ€์ž… ๋ถˆํ—ˆ
3 ์ •๋ณด ๋ฏธ๊ธฐ์ž…์‹œ ๊ฐ€์ž… ๋ถˆํ—ˆ ์ค‘๋ณต์ฒดํฌ ์ •๋ณด ๋ฏธ๊ธฐ์ž…์‹œ ๊ฐ€์ž… ๋ถˆํ—ˆ
4   ์•„์ด๋”” ๋ฏธ์ž…๋ ฅ์‹œ, ์ค‘๋ณต์ฒดํฌ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด
'์•„์ด๋””๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.' ๋ฉ˜ํŠธ ์ถœ๋ ฅ
 
5   ์•„์ด๋”” ์ˆ˜์ • ํ›„, ์ค‘๋ณต์ฒดํฌ ๋‹ค์‹œ ๋ˆŒ๋Ÿฌ์•ผํ•จ  
6   ์ •๋ณด ๋ฏธ๊ธฐ์ž…์‹œ ๊ฐ€์ž… ๋ถˆํ—ˆ  
7   ์ค‘๋ณต์ฒดํฌ ์•ˆํ•˜๋ฉด ๊ฐ€์ž… ๋ถˆํ—ˆ  

 

 

  ์ „ํ™”๋ฒˆํ˜ธ ์ด๋ฉ”์ผ
1 ํ•œ๊ตญ ์ „ํ™”๋ฒˆํ˜ธ ํ‘œ์ค€์— ๋งž์ถฐ ๊ธฐ์ž… ์ด๋ฉ”์ผ ํ‘œ์ค€์— ๋งž์ถฐ ๊ธฐ์ž…
2 ์ •๋ณด ๋ฏธ๊ธฐ์ž…์‹œ ๊ฐ€์ž… ๋ถˆํ—ˆ ์ด๋ฉ”์ผ ๋ฏธ์ž…๋ ฅ์‹œ, ์ค‘๋ณต์ฒดํฌ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด '์•„์ด๋”” ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.' ๋ฉ˜ํŠธ ์ถœ๋ ฅ
3   ์ด๋ฉ”์ผ ์ˆ˜์ • ํ›„, ์ค‘๋ณต์ฒดํฌ ๋‹ค์‹œ ๋ˆŒ๋Ÿฌ์•ผํ•จ
4   ์ •๋ณด ๋ฏธ๊ธฐ์ž…์‹œ ๊ฐ€์ž… ๋ถˆํ—ˆ
5   ์ค‘๋ณต์ฒดํฌ ์•ˆํ•˜๋ฉด ๊ฐ€์ž… ๋ถˆํ—ˆ

 

 

 

 


 

 

 

 

 

4.  RegisterRequest.class (dto)

DTO (Data Transfer Object, ๋ฐ์ดํ„ฐ ์ „์†ก ๊ฐ์ฒด)

: ํ”„๋กœ์„ธ์Šค ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ๋ณต์žกํ•œ ๋กœ์ง ์—†์ด ์ˆœ์ˆ˜ํ•˜๊ฒŒ ์ „๋‹ฌํ•˜๊ณ  ์‹ถ์€ ๋ฐ์ดํ„ฐ๋งŒ ๋‹ด๊ณ  ์žˆ๋‹ค.

 

@ToString
@Getter
@Setter
public class RegisterRequest {

    private String name;
    private String userId;
    private String pwd;
    private String pwdConfirm;
    private String tel;
    private String birth;
    private String email;

}

 

@ToString

: ๊ฐ์ฒด์˜ ๋ชจ๋“  ํ•„๋“œ ๊ฐ’์„ ๋ฌธ์ž์—ด๋กœ ๋ณด๊ธฐ ์ข‹๊ฒŒ ์ถœ๋ ฅํ•œ๋‹ค.

 

@Getter

: ๊ฐ์ฒด ์•ˆ์— ์ €์žฅ๋œ ๊ฐ’์„ ๊บผ๋‚ด์„œ ์ฝ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค.

 

@Setter

: ๊ฐ์ฒด ์•ˆ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝ/์ €์žฅํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค.

 

์‚ฌ์šฉ์ž๊ฐ€ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด, ์ž…๋ ฅํ•œ ๋ฐ์ดํ„ฐ๋Š” RegisterRequest ํด๋ž˜์Šค์˜ ํ•„๋“œ์— ์ €์žฅ๋œ๋‹ค. ๋ฌผ๋ก  ํ˜„์žฌ ํด๋ž˜์Šค์—์„œ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์—†๋‹ค. ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด๋‘๋ฉด ๋‚˜์ค‘์— ํšŒ์›๊ฐ€์ž…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ์—์„œ RegisterRequest ํด๋ž˜์Šค๋ฅผ dto๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค.

ํ˜„์žฌ ์ฝ”๋“œ์—์„œ @ToString์€ ํ•„์š”ํ•˜์ง„ ์•Š๋‹ค. ์˜คํžˆ๋ ค ์—†์–ด์•ผํ•˜๋Š” ์ฝ”๋“œ๋กœ, ์ž…๋ ฅ๊ฐ’์ด ์ œ๋Œ€๋กœ ์ „๋‹ฌ๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ดˆ๋ฐ˜์— ์„ค์ •ํ•ด๋‘” ์ฝ”๋“œ์˜€๋‹ค.(ํ˜น์‹œ ํ•„์š”ํ•œ ๋ถ„์„ ์œ„ํ•ด ์ ์–ด๋‘”๋‹ค) ๋งŒ์•ฝ @ToString์„ ์„ค์ •ํ•ด๋‘” ์ฑ„ ๋ฐฐํฌ๋ฅผ ํ•˜๊ฒŒ๋˜๋ฉด ๋น„๋ฐ€๋ฒˆํ˜ธ๊นŒ์ง€ ๋…ธ์ถœ๋˜์–ด ๋ณด์•ˆ ์‚ฌ๊ณ ๋กœ ์ด์–ด์ง€๋‹ˆ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  @ToString.Exclude๋ฅผ ์ด์šฉํ•ด ๋น„๋ฐ€๋ฒˆํ˜ธ ํ•„๋“œ๋ฅผ ์ถœ๋ ฅ ๋Œ€์ƒ์—์„œ ์ œ์™ธํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์•Œ์•„๋‘๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

 

 

+ ์ถ”๊ฐ€ ์ •๋ณด

@NotBlank
@Pattern(regexp = "^[๊ฐ€-ํžฃ]{2,5}$", message = "์ด๋ฆ„์€ 2-5๊ธ€์ž ํ•œ๊ธ€๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.")
private String name;

 

@NotBlank

: null, "", "  "์„ ๋ชจ๋‘ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

@Pattern

: ์š”์ฒญ ๊ฐ’์ด ์ •๊ทœํ‘œํ˜„์‹์— ๋งž๋Š” ๋ฌธ์ž์—ด์ธ์ง€ ๊ฒ€์ฆํ•œ๋‹ค.

 

์ฒ˜์Œ์—๋Š” ์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ dto์—์„œ ์ž…๋ ฅ๊ฐ’์— ์กฐ๊ฑด์„ ๋ถ™์˜€๋‹ค.(๋‹ค์–‘ํ•œ ์ƒํ™ฉ์— ๋งž๊ฒŒ alert ๋ฌธ๊ตฌ๋ฅผ ๋‚จ๊ธฐ๊ณ  ์‹ถ์–ด์„œ ๋‚˜์ค‘์—” ๋ฐ”๊ฟจ๋‹ค)

null๊ณผ "" ๊ทธ๋ฆฌ๊ณ  "  "์™€ ๊ฐ™์ด ๋ฌด์กฐ๊ฑด ๊ธ€์ž๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ๋“ค์–ด์˜ค๋„๋ก @NotBlank๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋” ๊ตฌ์ฒด์ ์ธ ์š”์ฒญ ๊ฐ’์€ @Pattern์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌผ๋ก  ๋‚˜๋Š” ์•„์˜ˆ ๋”ฐ๋กœ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ์„ค์ •ํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜๊ฒŒ dto์—์„œ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์œผ๋‹ˆ ์•Œ์•„๋‘๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

์ปจํŠธ๋กค๋Ÿฌ์— @Valid๋ฅผ ๋ถ™์—ฌ์•ผํ•˜๋Š” ๋“ฑ ์‚ฌ์šฉ๋ฒ•(?)์— ๋Œ€ํ•œ ์˜ˆ์‹œ ์ฝ”๋“œ๊ฐ€ ์žˆ์œผ๋‹ˆ ๊ตฌ์ฒด์ ์œผ๋กœ ์•Œ๊ณ  ์‹ถ์œผ๋ฉด ์•„๋ž˜ ์ถœ์ฒ˜๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋œ๋‹ค.

 

 

 

- @NotNull, @NotEmpty, @NotBlank ์ฐจ์ด์ ๊ณผ ์˜ˆ์‹œ ์ฝ”๋“œ

 

[Spring Boot] @NotNull, @NotEmpty, @NotBlank แ„‹แ…ด แ„Žแ…กแ„‹แ…ตแ„Œแ…ฅแ†ท ๋ฐ ์‚ฌ์šฉ๋ฒ•

๊ฐœ๋ฐœํ•˜์‹œ๋Š” API ์˜ request parameter ์˜ null ์ฒดํฌ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•˜๊ณ  ๊ณ„์‹ ๊ฐ€์š”? ๋Œ€๋ถ€๋ถ„ ๋ณ„๋„์˜ null ์ฒดํฌ util ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, Controller ์—์„œ ์กฐ๊ฑด๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ null ์„ ์ฒดํฌํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์กฐ๊ฑด๋ฌธ๊ณผ ๋ฉ”

sanghye.tistory.com

 

 

 

 


 

 

 

 

5.  Check

♠ ์ค‘๋ณต์ฒดํฌ ๋•Œ๋ฌธ์— ์ด๋ฉ”์ผ๊ณผ ์•„์ด๋””๋Š” ๋‹ค์Œ ๋ธ”๋กœ๊ทธ์—์„œ ๋‹ค๋ฃจ๋„๋ก ํ•˜๊ณ  ์—ฌ๊ธฐ์„œ๋Š” ์ด๋ฆ„, ํŒจ์Šค์›Œ๋“œ, ์ „ํ™”๋ฒˆํ˜ธ๋งŒ ์˜ฌ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.  

  • CheckName
public class CheckName {

    private static final String NAME_PATTERN = "^[๊ฐ€-ํžฃ]{2,5}$";

    private static final Pattern pattern = Pattern.compile(NAME_PATTERN);

    public static String checkName(String name) {

        if(name == null || name.isBlank()) {
            return "์„ฑํ•จ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.";
        }
        if (!pattern.matcher(name).matches()) {
            return "์„ฑํ•จ์€ 2~5๊ธ€์ž์˜ ํ•œ๊ธ€๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.";
        }

        return "ok";
    }

}
^[๊ฐ€-ํžฃ]{2,5}$๋ฅผ ํ•œ ๋ฒˆ ํ•ด์ฒดํ•ด๋ณด์ž. ^์™€ $๋Š” ์•ต์ปค๋ผ๋Š” ๊ฒƒ์œผ๋กœ ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘๊ณผ ๋์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ „์ฒด ํŒจํ„ด์— ์™„์ „ํžˆ ์ผ์น˜ํ•ด์•ผํ•œ๋‹ค. [๊ฐ€-ํžฃ]๋Š” ํ•œ๊ธ€์˜ ๋ชจ๋“  ์Œ์ ˆ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ํ•œ๊ธ€๋งŒ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •ํ–ˆ๋‹ค. ์˜์–ด๋„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด [A-Za-z]๋ฅผ ๋ถ™์ด๋ฉด ๋œ๋‹ค. {2, 5}๋Š” 2-5๊ธ€์ž๋กœ ๊ธธ์ด๋ฅผ ์ œํ•œํ–ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์„ค์ •ํ•œ NAME_PATTERN์„ ์ปดํŒŒ์ผํ•ด์„œ pattern ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์—ˆ๋‹ค. ์‚ฌ์‹ค ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋ณต๋ถ™ํ•ด์™€์„œ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์™œ private static final์ด ๋ถ™๋Š”์ง€๊นŒ์ง„ ๋ชฐ๋ž๋‹ค. ์ด๋ ‡๊ฒŒ ๋ธ”๋กœ๊ทธ๋ฅผ ์ •๋ฆฌํ•˜๋‹ค๋ณด๋ฉด ๋‹จ์ˆœํžˆ ๋„˜์–ด๊ฐ”๋˜ ์ฝ”๋“œ๋“ค๋„ ๋Œ์•„๋ณด๊ฒŒ ๋œ๋‹ค. pattern ๊ฐ์ฒด์— private static final์„ ๋ถ™์—ฌ ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๋กœ ๋งŒ๋“  ์ด์œ ๋Š” ์ •๊ทœ์‹์„ ํ•ด์„ํ•ด ๋‚ด๋ถ€ ์ƒํƒœ๋กœ ๋ฐ”๊พธ๋Š” ๋น„์šฉ์ด ๋“œ๋Š” ์ž‘์—…์ด๋ผ ์žฌ์‚ฌ์šฉ์ด ์ค‘์š”ํ•ด์„œ๋ผ๊ณ  ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ์ปดํŒŒ์ผ์„ ํ•ด๋‘๋ฉด ๋งค์นญ ๋น„์šฉ๋งŒ ์ง€๋ถˆํ•˜๊ฒŒ ๋˜๋‹ˆ ๋” ํšจ์œจ์ ์ด๋ผ๊ณ  ํ•œ๋‹ค.

์ด๋ฆ„๋ž€์— null ๊ฐ’์ด ๋“ค์–ด์˜ค๊ฑฐ๋‚˜, ๊ธ€์ž๊ฐ€ ๋“ค์–ด์˜ค์ง€ ์•Š์œผ๋ฉด "์„ฑํ•จ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ๋œจ๋„๋ก ์„ค์ •ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ •๊ทœ์‹์ด ๋ถˆ์ผ์น˜ํ•˜๋ฉด "์„ฑํ•จ์€ 2~5๊ธ€์ž์˜ ํ•œ๊ธ€๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค." ๋ฌธ๊ตฌ๊ฐ€ ์ถœ๋ ฅ๋˜๋„๋ก ํ–ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ์—†์œผ๋ฉด "ok"๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ๋‘๊ฐ€์ง€ ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ๋๋‹ค. ์ฒซ๋ฒˆ์งธ๋Š” ๋„์–ด์“ฐ๊ธฐ๋ฅผ ๋„ฃ์œผ๋ฉด matches๊ฐ€ ๋ฐœ๋™๋˜์–ด  "์„ฑํ•จ์€ 2~5๊ธ€์ž์˜ ํ•œ๊ธ€๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค." ๊ฒฝ๊ณ ์ฐฝ์ด ์ถœ๋ ฅ๋œ๋‹ค. null ๊ฐ’๋งŒ "์„ฑํ•จ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."๋ผ๊ณ  ๋œฌ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‘๋ฒˆ์งธ๋Š” ์–ด์ฐจํ”ผ matches๋กœ ํŒจํ„ด์„ ์ฒดํฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ต์ปค๋ฅผ ์“ฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. matcher( ).matches ์ž์ฒด๊ฐ€ ๋ฌธ์ž์—ด ์ „์ฒด ์ผ์น˜๋ฅผ ๊ฒ€์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ต์ปค๋ฅผ ๋นผ๋„ ์ž˜ ๋Œ์•„๊ฐ„๋‹ค.

์ •๋ง๋กœ ์›น์‚ฌ์ดํŠธ๋ฅผ ์—ด๊ธฐ ์œ„ํ•จ์ด ์žˆ๊ฑฐ๋‚˜ ํ€„์„ ๋†’์ด๋ ค๋ฉด ๋ฐ˜ํ™˜๊ฐ’๋„ String์ด ์•„๋‹Œ, boolean+๋ฉ”์„ธ์ง€ ํ˜น์€ enum ํ˜น์€ ์˜ˆ์™ธ/์—๋Ÿฌ์ฝ”๋“œ๋กœ ๊ตฌ์กฐํ™”ํ•˜๋ฉด ์‚ฌ์šฉ์„ฑ์ด ๋” ๋†’์ด๋Š” ๊ฑธ ์ถ”์ฒœํ•œ๋‹ค. 

 

 

 

  • CheckPwd
public class CheckPwd {

    private static final String PASSWORD_PATTERN =
            "^(?=.*[A-Z])(?=.*[0-9])(?=.*[a-z])(?=.*[!@#$%^&*()-+=]).{8,}$";

    private static final Pattern pattern = Pattern.compile(PASSWORD_PATTERN);

    public static String checkPwd(String pwd, String pwdConfirm) {
        if(pwd == null || pwd.isBlank()) {
            return "ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.";
        }
        if (pwdConfirm == null || pwdConfirm.isBlank()) {
            return "ํŒจ์Šค์›Œ๋“œ ํ™•์ธ๋ž€์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.";
        }
        if (!pwd.equals(pwdConfirm)) {
            return "ํŒจ์Šค์›Œ๋“œ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.";
        }
        if (!pattern.matcher(pwd).matches()) {
            return "ํŒจ์Šค์›Œ๋“œ์— ๋Œ€๋ฌธ์ž์™€ ํŠน์ˆ˜๋ฌธ์ž๊ฐ€ ํฌํ•จ๋œ 8๊ธ€์ž ์ด์ƒ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.";
        }

        return "ok";
    }

 

CheckPwd ํด๋ž˜์Šค์—์„œ๋Š” pwd์™€ pwdConfirm์— ์ž…๋ ฅ๋œ ๊ฐ’์ด ๋™์ผํ•œ์ง€ ํ™•์ธํ•ด์•ผํ•œ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ์—์„œ CheckPwd ํด๋ž˜์Šค๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜ pwd์™€ pwdConfirm์„ ๋ณด๋‚ผ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿผ CheckPwd ํด๋ž˜์Šค์—์„œ ๋ฐ›์€ ๋‘ ์ธ์ž ๊ฐ’์ด ๋™๋“ฑํ•œ์ง€ equals๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ๊ฒƒ์ด๋‹ค.

 

 

 

  • CheckTel
public class CheckTel {

    private static final String TEL_PATTERN = "^01(?:0|1|[6-9])[-](\\d{3}|\\d{4})[-](\\d{4})$";

    private static final Pattern pattern = Pattern.compile(TEL_PATTERN);

    public static String checkTel(String tel) {
        
        if(tel == null || tel.isBlank()) {
            return "ํœด๋Œ€ํฐ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.";
        }
        if (!pattern.matcher(tel).matches()) {
            return "ํœด๋Œ€ํฐ ๋ฒˆํ˜ธ ์–‘์‹์€ 010-0000-0000 ์ž…๋‹ˆ๋‹ค.";
        }

        return "ok";
    }
}

 

 

 

 


 

 

 

 

6. RigisterController

@RestController
@RequestMapping("/api")
@CrossOrigin(origins = "http://localhost:5173")
public class RegisterController {

    @Autowired
    private MemberService memberService;

    @PostMapping("/register")
    public ResponseEntity<String> register(@RequestBody RegisterRequest request) {

        // ์ด๋ฆ„ ์ฒดํฌ
        String nameCheckResult = CheckName.checkName(request.getName());
        if (!"ok".equals(nameCheckResult)) {
            return ResponseEntity.badRequest().body(nameCheckResult);
        }

        // ํŒจ์Šค์›Œ๋“œ ์ฒดํฌ
        String pwdCheckResult = CheckPwd.checkPwd(request.getPwd(), request.getPwdConfirm());
        if (!"ok".equals(pwdCheckResult)) {
            return ResponseEntity.badRequest().body(pwdCheckResult);
        }

        // ํฐ๋„˜๋ฒ„ ์ฒดํฌ
        String telCheckResult = CheckTel.checkTel(request.getTel());
        if (!"ok".equals(telCheckResult)) {
            return ResponseEntity.badRequest().body(telCheckResult);
        }

        // ์ถœ๋ ฅ์šฉ -> ์—†์• ์•ผํ•˜๋Š” ์ฝ”๋“œ
        System.out.println("=========================");
        System.out.println("ํšŒ์›๊ฐ€์ž… ์ •๋ณด๊ฐ€ ๋“ค์–ด์™”์Šต๋‹ˆ๋‹ค.");
        System.out.println("=========================");
        System.out.println(request);
        System.out.println("=========================");
        
        
        // ํ™•์ธ์ด ๋๋‚œ ๋ฐ์ดํ„ฐ๋Š” member์— ์ €์žฅ
        Member member = new Member();
        member.setName(request.getName());
        member.setUserId(request.getUserId());
        member.setPwd(request.getPwd());
        member.setTel(request.getTel());
        member.setBirth(request.getBirth());
        member.setEmail(request.getEmail());

        memberService.save(member);
        
        
        // ํšŒ์›๊ฐ€์ž… ํ—ˆ๊ฐ€
        return ResponseEntity.ok("ok");
    }
}
๋‹ค๋ฅธ ํฌ์ŠคํŒ…์—์„œ ์œ„์˜ ์ฝ”๋“œ๋Š” ๋” ์ž์„ธํ•˜๊ฒŒ ์‚ดํŽด๋ณด๊ธฐ๋กœ ํ•˜๊ณ , ํŒจํ„ด ์ฒดํฌ์— ๊ด€๋ จ๋œ ์ „๋ฐ˜์ ์ธ ์ฝ”๋“œ๋งŒ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค. @RequestBody RegisterRequest request๋กœ vue์—์„œ ๋ณด๋‚ธ JSON ๋ฐ์ดํ„ฐ๋ฅผ RegisterRequest DTO๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋ฐ›๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ResponseEntity<String>์€ ์‘๋‹ต์„ ์ƒํƒœ ์ฝ”๋“œ์™€ body ํ˜•ํƒœ๋กœ ๋Œ๋ ค์ฃผ๋Š” ํƒ€์ž…์ด๋‹ค. ์œ„์˜ ์ฝ”๋“œ์—์„œ ๊ฐ€์ž…์— ์„ฑ๊ณตํ•˜๋ฉด  200 OK + "ok"๊ฐ€ ๋ณด๋‚ด์ง„๋‹ค.

String nameCheckResult = CheckName.checkName(request.getName()); ์ฝ”๋“œ๋ฅผ ๋ณด์ž. request.getName( )์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜จ๋‹ค. ์ด๋•Œ dto์— ์„ค์ •ํ–ˆ๋˜ Getter๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์ ธ์˜จ ์ด๋ฆ„์€  CheckName.checkName์œผ๋กœ CheckName ํด๋ž˜์Šค๋กœ ํ–ฅํ•ด ๋งŒ๋“ค์–ด๋‘” if๋ฌธ์„ ๊ฑฐ์น˜๊ฒŒ ๋œ๋‹ค. ๋งŒ์•ฝ if๋ฌธ์„ ํ†ต๊ณผํ•˜๋ฉด "ok"๊ฐ€ ๋„˜์–ด๊ฐˆ ๊ฒƒ์ด๊ณ , if๋ฌธ์— ๊ฑธ๋ฆฌ๋ฉด ๊ทธ์— ๋งž๋Š” ๋ฌธ์ž์—ด์ด ๋„˜์–ด๊ฐ„๋‹ค.

if (!"ok".equals(nameCheckResult)) ๋„˜์–ด๊ฐ„ ๊ฒฐ๊ณผ๊ฐ’์ด ok๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด? ResponseEntity.badRequest().body(nameCheckResult);์œผ๋กœ "์„ฑํ•จ์€ ํ•œ๊ธ€๋กœ ์ž‘์„ฑํ•˜์…”์•ผํ•ฉ๋‹ˆ๋‹ค."๊ฐ€ body์— ๋‹ด๊ธฐ๊ณ  400 Bad Request ์‘๋‹ต์„ ๋ณด๋‚ด๊ฒŒ ๋œ๋‹ค. ์ด์ œ ํ”„๋ก ํŠธ๋Š” ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•„ ์‚ฌ์šฉ์ž ํ™”๋ฉด์— ์ถœ๋ ฅ์‹œํ‚จ๋‹ค.

 

 

 

 

 


 

 

์•„๋ž˜์— ์ถœ์ฒ˜๋ฅผ ๋‚จ๊ฒจ๋‘๊ฒ ์Šต๋‹ˆ๋‹ค.
๋ธ”๋กœ๊ทธ์—” ์ œ๊ฐ€ ์ตœ๋Œ€ํ•œ ์ดํ•ดํ•œ ๋‚ด์šฉ๊นŒ์ง€๋งŒ ์ ๋Š”๊ฑฐ๋ผ
์ถœ์ฒ˜์— ๋“ค์–ด๊ฐ€์‹œ๋ฉด ๋” ๋งŽ์€ ๋‚ด์šฉ์ด ์žˆ์–ด ๊ณต๋ถ€ํ•˜์‹œ๋Š”๋ฐ ๋„์›€๋˜์‹ค๊ฒ๋‹ˆ๋‹ค.

 

๐Ÿชฝ

ํ‹€๋ฆฐ ๋‚ด์šฉ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์„ธ์š”

 

 


 

 

- ์˜ฌ๋ฐ”๋ฅธ ํŒจ์Šค์›Œ๋“œ ์ž‘์„ฑ ๊ทœ์น™

 

์˜ฌ๋ฐ”๋ฅธ ํŒจ์Šค์›Œ๋“œ ์ž‘์„ฑ๊ทœ์น™(๊ธธ์ด vs ๋ณต์žก๋„)

๊ฐœ์ธ์ •๋ณด์˜ ๊ธฐ์ˆ ์ ·๊ด€๋ฆฌ์  ๋ณดํ˜ธ์กฐ์น˜ ๊ธฐ์ค€ ์ œ4์กฐ(์ ‘๊ทผํ†ต์ œ) โ‘ฆ ์ •๋ณดํ†ต์‹ ์„œ๋น„์Šค ์ œ๊ณต์ž๋“ฑ์€ ์ด์šฉ์ž๊ฐ€ ์•ˆ์ „ํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž‘์„ฑ๊ทœ์น™์„ ์ˆ˜๋ฆฝํ•˜๊ณ , ์ดํ–‰ํ•œ๋‹ค. โ‘ง ์ •๋ณดํ†ต

peim.tistory.com

 

 

 

- ์•ต์ปค

 

์•ต์ปค: ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘ ^๊ณผ ๋ $

 

ko.javascript.info

 

 

 

- ์ •๊ทœํ‘œํ˜„์‹

 

์ •๊ทœํ‘œํ˜„์‹

๋ฌธ์ž์—ด์„ ๋‹ค๋ฃจ๋Š” ํŒจํ„ดํ™”๋œ ์ž‘์—…์„ ์ •์˜ํ•˜๋Š” ์ˆ˜์‹๋ฌธ์ž์—ด ๋งค์นญ, ํ…œํ”Œ๋ฆฟ ์ผ์น˜ ์—ฌ๋ถ€ ํ™•์ธ, ํ…œํ”Œ๋ฆฟ ๋งค์นญ ๊ฒ€์ƒ‰(๋ฌธ์„œ๊ฐ€ ์žˆ์„ ๋•Œ ์ด๋ฉ”์ผ๋งŒ ๋ฝ‘๋Š” ์ž‘์—…์„ ํ•  ๋•Œ ๋“ฑ๋“ฑ)์ •๊ทœํ‘œํ˜„์‹์€ ๋А๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋‚จ์šฉํ•˜๋ฉด

velog.io

 

 

 

- ํŒจ์Šค์›Œ๋“œ ์ •๊ทœ์‹

 

[JAVA] ์ •๊ทœ์‹์„ ์ด์šฉํ•˜์—ฌ ํŒจ์Šค์›Œ๋“œ Validator ๋งŒ๋“ค๊ธฐ!

ํŒจ์Šค์›Œ๋“œ Validator  Java๋ฅผ ํ†ตํ•ด์„œ ๊ฐ„๋‹จํ•œ ํŒจ์Šค์›Œ๋“œ Validator๋ฅผ ์ƒ์„ฑํ•ด๋ณด์ž. ์š”์ฆ˜ ๋ณด์•ˆ์ด ๋†’์•„์ง์— ๋”ฐ๋ผ ํŒจ์Šค์›Œ๋“œ ๊ทœ์น™๋„ ๋ณต์žกํ•ด์ง„๋‹ค. ์šฐ์„  ๋Œ€ํ‘œ์ ์ธ ๊ทœ์น™๋“ค์„ ๋‚˜์—ดํ•ด๋ณด์ž.  (?=.*[A-Z]): ๋Œ€๋ฌธ์ž๊ฐ€

jay-cheol.tistory.com

 

 

 

- ResponseEntity

 

ResponseEntity์˜ ์‚ฌ์šฉ๋ฒ• ๋ฐ ์œ ์ง€๋ณด์ˆ˜

ResponseEntity๋ฅผ ์“ฐ๋Š” ์ด์œ  ์ผ๋ฐ˜์ ์œผ๋กœ Controller์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ์ฒด๋ฅผ Return ํ•˜๋Š” ๊ฒฝ์šฐ HTTP ์‘๋‹ต์„ ์ œ์–ดํ•  ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. @GetMapping("/") public User getUser() { User user = userService.getUser(); return user; } ํ•˜์ง€

stir.tistory.com

 

 

 

- Lombok

 

@Getter and @Setter

 

projectlombok.org