πŸ‘“ ν”„λ‘μ‹œ

μ—”ν‹°ν‹°λ₯Ό μ‘°νšŒν•  λ•Œ μ—°κ΄€λœ 엔티티듀이 항상 μ‚¬μš©λ˜λŠ” 것은 μ•„λ‹ˆλ‹€.

예) νšŒμ› μ—”ν‹°ν‹°λ₯Ό μ‘°νšŒν•  λ•Œ μ—°κ΄€λœ νŒ€ μ—”ν‹°ν‹°λŠ” λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ— 따라 μ‚¬μš©λ  λ•Œλ„ 있고 아닐 λ•Œλ„ μžˆλ‹€.

//νšŒμ› μ—”ν‹°ν‹°@Entity@Getterpublic class Member{    private String username;    @ManyToOne    private Team team;}// νŒ€ μ—”ν‹°ν‹°@Entity@Getterpublic class Team{    private String name;}
//νšŒμ›κ³Ό νŒ€ 정보λ₯Ό 좜λ ₯public void printUserAndTeam(String memberId){    Member member = em.find(Member.class, memberId);    Team team = member.getTeam();    member.getUsername();    team.getName();}//νšŒμ› μ •λ³΄λ§Œ 좜λ ₯public String printUser(String memberId){    Member member = em.find(Member.class, memberId);    member.getUsername();}

printUserAndTeam() λ©”μ†Œλ“œλŠ” memberId둜 νšŒμ› μ—”ν‹°ν‹°λ₯Ό μ°Ύμ•„μ„œ νšŒμ›κ³Ό μ—°κ΄€λœ νŒ€μ˜ 이름도 좜λ ₯ν•œλ‹€.

반면 printUser() λ©”μ†Œλ“œλŠ” νšŒμ› μ—”ν‹°ν‹°λ§Œ 좜λ ₯ν•˜λŠ” 데 μ‚¬μš©ν•˜κ³  μ—°κ΄€λœ νŒ€ μ—”ν‹°ν‹°λŠ” μ „ν˜€ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.

printUser() λ©”μ†Œλ“œλŠ” νšŒμ› μ—”ν‹°ν‹°λ§Œ μ‚¬μš©ν•˜λ―€λ‘œ em.find()둜 νšŒμ› μ—”ν‹°ν‹°λ₯Ό μ‘°νšŒν•  λ•Œ νšŒμ›κ³Ό μ—°κ΄€λœ νŒ€ μ—”ν‹°ν‹°(Member.team)κΉŒμ§€ ν•¨κ»˜ μ‘°νšŒν•˜λŠ” 것은 νš¨μœ¨μ μ΄μ§€ μ•Šλ‹€.

이런 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ JPAλŠ” μ—”ν‹°ν‹°κ°€ μ‹€μ œ μ‚¬μš©λ  λ•ŒκΉŒμ§€ DB 쑰회λ₯Ό μ§€μ—°ν•˜λŠ” 방법을 μ œκ³΅ν•œλ‹€.(μ§€μ—° λ‘œλ”©)

μ‰½κ²Œ 말해 team.getName()처럼 νŒ€ μ—”ν‹°ν‹°μ˜ 값을 μ‹€μ œ μ‚¬μš©ν•˜λŠ” μ‹œμ μ— DBμ—μ„œ νŒ€ 엔티티에 ν•„μš”ν•œ 데이터λ₯Ό μ‘°νšŒν•˜λŠ” 것이닀.

이 방법을 μ‚¬μš©ν•˜λ©΄ printUser() λ©”μ†Œλ“œλŠ” νšŒμ› λ°μ΄ν„°λ§Œ μ‘°νšŒν•΄λ„ λœλ‹€.

μ§€μ—° λ‘œλ”© κΈ°λŠ₯을 μ‚¬μš©ν•˜λ €λ©΄ μ‹€μ œ μ—”ν‹°ν‹° 객체 λŒ€μ‹  DB 쑰회λ₯Ό μ§€μ—°ν•  수 μžˆλŠ” κ°€μ§œ 객체가 ν•„μš”ν•˜λ‹€.(ν”„λ‘μ‹œ 객체)

1. ν”„λ‘μ‹œ 기초

JPAμ—μ„œ μ‹λ³„μžλ₯Ό μ—”ν‹°ν‹° ν•˜λ‚˜λ‘œ μ‘°νšŒν•  λ•ŒλŠ” EntityManager.find()λ₯Ό μ‚¬μš©ν•œλ‹€.

이 λ©”μ†Œλ“œλŠ” μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ— μ—”ν‹°ν‹°κ°€ μ—†μœΌλ©΄ DBμ—μ„œ μ‘°νšŒν•œλ‹€.

Member member = em.find(Member.class, "member1")