
๊ธฐ์กด ํ๋ก์ ํธ๋ฅผ ํ ๋, ์๋ต์ ๋ด ๋ง์๋๋ก ๋ง stringํ๋ค๊ฐ, responseDtoํ๋ค๊ฐ booleanํ๋ค๊ฐ voidํ๋ค๊ฐ ๋๋ฆฌ ์๋ง์ง์ฐฝ ๋ถ๋ฅด์ค ์๋ฐ์ผ๋ฐ ์๋ฐ ์ท์๋๋ฐ....
์๋ต์ ํต์ผํ๋ ๊ฒ์ ์ค์์ฑ์ ๊นจ๋ฌ์๋ค!!
(ํ๋ก ํธํํ
์ ์๋จน์ผ๋ ค๋ฉด ํด์ผ๋จ์)
๊ทธ๋ฆฌ๊ณ ์ด ๊ณผ์ ์์ ํ์ํ ๊ฐ๋ ๋ค๊น์ง ํจ๊ป ์์๋ณด์ !
- ์ ๋ค๋ฆญ
<Generic>- ๋น๋ ํจํด(Builder Pattern)
- Enum์ ์ด์ฉํ ์ฝ๋ ๊ด๋ฆฌ
- ์ฒด์ด๋(Method Chaining)์ ๊ตฌ์กฐ
ํด๋ผ์ด์ธํธ๋ API ์์ฒญ ๊ฒฐ๊ณผ๋ก JSON์ ๋ฐ๋๋ค
๋ฐฑ์๋๋ ํฐ ์๊ด์์ง๋ง, ์ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ ํ๋ก ํธ ์
์ฅ์์ ๋ฌธ์ ๊ฐ ์๊ธด๋ค
์์ฒญ์ ๋ ๋ฆฌ๊ณ ๋ฐ์๋๋ง๋ค ๋งค๋ฒ JSON ๊ตฌ์กฐ๊ฐ ๋ค๋ฅด๋ฉด, ํ๋ก ํธ์๋๊ฐ ์ด ์ฒ๋ฆฌ๋ฅผ ๊ฒฝ์ฐ๋ง๋ค ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํด์ฃผ์ด์ผํ๋ ๋นก์น๊ฒ๋๋ค..
์๋ฅผ ๋ค์ด ํ์๊ฐ์ ์๋ต์ด ์ด๋ฐ ๊ตฌ์กฐ๋ผ๋ฉด:
{
"code": 200,
"data": {
"name": "๋",
"email": "itsmin@naver.com"
},
"comment": "ํ์๊ฐ์
์ฑ๊ณต"
}
๋ก๊ทธ์ธ๋, ๊ฒ์๊ธ ์กฐํ๋, ์ญ์ ์๋ต ๋ฑ๋ฑ ๋ชจ๋ ์ด๋ฐ ๊ตฌ์กฐ๋ก ํต์ผํ๋ฉด ๋ชจ๋ ์๋ต์ ๋๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ ๊ฐ๋ฅํ๋ค! ์ฐ๋ฆฌ ๋ชจ๋ ํํ๋ก์ธ ์ ์๋ ์กฐ์ ๋ฐฉ๋ฒ๐
โ
์ผ๊ด๋ JSON ํฌ๋งท ์๋ต โ ํ๋ก ํธ์์ ์๋ต ์ฒ๋ฆฌ ๋ก์ง์ด ๋จ์ํด์ง๋ค
โ
์ ์ง๋ณด์ ์ฉ์ด โ ์ํ ์ฝ๋/๋ฉ์์ง๋ฅผ ํ ๊ณณ์์ ๊ด๋ฆฌ
โ
ํ
์คํธ ์ฉ์ด โ ์๋ต์ด ์์ธก ๊ฐ๋ฅํ๋ฏ๋ก ํ
์คํธ๋ ๋จ์ํด์ง (ํ
์คํธ ๊ฐ ์๋ชป ๋ฃ์์ ๋ ๋ฐ๋ก ์ ์ ์์)
โ
ํ์ฅ์ฑ โ ์๋ก์ด ์๋ต ํ์
์ถ๊ฐ๋ ์ฝ๊ฒ ๋์ ๊ฐ๋ฅ!
Enum์ ์ด๊ฑฐํ ์์๋ฅผ ์ ์ํ ๋ ์ฌ์ฉํ๋ Java์ ํน๋ณํ ํ์ !
public enum WeekDay {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
โก๏ธ WeekDay๋ผ๋ ์๋ก์ด ํ์ ์ด ์๊ธฐ๊ณ , 7๊ฐ์ ์์(์์ผ)๋ง ๋ค์ด๊ฐ ์ ์๋ ๊ฒ!!
public class Test {
public static void main(String[] args) {
WeekDay today = WeekDay.MONDAY;
if (today == WeekDay.MONDAY) {
System.out.println("์์์ผ ์๋ฐ ;;");
}
}
}
values() ๋ฉ์๋๋ก ๋ชจ๋ enum ๊ฐ ์ํ ๊ฐ๋ฅ โ enum ์์ ์กด์ฌํ๋๊ฐ? ๋ก ํ์ฉ ๊ฐ๋ฅํ๋ค!
for (WeekDay day : WeekDay.values()) {
System.out.println(day);
}
๊ทผ๋ฐ ์ค๋ช
๋ฉ์์ง, ์ซ์ ์ฝ๋ ๋ฑ ์ถ๊ฐ ์ ๋ณด๋ฅผ ๋ฃ๊ณ ์ถ์ ์ ์๋ค.
๊ทธ๋ด ๋ ์ด๋ ๊ฒ ํ์ฉํด๋ณด์
@Getter
@RequiredArgsConstructor
public enum SuccessCode {
SIGNUP_SUCCESS(HttpStatus.OK, 200, "ํ์๊ฐ์
์ฑ๊ณต"), //๊ฐ์ ์ ์ํ๊ธฐ
LOGIN_SUCCESS(HttpStatus.OK, 200, "๋ก๊ทธ์ธ ์ฑ๊ณต"),
POST_CREATED(HttpStatus.CREATED, 201, "๊ฒ์๊ธ ์์ฑ ์๋ฃ");
private final HttpStatus httpStatus; //์ํ๋ ๊ฐ ์ ์ํด์ฃผ๊ณ
private final int code;
private final String message;
}
ํ์ฉํ๋ฉด ์ด๋ ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค!
๊ทธ๋ฆฌ๊ณ ์๋์ฒ๋ผ ์ฌ์ฉํ๋ฉด~
SuccessCode code = SuccessCode.SIGNUP_SUCCESS;
System.out.println(code.getMessage()); //๋ฉ์ธ์ง ๊ฐ์ ธ์ค๊ธฐ
โ ํ์๊ฐ์
์ฑ๊ณต ์ถ๋ ฅ!!
๐ Enum ์ฌ์ฉ ์ ์ฅ์
1. ์ฝ๋ ์ค๋ณต ์ค์ด๊ธฐ
2. ์ํ ์ฝ๋, ๋ฉ์์ง ํ ๊ณณ์์ ๊ด๋ฆฌ
3. ์ํ ๊ด๋ฆฌ ์ผ๊ด์ฑ ์ ์ง
์๊น ๋ง๋ค์ด๋ Enum ํด๋์ค๋ฅผ ์ฌ์ฉํด์ ์ ํํ๋ ์๋ต์ ๋ฐํํ ์ ์๋ CommonResponse ํด๋์ค๋ฅผ ๋ง๋ค์
๊ณตํต ์๋ต ํด๋์ค๋ฅผ ๋ง๋ค ๋, ๊ทธ ์์ ๋ค์ด๊ฐ data๋ ์ํฉ๋ง๋ค ๋ค๋ฅด๋ค
-ํ์๊ฐ์
์๋ UserResponseDto
-ํ ์ผ ์กฐํ๋ฉด TodoResponseDto
-์ํ ์ ๋ณด๋ฉด ProductResponseDto
๐ ์๋ต ๋ฐ์ดํฐ์ ํ์
์ด ์ธ์ ๋ ๋ค๋ฅด๋ค!
๊ทธ๋์ ์ด๊ฑธ ๋ค Object๋ก ์ฒ๋ฆฌํ๋ฉด ๋งค๋ฒ ํ๋ณํ์ ํด์ผ ํ๊ณ , ํ์ ์์ ์ฑ์ด โ
โก๏ธ ์ ๋ค๋ฆญ(Generic)์ ์ฌ์ฉํ๋ฉด ํ๋์ ํด๋์ค์ ๋ค์ํ ํ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฐํ๊ฒ ๋ด์ ์ ์๋ค!!
: ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋, ์์ฑ์ ๋์ ์ฌ์ฉํ๋ ๋์์ธ ํจํด ์ค ํ๋
๐ ์ ์จ์ผํด???
: ํ๋๊ฐ ๋ง์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋, ์์ฑ์๋ setter๋ก ํ๋ฉด ๋๋ฌด๋๋ฌด ๋ณต์กํด์ง๋๊น ๊น๋ดํ๊ฒ ํํํ๊ธฐ ์ํด์!
โ ๊ฐ๋
์ฑ & ๋ถ๋ณ์ฑ์ ์ํด์ (๊ฐ์ฒด๊ฐ ํ ๋ฒ ์์ฑ๋๋ฉด ์์ ํ ์ ์๊ฒ)
User user = new User("ํ๊ธธ๋", "hong@test.com", "1234");
์ด๋ฐ์์ผ๋ก ๋ง๋ค ๋, ๊ฐ์ฒด๊ฐ ๋ช๊ฐ ์์ผ๋ฉด ์ธ๋งํ์ง๋ง,,,
์์ฒญ ๋ง์์ง๋ค๋ฉด?? 100๊ฐ๋ฅผ ๋ฃ์ด์ผํ๋ค๋ฉด?? ๊ฐ๋
์ฑ์ด ๋ฅ๋ง์ด ๋๊ฒ ์ฃ ?
๊ทธ๋ด๋ Builder ํจํด์ ์ ์ฉํ๋ฉด ๋๋น!!
User user = User.builder()
.name("ํ๊ธธ๋")
.email("hong@test.com")
.password("1234")
.build();
@Builder ์ด ์ด๋
ธํ
์ด์
์ ํด๋์ค์ ๋ถ์ฌ์ฃผ๋ฉด, ์ด๋ฐ์์ผ๋ก ๋ฐ๊ฟ์ ์ฌ์ฉํ ์ ์๋ฐ! ๊ฐ๋
์ฑ์ด ์ข์์ก์ฃต
@Getter
@Builder
@JsonInclude(JsonInclude.Include.NON_NULL)
public class CommonResponse<T> {
private final int code;
private final T data;
private final String comment;
public static <T> CommonResponse<T> of(SuccessCode code, T data) {
return CommonResponse.<T>builder()
.code(code.getCode())
.data(data)
.comment(code.getMessage())
.build();
}
public static <T> CommonResponse<T> of(SuccessCode code) {
return CommonResponse.<T>builder()
.code(code.getCode())
.comment(code.getMessage())
.build();
}
}
๐ก ํต์ฌ!!
1.@Builder
: ๋น๋ ํจํด ์ ์ฉ โ ํ๋ ์์ ์๊ด์์ด ๊ฐ์ฒด ์์ฑ ๊ฐ๋ฅ
2.<T>์ ๋ค๋ฆญ ์ฌ์ฉ
: ์ด๋ค ํ์ ์ด๋ data์ ๋ฃ์ ์ ์๋๋ก! (response๋ง๋ค ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌ ์ํด์ค๋ ๋๋๊น ์์ฐ์ฑ ํฅ์๋จ)
3.@JsonInclude.NON_NULL
: null ํ๋๋ JSON์ ํฌํจ๋์ง ์์ (๊ฐ๊ฒฐํ ์๋ต)
@PostMapping("/signup")
public ResponseEntity<CommonResponse<UserResponseDto>> signup(@RequestBody SignUpRequestDto request) {
UserResponseDto userResponseDto = userService.signup(request);
return ResponseEntity
.status(SuccessCode.SIGNUP_SUCCESS.getHttpStatus()) // ์ํ ์ฝ๋ ์ค์
.body(CommonResponse.of(SuccessCode.SIGNUP_SUCCESS, userResponseDto)); // ์๋ต ๋ณธ๋ฌธ ์ค์
}
๐ง ์ ์ด๋ฐ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฅผ๊น?
ResponseEntity.status(...).body(...)
โก๏ธ ๋น๋ ํจํด ๊ธฐ๋ฐ์ ๋ฉ์๋ ์ฒด์ด๋ ๋ฐฉ์
(์์๋ฅผ ๋ฐ๊ฟ์ body(...).status(...)์ฒ๋ผ ์ฐ๋ฉด ๋ฌธ๋ฒ ์ค๋ฅ ๋ฐ์)
๋ฐ๋ผ์ ์์ฐจ์ ์ผ๋ก ์จ์ผํจ
1. ์ํ์ฝ๋ ์ค์
2. ์๋ต ๋ฐ์ดํฐ ์ค์
ResponseEntity.status(...)
: ์๋ต์ HTTP ์ํ์ฝ๋ ์ค์ (200, 201, 400, 500 ๋ฑ)
.body(...)
: ์๋ต ๋ณธ๋ฌธ์ ๋ด์ ๋ฐ์ดํฐ ์ค์
(CommonResponse.of(...) SuccessCode์ ์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ณตํต ์๋ต ๊ฐ์ฒด ์์ฑ)
โก๏ธ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ!