sada-dream / sada-dream_server_v2

개인간 해외 직구 중계 플랫폼 사다드림입니다.
MIT License
0 stars 0 forks source link

Spring Boot를 이용한 RESTful Web Services 개발 [섹션 5] - Java Persistence API 사용 #78

Closed dongwooklee96 closed 3 years ago

dongwooklee96 commented 3 years ago

생성 및 조회할 때 정보를 추가하기


@GetMapping("/users/{id}")
public ResponseEntity<EntityModel<User>> retrieveUser(@PathVariable int id) {
        User user = userRepository.findById(id).
            orElseThrow(() -> new UserNotFoundException(String.format("ID[%s] not found", id)));

        EntityModel entityModel = EntityModel.of(user);
        WebMvcLinkBuilder linkTo = linkTo(methodOn(this.getClass()).retrieveAllUsers());
        entityModel.add(linkTo.withRel("all-users"));

        return ResponseEntity.status(HttpStatus.CREATED).body(entityModel);
 }
Screen Shot 2021-07-24 at 9 16 47 PM
@PostMapping("/users")
    public ResponseEntity<User> createUser(@Valid @RequestBody User user) {
        User savedUser = userRepository.save(user);

        URI location = ServletUriComponentsBuilder.fromCurrentRequest()
            .path("/{id}")
            .buildAndExpand(savedUser.getId())
            .toUri();

        return ResponseEntity.created(location).build();
    }
Screen Shot 2021-07-24 at 9 16 28 PM
dongwooklee96 commented 3 years ago

게시물 관리를 위한 Post Entity 추가와 초기 데이터 생성

Screen Shot 2021-07-24 at 9 30 04 PM

USER와 POST와 관계를 맺는 상황

@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(description = "사용자 상세 정보를 위한 도메인 객체")
@Entity
public class User {
    @Id
    @GeneratedValue
    private Integer id;

    @ApiModelProperty(notes = "사용자 이름을 입력해주세요.", example = "사용자 이름")
    @Size(min=2, message = "이름은 2글자 이상 입력해주세요.")
    private String name;

    @ApiModelProperty(notes = "사용자 등록일 입력해주세요.")
    @Past
    private Date joinDate;

    // @JsonIgnore
    @ApiModelProperty(notes = "사용자 패스워드를 입력해주세요.")
    private String password;

    // @JsonIgnore
    @ApiModelProperty(notes = "사용자의 주민번호를 입력해주세요.")
    private String ssn;

    @OneToMany(mappedBy = "user")
    private List<Post> posts;
}
package com.example.restfulwebservice.user;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

import com.fasterxml.jackson.annotation.JsonIgnore;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Generated;
import lombok.NoArgsConstructor;

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Post {
    @Id
    @Generated
    private Integer id;

    private String description;

    // User : Post -> 1 : N
    @ManyToOne(fetch = FetchType.LAZY)
    @JsonIgnore
    private User user;
}
dongwooklee96 commented 3 years ago

지연 로딩 방식이란?


dongwooklee96 commented 3 years ago
@PostMapping("/users/{id}/posts")
    public ResponseEntity<Post> createPost(@PathVariable int id ,@RequestBody Post post) {
        User user = userRepository.findById(id)
            .orElseThrow(() -> new UserNotFoundException(String.format("ID[%s] not found", id)));

        post.setUser(user);
        Post savedPost = postRepository.save(post);

        URI location = ServletUriComponentsBuilder.fromCurrentRequest()
            .path("/{id}")
            .buildAndExpand(savedPost.getId())
            .toUri();

        return ResponseEntity.created(location).build();
    }