ํ๋ก ํธ์๋์ ๋ฐฑ์๋ ๊ฐ์ API ํต์ ์์ ๋ฐ์ํ๋ CORS ๋ฌธ์ ๋ ํํ ์ด์ ์ค ํ๋์ ๋๋ค. ๊ทธ๋ฌ๋ CORS ๋ฌธ์ ๋ก ๋ณด์ด๋ ํ์์ด ์ค์ ๋ก๋ ๋ค๋ฅธ ๋ฌธ์ ์์ ๊ธฐ์ธํ๋ ๊ฒฝ์ฐ๋ ๋ง์ต๋๋ค. ์ด๋ฒ ์ฌ๋ก์์๋ CORS ์๋ฌ๋ก ์คํด๋ ๋ฌธ์ ์ ์ค์ ์์ธ์ ์ค๋ช ํ๊ณ ํด๊ฒฐ ๊ณผ์ ์ ๊ณต์ ํฉ๋๋ค.๐
โ๏ธ CORS๋?
CORS(Cross-Origin Resource Sharing)๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ค๋ฅธ ๋๋ฉ์ธ ๊ฐ์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ๋ ๋ณด์์ ์ํด ์ฌ์ฉํ๋ ์ ์ฑ ์ ๋๋ค. ๋ค๋ฅธ ์ถ์ฒ(๋๋ฉ์ธ, ํฌํธ, ํ๋กํ ์ฝ)์ ์์ฒญ์ ์ฐจ๋จํ๋ฉฐ, ์ด๋ฅผ ํ์ฉํ๋ ค๋ฉด ์๋ฒ์์ CORS ์ค์ ์ ํตํด ํน์ ์ถ์ฒ๋ฅผ ํ์ฉํด์ผ ํฉ๋๋ค.
โ๏ธ ๋ฌธ์ ์ํฉ
ํ๋ก ํธ์๋์์ ์๋ฒ์ API๋ฅผ ์์ฒญํ ๋, CORS ์๋ฌ๊ฐ ๋ฐ์ํ๋ค๊ณ ์๊ฐํ์ง๋ง, ์ค์ ๋ก๋ CORS๊ฐ ์์ธ์ด ์๋์์ต๋๋ค. JPA์ JPQL์ ์ฌ์ฉํ์ฌ ์๋ฐฉํฅ ๊ด๊ณ๋ฅผ ์ค์ ํ ์ํฐํฐ๋ค ๊ฐ์ ๋ฌดํ ์ฌ๊ท ํธ์ถ์ด ์์ธ์ด์์ต๋๋ค. ์ด๋ ์ง๋ ฌํ ๊ณผ์ ์์ ๋ฐ์ํ๋ ๋ฌธ์ ๋ก, ๋ฌดํ ๋ฃจํ๊ฐ ์๋ฒ ์๋ต์ ๋ฐฉํดํ๋ฉฐ CORS ์๋ฌ๋ก ํผ๋๋ ์ ์์์ต๋๋ค.
๐ก ์ง๋ ฌํ๋?
์ง๋ ฌํ(Serialization)๋ ๊ฐ์ฒด๋ฅผ ๋คํธ์ํฌ ์ ์ก์ด๋ ํ์ผ ์ ์ฅ ๋ฑ์์ ์ฌ์ฉํ ์ ์๋๋ก JSON ๋๋ XML ๊ฐ์ ๋ฐ์ดํฐ ํ์์ผ๋ก ๋ณํํ๋ ๊ณผ์ ์ ๋๋ค. ํ์ง๋ง ๊ฐ์ฒด ๊ฐ์ ์๋ฐฉํฅ ์ฐธ์กฐ๊ฐ ์์ ๊ฒฝ์ฐ, ์ง๋ ฌํ ๊ณผ์ ์์ ๋ฌดํ ๋ฃจํ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
โ๏ธ ๋ฌดํ ์ฌ๊ท ํธ์ถ์ด ์ค์ ์์ธ
JPA์์ ์๋ฐฉํฅ ๊ด๊ณ๋ฅผ ์ค์ ํ ๋, JPQL ์ฟผ๋ฆฌ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ฉด ์ํฐํฐ๋ค์ด ์๋ก๋ฅผ ๊ณ์ ์ฐธ์กฐํ์ฌ ๋ฌดํ ์ฌ๊ท ํธ์ถ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ ์ง๋ ฌํ ๊ณผ์ ์์ ์คํ ์ค๋ฒํ๋ก์ฐ์ ๊ฐ์ ์ค๋ฅ๋ฅผ ์ผ์ผ์ผ ์๋ฒ๊ฐ ์๋ตํ์ง ๋ชปํ๊ฒ ๋ง๋ค๊ณ , ํ๋ก ํธ์๋์์ ์๋ต์ ๊ธฐ๋ค๋ฆฌ๋ค๊ฐ CORS์ ๊ด๋ จ๋ ์ค๋ฅ์ฒ๋ผ ๋ณด์ด๊ฒ ๋ฉ๋๋ค.
โ๏ธ ํด๊ฒฐ ๋ฐฉ๋ฒ
์ด ๋ฌธ์ ๋ @JsonIgnore ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์๋ฐฉํฅ ๊ด๊ณ์ ์๋ ๊ฐ์ฒด๋ค ์ค ํ๋์ ํ๋๋ฅผ ์ง๋ ฌํ ๊ณผ์ ์์ ์ ์ธํจ์ผ๋ก์จ, ๋ฌดํ ์ฌ๊ท ํธ์ถ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. JPA ์ํฐํฐ์ ์ง๋ ฌํ ์, @JsonIgnore๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌดํ ๋ฃจํ๋ฅผ ์ฐจ๋จํ๋ฉด ์๋ฒ ์๋ต์ด ์ ์์ ์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ @JsonManagedReference์ @JsonBackReference๋ฅผ ์ฌ์ฉํ์ฌ ์ง๋ ฌํ ๋ฐฉํฅ์ ๋ช ์์ ์ผ๋ก ์ค์ ํ ์ ์์ต๋๋ค. @JsonManagedReference๋ ์ง๋ ฌํ๊ฐ ์์๋๋ ์ชฝ์ ํ์ํ๊ณ , @JsonBackReference๋ ์ง๋ ฌํ์์ ์ ์ธ๋๋ ์ชฝ์ ์ค์ ํฉ๋๋ค.
@Entity
public class User {
@OneToMany(mappedBy = "user")
@JsonManagedReference
private List<Order> orders;
}
@Entity
public class Order {
@ManyToOne
@JsonBackReference
private User user;
}
์ฐจ์ด ์์ฝ
- @JsonIgnore๋ ํน์ ํ๋๋ฅผ ์์ ํ ์ง๋ ฌํ์์ ์ ์ธํฉ๋๋ค. ์ฆ, ๋ฌดํ ์ฌ๊ท ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋งค์ฐ ๋จ์ํ ๋ฐฉ๋ฒ์ด์ง๋ง, ํด๋น ํ๋ ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ์ ๋ณด๋ด์ง ์์ต๋๋ค.
- @JsonManagedReference์ @JsonBackReference๋ ์ง๋ ฌํ ๋ฐฉํฅ์ ๋ช ์์ ์ผ๋ก ์ค์ ํ์ฌ ์๋ฐฉํฅ ๊ด๊ณ๋ฅผ ์ ์งํ๋ฉด์๋ ๋ฌดํ ๋ฃจํ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํฉ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ์ข ๋ ์ธ๋ฐํ๊ฒ ์กฐ์ ํ ์ ์์ง๋ง ์ค์ ์ด ๋ค์ ๋ณต์กํ ์ ์์ต๋๋ค.
โ๏ธ ๊ฒฐ๋ก
API ํธ์ถ ์ ๋ฐ์ํ ๋ฌธ์ ๋ ์ฒ์์ CORS ์๋ฌ์ฒ๋ผ ๋ณด์์ง๋ง, ์ค์ ์์ธ์ JPA ์๋ฐฉํฅ ๊ด๊ณ์ ๋ฌดํ ์ฌ๊ท ํธ์ถ์ด์์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด @JsonIgnore ๋๋ @JsonManagedReference์ @JsonBackReference๋ฅผ ์ฌ์ฉํ์ฌ ์ง๋ ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ , ์๋ฒ ์๋ต์ ์ ์ํํ์ต๋๋ค. ์ ์ฌํ ๋ฌธ์ ๋ฐ์ ์, CORS ๋ฌธ์ ๊ฐ ์๋๋ผ JPA ๋ฐ JPQL์ ์๋ฐฉํฅ ๊ด๊ณ ์ค์ ์ ๋จผ์ ์ ๊ฒํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.๐๐ป
'โJava' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring Boot] ํ๋ก์ ํธ ํ์ ์์กด์ฑ(Spring Web, Lombok, DevTools, Thymeleaf) (2) | 2024.09.03 |
---|---|
[Java] ์ปฌ๋ ์ ํ๋ ์์ํฌ(List, Queue, Set, Map) (0) | 2024.09.01 |
[Java] Map ์ฌ์ฉ ๋ฐฉ๋ฒ(keySet(), entrySet(), Map.entry()) (0) | 2024.09.01 |
[Java] JPA, JPQL, QueryDSL ๊ฐ๋ ์ ๋ฆฌ (1) | 2024.08.22 |