์ํ ์ฐธ์กฐ์ ์์ธ
Spring Boot๋ @ResponseBody
์ด๋
ธํ
์ด์
์ ์ ์ธํ ๋ ๊ฐ์ฒด๋ฅผ JSON ์ํ๋ก ๋ณํํ๊ธฐ ์ํด Jackson ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. Jackson์ ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํํ์ฌ JSON ํํ๋ก ๋ณํํ๋๋ฐ, ๊ธฐ๋ณธ์ ์ผ๋ก public ํ๋ ๋๋ getter๊ฐ ์๋ ํ๋๋ง ์ง๋ ฌํ ๋์์ผ๋ก ์ทจ๊ธํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ Member
ํด๋์ค๊ฐ ์์ต๋๋ค:
public class Member {
private String stringValue;
int intValue;
protected float floatValue;
public boolean booleanValue;
// No Getter Setter
}
์ ํด๋์ค์์๋ booleanValue
๋ง public์ด๋ฏ๋ก JSON์ผ๋ก ์ง๋ ฌํ๋ฉ๋๋ค.
์ค์ ์ํ ์ฐธ์กฐ ๋ฌธ์ ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์์
Board
์ Post
์ํฐํฐ๋ฅผ ํตํด ์ํ ์ฐธ์กฐ ๋ฌธ์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Board.java
@Entity
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "board_id")
private Long id;
@Column(name = "board_name")
private String name;
@OneToMany(mappedBy = "board", cascade = CascadeType.ALL)
private List<Post> postList = new ArrayList<>();
}
Post.java
@Entity
@Data
public class Post extends TimeEntity {
@Id
@GeneratedValue @Column(name = "post_id")
private Long id;
@Column(nullable = false, name = "post_title")
private String title; //์ ๋ชฉ
@Column(nullable = false, length = 3000, name = "post_content")
private String content; //๋ด์ฉ
@ManyToOne(targetEntity = Board.class, fetch = FetchType.EAGER, optional = false)
@JoinColumn(name = "board_id", nullable = false)
private Board board;
}
์ด ๊ตฌ์ฑ์์ Board
์ postList
๋ฅผ ์ง๋ ฌํํ๋ฉด ๊ฐ Post
์ board
๊ฐ์ฒด๋ฅผ ๋ค์ ์ง๋ ฌํํ๋ ค๊ณ ํ๊ณ , ์ด ๊ณผ์ ์ด ๋ฐ๋ณต๋์ด ์ํ ์ฐธ์กฐ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ํ ์ฐธ์กฐ ํด๊ฒฐ ๋ฐฉ๋ฒ
ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค. ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- @JsonManagedReference์ @JsonBackReference ์ฌ์ฉ
@JsonManagedReference
๋ ์ง๋ ฌํ์ ํฌํจ๋๋ฉฐ, @JsonBackReference
๋ ์ง๋ ฌํ์์ ์ ์ธ๋ฉ๋๋ค. ์ด๋ฅผ ์ ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
Board.java
@Entity
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "board_id")
private Long id;
@Column(name = "board_name")
private String name;
@JsonManagedReference
@OneToMany(mappedBy = "board", cascade = CascadeType.ALL)
private List<Post> postList = new ArrayList<>();
}
Post.java
@Entity
@Data
public class Post extends TimeEntity {
@Id
@GeneratedValue @Column(name = "post_id")
private Long id;
@Column(nullable = false, name = "post_title")
private String title; //์ ๋ชฉ
@Column(nullable = false, length = 3000, name = "post_content")
private String content; //๋ด์ฉ
@JsonBackReference
@ManyToOne(targetEntity = Board.class, fetch = FetchType.EAGER, optional = false)
@JoinColumn(name = "board_id", nullable = false)
private Board board;
}
์ํ ์ฐธ์กฐ ํด๊ฒฐ์ ์ํ ์ค์ ์ ์ฉ ์ฌ๋ก
ํ๋ก์ ํธ์์ ์ค์ ๋ก ์ํ ์ฐธ์กฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ๋ฌ ๋ฐฉ๋ฒ์ ์ ์ฉํ ์ ์์ต๋๋ค. ์์์ ์ค๋ช
ํ @JsonManagedReference
์ @JsonBackReference
์ธ์๋, DTO๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ API ์๋ต์ ์ต์ ํํ๋ ๋ฐ ๋์์ ์ค๋๋ค.
DTO(Data Transfer Object)๋ฅผ ์ฌ์ฉํ ์ํ ์ฐธ์กฐ ํด๊ฒฐ
DTO ์ฌ์ฉ ์์๋ก Author
์ Book
์ ๊ด๊ณ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ด ์์์์๋ ๊ฐ๋จํ ๋์ ๊ด๋ฆฌ ์์คํ
์ ๊ตฌ์ถํ ๋ Author
๊ฐ ์ฌ๋ฌ Book
์ ๊ฐ์ง ์ ์๋ ๊ด๊ณ๋ฅผ ์ค์ ํฉ๋๋ค.
Author.java
@Entity
public class Author {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "author", cascade = CascadeType.ALL)
private List<Book> books = new ArrayList<>();
}
Book.java
@Entity
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String genre;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "author_id")
private Author author;
}
AuthorDTO.java
public class AuthorDTO {
private Long id;
private String name;
private List<BookDTO> books;
public AuthorDTO(Author author) {
this.id = author.getId();
this.name = author.getName();
this.books = author.getBooks().stream().map(BookDTO::new).collect(Collectors.toList());
}
}
public class BookDTO {
private Long id;
private String title;
private String genre;
public BookDTO(Book book) {
this.id = book.getId();
this.title = book.getTitle();
this.genre = book.getGenre();
}
}
์ ์์์์๋ Author
์ Book
์ฌ์ด์ ์ํ ์ฐธ์กฐ ๋ฌธ์ ๋ฅผ DTO๋ฅผ ํตํด ํด๊ฒฐํฉ๋๋ค. AuthorDTO
์ BookDTO
๋ ๊ฐ๊ฐ ํ์ํ ์ ๋ณด๋ง์ ํฌํจํ๋ฏ๋ก, ์ง๋ ฌํ ๊ณผ์ ์์ ์ํ ์ฐธ์กฐ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
๋งคํ ์ฌ์ค์ ์ ํตํ ์ํ ์ฐธ์กฐ ํด๊ฒฐ
๋๋ก๋ ์๋ฐฉํฅ ๋งคํ์ด ๊ผญ ํ์ํ์ง ์์ ์ ์์ต๋๋ค. ํ์ํ ๊ฒฝ์ฐ์๋ง ์๋ฐฉํฅ ๋งคํ์ ์ค์ ํ๊ณ , ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์๋ ๋จ๋ฐฉํฅ ๋งคํ์ ๊ณ ๋ คํด๋ณด๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ ๊ตฌ์กฐ๋ฅผ ๋จ์ํํ๊ณ ์ฑ๋ฅ์ ๊ฐ์ ํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
์ํ ์ฐธ์กฐ ๋ฌธ์ ๋ ๋ง์ ํ๋ก์ ํธ์์ ์ง๋ฉดํ ์ ์๋ ๊ณผ์ ์ ๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์ํ ์ ๊ทผ ๋ฐฉ๋ฒ์ ์ดํดํ๊ณ ์ ์ ํ ์ ์ฉํ๋ ๊ฒ์ ํ๋ก์ ํธ์ ์ฑ๊ณต์ ํฌ๊ฒ ๊ธฐ์ฌํ ์ ์์ต๋๋ค. ์ํ ์ฐธ์กฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์ ์ดํดํ๊ณ , ์ํฉ์ ๋ง๊ฒ ์ ์ฉํ์ฌ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ์ฃผ์ํด๋ณด์