공부/Spring

RESTful Web Service 개발 - Java Persistence API 사용_3

데부한 2023. 1. 27. 20:36
반응형

 

 

Spring Boot를 이용한 RESTful Web Services 개발

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

사용자가 작성할 수 있는 게시물 관련 Entity를 만들어보자. 사용자는 여러 개의 게시글을 작성할 수 있으며, 아예 작성을 하지 않을 수도 있다. 반대로 게시글은 사용자가 없으면 생성되지 못한다. 즉 User가 필수 데이터, Post가 옵셔널 데이터라고 생각하면 된다.

  • Post.java 생성

...
public class Post {
    
    @Id
    @GeneratedValue
    private Integer id;
    
    private  String description;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JsonIgnore
    private Users user;
    
}
  • ManyToOne : Post 입장에서 봤을 때 여러 개의 데이터가 존재할 때 User 데이터가 적어도 한 개는 있어야한다는 의미이다.
  • JsonIgnore : Json 포맷으로 응답 시 해당 어노테이션이 붙은 데이터는 외부로 노출되지 않는다.
  • fetch = FetchType.LAZY : 지연 로딩 방식. 지연 로딩 방식은 사용자 Entity를 조회할 때 Post Entity가 같이 로딩 되는 것이 아니라 Post 데이터가 로딩되는 시점에 같이 User 데이터도 가져온다는 의미이다.
반응형
  • Users.java
@OneToMany(mappedBy = "user")
private List<Post> post;
  • OneToMany : User 입장에서 봤을 때 한 명의 사용가자 있으면 여러 개의 게시글을 작성 할 수 있다.
  • mappedBy는 Post.java에서 관계를 설정해준 필드 명을 기재한다.

 

  • data.sql

Post 더미 데이터 생성

insert into post values(10001, 'My first post', 9901);
insert into post values(10002, 'My second post', 9902);

서버 재실행 후 h2 데이터베이스 확인

 

 

게시물 조회를 위한 Post Entity와 User Entity와의 관계 설정

Post Entity를 이용한 메서드를 작성하자.

  • UserJapController.java
@GetMapping("/users/{id}/post")
public List<Post> retrieveAllPostByUser(@PathVariable int id) {
    Optional<Users> user = userRepository.findById(id);
    
    if(!user.isPresent()) {
        throw new UserNotFoundException(String.format("ID [%s] not found.", id));
    }
    
    return user.get().getPost();
}

서버 재실행 후 포스트맨 확인

반응형

나는 더미 데이터에 9901 사용자 게시글을 하나만 insert해서 post 한 개 데이터만 보인다.

전체 사용자 목록 조회 시에도 Post 데이터를 확인할 수 있다.

 

 

JPA를 이용한 새 게시물 추가 - POST HTTP Method

  • PostRepository.interface 생성

@Repository
public interface PostRepository extends JpaRepository<Post, Integer> {
    
}

 

  • UserJapController.java
@PostMapping("/users/{id}/posts")
public ResponseEntity<Post> createPost(@PathVariable int id,
                                       @RequestBody Post post) {
    // user id 검색 후 저장
    Optional<Users> user = userRepository.findById(id);

    if(!user.isPresent()) throw new UserNotFoundException(String.format("ID [%s] not found", id));

    // user 객체 저장
    post.setUser(user.get());
    
    Post savedPost = postRepository.save(post);

    URI location = ServletUriComponentsBuilder.fromCurrentRequest()
            .path("/{id}")
            .buildAndExpand(savedPost.getId())
            .toUri();
    
    return ResponseEntity.created(location).build();
}
반응형

서버 재실행 후 포스트맨 확인

사용자 게시글 조회

추가가 된 걸 확인할 수 있다.

 

 


- 출처 : 인프런 Spring Boot를 이용한 RESTful Web Services 개발 강의

반응형