Framework/Spring Boot

[Spring Boot] ์ž์ฃผ ์“ฐ์ด๋Š” Spring Boot Annotation (Controller, Service, Model)

๊ฝ์น˜_๋กœ๊ทธ 2024. 4. 21. 14:27

๐Ÿš€ Controller Annotation

Annotation ์˜์—ญ Description
@RestController Class Spring์˜ ์ปดํฌ๋„ŒํŠธ ์Šค์บ” ๋Œ€์ƒ์ด ๋˜๋„๋ก ํ•˜๊ณ  HTTP ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ž๋™์œผ๋กœ ๋งคํ•‘๋˜๋„๋ก ํ•˜๋Š” ๋“ฑ Spring์—์„œ Controller๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ธฐ๋ณธ์ ์ธ ๋™์ž‘์„ ๋‹ด๊ณ ์žˆ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค.
@Controller์™€ @RequestBody๊ฐ€ ํ•ฉ์ณ์ง„ ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ RESTful ์›น ์„œ๋น„์Šค์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
@RequiredArgsConstructor Class Spring 4.3๋ถ€ํ„ฐ๋Š” @Autowired๋ฅผ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž…๋ณด๋‹ค ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž…์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
@RequiredArgsConstructor๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์„ฑ์ž ์ฝ”๋“œ๋ฅผ ๋”ฐ๋กœ ์ ์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.
'private final Service service'์™€ ๊ฐ™์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. 
@RequestMapping Class ํ•จ์ˆ˜ ๋ ˆ๋ฒจ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•จ์ˆ˜ ๋ ˆ๋ฒจ์—๋Š” @GetMapping๊ณผ ๊ฐ™์€ HTTP ๋ฉ”์†Œ๋“œ ๋ ˆ๋ฒจ์˜ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๊ณ  ํด๋ž˜์Šค ๋ ˆ๋ฒจ์—๋Š” @RequestMapping์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
Controller์— ํฌํ•จ๋œ ๋ชจ๋“  ํ•จ์ˆ˜์— ๊ณตํ†ต ์ ์šฉํ•  ๊ณตํ†ต ๊ฒฝ๋กœ์™€ ๊ฐ™์€ ๋‚ด์šฉ์„ ์ ์Šต๋‹ˆ๋‹ค.
@Api, @Tag Class Swagger๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค.
@ApiOperation, @Operation Method Swagger๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค.
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
Method @RequestMapping์˜ ํ•˜์œ„ ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๊ฐ ํ•จ์ˆ˜๋งˆ๋‹ค ์‚ฌ์šฉํ•˜๋Š” HTTP ๋ฉ”์†Œ๋“œ์— ๋”ฐ๋ผ ์ง€์ •ํ•ด์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
path : ๊ฐ API์˜ ํ•˜์œ„ ๊ฒฝ๋กœ
produces, consumes : ์š”์ฒญ๊ณผ ์‘๋‹ต์˜ ํ˜•์‹์„ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ JSON ํ˜•ํƒœ๋กœ ํ†ต์‹ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— 'MediaType.APPLICATION_JSON_VALUE'๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
@PathVariable Param Method : 'GET'
URL ๊ฒฝ๋กœ์—์„œ ๋ณ€์ˆ˜๋ฅผ ์ถ”์ถœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ RESTful ์›น ์„œ๋น„์Šค์—์„œ ๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”์ถœํ•˜๋Š” ๋ฐ ์“ฐ์ž…๋‹ˆ๋‹ค.
'/products/{id}'์™€ ๊ฐ™์€ ๊ฒฝ๋กœ์—์„œ id๋ฅผ ์ถ”์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
@RequestParam Param Method : 'GET'
์š”์ฒญ์˜ ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜(ํŒŒ๋ผ๋ฏธํ„ฐ)๋ฅผ ์ถ”์ถœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. URL์˜ ? ๋’ค์— ์˜ค๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.
์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
'/products?id=123'์™€ ๊ฐ™์ด URL์—์„œ id๋ฅผ ์ถ”์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
์ „๋‹ฌ๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ VO ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํด๋ž˜์Šค ๋‚ด ํ•„๋“œ์™€ ์ž๋™์œผ๋กœ ๋งตํ•‘ํ•ด์ค๋‹ˆ๋‹ค. (๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ)
'POST', 'PUT', 'PATCH'์—๋„ Request๊ฐ€ form ๋ฐ์ดํ„ฐ ํ˜•์‹์œผ๋กœ ์˜จ๋‹ค๋ฉด (URL ๋’ค์— Query String ํ˜•ํƒœ๋กœ ์˜จ๋‹ค๋ฉด) ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ JSON ํ˜•ํƒœ๋Š” ์ˆ˜์šฉํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ๋กœ 'GET'์—์„œ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.)
@RequestBody Param Method : 'POST', 'PUT', 'PATCH'
HTTP ์š”์ฒญ์˜ ๋ณธ๋ฌธ(body) ๋ถ€๋ถ„์„ ํŠน์ • ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋งคํ•‘ํ•˜๋„๋ก ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค.
์ฃผ๋กœ POST๋‚˜ PUT ์š”์ฒญ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ JSON ๋˜๋Š” XML ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
- ์˜ˆ๋ฅผ ๋“ค์–ด, ํด๋ผ์ด์–ธํŠธ๊ฐ€ JSON์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ณ  ์ด๋ฅผ ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด @RequestBody๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค
@Valid Param ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ํ•  ๋•Œ ๊ฐ์ฒด์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.
@NotNull, @NotEmpty, @Size, @Pattern์™€ ๊ฐ™์€ Hibernate Validator๋กœ ์ •์˜๋œ ์–ด๋…ธํ…Œ์ด์…˜๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
VO ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๊ฐ ํ•„๋“œ์— ํ•„์š”ํ•œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์„œ ์š”์ฒญ์„ ์†์‰ฝ๊ฒŒ ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RestController
@RequestMapping("/vl")
@Api(tags = {"Simple"})
@RequiredArgsConstructor
public class SimpleController {
 
