Gallery
Search
๊ณตํต - Controller, ๊ฒ์ ํค์๋์ ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ์ํ ํ์ด์ ๋ธ ๊ฐ์ฒด
์ฐ์ ๊ณตํต์ ์ผ๋ก ์ ์ฉ๋ ์ปจํธ๋กค๋ฌ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ๋ก ํธ์๋๋ก๋ถํฐ keyword ๋ฅผ QueryString์ผ๋ก โฆ?keyword=abc์ ๊ฐ์ ํํ๋ก HTMLํผ์ผ๋ก๋ถํฐ ํน์ ๊ฐ๋ค์ ์ถ์ถ ํ ์ ์์ผ๋ฉฐ, HTTP์์ฒญ์ ๋ด์ ์ปจํธ๋กค๋ฌ๋ก ๋ฌธ์์ด์ ์ ๋ฌ ํ ์ ์์ต๋๋ค.
ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ์ํด์๋ ์์ JPA๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด Total Count๋ฅผ ๋ฝ์์์ ํ์ฌ ๋ด๊ฐ ๋ช๋ฒ์งธ ํ์ด์ง์ธ์ง๋ฅผ ๊ณ์ฐํด์ ํ์๋ฅผ ํด์ฃผ์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ฐ ๊ณ์ฐ์ ๋ชจ๋ ์ง์ ๊ณ์ฐํ๋ ๋ฉ์๋, ๋ณ์๋ฅผ ์ง์ ์์ฑํ๊ณ ๋งค๊ฐ๋ณ์๋ก Service์ ์ ๋ฌํ๊ฒ ๋๋ฉด ์ฝ๋๊ฐ ๋ณต์กํด์ง๊ฒ ๋ฉ๋๋ค!ย ํ์ด์ ๋ธ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ ์ถ๊ฐ๋์ด์ผ ํ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด ๋ณต์กํ ์ฝ๋๋ฅผ ํด๊ฒฐํด์ฃผ๊ธฐ ์ํด ์คํ๋ง ๋ฐ์ดํฐ JPA๋ ํ์ด์ง๊ณผ ์ ๋ ฌ์ ํ์คํ ํด๋์์ต๋๋ค.
ํ์ฌ ํ์ด์ง, ํ์ด์ง ํฌ๊ธฐ, ์ ๋ ฌ ๊ธฐ์ค, ์ ๋ ฌ ๋ฐฉํฅ์ HTTP์์ฒญ์ผ๋ก ๋ฐ์์ค๊ณ pageable ๊ฐ์ฒด๋ฅผ ํตํด ํ์ด์ง ์ฒ๋ฆฌ๋ ๊ฐ์ฒด๋ฅผ ์๋์ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
keyword, pageable ๊ฐ์ฒด๋ฅผ Service ๊ณ์ธต์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์กฐํ(READ)ํ๋ ๋น์ง๋์ค ๋ก์ง์ ํ์ฉ ๋ ์ ์๋๋ก ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ๊ฒ ๋ฉ๋๋ค.
์ด๊ธฐ MVP JPA - Service ๊ณ์ธต์์์ ๊ตฌํ ์ํ ์ฝ๋
[Spring][258] JPA โ JPQL โ QueryDSL ๋ณํ๊ณผ์
๊ฒ์๊ธ์ ์์๋ ๋๊ธ ์ถ๊ฐํ๋ API
CommentController์์ ๊ณ์ POSTMAN์ผ๋ก blogId ํ๋ผ๋ฏธํฐ๋ฅผ ๋ชป๋ฐ์์จ๋ค.
๋ํ๋๋ ์ค๋ฅ๋ ๋๊ฐ์ง ์ ํ์ด์๋ค.
์ฒซ๋ฒ์งธ๋ NullPointerException์ผ๋ก blogId์์ฒด๊ฐ ์ ๋ฌ๋์ง ์๋ ์ํฉ,
์ด๊ฑด ๋๋ฌด ๋ปํ๋ค. ์ ์ฝ๋์์ blogId๋ฅผ req์ด๋ ๋ณ์, ์ด๋ ๊ณง HttpServletRequest์์ ๋ฐ๊ณ ์๋๋ฐ ์ฌ๊ธฐ ์์๋ฆฌ๊ฐ ์๋ค. ์๋ณธ ๊ธ์ id๋ ํด๋ผ์ด์ธํธ์์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์ผ ํ๋ค. ๊ทธ๋์ ์๋ ์ฝ๋์๊ฐ์ด ๋ณ๊ฒฝํ๋ค.
๊ทธ๋ฐ๋ฐ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. blogId๊ฐ Longํ์
์ผ๋ก ๋ค์ด์ค์ง ์๋๊ฒ ๊ฐ๋ค. ๋ญ๊ฐ ์์ฒญ๋ฌธ์ด ์๋ชป๋์์ ์ ์๋ค.
POSTMAN์์ POST ๋ฐฉ์์ url์ http://localhost:8080/api/comment ์ธ ์ํ์์ ๋ก๊ทธ์ธ์ผ๋ก ์ฟ ํค์์ ํ ํฐ์ ๋ฐ์์ ํค๋์ ๋ฃ์ด์ฃผ์๋ค. Body์๋ ์๋๊ฐ์ด JSON์ผ๋ก ๋ฃ์๋ค. ์์ง๋ ์ด์ํ์ ์ด ์๋ค.
๋ถ๋ช
ํ ์๋ณธ๊ธ์ ํ๋ผ๋ฏธํฐ๋ก id๋ฅผ ๋ฐ์๋ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์๋์ฒ๋ผ ์์ฒญํ๋๋ฐ ์ค๋ฅ๊ฐ๋ฐ์ํ๋ค. ๊ณ์ ChatGPT๋ฅผ ํตํด ๋ฌธ์ํ์ง๋ง ์ ํ ํ๋ฆฐ๊ณณ์ด ์๋ค..

