[JSCODE] 2회차

HanjmoΒ·2023λ…„ 5μ›” 14일
0

🎯 λͺ©ν‘œ

  • μ—”ν‹°ν‹° 생성
  • 기본적인 CRUD ν™œμš©
  • μš”μ²­λΆ€ν„° μ‘λ‹΅κΉŒμ§€ 전체 κ³Όμ • κ²½ν—˜
  • REST API 섀계
  • HTTP Status Code

✏️ λ‚΄μš©

1. Entity 개발

setter 지양

μ—”ν‹°ν‹°μ—μ„œ setterλ₯Ό μ‚¬μš©ν•˜λŠ” 경우 μ‚¬μš©ν•œ μ˜λ„λ₯Ό μ‰½κ²Œ νŒŒμ•…ν•˜κΈ° μ–΄λ €μš°λ©°, 일관성을 μœ μ§€ν•˜κΈ°λ„ μ–΄λ ΅λ‹€κ³  ν•œλ‹€.

λ”°λΌμ„œ, μ—”ν‹°ν‹°μ˜ 값을 μˆ˜μ •ν•  λ•ŒλŠ” setterλ₯Ό μ§€μ–‘ν•˜κ³ , μ‚¬μš©ν•œ μ˜λ„λ₯Ό μ•Œ 수 μžˆλŠ” λ©”μ„œλ“œ ν˜Ήμ€ λΉŒλ” νŒ¨ν„΄μ„ μ‚¬μš©ν•˜μ˜€λ‹€.

@NoArgsConstructor(access = AccessLevel.PROTECTED)

λ¬΄λΆ„λ³„ν•œ 객체 생성을 막기 μœ„ν•΄μ„œ(κΈ°λ³Έ μƒμ„±μžλ₯Ό 막기 μœ„ν•΄μ„œ) 엔티티에 @NoArgsConstructor(access = AccessLevel.PROTECTED) μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν–ˆλ‹€.

2. Repository, Service 계측 개발

  • Repository: λ°μ΄ν„°λ² μ΄μŠ€μ— μ ‘κ·Όν•˜μ—¬ 객체λ₯Ό DB에 μ €μž₯ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” 계측
  • Service: 핡심 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ κ΅¬ν˜„ν•˜λŠ” 계측

3. Controller 개발

API μŠ€νŽ™μ— Entity λ…ΈμΆœπŸ™…πŸ»

μ—”ν‹°ν‹°λ₯Ό API μŠ€νŽ™μ— λ…ΈμΆœν•˜λŠ” 경우 엔티티에 API 검증 둜직과 ν”„λ ˆμ  ν…Œμ΄μ…˜ 계측을 μœ„ν•œ 둜직이 μΆ”κ°€λ˜κ±°λ‚˜, μ—”ν‹°ν‹°κ°€ λ³€κ²½λ˜λ©΄ API μŠ€νŽ™ μžμ²΄λ„ λ³€κ²½λ˜λŠ” λ¬Έμ œκ°€ λ°œμƒν•œλ‹€.

κ·ΈλŸ¬λ―€λ‘œ API μŠ€νŽ™μ— μ—”ν‹°ν‹° λŒ€μ‹  λ³„λ„λ‘œ μƒμ„±ν•œ DTOλ₯Ό λ§€ν•‘ν•˜μž.

μœ μ—°ν•œ Json 객체 λ°˜ν™˜

전체 κ²Œμ‹œκΈ€μ„ μ‘°νšŒν•˜λŠ” κΈ°λŠ₯μ—μ„œ λ°˜ν™˜ νƒ€μž…μ΄ List<Post>라면, Json κ°μ²΄λŠ” [{Post1}, {Post2}, {Post3}, ...] ν˜•νƒœλ‘œ λ°˜ν™˜λœλ‹€.

λ§Œμ•½ Post뿐만 μ•„λ‹ˆλΌ Post의 κ°œμˆ˜κ°™μ€ λ‹€λ₯Έ 데이터λ₯Ό μΆ”κ°€ μš”μ²­ν•˜λŠ” 경우 Json 객체λ₯Ό λ°˜ν™˜ν•˜κΈ° κΉŒλ‹€λ‘œμ›Œμ§„λ‹€.

λ”°λΌμ„œ, {"count":2, "Post":[{Post1}, {Post2}]} ν˜•νƒœλ‘œ μœ μ—°ν•œ Json 객체 λ°˜ν™˜μ„ μœ„ν•΄μ„œ Result 클래슀둜 μ»¬λ ‰μ…˜μ„ κ°μ‹Έμ„œ λ°˜ν™˜ν•œλ‹€.

HTTP Status Code

