// ๐ Entity ์์ฑ
Member member = new Member();
member.setId("1");
member.setUsername("๋ง๋");
// ๐ Repository(DB) โ ๊ฐ๋จํ์ฝ๋
memberRepository.save(mallang);
memberRepository.find();
// ๐ Entity ์์ฑ
Member member = new Member();
member.setId("1");
member.setUsername("๋ง๋");
// ๐ EntityManagerFactory ์์ฑ
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("JPA์ฌํ");
// ๐ EntityManager ์์ฑ
EntityManager entityManager = entityManagerFactory.createEntityManager();
// ๐ ์ ์ฅ ๋ฐ ์กฐํ
entityManager.persist("mallang"); // Entity ์์ํ(์ ์ฅ)
entityManager.find(Member.class, 1L); // Entity ์กฐํ
ํ๋ก๊ทธ๋จ์ฑ๋ฅ์ ์ํด ์ฌ๋ฌ๊ฐ์ ์ค๋ ๋(ํ๋ก๊ทธ๋จ๋ด๋ถ ์ผ๊พผ)๊ฐ ๊ฐ์ด ์ผํจ
โ ๋์์ฑ๋ฌธ์ ๋ฐ์ ๐จ
โ ํน์ ๋ฆฌ์์ค ๊ณต์ ํ์ง ๋ชปํ๊ฒํ๋ ์ฒ๋ฆฌ๊ฐ ํ์ํจ
โ EntityManager
: ๊ณต์ ํ๋ฉด ์๋๋ ํน์ ๋ฆฌ์์ค๊ฐ ์์
โก ์ฌ๋ฌ ์ค๋ ๋ โ ํ๋์ EntityManager
์ด์ฉ ๋ง์ โ๏ธ
โข EntityManagerFactory์์ ํ์ํ ๋๋ง๋ค ์ฌ๋ฌ๊ฐ์ EntityManager๋ฅผ ์์ฑํด์ ์ฌ์ฉํจ โ
๐ ์์์ฑ์ปจํ ์คํธ
: Entity๋ฅผ ์๊ตฌ์ ์ฅํ๋ ํ๊ฒฝ
์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊บผ๋ด์จ ๋ฐ์ดํฐ๊ฐ์ฒด๋ฅผ ๋ณด๊ดํ๋ ์ญํ
EntityManager
โ Entity ์กฐํ & ์ ์ฅ ์, Entity๋ฅผ ๋ณด๊ดํ๊ณ ๊ด๋ฆฌํจ
// Entity ์์ฑ
Member member1 = new Member();
member1.setId("mallang");
member1.setUsername("๋ง๋์ด");
EntityManager
โ Entity๊ฐ ์์์ฑ์ปจํ
์คํธ์ ์ ์ฅ๋์ด ๊ด๋ฆฌ๋๊ณ ์๋ ์ํ// EntityManager -> ์์์ฑ์ปจํ
์คํธ์ ์ํฐํฐ๊ฐ์ฒด ์ ์ฅ
entityManager.persist(member1);
// Entity ์์์ฑ์ปจํ
์คํธ์์ ๋ถ๋ฆฌ
entityManager.detach(member1);
// ์์์ฑ์ปจํ
์คํธ ๋น์ฐ๊ธฐ
entityManager.clear();
// ์์์ฑ์ปจํ
์คํธ ์ข
๋ฃ
entityManager.close();
entityManager.remove(member1);
DB๋ฅผ ์ฌ์ฉํ๋ ์์
: ์๋์ ์ผ๋ก ๋ถํ์ ๋น์ฉ์ด ์ฌํ ์์
๐จ
โ ํ๋ก๊ทธ๋จ ์คํ ์, DB ์ฌ์ฉํ์๋ฅผ ์ต๋ํ ์ค์ด๋๊ฒ ์ข์ โ
Java ์ ํ๋ฆฌ์ผ์ด์
๋ฐ์ดํฐ์กฐํ๋ง๋ค โ DB๋ก SELECT*FROMโขโขโข
๋๊ฐ๋ SQL Query๋ฅผ ์ต๋ํ ์ค์ฌ์ผํ๋ค๋ ์๋ฏธ โญ๏ธ
๐ ์์์ฑ์ปจํ ์คํธ ๋ด๋ถ์ 1์ฐจ์บ์
1. find("member1") ๋ก์ง Request โ 1์ฐจ์บ์ ์ฐ์ ์กฐํ
2. 1์ฐจ์บ์์ ์์ผ๋ฉด โ , 1์ฐจ์บ์์์ ์กฐํํด์ Response
3. 1์ฐจ์บ์์ ์์ผ๋ฉด โ๏ธ , DB๋ก ์ค์ SQL Query๋ฅผ ๋ด๋ณด๋
4. DB์์ ์ง์ ์ฐพ์ ๊ฐ Response ์ , 1์ฐจ์บ์์ ์ ์ฅํ๊ณ Response
ย ย ย (๋ค์์์ ๋ DB๋ก Query๋ฅผ ๋ ๋ ๋ฆฌ์ง ์๊ธฐ์ํด)
์ฐ๊ธฐ์ง์ฐSQL์ ์ฅ์
๋ฅผ ๋
๐ ์์์ฑ์ปจํ ์คํธ ๋ด๋ถ์ ์ฐ๊ธฐ์ง์ฐSQL์ ์ฅ์
1. memberA, memberB Entity โ ์์ํํจ (persist())
2. entityManager.commit() โ ๋ฉ์๋ ํธ์ถ
3. ๋ด๋ถ์ ์ผ๋ก ์ฐ๊ธฐ์ง์ฐSQL์ ์ฅ์ โก๏ธ Flush
4. SQL Query(INSERT A, INSERT B) โ DB๋ก ๋ฐ์๋จ
DirtyChecking
โ ๋ฐ์ดํฐ์ ๋ณ๊ฒฝ์ ๊ฐ์งํด ์๋์ผ๋ก ์์ ํด์ค
JPA : 1์ฐจ์บ์ + ์ฐ๊ธฐ์ง์ฐSQL์ ์ฅ์ โ ๋ณ๊ฒฝ & ์์ ๊ฐ์งํจ โญ๏ธ
๐ DirtyChecking
1. 1์ฐจ์บ์ : Entity ๊ฐ์ฒด์ ๋ณด + Entity ์กฐํ์์ ๋ฐ์ดํฐ (์ค๋ ์ท) โ ๋ชจ๋์ ์ฅ
2. Entity ๊ฐ์ฒด์ ๋ณด์ Entity ์กฐํ์์ ๋ฐ์ดํฐ ๋ค๋ฆ โ ๋ณ๊ฒฝ๋ฐ์ ํ์ง
3. ๋ณ๊ฒฝ์ด ํ์ง๋๋ฉด, ํด๋น ๋ณ๊ฒฝ๋ถ๋ฌธ์ ๋ฐ์ํ ์ ์๋ UPDATE Query ์ค์ค๋ก ์์ฑํด๋ (โ ์ฐ๊ธฐ์ง์ฐSQL์ ์ฅ์)
Member member1 = entityManager.find(Member.class, "mallang");
Member member2 = entityManager.find(Member.class, "mallang");
System.out.println(member1 == member2); // True
@Entity
@Table(name = "USER")
public class Member {
@Id
@Column(name = "user_id")
private String id;
private String username;
private Integer age;
@Enumerated(EnumType.STRING)
private RoleType userRole;
// Timestamped ํด๋์ค ์์ํ์ง ์๊ณ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
@Temporal(TemporalType.TIMESTAMP)
private Date modifiedDate;
}
Annotation | ํน์ง |
---|---|
@Entity | - ๊ธฐ๋ณธ์์ฑ์ ํ์ (@NoArgsConstructor_ํ๋ผ๋ฏธํฐ์๋๊ธฐ๋ณธ์์ฑ์) - final, enum, interface ํด๋์ค์ ์ฌ์ฉ๋ถ๊ฐ โ๏ธ - ์ ์ฅํ ํ๋ โ final ์ฌ์ฉ๋ถ๊ฐ โ๏ธ |
@Table | - Entity์ Mapping ํ ํ
์ด๋ธ์ ์ด๋ฆ - ์๋ต โ ํด๋์ค ๋ช ์ด ํ ์ด๋ธ ๋ช ์ผ๋ก ๊ท์๋จ |
@Column | - ๊ฐ์ฒด ํ๋ โ ํ
์ด๋ธ Column์ Mappingํ๋๋ฐ ์ฌ์ฉ - ์๋ต๊ฐ๋ฅ - ์ด๋ฆ, Nullable, unique ๋ฑ ์์ฑ ์ฌ์ฉ |
@Enumerated | - Java Enum์ ํ
์ด๋ธ์์ ์ฌ์ฉ - STRING ์์ฑ : Enum ์ด๋ฆ์ Column์ ์ ์ฅํจ (Enum๋ณ๊ฒฝ์๋ ์์ ํจ) - ORDINAL ์์ฑ : Enum์ ๋์๋๋ ์์ index๊ฐ์ Column์ ์ ์ฅํจ |
@Entity
@Getter
@Setter
public class Member {
@Id
@Column(name = "member_id")
private String id;
private String username;
@ManyToOne
@JoinColumn(name = "team_id")
private Team team;
public void setTeam(Team team) {
this.team = team;
}
}
@Entity
@Getter
@Setter
public class Team {
@Id
@Column(name = team_id)
private String id;
private String teamname;
}
Annotation | ํน์ง |
---|---|
@ManyToOne | - N : 1 (๋ค๋์ผ) ๊ด๊ณ - Optional ์์ฑ : false โ ์ฐ๊ด๋ Entity๊ฐ ํญ์ ์์ด์ผ ์์ฑ๊ฐ๋ฅ - fetch ์์ฑ : EAGER โ (์ฐ๊ด๋๊ฒ๊น์ง)์ฆ์๋ก๋ฉ, LAZY โ ์ง์ฐ๋ก๋ฉ - cascade : ์์์ฑ์ ์ด |
@JoinColumn | - FK Mapping - ์ค์ DB ๊ฐ์ฒดํ๋ โ ๊ฐ์ฒดํ ์ด๋ธ์ FK๊ฐ ๋ค์ด๊ฐ - name ์์ฑ : FK ๋ช |
@Getter
@Entity
@NoArgsConstructor // ํ๋ผ๋ฏธํฐ์๋ ๊ธฐ๋ณธ์์ฑ์
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String memberName;
@OneToMany(mappedBy = "member", fetch = FetchType.EAGER)
private List<Orders> orders = new ArrayList<>();
// ์์ฑ์
public Member(String memberName) {
this.memberName = memberName;
}
}
@Getter
@Entity
@NoArgsConstructor
public class Orders {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "food_id")
private Food food;
@ManyToOne
@JoinColumn(name = "member_id")
private Member member;
// ์์ฑ์
public Orders(Food food, Member member) {
this.food = food;
this.member = member;
}
}
@Getter
@Entity
@NoArgsConstructor
public class Food {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String foodName;
@Column(nullable = false)
private int price;
@OneToMany(mappedBy = "food", fetch = FetchType.EAGER)
private List<Orders> orders = new ArrayList<>();
// ์์ฑ์
public Food(String foodName, int price) {
this.foodName = foodName;
this.price = price
}
}
๐ ํ๋ก์
: ์ง์ฐ๋ก๋ฉ๊ธฐ๋ฅ(fetch) ์ฌ์ฉ ์, ์ค์ Entity ๊ฐ์ฒด ๋์์ DB์กฐํ๋ฅผ ์ง์ฐํ ์ ์๋ ๊ฐ์ง๊ฐ์ฒด
Entity ์กฐํ โ ์ฐ๊ด๋ Entity๊ฐ ํญ์ ์ฌ์ฉ๋์ง โ
์ฐ๊ด๊ด๊ณ Entity : ๋น์ฆ๋์ค ๋ก์ง์ ๋ฐ๋ผ ์ฌ์ฉ๋ ๋๋ ์์ง๋ง, ์๋๋๋ ์์
JPA : ๋ถํ์ํ DB ์กฐํ๋ฅผ ์ค์ฌ ์ฑ๋ฅ์ต์ ํ โ
์ง์ฐ๋ก๋ฉ
: Entity๊ฐ ์ค์ ์ฌ์ฉ๋ ๋๊น์ง DB์กฐํ๋ฅผ ์ง์ฐํ๋ ๋ฐฉ๋ฒ