Spring/Spring JPA ๊ธฐ๋ณธ
๋ค๋์ผ [N : 1] @ManyToOne ๋จ๋ฐฉํฅ Member(N) : Team(1) ์ ๋ค๋์ผ ๊ด๊ณ ํ์ชฝ์ด ๊ด๊ณ๋ฅผ ๋งบ์ ์ชฝ์ ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ ๊ฒ์ ์๋ฏธ ํ๋์ ํ(1)์ ์ฌ๋ฌ ๋ฉค๋ฒ(N)๋ฅผ ๊ฐ๋๋ค Member.class @ManyToOne @JoinColumn(name = "team_id") private Team team; Many -> One Member(N) -> Team(1) name ์์ฑ์๋ ๋งคํํ ์ธ๋ ํค ์ด๋ฆ ์ง์ ํ๋ค. ๋ค๋์ผ [N : 1] OneToMany ์๋ฐฉํฅ Team ๊ฐ์ฒด์์ ๋ฐ๋์ชฝ Member ๋ฅผ ์ฐธ์กฐํ๊ธฐ ์ํ List members ๋ฅผ ์์ฑํด์ค๋ค. ์ด๋ ๊ฒ ์์ฑํด์ค๋ ํ
์ด๋ธ์๋ ์ํฅ์ ์ฃผ์ง ์๋๋ค. @OneToMany(mappedBy = "team") private List memb..
Spring/Spring JPA ๊ธฐ๋ณธ
์ฐ๊ด๊ด๊ณ ๋งคํ ๊ฐ์ฒด์ ํ
์ด๋ธ ์ฐ๊ด๊ด๊ณ์ ์ฐจ์ด๋ฅผ ์ดํดํ์ ๊ฐ์ฒด์ ์ฐธ์กฐ์ ํ
์ด๋ธ์ ์ธ๋ ํค๋ฅผ ๋งคํ ๊ฐ์ฒด๋ฅผ ํ
์ด๋ธ์ ๋ง์ถ์ด ๋ชจ๋ธ๋ง (์ฐ๊ด๊ด๊ณ๊ฐ ์๋ ๊ฐ์ฒด) Team @Entity public class Team { @Id @GeneratedValue @Column(name = "TEAM_ID") private Long id; @Column(name = "TEAM_NAME") private String name; } Member @Entity public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Column(name = "USERNAME") private String name; @Column(name = "T..
Spring/Spring JPA ๊ธฐ๋ณธ
์ํฐํฐ ๋งคํ @Entity @Entity public class Member { @Id @GeneratedValue private Long id; private String username; } @Entity๊ฐ ๋ถ์ ํด๋์ค๋ JPA๊ฐ ๊ด๋ฆฌ JPA๋ฅผ ์ฌ์ฉํด์ ํ
์ด๋ธ๊ณผ ๋งคํํ ํด๋์ค๋ @Entity ํ์ ๊ธฐ๋ณธ ์์ฑ์ ํ์(ํ๋ผ๋ฏธํฐ๊ฐ ์๋ public ๋๋ protected ์์ฑ์) name ์์ฑ @Entity(name = "Member") public class Member { JPA์์ ์ฌ์ฉํ ์ํฐํฐ ์ด๋ฆ์ ์ง์ ํ๋ค. ๊ธฐ๋ณธ๊ฐ: ํด๋์ค ์ด๋ฆ์ ๊ทธ๋๋ก ์ฌ์ฉ(์: Member) ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ์๋ ์์ฑ jpa: hibernate: ddl-auto: create DDL์ ์ ํ๋ฆฌ์ผ์ด์
์คํ ์์ ์ ์๋ ์์ฑ ..
Spring/Spring JPA ๊ธฐ๋ณธ
PersistenceContext (์์์ฑ ์ปจํ
์คํธ) ์์์ฑ ์ปจํ
์คํธ๋ ์ํฐํฐ๋ฅผ ์๊ตฌ ์ ์ฅํ๋ ํ๊ฒฝ์ด๋ผ๋ ๋ป์ด๋ค. ์ ํ๋ฆฌ์ผ์ด์
๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ด์์ ๊ฐ์ฒด๋ฅผ ๋ณด๊ดํ๋ ๊ฐ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ์ญํ ์ ํ๋ค. ์ํฐํฐ ๋งค๋์ ๋ฅผ ํตํด ์ํฐํฐ๋ฅผ ์ ์ฅํ๊ฑฐ๋ ์กฐํํ๋ฉด ์ํฐํฐ ๋งค๋์ ๋ ์์์ฑ ์ปจํ
์คํธ์ ์ํฐํฐ๋ฅผ ๋ณด๊ดํ๊ณ ๊ด๋ฆฌํ๋ค. public Long save(Member member) { em.persist(member); return member.getId(); } EntityManager.persist(member) : ์ํฐํฐ ๋งค๋์ ๋ฅผ ์ฌ์ฉํด ํ์ ์ํฐํฐ๋ฅผ ์์์ฑ ์ปจํ
์คํธ์ ์ ์ฅํ๋ค๋ ์๋ฏธ! ์ค์ ๋ก๋ DB์ ์ ์ฅํ๋ ๊ฒ์ด ์๋๋ผ ์์์ฑ ์ปจํ
์คํธ๋ฅผ ํตํด์ Entity๋ฅผ ์์ํํ๋ค๋ ๋ป์ด๋ค. ์ ํํ ๋งํ๋ฉด persi..
Spring/Spring JPA ๊ธฐ๋ณธ
JPA ๊ตฌ๋ ๋ฐฉ์ EntityManagerFactory ์ํฐํฐ ๋งค๋์ ๋ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ ๊ทผํ๋ฉด ๋์์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฏ๋ก ์ค๋ ๋ ๊ฐ์ ์ ๋ ๊ณต์ ํ๋ฉด ์ ๋๋ค. ๋์์ฑ(Concurrency): ์ ์ ๊ฐ ์ฒด๊ฐํ๊ธฐ์๋ ๋์์ ์ํํ๋ ๊ฑฐ ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ฌ์ค์ ์ ์ ๊ฐ ์ฒด๊ฐํ ์ ์๋ ์งง์ ์๊ฐ๋จ์๋ก ์์
๋ค์ ๋ฒ๊ฐ์๊ฐ๋ฉด์ ์ํํ๋ ๊ฒ์ด๋ค. ๋ด๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ณ ์๋๋ฐ ๋ค๋ฅธ ์ค๋ ๋์์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ์์ ํด๋ฒ๋ฆฌ๋ฉด ์๋๊ธฐ ๋๋ฌธ์ ์ํฐํฐ ๋งค๋์ ๋ ํ๋๋ฅผ ๊ณต์ ํ๋ฉด ์ ๋๊ณ , ์ํฉ์ ๋ฐ๋ผ ๊ณ์ ๋ง๋ค์ด์ค์ผํ๋ค. ์ํฐํฐ ๋งค๋์ ๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ์ด๋ค. EntityManager Entity๋ฅผ ๊ด๋ฆฌํ๋ ์ญํ ์ ์ํํ๋ ํด๋์ค์ด๋ค. ์ํฐํฐ ๋งค๋์ ๋ด๋ถ์ ์์์ฑ ์ปจํ
์คํธ(Persistence Context)..
Spring/Spring JPA ๊ธฐ๋ณธ
SQL ์ค์ฌ์ ์ธ ๊ฐ๋ฐ ๋ฌธ์ ์ ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฒด์งํฅ ํจ๋ฌ๋ค์์์๋ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ๋ ๊ฐ์ฒด(์ ํํ๋ ๊ฐ์ฒด์ ์ฐธ์กฐ ๊ฐ์ ๊ฐ์ง๋ ๋ณ์)๋ฅผ ํตํด ์ฐธ์กฐํฉ๋๋ค. ์ด์ ๋ฐํด, ๋ฐ์ดํฐ๋ฒ ์ด์ค ํจ๋ฌ๋ค์์ ํ
์ด๋ธ์ด ๋ค๋ฅธ ํ
์ด๋ธ์ ์ฐธ์กฐํ ๋ ๋ค๋ฅธ ํ
์ด๋ธ์ PK๋ฅผ FK๋ก ๊ฐ์ง์ ํตํด ์ฐธ์กฐํฉ๋๋ค. ORM Object-relational mapping(๊ฐ์ฒด ๊ด๊ณ ๋งคํ) ๊ฐ์ฒด๋ ๊ฐ์ฒด๋๋ก ์ค๊ณ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋๋ก ์ค๊ณ ORM ํ๋ ์์ํฌ๊ฐ ์ค๊ฐ์์ ๋งคํ https://www.inflearn.com/course/ORM-JPA-Basic/dashboard ์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊ธฐ๋ณธํธ - ์ธํ๋ฐ | ๊ฐ์ JPA๋ฅผ ์ฒ์ ์ ํ๊ฑฐ๋, ์ค๋ฌด์์ JPA๋ฅผ ์ฌ์ฉํ์ง๋ง ๊ธฐ๋ณธ ์ด๋ก ์ด ๋ถ์กฑํ์ ๋ถ๋ค์ด JP..
Spring/Spring JPA ํ์ฉ
public class MemberForm { @NotEmpty(message = "ํ์ ์ด๋ฆ์ ํ์ ์
๋๋ค") private String name; private String city; private String street; private String zipcode; } ํผ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ ํ๋ฉด ๊ณ์ธต๊ณผ ์๋น์ค ๊ณ์ธต์ ๋ช
ํํ๊ฒ ๋ถ๋ฆฌํ๋ค. @NotEmpty Null, ๋น ๋ฌธ์์ด ๋ถ๊ฐ @PostMapping("/members/new") public String create(@Valid MemberForm form , BindingResult result) { if (result.hasErrors()){ return "members/createMemberForm"; } @Valid ํน์ง ์ ํจ์ฑ๊ฒ์ฌ , ์๋ชป๋..
Spring/Spring JPA ํ์ฉ
์ฃผ๋ฌธ ๋๋ฉ์ธ ๊ฐ๋ฐ //== ์์ฑ ๋ฉ์๋ ==// public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems) ๊ฐ๋ณ์ธ์ ํ์
... ๋ณ์๋ช
๊ณผ ๊ฐ์ ํ์์ผ๋ก ์ ์ธ for (OrderItem orderItem : orderItems) { order.addOrderItem(orderItem); } ๋ฉ์๋์ ๋งค๊ฐ๋ณ์ ๊ฐ์๋ฅผ ๋์ ์ผ๋ก ์ง์