๐ EnjoyTrip ํ๋ก์ ํธ์์ ์ํฐํฐ๋ฅผ ๋ง๋ค ๋ ์๊ฒผ๋ ๋ฌธ์ ๊ธฐ๋ก
์ฐ์ ๋๋ ๊ณ์ ์๋๋ก์ด๋ ๊ฐ๋ฐ + ์ง์ํ ๊ฒ๋ง ๊น์ง๊น์ง ๋๋ค๊ฐ.. ๋ฐฑ์๋ ๊ฐ๋ฐ์ ํ์ง ์ผ๋ง ์ ๋ ์ํ์๋ค.
์ฒซ ํ๋ก์ ํธ์์๋ ๋ค๋ฅธ ํ์๋ถ๊ป์ ์ํฐํฐ๋ฅผ ๋ง๋ค์๊ณ , ๋๋ JPA๋ฅผ ์ตํ๋๋ฐ ๋ ์ง์คํด์ ๊ฐ๋ฐ์ ํ๋ค.
์ด ํ๋ก์ ํธ์์๋ ๊ธฐ์กด ใ rใ i์์ ์ค Dump ํ์ผ์ด ์ด๋ฏธ ์กด์ฌํ๊ณ , MyBatis๋ฅผ ์ด์ฉํ์ฌ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด ๋๋๋ฐ,
์ฐ๋ฆฌ๋ ์ด์ฐจํผ 2ํ๊ธฐ ๋ JPA๋ฅผ ์ธ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ฏธ๋ฆฌ ์ฐ์ตํด๋ณด์. ๋ผ๋ ์ทจ์ง๋ก JPA๋ก ํ๋ก์ ํธ๋ฅผ ๋ฐ๊ฟ์ ์งํํ๋ค.
๋ฐ๋ผ์ ์ํฐํฐ๋ฅผ ๋ง๋ค์ด์ผ ํ๋๋ฐ, ๊ทธ๊ฒ์ ๋ด๊ฐ ํ๊ธฐ๋ก ํ๋ค.
์ด๋ ์ฒ์์ด๋ผ ์ฐ๊ด๊ด๊ณ ์ค์ ํ๋๊ฒ ์ด๋ ค์ ๋ค.
ํนํ๋ ใ rใ i์์ ์ค Dump ํ์ผ์ ๊ทธ๋๋ก ๋ฃ๊ณ + ์ฐ๋ฆฌ์ ์ปค์คํ ๊ธฐ๋ฅ์ ๋ง๋ค์ด์ผ ํ๋๋ฐ
๋งค๋ฒ ๋น์๋ณ ๊ด๊ณ๋ก ์ฐ๊ด๊ด๊ณ๋ฅผ ๋ง๋ค์๋ค๊ฐ ์๋ณ ๊ด๊ณ๋ก ํ๋ ค๋ ๋จธ๋ฆฌ๊ฐ ํฐ์ง๋ ์ค ์์๋ค.
์์ฑ ERD๋ถํฐ ๋ณด์.

์ฌ๊ธฐ์ ๋ฌธ์ ๋๋ ๊ฒ์
1) gugun ํ ์ด๋ธ๊ณผ sido ํ ์ด๋ธ์ n:1์ ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ , gugun์ PK๊ฐ gugun_code + sido_code ๋ผ๋ ์ .
2) attraction_description ํ ์ด๋ธ๊ณผ attraction_info ํ ์ด๋ธ์ n:1์ ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ , attraction_description์ PK๊ฐ attraction_id ๋ผ๋ ์ .
1๋ฒ๋ถํฐ ์ดํด๋ณด์.
gugun ํ ์ด๋ธ๊ณผ sido ํ ์ด๋ธ์ n:1์ ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ , gugun์ PK๊ฐ gugun_code + sido_code
1. sido_id๋ฅผ PK๋ก ๊ฐ๋ Sido ํด๋์ค ์์ฑ
2. sido_code์ gugun_code๋ฅผ ๋ฌถ์ GugunId ํด๋์ค ์์ฑ
import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@Embeddable
@NoArgsConstructor
public class GugunId implements Serializable {
@Column(name = "sido_code")
private int sidoCode;
@Column(name = "gugun_code")
private int gugunCode;
public GugunId(int sidoCode, int gugunCode) {
this.sidoCode = sidoCode;
this.gugunCode = gugunCode;
}
}
** @Embeddable -> ํ๋์ ๊ฐ์ฒด๋ก ๋ฌถ์ด ํํํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
** ๋ณตํฉํค๋ก ์ง์ ํ ํด๋์ค๋ Serializable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
3. Gugun ํด๋์ค ์์ฑ
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Gugun {
@MapsId("sidoCode")
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "sido_code", referencedColumnName = "sido_code")
private Sido sido;
@EmbeddedId
private GugunId gugunId;
@Column(name = "gugun_name")
private String name;
@OneToMany(mappedBy = "gugun")
private List<AttractionInfo> attractionInfos = new ArrayList<>();
}
** @MapsId -> FK๋ฅผ PK๋ก ์ง์ ํ ๋
** @EmbeddedId -> ๋ณตํฉํค ์ง์
4. ๋ค๋ฅธ ํด๋์ค์์ Gugun์ ์ฐธ์กฐํด์ผ ํ ์ผ์ด ์๊ธด๋ค๋ฉด?
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumns({
@JoinColumn(name = "sido_code", referencedColumnName = "sido_code"),
@JoinColumn(name = "gugun_code", referencedColumnName = "gugun_code")
})
private Gugun gugun;
** referencedColumnName ์ ๊ผญ ๋ช ์ํด์ค์ผ ํ๋ค. ์ ๊ทธ๋ฌ๋ฉด ๊ผฌ์ด๋๋ผ..
์ด์ ๋ ๋ฒ์งธ.
attraction_description ํ ์ด๋ธ๊ณผ attraction_info ํ ์ด๋ธ์ n:1์ ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ , attraction_description์ PK๊ฐ attraction_id
1. AttractionInfo ํด๋์ค
@OneToOne(mappedBy = "attractionInfo")
@PrimaryKeyJoinColumn
private AttractionDescription attractionDescription;
** @PrimaryKeyJoinColumn ์ ์ด์ฉํด ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ์ด์ค๋ค.
2. AttractionDescription ํด๋์ค
@OneToOne
@MapsId
@JoinColumn(name = "attraction_id", referencedColumnName = "attraction_id")
private AttractionInfo attractionInfo;
์ด๋ ๊ฒ ํด์ ์ฐ๋ฆฌ๊ฐ ์๋ํ ๋๋ก ์ํฐํฐ๊ฐ ์ ๋ง๋ค์ด์ก๋ค.
'โ๏ธ > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring Boot] ๋์์ฑ ์ ์ด (1) - ๋์์ฑ ๋ฌธ์ , ์ฌ๊ณ ๊ฐ์ ์์คํ ๊ตฌํ ๋ฐ ํ ์คํธ (1) | 2024.11.09 |
---|---|
[JPA] ์ํฐํฐ equals ๋ฉ์๋ ๊ตฌํ ์ ์ฃผ์ํ ์ (0) | 2024.11.08 |
[JPA] Join Fetch ์ MultipleBagFetchException (0) | 2024.11.07 |
[Spring] OpenFeign ์ฌ์ฉํด๋ณด๊ธฐ (0) | 2024.05.22 |
Java ํต์ ์ธํฐํ์ด์ค ์ค์ต (0) | 2023.12.30 |