[REST API] User Entity와 일대다 관계인 Post Entity 만들기

민지·2024년 3월 18일
0

REST API - Spring Boot

목록 보기
25/27
  • 앞 과정에서 User resource에 대한 REST API를 만들었다!

    • GET /users, POST /users, GET /users/{id}, DELETE /users/{id}
  • 그럼 이제, Post resource에 대한 REST API를 만들 시간이다!

    • Retrieve all posts for a User
      • GET /users/{id}/posts
    • Create a post for a User
      • POST /users/{id}/posts

Post resource에 대한 REST API의 기능 2가지를 다음 포스팅에 거쳐서 정리해보자!!

구현 과정

Post Entity 만들기 & User Entity modified

User Entity modified

@OneToMany(mappedBy = "user")
@JsonIgnore
private List<Post> posts;	

public List<Post> getPosts() {
	return posts;
}

public void setPosts(List<Post> posts) {
	this.posts = posts;
}

Post Entity new

@Entity
public class Post {

	@Id
	@GeneratedValue
	private Integer id;
	private String description;

	@ManyToOne(fetch = FetchType.LAZY)
	@JsonIgnore
	private User user;

	// getters and setters

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	// toString

	@Override
	public String toString() {
		return "Post [id=" + id + ", description=" + description + "]";
	}

}
  • Post를 User와 매핑시키기
    • 1명의 User - 여러 개의 Post 가능
    • User 엔디티에서, Posts와 무슨 관계? -> 일대다
      @OneToMany(mappedBy = "user")
    • Post 엔디티에서, User와 무슨 관계? -> 다대일
      @ManyToOne(fetch = FetchType.LAZY)


      fetch 속성 정의

      -> fetch 속성은, 관계가 지연(lazy) 로딩이 될건지, 아니면 즉시(eager) 로딩이 될 건지 결정해주는 속성
      -> 동일한 쿼리에서 post와 user의 세부정보를 검색하고자 한다면 eager fetch를, 그럴 필요가 없다면 lazy fetch를 사용하면 된다.

  • @JsonIgnore 추가 - 1대다, 다대1 관계를 설정했을 뿐
    • Post Entity에서는, User Entity를 Json 응답에 포함시키지 않는다.
    • User Entity에서는, Post Entity를 Json 응답에 포함시키지 않는다.

/src/main/resources/application.properties Modified

spring.jpa.show-sql=true

콘솔창에 쿼리문이 보이게 하는 속성

위 설정 추가 이후, 콘솔창에 뜬 쿼리문을 아래와 같이 정리했다.

Table Creation From Logs

create sequence post_seq start with 1 increment by 50

create sequence user_details_seq start with 1 increment by 50

create table post
(id integer not null, description varchar(255), user_id integer, primary key (id))

create table user_details
(id integer not null, birth_date date, name varchar(255), primary key (id))
  • user_details 테이블은, User Entity의 멤버변수만 가지지만,
    흥미롭게도, post 테이블은, Post Entity의 멤버변수뿐만 아니라, 연결된 User 엔디티의 user_id 필드도 같이 만들어진 것을 확인할 수 있었다!

    • User클래스의 @OneToMany의 mappedBy 속성 때문이다!
    • user_id 열은, post와 특정 user를 연결할 때 사용할 것!
  • user_details_seq는 User에 @GeneratedValue를 추가했기 때문이고, post_seq 또한 Post에 @GeneratedValue를 추가했기 때문
    -> 이 2개의 sequence는, 새 post나 새 user를 생성할 때, id값 생성에 사용된다.


생성한 User - Post의 일대다 관계 테스트

// User
insert into user_details(id,birth_date,name)
values(10001, current_date(), 'minjiki2_sql_1');

insert into user_details(id,birth_date,name)
values(10002, current_date(), 'minjiki2_sql_2');

insert into user_details(id,birth_date,name)
values(10003, current_date(), 'minjiki2_sql_3');


// Post
insert into post(id, description, user_id)
values (20001, 'I want to learn CSS', 10001);

insert into post(id, description, user_id)
values (20002, 'I want to learn JS', 10002);

insert into post(id, description, user_id)
values (20003, 'I want to learn HTML', 10003);



참고 및 출처

이 시리즈는 Udemy 강의의 내용을 정리한 것입니다.
https://www.udemy.com/course/spring-boot-and-spring-framework-korean/

profile
배운 내용을 바로바로 기록하자!

0개의 댓글