@OneToOne

์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘ ๊ธฐ๋ณธ - ์ผ๋Œ€์ผ ๊ด€๊ณ„

1. ์ฃผ ํ…Œ์ด๋ธ”์— ์™ธ๋ž˜ ํ‚ค

@OneToOne ๋‹จ๋ฐฉํ–ฅ

onetoone

์œ„๋Š” ์ผ๋Œ€์ผ ์ฃผ ํ…Œ์ด๋ธ”์— ์™ธ๋ž˜ ํ‚ค, ๋‹จ๋ฐฉํ–ฅ์ด๋‹ค. (erd์—๋Š” ๊นœ๋นกํ•˜๊ณ  ๋ชป ๋„ฃ์—ˆ์ง€๋งŒ Memberํ…Œ์ด๋ธ”์˜ LOCKER_ID๋Š” fk์ด์ž uk์ด๋‹ค.)

@Entity
public class Member{
    @Id @GeneratedValue
    @Column(name="MEMBER_ID")
    private Long id;

    private String username;

    @OneToOne
    @JoinColumn(name="LOCKER_ID")
    private Locker locker;

    ...
}

@Entity
public class Locker{
    @Id @GeneratedValue
    @Column(name="LOCKER_ID")
    private Long id;

    private String name;

    ...
}

์ฝ”๋“œ๋Š” ๋‹ค๋Œ€์ผ ๋‹จ๋ฐฉํ–ฅ๊ณผ ์ƒ๋‹นํžˆ ์œ ์‚ฌํ•˜๋‹ค.

@OneToOne ์–‘๋ฐฉํ–ฅ

onetoone2

์œ„๋Š” ์ผ๋Œ€์ผ ์ฃผ ํ…Œ์ด๋ธ”์— ์™ธ๋ž˜ ํ‚ค, ์–‘๋ฐฉํ–ฅ์ด๋‹ค.

@Entity
public class Member{
    @Id @GeneratedValue
    @Column(name="MEMBER_ID")
    private Long id;

    private String username;

    @OneToOne
    @JoinColumn(name="LOCKER_ID")
    private Locker locker;

    ...
}

@Entity
public class Locker{
    @Id @GeneratedValue
    @Column(name="LOCKER_ID")
    private Long id;

    private String name;

    @OneToOne(mappedBy="Locker")
    private Member member;

    ...
}

์—ญ์‹œ ์ฝ”๋“œ๋Š” ๋‹ค๋Œ€์ผ ์–‘๋ฐฉํ–ฅ๊ณผ ์ƒ๋‹นํžˆ ์œ ์‚ฌํ•˜๋‹ค.

2. ๋Œ€์ƒ ํ…Œ์ด๋ธ”์— ์™ธ๋ž˜ ํ‚ค

@OneToOne ๋‹จ๋ฐฉํ–ฅ

๋Œ€์ƒ ํ…Œ์ด๋ธ”์— ์™ธ๋ž˜ ํ‚ค๋ฅผ ๋‘˜ ๋•Œ @OneToOne ๋‹จ๋ฐฉํ–ฅ ๋งคํ•‘์€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

@OneToOne ์–‘๋ฐฉํ–ฅ

(์—ญ์‹œ erd์—๋Š” ๋ชป ๋„ฃ์—ˆ์ง€๋งŒ Lockerํ…Œ์ด๋ธ”์˜ MEMBER_ID๋Š” fk์ด์ž uk์ด๋‹ค.)

onetoone3
@Entity
public class Member{
    @Id @GeneratedValue
    @Column(name="MEMBER_ID")
    private Long id;

    private String username;

    @OneToOne(mappedBy="LOCKER_ID")
    private Locker locker;

    ...
}

@Entity
public class Locker{
    @Id @GeneratedValue
    @Column(name="LOCKER_ID")
    private Long id;

    private String name;

    @OneToOne
    @JoinColumn(name="MEMBER_ID")
    private Member member;

    ...
}

์ฃผ ํ…Œ์ด๋ธ”์— ์™ธ๋ž˜ ํ‚ค๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋˜, db์„ค๊ณ„์˜ ๋ฐฉํ–ฅ์„ฑ์„ ๊ณ ๋ คํ•ด์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ง€ ํŒ€์›๋“ค๊ณผ ์ถฉ๋ถ„ํ•œ ํ˜‘์˜๋ฅผ ๊ฑฐ์น˜๊ณ  ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. memberํ•œ ๋ช…์ด ์—ฌ๋Ÿฌ locker๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก db์„ค๊ณ„๊ฐ€ ๋ฐ”๋€”์ˆ˜๋„ ์žˆ๊ณ , lockerํ•˜๋‚˜๊ฐ€ ์—ฌ๋Ÿฌ member์— ์˜ํ•ด ์‚ฌ์šฉ๋˜๋„๋ก db์„ค๊ณ„๊ฐ€ ๋ฐ”๋€”์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

memberํ•œ ๋ช…์ด ์—ฌ๋Ÿฌ locker๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค๊ณ„๊ฐ€ ๋ฐ”๋€” ๊ฒฝ์šฐ์— ๋Œ€์ƒ ํ…Œ์ด๋ธ”์— ์™ธ๋ž˜ ํ‚ค ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ ธ๊ฐˆ ๊ฒฝ์šฐ, lockerํ…Œ์ด๋ธ”์˜ ์™ธ๋ž˜ํ‚ค์— unique์กฐ๊ฑด๋งŒ ๋นผ์ฃผ๋ฉด ์ฝ”๋“œ ๋ณ€๊ฒฝ์—†์ด ์œ ์—ฐํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ๋ฌผ๋ก  lockerํ•˜๋‚˜๊ฐ€ member์—ฌ๋Ÿฌ ๋ช…์— ์˜ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ, memberํ…Œ์ด๋ธ”์˜ ์™ธ๋ž˜ํ‚ค์— unique์กฐ๊ฑด์„ ๋นผ๋ฉด ๋˜๋ฏ€๋กœ, ์ฃผ ํ…Œ์ด๋ธ”์— ์™ธ๋ž˜ํ‚ค ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋งž์„ ๊ฒƒ์ด๋‹ค.

์ฐธ๊ณ 

๋˜ํ•œ ์ž์ฒด PK๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋Œ€์‹ , ์™ธ๋ž˜ํ‚ค ์ž์ฒด๋ฅผ PK๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด @MapsId๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

Last updated