    private final SimpleService simpleService;
 
    @ApiOperation(value = "", httpMethod = "GET", notes = "")
    @GetMapping(path = "/simple", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<CommonResponseVO> method(@Valid SimpleRequestVO, simpleRequestVO){
        return ResponseUtil.createSuccessResponse(simpleService.method(simpleRequestVO));
    }
}
cs

๐Ÿš€ Service Annotation

Annotation ์˜์—ญ Description
@Service Class @Controller์™€ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
์ปดํฌ๋„ŒํŠธ ์Šค์บ” ๋Œ€์ƒ์ด ๋˜๊ณ  Spring Container์— Bean์œผ๋กœ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค.
ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” Service ํด๋ž˜์Šค๋ผ๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
@RequiredArgsConstructor Class Controller์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ด์œ ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž ์˜์กด์„ฑ ์ฃผ์ž…์„ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋˜๋ฉฐ
'private final Repository repository'์™€ ๊ฐ™์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
@Transactional Method DB์˜ ํŠธ๋žœ์žญ์…˜์„ ๋งŒ๋“ค๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๋‹จ์ˆœํžˆ @Transactional๋งŒ ์ ์–ด์ฃผ๋ฉด ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜๊ฐ€ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ์—ฌ์„œ ์ค‘๊ฐ„์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด DB์— Rollback์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
readOnly, rollbackFor, noRollbackFor, propagation, isolation, timeout์™€ ๊ฐ™์€ ์˜ต์…˜์œผ๋กœ ํŠธ๋žœ์žญ์…˜์„ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Service
@RequiredArgsConstructor
public class Service {
    private final Repository repository;
    private final SecondService secondService;
     
    @Transactional
    @HystrixCommand(fallbackMethod = "fallbackService")
    public PaginationResponseVO method(RequestVO requestVO) {
        ...
        return new PaginationResponseVO();
    }
 