์ด์ํ ํด๊ฒฐ?
[Spring][JPA]55 ๋๊ธ๊ธฐ๋ฅ ๊ตฌํ ์ค ํธ๋ฌ๋ธ์ํ
- POSTMAN ๋ฒ๊ทธ? ์ ํ ์ํ
๋์ง ์์์ ํ๋ฌดํ๋ค. Required request parameter 'Argumentsโ for method parameter type Long is not present
CascadeType.REMOVE
โข
CASCADE์ REMOVE ์ต์
์ ์ ์ฉํ๋ฉด ํด๋น Entity ๊ฐ์ฒด๋ฅผ ์ญ์ ํ์ ๋ ์ฐ๊ด๋ Entity ๊ฐ์ฒด๋ค์ ์๋์ผ๋ก ์ญ์
โข
ํ์ง๋ง REMOVE ์ต์
๊ฐ์ ๊ฒฝ์ฐ ์ฐ๊ด๋ Entity์ ๊ด๊ณ๋ฅผ ์ ๊ฑฐํ๋ค๊ณ ํด์ ์๋์ผ๋ก ํด๋น Entity๊ฐ ์ญ์ ๋์ง๋ ์๋๋ค.
orphanRemoval = true
orphanRemoval ์ต์
๋ REMOVE ์ต์
๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํด๋น Entity ์ฆ, Robbie Entity ๊ฐ์ฒด๋ฅผ ์ญ์ ํ๋ฉด ์ฐ๊ด๋ ์์ Entity๋ค์ด ์๋์ผ๋ก ์ญ์ ๋๋ค.
โข
orphanRemoval์ด๋ REMOVE ์ต์
์ ์ฌ์ฉํ ๋ ์ญ์ ํ๋ ค๊ณ ํ๋ ์ฐ๊ด๋ Entity๋ฅผ ๋ค๋ฅธ ๊ณณ์์ ์ฐธ์กฐํ๊ณ ์๋์ง ์๋์ง๋ฅผ ๊ผญ ํ์ธ ํ์
โฆ
A์ B์ ์ฐธ์กฐ๋๊ณ ์๋ C๋ฅผ B๋ฅผ ์ญ์ ํ๋ฉด์ ๊ฐ์ด ์ญ์ ํ๊ฒ ๋๋ฉด A๋ ์ฐธ์กฐํ๊ณ ์๋ C๊ฐ ์ฌ๋ผ์ก๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋ฐ์
โฆ
๋ฐ๋ผ์ orphanRemoval ๊ฐ์ ๊ฒฝ์ฐ @ManyToOne ๊ฐ์ ์ ๋ํ
์ด์
์์๋ ์ฌ์ฉํ ์ ์๋ค.
[Spring][JPA]54 ๊ณ ์ Entity ์ญ์ (๊ฒ์๊ธ-๋๊ธ)
๋ค์๊ณผ ๊ฐ์ ์ฐ๊ด ๊ด๊ณ๋ฅผ ์ฐธ๊ณ ํ์ฌ Entity๋ฅผ ์์ฑํด๋ณด์.

