ORM ๋งคํ์ด ํ์ํ ์ด์
๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๊ด๊ณ๋ฅผ ํํํ๋ ๋ฐฉ์์ ๊ทผ๋ณธ์ ์ธ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ๊ฐ์ฒด๋ ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ '์ฐธ์กฐ'ํ๋ฉฐ ๊ด๊ณ๋ฅผ ๋งบ์ต๋๋ค. ๋ฐ๋ฉด์ ํ ์ด๋ธ์ '์ธ๋ ํค' ๊ฐ์ ํตํด ๋ค๋ฅธ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐํ์ฃ . ์ด ์ฐจ์ด ๋๋ฌธ์ ORM ๋งคํ์ด ํ์ํฉ๋๋ค.
๐ ๋ฉ๋ชจ๋ฆฌ(๊ฐ์ฒด) ↔ ์ ์ฅ์(ํ ์ด๋ธ) ๊ด๊ณ์์ JPA๊ฐ ์ค๊ฐ(์์์ฑ ์ปจํ ์คํธ)์์ ๋ฌด์์ ํ๋์ง
ํต์ฌ: ์ฝ๋์์๋ ๊ฐ์ฒด ์ฐธ์กฐ๋ก ๊ด๊ณ๋ฅผ ๋ง๋ค๊ณ , JPA๊ฐ ๊ทธ๊ฑธ DB์ FK๋ก ๋ฐ๊ฟ์ ์ ์ฅํ๋ค.
1) ์ํฐํฐ(๊ฐ์ฒด) ์ชฝ ์ฝ๋: "๊ฐ์ฒด ์ฐธ์กฐ"๋ก ๊ด๊ณ ํํ
@Entity
@Table(name = "TEAM")
public class Team {
@Id @GeneratedValue
private Long id;
private String name;
}
@Entity
@Table(name = "MEMBER")
public class Member {
@Id @GeneratedValue
private Long id;
private String username;
@ManyToOne
@JoinColumn(name = "TEAM_ID") // MEMBER ํ
์ด๋ธ์ TEAM_ID(FK) ์ปฌ๋ผ์ด ์๊น
private Team team;
public void changeTeam(Team team) {
this.team = team;
}
}
- ์ฌ๊ธฐ์ Member.team์ teamId ๊ฐ์ ์ซ์๊ฐ ์๋๋ผ, Team "๊ฐ์ฒด ์์ฒด"๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
- ๊ทธ๋ฐ๋ฐ @JoinColumn(name="TEAM_ID") ๋๋ฌธ์, DB์๋ MEMBER ํ ์ด๋ธ์ TEAM_ID(FK) ์ปฌ๋ผ์ผ๋ก ์ ์ฅ๋ฉ๋๋ค. (ManyToOne์ด๋ฉด FK๋ “์์ค ์ํฐํฐ(์ฌ๊ธฐ์๋ MEMBER) ํ ์ด๋ธ”์ ๋์ ๋๋ค.)
2) "๋ฉ๋ชจ๋ฆฌ์์ ๋ง๋ค๊ณ → ์ ์ฅ ๋์์ผ๋ก ๋ฑ๋กํ๊ณ → ์ปค๋ฐ ๋ DB์ ๋ฐ์" ํ๋ฆ
// ๋ณดํต ์คํ๋ง์ด๋ฉด @Transactional ์์์ ์คํ๋๋ค๊ณ ๋ณด๋ฉด ๋ฉ๋๋ค.
Team team = new Team();
team.setName("TeamA"); //์ง๊ธ์ ๊ทธ๋ฅ ์๋ฐ ๊ฐ์ฒด(๋ฉ๋ชจ๋ฆฌ)
em.persist(team); //์์์ฑ ์ปจํ
์คํธ์ ๋ฑ๋ก(๊ด๋ฆฌ ์์)
Member member = new Member();
member.setUsername("member1");
member.changeTeam(team); //๊ฐ์ฒด ์ฐธ์กฐ๋ก ๊ด๊ณ ์ฐ๊ฒฐ
em.persist(member); // member๋ ์์์ฑ ์ปจํ
์คํธ์ ๋ฑ๋ก
// ํธ๋์ญ์
commit ์์ ์ flush๊ฐ ์ผ์ด๋๋ฉฐ DB์ ๋ฐ์๋จ
tx.commit();
์ฌ๊ธฐ์ ํฌ์ธํธ๋ 3๋จ๊ณ์ ๋๋ค.
- new Team(), new Member()
- ๊ทธ๋ฅ ๋ฉ๋ชจ๋ฆฌ์ ์๋ฐ ๊ฐ์ฒด์ ๋๋ค. ์์ง DB๋ ๋ฌด๊ดํฉ๋๋ค.
- em.persist(...)
- ๊ฐ์ฒด๋ฅผ ์์์ฑ ์ปจํ ์คํธ(= EntityManager๊ฐ ๊ด๋ฆฌํ๋ ์์ญ)์ ๋ฃ์ด์ "๊ด๋ฆฌ ๋์(Managed)"์ผ๋ก ๋ง๋ญ๋๋ค. ๊ทธ๋ฆฌ๊ณ "๋์ค์ DB์ ๋ฃ์ ๋์"์ผ๋ก ์์ฝ๋ฉ๋๋ค.
- commit(๋๋ flush)
- ๋ณ๊ฒฝ ์ฌํญ์ด ์ฆ์ DB๋ก ๋๊ฐ๋ ๊ฒ ์๋๋ผ, ๋ณดํต ์ปค๋ฐ ์ง์ ์ flush(๋๊ธฐํ) ๋๋ฉด์ INSERT/UPDATE ๊ฐ์ SQL์ด DB์ ์ ๋ฌ๋ฉ๋๋ค.
3) find()๊ฐ "์ํฐํฐ๋ฅผ ์ฐพ๋๋ค"๋ ๊ฒ ์ฝ๋์์ ์ด๋ค ์๋ฏธ์ธ์ง
Long teamId = 100L;
Team t1 = em.find(Team.class, teamId);
Team t2 = em.find(Team.class, teamId);
System.out.println(t1 == t2) // ๊ฐ์ ํธ๋์ญ์
/๊ฐ์ ์์์ฑ ์ปจํ
์คํธ๋ฉด ๋ณดํต true
em.find(Team.class, 100L)์ PK๊ฐ 100์ธ Team ์ํฐํฐ(๊ฐ์ฒด)๋ฅผ ๊ฐ์ ธ์จ๋ค๋ ๋ป์ด๊ณ , JPA๋ "ํ ์์์ฑ ์ปจํ ์คํธ ์์์ ๊ฐ์ PK๋ ๊ฐ์ฒด 1๊ฐ๋ง ์กด์ฌ"ํ๋๋ก ๊ด๋ฆฌํฉ๋๋ค.
๊ทธ๋์ ๊ฐ์ ํธ๋์ญ์ ๋ฒ์์์ ๊ฐ์ PK๋ฅผ ๋ ๋ฒ ์ฐพ์ผ๋ฉด DB๋ฅผ ๋ ์ฐ๊ธฐ๋ณด๋ค ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉํ๋ ํํ๊ฐ ๋ฉ๋๋ค.(1์ฐจ ์บ์/๋์ผ์ฑ ๋ณด์ฅ)
1) Team ์ํฐํฐ ์ฝ๋ ํ์ด
@Entity
@Table(name = "TEAM")
public class Team {
@Id @GeneratedValue
private Long id;
private String name;
}
- @Entity
- ์ด ํด๋์ค๊ฐ JPA๊ฐ ๊ด๋ฆฌํ๋ ์์ ๊ฐ์ฒด(์ํฐํฐ)๋ผ๋ ๋ป์ ๋๋ค. ์ฆ, DB์ ์ ์ฅ/์กฐํ ํ ๋์์ผ๋ก ์ธ์๋ฉ๋๋ค. ์ํฐํฐ์ ์ํ๋ ํ๋(๋๋ ํ๋กํผํฐ)๋ก ํํ๋๊ณ , ์ํฐํฐ๋ ์ต์ 1๊ฐ ์ด์์ @Id(PK)๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค.
- @Table(name = "TEAM")
- ์ด ์ํฐํฐ๊ฐ ๋งคํ๋ ํ ์ด๋ธ ์ด๋ฆ์ TEAM์ผ๋ก ์ง์ ํ ๊ฒ๋๋ค. @Table์ "์ด ์ํฐํฐ์ ๊ธฐ๋ณธ ํ ์ด๋ธ์ด ๋ฌด์์ธ์ง"๋ฅผ ์ง์ ํฉ๋๋ค. (์ฐธ๊ณ ๋ก @Table์ ์ ์ฐ๋ฉด ๊ธฐ๋ณธ ๊ท์น์ผ๋ก ํ ์ด๋ธ๋ช ์ด ๊ฒฐ์ ๋ฉ๋๋ค.)
- @Id
- id ํ๋๊ฐ ๊ธฐ๋ณธ ํค(PK)๋ผ๋ ๋ป์ ๋๋ค. ์ํฐํฐ๋ฅผ ๊ตฌ๋ถํ๋ ์๋ณ์ ์ญํ ์ ํฉ๋๋ค.
- @GeneratedValue
- id ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ง์ ๋ฃ๊ธฐ๋ณด๋ค, JPA/DB๊ฐ ์๋ ์์ฑํ๋๋ก ๋งก๊ธฐ๊ฒ ๋ค๋ ์๋ฏธ์ ๋๋ค. @Id์ ๊ฐ์ด ์ฐ๋ PK ์์ฑ ์ ๋ต ์ง์ ์ ๋๋ค.
- private String name;
- ๋ณ๋ ํ์๊ฐ ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก DB ์ปฌ๋ผ์ผ๋ก ๋งคํ๋๋ ์์ ํ๋๋ก ์ทจ๊ธ๋ฉ๋๋ค.(์์ ์ ์ธ๋ @Transient ๋ฑ์ผ๋ก ๋ฐ๋ก ํ์)
2) Member ์ํฐํฐ ์ฝ๋ ํ์ด("๊ด๊ณ" ๋ถ๋ถ์ด ํต์ฌ)
@Entity
@Table(name = "MEMBER")
public class Member {
@Id @GeneratedValue
private Long id;
private String username;
@ManyToOne
@JoinColumn(name = "TEAM_ID") // MEMBER ํ
์ด๋ธ์ TEAM_ID(FK) ์ปฌ๋ผ์ด ์๊น
private Team team;
public void changeTeam(Team team) {
this.team = team;
}
}
- private Team team;
- ์ฌ๊ธฐ์ ์ ์ผ ์ค์ํ ํฌ์ธํธ๋ teamId(Long)๊ฐ ์๋๋ผ Team “๊ฐ์ฒด ์ฐธ์กฐ”๋ฅผ ๋ค๊ณ ์๋ค๋ ๊ฒ์ ๋๋ค.
- ์ฆ, ์๋ฐ ์ฝ๋์์๋ “๋ฉค๋ฒ๊ฐ ์ด๋ ํ์ธ์ง”๋ฅผ ์ซ์ FK๋ก ๋ค๊ณ ์๋ ๊ฒ ์๋๋ผ Team ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ๋ก ํํํฉ๋๋ค.
- @ManyToOne
- “๋ฉค๋ฒ ์ฌ๋ฌ ๋ช ์ด ํ๋์ ํ์ ์ํ ์ ์๋ค”๋ ์นด๋๋๋ฆฌํฐ(๋ค:1) ๋ฅผ ์ ์ธํ ๊ฒ๋๋ค. ORM์ด ์ด ๊ด๊ณ๋ฅผ ์ํฐํฐ ์ฐ๊ด๊ด๊ณ๋ก ์ธ์ํ๊ฒ ๋ฉ๋๋ค.
- @JoinColumn(name = "TEAM_ID")
- ์ด ์ฐ๊ด๊ด๊ณ๋ฅผ DB์์ ํํํ ๋, MEMBER ํ ์ด๋ธ์ TEAM_ID๋ผ๋ ์กฐ์ธ ์ปฌ๋ผ(=์ธ๋ํค ์ปฌ๋ผ)์ ์ฐ๊ฒ ๋ค๋ ๋ป์ ๋๋ค. @JoinColumn ์์ฒด๊ฐ “์กฐ์ธ์ ์ํด ์ฌ์ฉํ ์ปฌ๋ผ”์ ์ง์ ํ๋ ์ ๋ ธํ ์ด์ ์ ๋๋ค.
- ๊ฒฐ๊ณผ์ ์ผ๋ก DB์์๋ ๋๋ต ์ด๋ฐ ๋ชจ์์ด ๋ฉ๋๋ค.
- TEAM(id PK, name, …)
- MEMBER(id PK, username, TEAM_ID FK → TEAM.id)
- “๊ทธ๋ผ member.team = team ํ๋ฉด DB์ TEAM_ID๋ ๋๊ฐ ์ฑ์์?”
- Hibernate ๊ฐ์ JPA ๊ตฌํ์ฒด๋ @ManyToOne ์ฐ๊ด๊ด๊ณ๊ฐ ์ธํ ๋๋ฉด, ๊ทธ์ ๋ง๋ FK ์ปฌ๋ผ ๊ฐ์ ์ค์ (๋๊ธฐํ)ํ๋ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค.
- ์ฆ, ์ฝ๋์์๋ member.team์ ์ธํ ํ๋๋ฐ, ์ ์ฅ๋ ๋๋ DB์ MEMBER.TEAM_ID๊ฐ ์ฑ์์ง๊ฒ ๋ฉ๋๋ค.
- changeTeam(Team team) ๋ฉ์๋
- ์ด๊ฑด JPA ํ์ ๋ฌธ๋ฒ์ด๋ผ๊ธฐ๋ณด๋ค๋, ํ ๋ณ๊ฒฝ์ด๋ผ๋ ํ์๋ฅผ ๋ฉ์๋๋ก ๋ฌถ์ด์ ์บก์ํํ ๊ฒ๋๋ค. ๋์ค์ ์๋ฐฉํฅ ๊ด๊ณ๋ก ํ์ฅ๋๋ฉด(Team์ด members ์ปฌ๋ ์ ์ ๊ฐ์ง ๋) ์ด ๋ฉ์๋ ์์์ ์์ชฝ์ ํจ๊ป ๋ง์ถ๋ ์์ผ๋ก “๊ด๊ณ ์ผ๊ด์ฑ”์ ์ ์งํ๊ธฐ๋ ์ข์์ง๋๋ค.
๐ก ์ฌ๊ธฐ์ ๋งํ๋ teamId๋ ๋ฌด์์ผ๊น?
teamId๋ ์ง๊ธ ์ํฐํฐ ์ฝ๋์ "ํ๋๋ก ์กด์ฌํ๋ ๊ฐ"์ด ์๋๋ผ, DB ๊ด์ ์์ ๋งํ๋ ์ธ๋ํค(FK) ๊ฐ์ ์ฝ๊ฒ ๋ถ๋ฅธ ํํ์ ๋๋ค.
1) ์ฝ๋์์ “teamId ํ๋”๋ ์์
- ํ๋ ์ด๋ฆ: team(ํ์ ์ Team)
- ์ด๋ ธํ ์ด์ : @JoinColumn(name = "TEAM_ID")
์ฌ๊ธฐ์ @JoinColumn(name="TEAM_ID")๋ “์ด ์ฐ๊ด๊ด๊ณ๋ฅผ DB์ ์ ์ฅํ ๋, MEMBER ํ ์ด๋ธ์ TEAM_ID ์ปฌ๋ผ์ ์กฐ์ธ ์ปฌ๋ผ(์ธ๋ํค ์ปฌ๋ผ)์ผ๋ก ์ฐ๊ฒ ๋ค”๋ ๋ป์ด์ง, ์๋ฐ ํ๋ ์ด๋ฆ์ teamId๋ก ๋ง๋ค๊ฒ ๋ค๋ ๋ป์ด ์๋๋๋ค.
2) ๊ทธ๋ผ TEAM_ID(=teamId)๋ ์ด๋์ ์๋๋ฉด “DB ํ ์ด๋ธ ์ปฌ๋ผ”์ผ๋ก ์๋ค
์๋ฐ ์ฝ๋์์๋ member.team์ด๋ผ๋ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ์ธํ ํ์ง๋ง, ์ ์ฅ๋ ๋๋ DB์ MEMBER.TEAM_ID = TEAM.ID ํํ๋ก ๋ค์ด๊ฐ๋๋ค. ์ด๋ ๊ทธ TEAM_ID ์ปฌ๋ผ ๊ฐ(=FK)์ ํํ ๋ง๋ก “teamId”๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ๋๋ค.
3) teamId ๊ฐ์ ์ฝ๋์์ ๋ณด๊ณ ์ถ์ผ๋ฉด?
์ํฐํฐ์ teamId ํ๋๊ฐ ์์ผ๋ ๋ณดํต์ ์ด๋ ๊ฒ ๋ด ๋๋ค.
- member.getTeam().getId() → “ํ ๊ฐ์ฒด์ id”, ์ฆ DB์ TEAM_ID์ ๋ค์ด๊ฐ๋ ๊ฐ๊ณผ ๊ฐ์ ์๋ฏธ
์ ๋ฆฌํ๋ฉด, teamId๋ ‘์๋ฐ ํ๋’๊ฐ ์๋๋ผ ‘DB์ ์ธ๋ํค ์ปฌ๋ผ ๊ฐ’์ ์๋ฏธํ๋ ํํ์ด๊ณ , JPA์์๋ ๊ทธ FK๋ฅผ ์ง์ ๋ค๊ณ ์๊ธฐ๋ณด๋ค Team team ์ฐธ์กฐ๋ก ๊ด๊ณ๋ฅผ ๋ชจ๋ธ๋งํ๋ ๊ฒ ๊ธฐ๋ณธ์ ๋๋ค.
3) ์๋ฐฉํฅ ๋งคํ์ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ๊ฐ์ ์ ๋ ฅ
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
team.getMembers().add(member);
//์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ๊ฐ ์ค์
member.setTeam(team); //**
em.persist(member);
ํ ์ค ์ฉ ํด์ํด๋ณด์
Team team = new Team();
team.setName("TeamA");
em.persist(team);
- Team ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ์ด๋ฆ์ ๋ฃ์ต๋๋ค.
- em.persist(team)๋ก Team์ ์์์ฑ ์ปจํ ์คํธ์ ๋ฑ๋กํด์ "์ ์ฅ ๋์"์ผ๋ก ๋ง๋ญ๋๋ค. (๋ณดํต ์ปค๋ฐ/ํ๋ฌ์ ์์ ์ INSERT๊ฐ ๋๊ฐ๋๋ค.)
Member member = new Member();
member.setName("member1");
- Member ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ์ด๋ฆ์ ๋ฃ์ต๋๋ค. ์์ง ํ๊ณผ์ ๊ด๊ณ๋ ์ ์กํ ์ํ์ ๋๋ค.
team.getMembers().add(member);
- Team ์ชฝ ์ปฌ๋ ์ ์ member๋ฅผ ์ถ๊ฐํฉ๋๋ค.
- ๋ค๋ง Team.members๊ฐ mappedBy์ธ ๋ฐ๋ํธ(inverse side)์ด๋ผ๋ฉด, ์ด ์ค์ ๊ฐ์ฒด ๊ทธ๋ํ(๋ฉ๋ชจ๋ฆฌ)์์๋ง ์ฐ๊ฒฐ์ ๋ง๋ ๊ฒ์ ๊ฐ๊น๊ณ , DB์ FK(TEAM_ID)๋ฅผ “๊ฒฐ์ ”ํ๋ ์ฃผ์ฒด๋ ์๋๋๋ค.
member.setTeam(team); //**
- ์ด ์ค์ด ํต์ฌ์ ๋๋ค. Member.team์ ๋ณดํต @JoinColumn(TEAM_ID)๊ฐ ๋ถ์ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ(owning side) ์ด๊ณ , JPA๋ ์ด ์ชฝ ๊ฐ์ ๊ธฐ์ค์ผ๋ก MEMBER ํ ์ด๋ธ์ TEAM_ID(FK)๋ฅผ ์ฑ์๋๋ค.
- ๊ทธ๋์ ํ๋ฉด์ "์๋ฐฉํฅ ๋งคํ ์ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ๊ฐ์ ์ ๋ ฅํด์ผ ํ๋ค"๋ผ๊ณ ์ ํ ์๋ ๊ฒ์ ๋๋ค.
em.persist(member);
- Member๋ ์์ ์ํ๋ก ๋ง๋ค๊ณ , ์ปค๋ฐ/ํ๋ฌ์ ๋ ์ ์ฅ๋๋๋ก ํฉ๋๋ค.
- ๊ฒฐ๊ณผ์ ์ผ๋ก DB์๋ MEMBER.TEAM_ID = TEAM.ID ํํ๋ก FK๊ฐ ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค(์ฃผ์ธ ์ชฝ์ ์ธํ ํ๊ธฐ ๋๋ฌธ์).
JPA์์ ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ์ '์ฐ๊ด๊ด๊ณ ์ฃผ์ธ'์ ๋ฌด์์ ๊ธฐ์ค์ผ๋ก ๊ฒฐ์ ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํ ๊น์?
์ธ๋ ํค๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ ์ด๋์ ์์นํ๋์ง๊ฐ ์ฐ๊ด๊ด๊ณ ์ฃผ์ธ์ ๊ฒฐ์ ํ๋ ํต์ฌ ๊ธฐ์ค์ ๋๋ค. ๋ณดํต N:1 ๊ด๊ณ์์ N์ชฝ์ ์ธ๋ ํค๊ฐ ์์ผ๋ฏ๋ก N์ชฝ์ด ์ฃผ์ธ์ด ๋ฉ๋๋ค.
JPA ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ์์ '์ฐ๊ด๊ด๊ณ ์ฃผ์ธ'์ ์ญํ ์ ๋ฌด์์ผ๊น์?
์ฐ๊ด๊ด๊ณ ์ฃผ์ธ๋ง์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋ ์ธ๋ ํค์ ๊ฐ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ๋ฑ๋กํ ์ ์์ต๋๋ค. ์ฃผ์ธ ์๋ ์ชฝ(mappedBy ์ค์ ๋ ๊ณณ)์ ์ธ๋ ํค ๊ฐ์ ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํฉ๋๋ค.
JPA ์ฐ๊ด๊ด๊ณ๋ฅผ ์ค๊ณํ ๋ ๊ถ์ฅ๋๋ ์ด๊ธฐ ์ ๊ทผ ๋ฐฉ์์ ๋ฌด์์ผ๊น์?
์ฒ์๋ถํฐ ์๋ฐฉํฅ์ผ๋ก ์ค๊ณํ๋ฉด ๋ถํ์ํ๊ฒ ๋ณต์กํด์ง ์ ์์ต๋๋ค. ๋จ๋ฐฉํฅ์ผ๋ก ์ถฉ๋ถํ ์ค๊ณํ ํ, ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ์ค ์ญ๋ฐฉํฅ ์กฐํ๊ฐ ์ ๋ง ํ์ํ ๋ ์๋ฐฉํฅ์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
JPA ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ฅผ ์ฌ์ฉํ ๋, Lombok์ toString()์ด๋ JSON ์ง๋ ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ ์ ์ฃผ์ํด์ผ ํ ๊ฐ์ฅ ํํ ๋ฌธ์ ๋ ๋ฌด์์ผ๊น์?
์์ชฝ ์ํฐํฐ๊ฐ ์๋ก๋ฅผ ์ฐธ์กฐํ๋ ๊ตฌ์กฐ ๋๋ฌธ์ toString์ด๋ JSON ๋ณํ ์ ์๋ก๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํธ์ถํ๋ฉฐ ๋ฌดํํ ์ํํ ์ ์์ต๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ค๋ฅ๋ก ์ด์ด์ง๋๋ค.
'๐ Growth > TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [TIL] Git๊ณผ GitHub (0) | 2026.04.02 |
|---|---|
| [TIL] ๊ฐ๋ฐ ๊ธฐ๋ณธ ์ฉ์ด (0) | 2026.04.01 |
| [TIL] 2026๋ 01์ 05์ผ (0) | 2026.01.05 |
| [์คํ๋ง] 2025-07-02 (1) | 2025.07.02 |
| [TIL] 2024๋ 11์ 14์ผ (1) | 2024.11.15 |