*/Spring

[Spring] JPA ์—”ํ‹ฐํ‹ฐ ์ƒ์„ฑ ์‹œ ์ƒ๊ฒผ๋˜ ๋ฌธ์ œ๋“ค (์‹๋ณ„๊ด€๊ณ„ ๋ฌธ์ œ)

sssbin 2024. 3. 17. 19:58

 

๐Ÿ“ 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] OpenFeign ์‚ฌ์šฉํ•ด๋ณด๊ธฐ  (0) 2024.05.22
Java ํ†ต์‹  ์ธํ„ฐํŽ˜์ด์Šค ์‹ค์Šต  (0) 2023.12.30