Member.java
Team.java
Team๊ณผ Member๋ ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ์ด๋ฉฐ ํค์ ์ฃผ์ธ์ Member์ด๋ค.(@JoinColumn์ผ๋ก Teamํ์
์ team๋ณ์๋ Teamํด๋์ค์ mappedBy๋ก ์ฐธ์กฐ๋์ด์๋ค.) ๋ํ Team Entity์์๋ @OneToMany๋ก List<Member>๋ฅผ Member ์ํฐํฐ์ team ์ฐธ์กฐ๋ณ์์ ๋งตํํ๊ณ ์๋ค.
[Spring][JPA]53 Fetch Type, ์ง์ฐ๋ก๋ฉ(LAZY), ์ฆ์๋ก๋ฉ(EAGER)
JPAย Auditing์ด๋?
Java์์ ORM ๊ธฐ์ ์ธ JPA๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ฉ์ธ์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ์ ๋งคํํ ๋ ๊ณตํต์ ์ผ๋ก ๋๋ฉ์ธ๋ค์ด ๊ฐ์ง๊ณ ์๋ ํ๋๋ ์ปฌ๋ผ๋ค์ด ์กด์ฌํ๋ค. ๋ํ์ ์ผ๋ก ์์ฑ์ผ์, ์์ ์ผ์, ์๋ณ์ ๊ฐ์ ํ๋ ๋ฐ ์ปฌ๋ผ์ด ์๋ค.
๋๋ฉ์ธ๋ง๋ค ๊ณตํต์ผ๋ก ์กด์ฌํ๋ค๋ ์๋ฏธ๋ ๊ฒฐ๊ตญ ์ฝ๋๊ฐ ์ค๋ณต๋๋ค๋ ๋ง์ด๋ฉฐ ์ค๋ณต์ ์ ๊ฑฐํ๋ ๊ฒ์ ํ๋ก์ ํธ์ ์ ์ง๋ณด์์ ์ธก๋ฉด์์ ํต์ฌ์ ์ธ ์ฌ์์ด๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ย ๋๊ฐ, ์ธ์ ํ์๋์ง ๊ธฐ๋ก์ ์ ๋จ๊ฒจ๋์์ผ ํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์์ฑ์ผ, ์์ ์ผ ์ปฌ๋ผ์ ๋๋จํ ์ค์ํ ๋ฐ์ดํฐ๋ค.
๊ทธ๋์ JPA์์๋ย Audit์ด๋ผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์๋ค. Audit์ย ๊ฐ์ํ๋ค, ๊ฐ์ฌํ๋ค๋ผ๋ ๋ป์ผ๋ก Spring Data JPA์์ ์๊ฐ์ ๋ํด์ ์๋์ผ๋ก ๊ฐ์ ๋ฃ์ด์ฃผ๋ ๊ธฐ๋ฅ. ๋๋ฉ์ธ์ ์์์ฑ ์ปจํ
์คํธ์ ์ ์ฅํ๊ฑฐ๋ ์กฐํ๋ฅผ ์ํํ ํ์ update๋ฅผ ํ๋ ๊ฒฝ์ฐ ๋งค๋ฒ ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํ์ฌ ์ฃผ์ด์ผ ํ๋๋ฐ, audit์ ์ด์ฉํ๋ฉด ์๋์ผ๋ก ์๊ฐ์ ๋งคํํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ
์ด๋ธ์ ๋ฃ์ด์ค ์ ์๋ค.
์์กด์ฑ ์ถ๊ฐ
๊ธฐ๋ณธ์ ์ผ๋ก ์คํ๋ง ๋ถํธ์์ gradle๋ก ์์กด์ฑ์ ๊ด๋ฆฌํ๊ฒ ๋ ๊ฒฝ์ฐย spring-boot-starter-data-jpa๋ง ์ถ๊ฐํด๋ Audit์ ํ๋๋ฐ๋ ๋ฌธ์ ๊ฐ ์๋ค. ์ด ๋ง์ Spring-Data-JPA ์์ ํด๋น ๊ธฐ๋ฅ์ด ์๋ค๋ ๋ง๊ณผ ๊ฐ๋ค.
ํด๋น ๊ธฐ๋ฅ์ ์ฌ์ฉ ํ ์ค์ Entity ํด๋์ค ํ์ผ, Timestamped.java
๊ธฐ๋ณธ์ ์ผ๋ก ์์ฑ์๊ฐ, ์์ ์๊ฐ์ ๊ธฐ๋กํ๊ธฐ ์ํด์ Timestamped.java ํด๋์ค๋ฅผ ๋ง๋ค์๋ค.
์ ์ํฐํฐ ํด๋์ค์ Audit๊ด๋ จ ์ฃผ์ ์ด๋
ธํ
์ด์
์ ์ค๋ช
์ ๋ค์๊ณผ ๊ฐ๋ค.
@MappedSuperclass | JPA Entity ํด๋์ค๋ค์ด ํด๋น ์ถ์ ํด๋์ค๋ฅผ ์์ํ ๊ฒฝ์ฐ createDate, modifiedDate๋ฅผ ์ปฌ๋ผ์ผ๋ก ์ธ์ |
@EntityListeners(AuditingEntityListener.class | ํด๋น ํด๋์ค์ Auditing ๊ธฐ๋ฅ์ ํฌํจ |
@CreatedDate | Entity๊ฐ ์์ฑ๋์ด ์ ์ฅ๋ ๋ ์๊ฐ์ด ์๋ ์ ์ฅ |
@LastModifiedDate | ์กฐํํ Entity์ ๊ฐ์ ๋ณ๊ฒฝํ ๋ ์๊ฐ์ด ์๋ ์ ์ฅ |
ํด๋์ค์ ์์
ํด๋น ์ํฐํฐ ํด๋์ค๋ ์๊ฐ์ ๊ธฐ๋กํ๋ ํ๋๋ง์ผ๋ก ๊ตฌ์ฑ๋์ด ์๊ธฐ ๋๋ฌธ์, ํ๋ก์ ํธ ๋ด์ ๋ณธ ์ํฐํฐ์์๋ ์์์ ํตํด์ ํด๋น ํ๋๋ค์ ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ค.(== ํฌํจ๋์ด์ผ ํ๋ค.)
[Spring][JPA]52 JPA Auditing์ด๋? SpringBoot์์ ๊ตฌ์ฑ ๋ฐ ํ์ฑํ ์ํค๊ธฐ ์ค์ต
๋ค๋์ผ (N:1) ๊ด๊ณ ๋จ๋ฐฉํฅ๊ณผ ์๋ฐฉํฅ
1. ๋ค๋์ผ ๊ด๊ณ ๋จ๋ฐฉํฅ
๋ค๋์ผ (N:1) ๊ด๊ณ (๋จ๋ฐฉํฅ)
โข
์์: ํ๋์ ์ฃผ๋ฌธ(Order)์ ํ๋์ ๊ณ ๊ฐ(Customer)์ ์ํฉ๋๋ค.
โข
์ค๋ช
:
โฆ
์ฌ๋ฌ ์ฃผ๋ฌธ์ ๊ฐ์ ๊ณ ๊ฐ์๊ฒ ์ํ ์ ์์ง๋ง, ํ๋์ ์ฃผ๋ฌธ์ ์ค์ง ํ๋์ ๊ณ ๊ฐ์ ์ํฉ๋๋ค. ์ด๊ฒ์ ๋ค๋์ผ ๊ด๊ณ์
๋๋ค.
โฆ
๋ฐ๋ผ์ Order ์ํฐํฐ์๋ customer๋ผ๋ ์์ฑ(๋๋ ์ธ๋ ํค)์ด ์์ ๊ฒ์ด๋ฉฐ, ์ด ์์ฑ์ Customer ์ํฐํฐ๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
โข
Spring JPA ์ด๋
ธํ
์ด์
โฆ
@Entity: ์ํฐํฐ ํด๋์ค์์ ํ์ํฉ๋๋ค.
โฆ
@ManyToOne: ๋ค๋์ผ ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ฉฐ, ์ด ์ด๋
ธํ
์ด์
์ Order ์ํฐํฐ์ customer ์์ฑ๊ณผ ๊ด๋ จ๋ฉ๋๋ค.
โฆ
@JoinColumn: ์ธ๋ ํค๋ฅผ ์ง์ ํฉ๋๋ค. @ManyToOne๊ณผ ํจ๊ป ์ฌ์ฉํ์ฌ ์ด๋ค ์ปฌ๋ผ์ด ์ธ๋ ํค์ธ์ง ์ง์ ํฉ๋๋ค. ํค์ ์ฃผ์ธ
2. ๋ค๋์ผ ๊ด๊ณ ์๋ฐฉํฅ
๋ค๋์ผ (N:1) ๊ด๊ณ (์๋ฐฉํฅ)
โข
์์: ํ๋์ ์ฃผ๋ฌธ(Order)์ ํ๋์ ๊ณ ๊ฐ(Customer)์ ์ํฉ๋๋ค. ๋์์ ํ๋์ ๊ณ ๊ฐ๋ ์ฌ๋ฌ ์ฃผ๋ฌธ์ ๊ฐ์ง ์ ์์ต๋๋ค.
โข
Spring JPA ์ด๋
ธํ
์ด์
:
โฆ
@Entity: ์ํฐํฐ ํด๋์ค์์ ํ์ํฉ๋๋ค.
โฆ
@ManyToOne: ๋ค๋์ผ ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ฉฐ, Order ์ํฐํฐ์ customer ์์ฑ๊ณผ ๊ด๋ จ๋ฉ๋๋ค.
โฆ
@JoinColumn: ์ธ๋ ํค๋ฅผ ์ง์ ํฉ๋๋ค. @ManyToOne๊ณผ ํจ๊ป ์ฌ์ฉํ์ฌ ์ด๋ค ์ปฌ๋ผ์ด ์ธ๋ ํค์ธ์ง ์ง์ ํฉ๋๋ค.
โฆ
@OneToMany: ์ผ๋๋ค ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ฉฐ, Customer ์ํฐํฐ์ customer ๋ก ์ฐธ์กฐ๋ฉ๋๋ค. Customer ์ํฐํฐ์์ orders ๋ฆฌ์คํธ์ ๊ด๋ จ๋ฉ๋๋ค.
์ผ๋๋ค (1:N) ๊ด๊ณ ๋จ๋ฐฉํฅ๊ณผ ์๋ฐฉํฅ
1. ์ผ๋๋ค ๊ด๊ณ ๋จ๋ฐฉํฅ
[Spring][JPA]49_2 Entity ์ฐ๊ด๊ด๊ณ ํ๊ฐ๋ ค์ ์์๋ฅผ ํตํด ํ๋ฒ ๋ ์ ๋ฆฌ
์ฐ๊ด๊ด๊ณ ๋งคํ์ ๊ณ ๋ ค์ฌํญ 3๊ฐ์ง
โข
๋ค์ค์ฑ
โฆ
๋ค๋์ผ : @ManyToOne (๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ)
โฆ
์ผ๋๋ค : @OneToMany
โฆ
์ผ๋์ผ : @OneToOne
โฆ
๋ค๋๋ค : @ManyToMany (์ค๋ฌด์์ ์ฌ์ฉํ์ง ์์)
โข
๋จ๋ฐฉํฅ, ์๋ฐฉํฅ
โฆ
ํ
์ด๋ธ
โช
์ธ๋ํค ํ๋๋ก ์์ชฝ ์กฐ์ธ ๊ฐ๋ฅ
โช
์ฌ์ค ๋ฐฉํฅ์ด๋ผ๋ ๊ฐ๋
์ด ์์
โฆ
๊ฐ์ฒด
โช
์ฐธ์กฐ์ฉ ํ๋๊ฐ ์๋ ์ชฝ์ผ๋ก๋ง ์ฐธ์กฐ ๊ฐ๋ฅ
โช
ํ์ชฝ๋ง ์ฐธ์กฐํ๋ฉด ๋จ๋ฐฉํฅ
โช
์์ชฝ์ด ์๋ก ์ฐธ์กฐํ๋ฉด ์๋ฐฉํฅ ( ์ฌ์ค ๋จ๋ฐฉํฅ ์ฐธ์กฐ๊ฐ 2๊ฐ ์๋ ๊ตฌ์กฐ!)
โข
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ
โฆ
ํ
์ด๋ธ์ย ์ธ๋ํค ํ๋๋ก ๋ ํ
์ด๋ธ์ด ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ์
โฆ
๊ฐ์ฒด ์๋ฐฉํฅ ๊ด๊ณ๋ A โ B, B โ A ์ฒ๋ผย ์ฐธ์กฐ๊ฐ 2๊ตฐ๋ฐ
โฆ
๊ฐ์ฒด ์๋ฐฉํฅ ๊ด๊ณ๋ ์ฐธ์กฐ๊ฐ 2๊ตฐ๋ฐ ์์. ๋ ์ค ํ
์ด๋ธ์ ์ธ๋ํค๋ฅผ ๊ด๋ฆฌํ ๊ณณ์ ์ง์ ํด์ผ ํจ
โฆ
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ : ์ธ๋ํค๋ฅผ ๊ด๋ฆฌํ๋ ์ฐธ์กฐ
โฆ
์ฃผ์ธ์ ๋ฐ๋ํธ : ์ธ๋ํค์ ์ํฅ์ ์ฃผ์ง ์์. ๋จ์ ์กฐํ๋ง ๊ฐ๋ฅ(์ฝ๊ธฐ)
๋ค๋์ผ[N:1] ์ฐ๊ด๊ด๊ณ
๋ค๋์ผ[N:1] ๋จ๋ฐฉํฅ
โข
๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ์ฐ๊ด๊ด๊ณ
โข
๋ค๋์ผ์ ๋ฐ๋๋ ์ผ๋๋ค
โข
ํญ์ ๋ค(N)์ชฝ์ ์ธ๋ํค๊ฐ ๋ค์ด๊ฐ์ผ ํจ!

@ManyToOne ์ฃผ์์์ฑ
โข
๋ค๋์ผ ๊ด๊ณ ๋งคํ
๋ค๋์ผ[N:1] ์๋ฐฉํฅ
[Spring][JPA]49 Entity ์ฐ๊ด๊ด๊ณ N:1, 1:N, 1:1, N:M ๋งตํ ๋ฐ ๋ฐฉํฅ
์ ์์ฝ, ํ ์์
JPA๋ ์๋ฐ ์ง์์ ORM ๊ธฐ์ ์ ๋ํ API ํ์ค ๋ช
์ธ์ด๋ฉฐ
Hibernate๋ JPA์ ๊ตฌํ์ฒด์ด๊ณ , ๋ด๋ถ์ ์ผ๋ก JDBC๋ฅผ ์ด์ฉํ๋ค.
Spring Data JPA๋ JPA๋ฅผ ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ์คํ๋ง์์ ์ ๊ณตํ๋ ๋ชจ๋๋ก ๋ด๋ถ์ ์ผ๋ก JPA ๊ตฌํ์ฒด๋ฅผ ์ด์ฉํ๋ค.
JPA์ด์ ์ ๋ฐฐ๊ฒฝ, SQL Mapper๋?
SQL Mapper๋ ๊ฐ๋ฐ์๊ฐ ์ง์ SQL๋ฌธ์ ์์ฑํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ Persistence Framework์ด๋ค. ๊ฐ์ฒด์ ํ
์ด๋ธ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ง์ ๋งคํํ๋ ๊ฒ์ด ์๋, SQL๋ฌธ์ ์คํํด ์ฟผ๋ฆฌ ์ํ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ค ๊ฐ์ฒด์ ๋งคํํ ์ง ๋ฐ์ธ๋ฉ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๋ฐ๋ผ์ DBMS์ ์ข
์์ ์ธ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ํ ์ ์๋ค. ๋ํ์ ์ผ๋ก MyBatis๊ฐ ์๋ค. ์ฌ๊ธฐ ๋จ๊ณ๊น์ง๋ JDBC Template๋ฅผ ๊ฐ์ ํด์ ์ฌ์ฉํ์ง๋ง, ๊ฒฐ๊ตญ SQL๋ฌธ์ ์ง์ ์์ฑํด์ผ๋๋ค๋ ๋จ์ ์ด ์๋ค.
์ฅ์
โข
JDBC๋ฅผ ์ฌ์ฉํ ๋ ๋ฐ์ํ๋ ๋ถํธํจ์ ์ค์ผ ์ ์๋ค.
โข
SQL์ด ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ถ๋ฆฌ๋์ด ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ๋ค.
โข
์ธ๋ถ์ ์ธ SQL ๋ณ๊ฒฝ์ ํธ๋ฆฌํ๋ค
โข
๊ธฐ์กด์ SQL๋ฌธ๋ฒ์ ๊ทธ๋๋ก ์ ์ฉํ ์ ์์ด ์๋ก์ด ๊ธฐ์ ์ ํ์ตํ์ง ์์๋ ๋๋ค.
๋จ์
โข
DBMS ๋ณ๋ก SQL ๋ฌธ๋ฒ์ด ๋ค๋ฅด๋ค.
โข
๊ฐ๋ฐ์๊ฐ ์ง์ SQL๋ฌธ์ ์์ฑํด์ผ ํ๋ค.
[Spring][JPA]51 JPA๋? MyBatis(SQL Mapper)๋ถํฐ ์์ ํต์ฌ์์ฝ
ํต์ฌ ์ด๋
ธํ
์ด์
@Entity
โข
@Entity ์ด๋
ธํ
์ด์
์ด ๋ถ์ ํด๋์ค๋ JPA๊ฐ ๊ด๋ฆฌํ๋ ์ํฐํฐ์ด๋ค
โข
JPA๋ฅผ ์ฌ์ฉํด์ ํ
์ด๋ธ๊ณผ ๋งคํํ ํด๋์ค๋ @Entity ์ด๋
ธํ
์ด์
์ด ํ์๋ค
โข
๊ธฐ๋ณธ ์์ฑ์ ํ์(ํ๋ผ๋ฏธํฐ๊ฐ ์๋ public ๋๋ protected ์์ฑ์)
โข
final ํด๋์ค, enum, interface, inner ํด๋์ค ์ฌ์ฉ X
โข
์ ์ฅํ ํ๋์ final ์ฌ์ฉ X
โข
name ์์ฑ์ ์ฌ์ฉํ๋ฉด JPA์์ ์ฌ์ฉํ ์ํฐํฐ ์ด๋ฆ์ ์ง์ ํ ์ ์๋ค.
โฆ
๊ธฐ๋ณธ๊ฐ์ ํด๋์ค ์ด๋ฆ์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค
์์:
@Table
โข
@Table ์ด๋
ธํ
์ด์
์ ์ํฐํฐ์ ๋งคํํ ํ
์ด๋ธ์ ์ง์ ํ๋ค.
โข
name ์์ฑ์ผ๋ก ๋งคํํ ํ
์ด๋ธ ์ด๋ฆ ์ง์ ์ด ๊ฐ๋ฅํ๋ค
โข
๊ธฐ๋ณธ๊ฐ์ ์ํฐํฐ ์ด๋ฆ์ด๋ค
์์ :
[Spring][JPA]41 ์ํฐํฐ ๋งคํ, ํ๋ ์ปฌ๋ผ ๋งคํ, ๊ธฐ๋ณธํค ๋งคํ ๋ฑ ํ์ฌ๊น์ง ์ฃผ์ ์ด๋
ธํ
์ด์
MySQL | Java |
TINYINT | Integer |
BIT | Boolean |
BOOL/BOOLEAN (TINYINT(1)) | Integer |
SMALLINT | Unsigned ์๊ด์์ด Integer |
MEDIUMINT | Integer, Unsinged๋ผ๋ฉด Long |
INT | Integer, Unsigned๋ผ๋ฉด Long |
BIGINT | Long, Unsigned๋ผ๋ฉด java.math.BigInteger |
FLOAT | Float |
DOUBLE | Double |
DECIMAL | java.math.BigDecimal |
DATE | java.sql.Date |
DATETIME | java.sql.Timestamp |
TIMESTAMP | java.sql.Timestamp |
TIME | java.sql.Timestamp |
YEAR | yearsIsDateType์ด ์ค์ ๋๋ค๋ฉด java.sql.Date,์๋๋ผ๋ฉด Short |
CHAR | ์ปฌ๋ผ์ด Binary๋ก ์ค์ ๋์ง ์์๋ค๋ฉด String,๋ผ ์๋ค๋ฉด byte[] |
VARCHAR | CHAR์ ๋์ผ |
BINARY | byte[] |
VARBINARY | byte[] |
TINYBLOB | byte[] |
TINYTEXT | String |
BLOB | byte[] |
TEXT | String |
MEDIUMBLOB | byte[] |
MEDIUMTEXT | String |
LONGBLOB | byte[] |
LONGTEXT | String |
ENUM | String |
SET | String |
[Spring][JPA]39 MySql - Java ๋ฐ์ดํฐ ํ์
Load more