    public PaginationResponseVO fallbackService(RequestVO requestVO) {
        return secondService.method(requestVO);
    }
}
cs

 

๐Ÿš€ Model Annotation

๐Ÿ“Œ@NoArgsConstrutor, @AllArgsConstrutor, @RequiredArgsConstructor ์‚ฌ์šฉ ์—ฌ๋ถ€๋Š” ํ•„์ˆ˜์ธ์ง€ ์•„๋‹Œ์ง€ ํ™•์ธ์ด ๋” ํ•„์š”!

Annotation ์˜์—ญ Description
@NoArgsConstrutor
@AllArgsConstrutor
(access = AccessLevel.PRIVATE)


Class ๊ธฐ๋ณธ ์ƒ์„ฑ์ž์™€ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ํฌํ•จํ•œ ์ƒ์„ฑ์ž๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค.
ํ•„๋“œ๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ ์ƒ์„ฑ์ž๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ํ•„๋“œ ์ˆœ์„œ์™€ ํƒ€์ž…์„ ๋ชจ๋‘ ๋งž์ถฐ์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํœด๋จผ์—๋Ÿฌ๋ฅผ ๋งŒ๋“ค์–ด๋‚ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ VO๋Š” Builder๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•˜๋ฉฐ ์™ธ๋ถ€์—์„œ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋„๋ก AccessLevel์„ ์„ค์ •ํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
  • Bulder ํŒจํ„ด์ด ๊ฐ–๋Š” ์žฅ์ 
    • ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ : ์ƒ์„ฑ์ž์— ๋งŽ์€ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ์„ ๋•Œ, ์ธ์ž์˜ ์ˆœ์„œ์™€ ์˜๋ฏธ๋ฅผ ํ˜ผ๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Builder ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ๊ฐ์˜ ์„ค์ • ๋ฉ”์„œ๋“œ์— ์˜๋ฏธ ์žˆ๋Š” ์ด๋ฆ„์„ ๋ถ€์—ฌํ•˜๊ณ , ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.
    • ํ•„์ˆ˜ ๋ฐ ์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜ ์ง€์› : ์ผ๋ถ€ ํ•„๋“œ๋Š” ํ•„์ˆ˜์ด๊ณ , ์ผ๋ถ€๋Š” ์„ ํƒ์ ์ผ ๋•Œ Builder ํŒจํ„ด์€ ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ํ•„๋“œ๋งŒ ์„ค์ •ํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ธ์ž ์ˆœ์„œ์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š์Œ : ์ƒ์„ฑ์ž์˜ ์ธ์ž ์ˆœ์„œ์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ, ์ƒˆ๋กœ์šด ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ํ•„๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด๋„ ๊ธฐ์กด ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ๋œ ์ฃผ๋ฉด์„œ ๊ฐ์ฒด ์ƒ์„ฑ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๊ฐ€๋ณ€์„ฑ์„ ๊ฐ์†Œ์‹œ์ผœ ๊ฐ์ฒด์˜ ์ผ๊ด€์„ฑ ๊ฐ•ํ™” : Builder ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€๋ณ€์„ฑ์„ ๊ฐ์†Œ์‹œํ‚ด์œผ๋กœ์จ ๊ฐ์ฒด์˜ ์ผ๊ด€์„ฑ์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์ฒด ์ƒ์„ฑ ์ดํ›„์—๋Š” ๋” ์ด์ƒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜์–ด ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@Data Class @Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor ๋ฅผ ํ•ฉ์นœ Annotation
@RequiredArgsConstructor์€ ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š์€ ๋ชจ๋“  final ํ•„๋“œ, @NonNull๊ณผ ๊ฐ™์ด ์ œ์•ฝ์กฐ๊ฑด์ด ์„ค์ •๋˜์–ด์žˆ๋Š” ๋ชจ๋“  ํ•„๋“œ๋“ค์— ๋Œ€ํ•œ ์ƒ์„ฑ์ž๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค.
@Builder Class Builder ํŒจํ„ด์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค. 
@SuperBuilder Class VO๋ฅผ ์ƒ์† ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ถ€๋ชจ์˜ ํ•„๋“œ๋ฅผ Builder์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค.
@Builder.Default Field Builder๋กœ ์ƒ์„ฑํ•  ๋•Œ ๊ธฐ๋ณธ๊ฐ’์„ ์ง€์ •ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 
@ApiModelProperty Field Swagger๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค.
@Min(1)
@Max(50)
Field @Vaild์™€ ๊ฐ™์ด ์‚ฌ์šฉ๋˜๋ฉฐ VO ์•ˆ์— ์žˆ๋Š” ํ•„๋“œ ๊ฐ’์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ•ด์ค๋‹ˆ๋‹ค.
@Min, @Max ์ด์™ธ์—๋„ @Positive, @PositiveOrZero ๋“ฑ ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ Annotation์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
@NotNull
@NotEmpty
@NotBlank
Field Null ์—ฌ๋ถ€ ์ฒดํฌ
Null ์—ฌ๋ถ€ ์ฒดํฌ, ๋นˆ ๋ฌธ์ž์—ด(""), ๋นˆ ๊ฐ์ฒด(List) ์ฒดํฌ
Null ์—ฌ๋ถ€ ์ฒดํฌ, ๋นˆ ๋ฌธ์ž์—ด(""), ๋นˆ ๊ฐ์ฒด(List) ์ฒดํฌ, ๊ณต๋ฐฑ ๋ฌธ์ž์—ด(" ")์ธ์ง€ ์ฒดํฌ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
@Getter
@ToString
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@EqualsAndHashCode(callSuper = false)
public class RequestVO extends PaginationRequestVO {
    @Builder.Default
    @Enum(enumClass = DefaultBlogSortType.class)
    @ApiModelProperty(value = "๋ธ”๋กœ๊ทธ๋ฅผ ์กฐํšŒํ•˜๋Š” ์ •๋ ฌ ๊ธฐ์ค€ (๊ธฐ๋ณธ๊ฐ’: ACCURACY)", notes = "๋ธ”๋กœ๊ทธ ์กฐํšŒ ์ •๋ ฌ ๊ธฐ์ค€", example = "RECENCY", allowableValues = "ACCURACY, RECENCY")
    private String sortType = DefaultBlogSortType.ACCURACY.name();
 