200 OK와 같은 HTTP μƒνƒœ μ½”λ“œλΏλ§Œ μ•„λ‹ˆλΌ, 상황에 따라 λͺ…ν™•ν•œ 정보λ₯Ό 전달할 수 μžˆλŠ” HTTP μƒνƒœ μ½”λ“œλ“€λ„ μ‚¬μš©ν–ˆλ‹€.

  • 200 OK: μš”μ²­μ΄ μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œλ˜μ—ˆμ„ λ•Œ μ‚¬μš©
  • 201 Created: μƒˆλ‘œμš΄ λ¦¬μ†ŒμŠ€κ°€ μƒμ„±λ˜μ—ˆμ„ λ•Œ μ‚¬μš©
  • 204 No Content: λ¦¬μ†ŒμŠ€μ˜ μ‚­μ œκ°€ 정상 μ²˜λ¦¬λ˜μ—ˆμ„ λ•Œ μ‚¬μš©

μ†ŒμŠ€ μ½”λ“œ

@RestController
@RequiredArgsConstructor
public class PostApiController {

    private final PostService postService;

    @ResponseStatus(HttpStatus.CREATED)
    @PostMapping("/posts")
    public PostDto writePost(@RequestBody PostDto postDto) {
        Post post = Post.builder()
                .title(postDto.getTitle())
                .content(postDto.getContent())
                .build();
        postService.writePost(post);
        return PostDto.from(post);
    }

    @ResponseStatus(HttpStatus.OK)
    @GetMapping("/posts")
    public Result<PostDto> findAllPostBy() {
        List<Post> findPost = postService.findAllPost();
        List<PostDto> findPostDto = findPost.stream()
                .map(m -> PostDto.from(m))
                .collect(Collectors.toList());
        return Result.from(findPostDto);
    }

    @ResponseStatus(HttpStatus.OK)
    @GetMapping("/posts/{id}")
    public PostDto findById(@PathVariable("id") Long id) {
        Post findPost = postService.findPost(id);
        return PostDto.from(findPost);
    }

    @ResponseStatus(HttpStatus.OK)
    @PatchMapping("/posts/{id}")
    public PostDto updatePost(@PathVariable("id") Long id, @RequestBody PostDto postDto) {
        Post updatePost = postService.updatePost(id, postDto);
        return PostDto.from(updatePost);
    }

    @ResponseStatus(HttpStatus.NO_CONTENT)
    @DeleteMapping("/posts/{id}")
    public String deletePost(@PathVariable("id") Long id) {
        postService.deletePost(id);
        return "ok";
    }
}

πŸ’¬ ν›„κΈ°

이번 νšŒμ°¨λΆ€ν„° 본격적인 API κ°œλ°œμ„ μ‹œμž‘ν–ˆλ‹€.
사싀 κ°•μ˜λ₯Ό ν†΅ν•΄μ„œ CRUD κ°œλ°œμ„ κ²½ν—˜ν•΄λ³Έ 적은 μžˆμ§€λ§Œ, 혼자 힘으둜 ν•˜λŠ” 것은 거의 μ²˜μŒμ΄λ‹€.
μš°μ„  λŠλ‚Œ κ°€λŠ”λŒ€λ‘œ κ΅¬ν˜„μ€ μ„±κ³΅ν–ˆμ§€λ§Œ λΆ€μ‘±ν•œ 뢀뢄이 λ§Žμ•„μ„œ λ‹€μ–‘ν•œ 예제λ₯Ό 보며 점차 κ°œμ„ μ‹œν‚¬ 생각이닀.

μ–΄λ €μ› λ˜ λΆ€λΆ„ & κ°œμ„  λ°©ν–₯

  • μ„œλΉ„μŠ€ 계측에 μžˆμ–΄μ•Ό ν•  둜직이 컨트둀러 계측에 μžˆλŠ” λ“± 각 계측별 μ–΄λ– ν•œ 역할을 μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ”μ§€ 감이 μ™„μ „νžˆ μž‘νžˆμ§€ μ•Šμ€ λ“― ν•˜λ‹€.
    -> κ°œλ°œμ„ μ‹œμž‘ν•˜κΈ° μ „ 섀계에 κ³ λ―Όν•˜λŠ” μ‹œκ°„μ„ 늘리기

  • DTOλ₯Ό μ–΄λ–»κ²Œ μ„€κ³„ν•˜κ³ , μ–΄λ–»κ²Œ μ‚¬μš©ν• μ§€μ— λŒ€ν•΄ 많이 λΆ€μ‘±ν•˜λ‹€.
    -> DTOλ₯Ό μ™œ μ‚¬μš©ν•˜λŠ”μ§€ λͺ…ν™•ν•˜κ²Œ 받아듀인 후에 λ‹€μ–‘ν•œ 예제 μ½”λ“œλ₯Ό 보며 ν•™μŠ΅ν•˜κΈ°

  • 각각의 μ–΄λ…Έν…Œμ΄μ…˜μ„ μ–Έμ œ, μ–΄λ””μ„œ, μ–΄λ–»κ²Œ, μ™œ μ‚¬μš©ν•˜λŠ”μ§€μ— λŒ€ν•œ 이해가 λΆ€μ‘±ν•˜λ‹€.
    -> μŠ€ν”„λ§ μΆ©λΆ„νžˆ λ³΅μŠ΅ν•˜κΈ°

0개의 λŒ“κΈ€