    @ApiModelProperty(value = "ํŠน์ • ๋ธ”๋กœ๊ทธ URL", notes = "ํŠน์ • ๋ธ”๋กœ๊ทธ ๊ธ€๋งŒ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ")
    private String blogUrl;
 
    @ApiModelProperty(value = "๋ธ”๋กœ๊ทธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ธฐ์ค€ ํ‚ค์›Œ๋“œ", notes = "๋ธ”๋กœ๊ทธ ๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ", required = true)
    @NotEmpty
    private String keyword;
 
    @Min(1)
    @Max(50)
    @Builder.Default
    @ApiModelProperty(value = "Page ๋‹จ์œ„๋กœ ์กฐํšŒ ์‹œ ํ•œ ๋ฒˆ์— ๊ฐ€์ ธ์˜ฌ Page์˜ ํฌ๊ธฐ (๊ธฐ๋ณธ๊ฐ’: 10)", notes = "1~50 ์‚ฌ์ด์˜ ์ •์ˆ˜", example = "10")
    private Integer pageSize = 10;
 
    @Min(1)
    @Max(50)
    @Builder.Default
    @ApiModelProperty(value = "Page ๋‹จ์œ„๋กœ ์กฐํšŒ ์‹œ ๋ฐ์ดํ„ฐ ์กฐํšŒ ์‹œ์ž‘ ๊ฑด ์ˆ˜ (๊ธฐ๋ณธ๊ฐ’: 1)", notes = "1~50 ์‚ฌ์ด์˜ ์ •์ˆ˜", example = "1")
    private Integer start = 1;
 
    public GetVO toGetVO() {
        String query = ObjectUtils.isEmpty(blogUrl) ? keyword : blogUrl + " " + keyword;
        String sort = sortType.toLowerCase();
        return GetVO.builder()
                .query(query)
                .sort(sort)
                .page(this.start)
                .size(this.pageSize)
                .build();
    }
}
cs

 

๋ฐ˜์‘ํ˜•