2022. 9. 2. 16:11ใBackend/๐ฟ Spring
๊ฐ์
@ManyToOne ์ฐ๊ด๊ด๊ณ์์ pk ๊ฐ ์๋ ๊ฐ์ ์ฐธ์กฐํ ๋ ๊ฒช์ ๋ฌธ์ ๋ฅผ ๊ธฐ๋กํ์ต๋๋ค.
๊ธฐ์กด์๋ ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ์ง ์๊ณ FK๋ฅผ ๋จ์ String ์ผ๋ก ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ ๋ ํ ์ด๋ธ์ ๊ฐ๋จํ ์กฐ์ธํ์ฌ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์์ต๋๋ค. ํ์ง๋ง ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ๊ณ FK ์ ํ์ ์ String ์์ Entity๋ก ๋ณ๊ฒฝํ์ ๋, ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ ๋ฐ์ ์ ์์์ต๋๋ค.
๋ฌธ์ ์ ์์ธ๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ํ์ด ์ค๋ช ํด๋ณด๊ฒ ์ต๋๋ค.
๋ฌธ์ ์ํฉ
Hospital ์ํฐํฐ์์ Address ์ํฐํฐ๋ฅผ ์ฐธ์กฐํ๋ addressCode ๋ผ๋ Foreign Key ๊ฐ ์์ต๋๋ค.
์ ํํ ๋งํ๋ฉด FK ์ฒ๋ผ ์ฌ์ฉํ๋ ค๊ณ ์ ์ธํ addressCode ํ๋๊ฐ ์์ต๋๋ค. ์ด์ด์๊ฒ๋ ํด๋น ํ๋์ ํ์ ์ Address ๋ก ์ ์ธํ์ง ์๊ณ , String ์ผ๋ก ์ง์ ํ ์ค์๊ฐ ์์์ต๋๋ค. ๊ฐ์ฒด์งํฅ์ ์ด์ง ๋ชปํ๊ณ , ์ฐ๊ด๊ด๊ณ๊ฐ ๋งบ์ด์ง์ง ์์ ์ํ์์ ์ฐธ์กฐ๋ง ํ๋ ์ํ๋ก ๋ณผ ์ ์์ต๋๋ค.
@Entity
@Table(name = "hospital")
public class Hospital {
@Id @GeneratedValue(strategy = IDENTITY)
@Column(name = "id", nullable = false)
private Integer id;
@Column(name = "address_code")
private String addressCode;
}
@Entity
@Table(name = "address")
public class Address implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "id", nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "code")
private String code;
}
์ด ๊ธ์ ์ฝ๋ ๋ถ๋ค์Hospital ์ํฐํฐ์ addressCode ์ ํ์ ์ด ์ด์ํ๋ค๋ ๊ฒ์ ๋จ๋ฒ์ ์์์ฐจ๋ฆฌ์ค ๊ฒ๋๋ค. OOP๋ต๊ฒ ์ฝ๋๋ฅผ ์์ฑํ๋ ค๋ฉด String -> Address ํ์ ์ผ๋ก ๋ณ๊ฒฝํด์ค์ผ ํฉ๋๋ค.
ํด๋น ๋ถ๋ถ์ ๋ณ๊ฒฝ ํ์ต๋๋ค.
@Entity
@Table(name = "hospital")
public class Hospital {
@Id @GeneratedValue(strategy = IDENTITY)
@Column(name = "id", nullable = false)
private Integer id;
// ๋ณ๊ฒฝ ์
// @Column(name = "address_code")
// private String addressCode;
// ๋ณ๊ฒฝ ํ
@ManyToOne
@JoinColumn(name = "address_code")
private Addresss address;
}
์์ ํ ๋ด์ฉ์ ๋ฐ์ํ์ฌ QueryDSL JPA๋ ์คํํด๋ณด๊ฒ ์ต๋๋ค. ํด๋น ์ฝ๋๋ hospital ์ด address ๋ฅผ ์ฐธ์กฐํ์ฌ, address ์ํฐํฐ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
public Page<HospitalListDto> getHospitals(Pageable pageable) {
JPQLQuery<HospitalListDto> limit = getQuerydsl().createQuery()
.select(home)
.from(hospital)
.leftJoin(address).on(hospital.address.code.eq(address.code))
.groupBy(hospital.id)
.limit(pageable.getPageSize());
...
}
leftjoin ์ฟผ๋ฆฌ์์ hospital์ address ํ๋๊ฐ address์ code ํ๋๋ฅผ ์ฐธ์กฐํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
ํ ์ด๋ธ ์์์ ์๋์ ๊ฐ์ ๋ชจ์ต์ด์ฃ .
ํ ์ด๋ธ์ address_code ๋ผ๋ ์ปฌ๋ผ๋ช ์ด, Java ์ฝ๋์์ ์๋์ฒ๋ผ ํํ๋ฉ๋๋ค.
@Column(name = "address_code")
private Addresss address;
QueryDSL ์ฝ๋๊ฐ ์คํ ๋ ํ ์ ์์ ์ผ๋ก ๊ฐ์ด ๋ฐํ ๋ ๊ฒ์ด๋ผ ๊ธฐ๋ํ์ง๋ง, ์๋ฌด๋ฐ ๊ฐ๋ ๋์ค์ง ์์์ต๋๋ค.
์์ธ ํ์ ์ ์ํด ์ค์ sql ์ฟผ๋ฆฌ๊ฐ ์ด๋ป๊ฒ ๋๊ฐ๋์ง p6spy ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ํ์ธํ์ต๋๋ค.
select distinct hospital0_.id,
hospital0_.address_code
from core_hospital hospital0_
left outer join address address2_ on hospital0_.address_code = address2_.id
left outer join address address1_ on (address1_.code = address2_.code)
group by hospital0_.id
limit 20;
๋ถ๋ช QueryDSL ์ฝ๋์์ left Join ์ ํ๋ฒ๋ง ๊ฑธ์๋๋ฐ, ์ค์ ๋ก ๋๊ฐ ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ฉด left join ์ด ๋๋ฒ ๊ฑธ๋ ค์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ๋ฌด์์ด ๋ฌธ์ ์ผ๊ฐ์?
์์ธ ํ์
์ฐ์ ๋๋ฒ๋๊ฐ left join ์ฟผ๋ฆฌ๊ฐ ์ด๋ค ํํ์ธ์ง ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
left outer join address address2_ on hospital0_.address_code = address2_.id -- (1)
left outer join address address1_ on (address1_.code = address2_.code) -- (2)
1) hospital ํ ์ด๋ธ์ address_code ์ปฌ๋ผ์ด address ํ ์ด๋ธ์ id ์ ์กฐ์ธํฉ๋๋ค. queryDSL ์ฝ๋๋๋ก๋ผ๋ฉด address_code ๋ address์ code ์ปฌ๋ผ๊ณผ ์กฐ์ธํด์ผํ๋๋ฐ ๋ง์ด์ฃ .
2) ๋๋ฒ์งธ ์กฐ์ธ๋ฌธ์์ , address ํ ์ด๋ธ์ code ์ปฌ๋ผ์ด, (1) ์์ ์กฐ์ธํ ๋ ์ฌ์ฉ๋ address ํ ์ด๋ธ์ code ์ปฌ๋ผ๊ณผ ์กฐ์ธ๋ฉ๋๋ค. ๋ํต ๋ฌด์จ ์๋ฆฌ์ธ์ง, ์ด๋ป๊ฒ ํด์ํด์ผํ ์ง ๊ฐ์ด ์ค์ง ์์ต๋๋ค.
๋ฌธ์ ์์ธ
๊ณต์๋ฌธ์์ ๊ตฌ๊ธ๋ง์ ํตํด ์ ์์ ๊ฐ์ ์ด์ํ join ๋ฌธ์ด ๋ฐ์ํ๋์ง ์ ์ ์์์ต๋๋ค.
์๋๋ JoinColumn ์ด๋ ธํ ์ด์ ์ ์ต์ ์ธ referencedColumnName ์ ๊ดํ ์ค๋ช ์ ๋๋ค.
ํ์ด๋ผ์ดํ
๋ ๋ถ๋ถ์ ์์ญํด๋ณด๋ฉด, @JoinColumn(name="value")
์ value
๋ ์ฐธ์กฐ ํ
์ด๋ธ์ primary key
์ ๊ฐ์ ์ด๋ฆ์ผ๋ก ๋ํดํธ ์ง์ ๋๋ค๋ ๊ฒ์ ์ถ๋ก ํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ value๋ hospital ์ address_code
์ ํด๋น๋๋ ๊ฐ ์
๋๋ค.
์ด์ฏค์์ address์ hospital ์ํฐํฐ๋ฅผ ๋ค์ ๋ณด๊ฒ ์ต๋๋ค.
@Entity
@Table(name = "address")
public class Address implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "id", nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "code")
private String code;
}
@Entity
@Table(name = "hospital")
public class Hospital {
@Id @GeneratedValue(strategy = IDENTITY)
@Column(name = "id", nullable = false)
private Integer id;
@ManyToOne
@JoinColumn(name = "address_code")
private Addresss address;
}
๋์น ์ฑ์ จ๋์?
2๋ฒ์ด๋ ์ถ๋ ฅ๋ left join ๋ฌธ์ด, referencedColumnName
์ default ์์ฑ๊ณผ ์ฐ๊ด๋ผ ์์์ ์ ์ ์์ต๋๋ค.
referencedColumnName
์ ๋ณ๋๋ก ์ง์ ํ์ง ์์๊ธฐ ๋๋ฌธ์ ๋ํดํธ๋ก pk ๊ฐ์ธ address.id ๋ฅผ ์ฐธ์กฐํ ๊ฒ์์ ํ์
ํ ์ ์์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ queryDSL ์์ ์กฐ์ธ๋ฌธ๊ณผ ์ค์ query ์ ์กฐ์ธ๋ฌธ์ด ์ฐจ์ด๋ฅผ ๊ฐ์ง ๊ฒ์ด์ฃ . queryDSL ์์ hospital์ fk
๋ address ์ code
๋ฅผ ์ฐธ์กฐํ๋ ค๊ณ ํ์ง๋ง, @JoinColumn ์ ๋ํดํธ ์ต์
์ด id(pk) ๋ฅผ ์ฐธ์กฐํด๋ฒ๋ฆฝ๋๋ค. ์ค์ ์ฟผ๋ฆฌ (1) ์์ address.id ๊ฐ ๋ฑ์ฅํ๋ ์ด์ ๋ฅผ ์ด์ ๋ ์ดํดํ ์ ์์ต๋๋ค.
๋ฌธ์ ํด๊ฒฐ
@Entity
@Table(name = "hospital")
public class Hospital {
@Id @GeneratedValue(strategy = IDENTITY)
@Column(name = "id", nullable = false)
private Integer id;
@ManyToOne
@JoinColumn(name = "address_code", referencedColumnName = "code")
private Address address;
}
์ด์ @JoinColumn ์ ์ต์
referencedColumnName ์ ์ฐ๋ฆฌ๊ฐ ์ค์ ๋ก ์ฐธ์กฐํ๊ณ ์ ํ๋ ์ปฌ๋ผ๋ช
code
์ ์ ์ต๋๋ค. queryDSL ์ ๋ค์ ์คํํด๋ณด๋ฉด ์ํ๋ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ ๋ฆฌ
- ์ฐ๊ด๊ด๊ณ ๋งคํ ์ ์ฐธ์กฐํ๋ ์ปฌ๋ผ์ด pk ์ธ์ง ์๋์ง ํ์ธ ํด์ผํ๋ค.
- ์ฐธ์กฐํ๋ ์ปฌ๋ผ์ด pk ๋ผ๋ฉด @JoinColumn ์ ๊ทธ๋๋ก ์ฌ์ฉํด๋ ๋์ง๋ง, ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ referencedColumnName ์ ์ฐธ์กฐํ๋ ค๋ column ๋ช ์ ๋๊ฒจ์ค์ผ ํ๋ค.
๊ฒฐ๋ก ๋ง ๋๊ณ ๋ณด๋ฉด, @JoinColumn ์ referencedColumnName ์ ์ค์ ํ๋ฉด ๋๋ ๊ฐ๋จํ ๋ฌธ์ ์ ๋๋ค.
๋ง์ต๋๋ค, ๊ฐ๋จํ ๋ฌธ์ ์ง๋ง ๊ตฌ์ ๊ตฌ์ ํ์ด์ด ์ ์ด์ฃ . ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ณผ์ ์์ JPA ์ ์ฐ๊ด๊ด๊ณ๋ ์ด๋ ธํ ์ด์ ๋ฑ์ ์ง์์ด ๋ถ์กฑํจ์ ๋๊ผ์ต๋๋ค. @JoinColumn ์ด ๋ํดํธ๋ก ์ฐธ์กฐํ๋ ๊ฐ์ด pk ๋ผ๋ ์ง์์ด ๋จธ๋ฆฌ์์ ์ ๋ฆฌ ๋ผ ์์๋ค๋ฉด, ๋ ์ ๋๋ก ๋ ๊ตฌ๊ธ๋ง์ ํตํด ๋ฌธ์ ๋ฅผ ๋นจ๋ฆฌ ํด๊ฒฐํ ์ ์์ง ์์์๊น ์๊ฐ์ด ๋ญ๋๋ค. ๊ทธ๋ผ ๋ค์ JPA ๊ธฐ๋ณธ์ ๊ณต๋ถํ๋ฌ 20000 . . .
'Backend > ๐ฟ Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[IDE] Unable to resolve table ์๋ฌ ํด๊ฒฐ (0) | 2022.12.08 |
---|---|
RDS - springboot ์ฐ๋ ์ ์๋ฌ ํธ๋ฌ๋ธ์ํ ๋ชจ์ (0) | 2022.09.11 |
[Spring] Shedlock ์ผ๋ก ์ค์ผ์ฅด๋ง ์ ์ดํ๊ธฐ (0) | 2022.08.14 |
IntelliJ ์คํ๋ง๋ถํธ ์๋ฒ 2๋ ์ด์ ์คํํ๋ ๋ฒ (0) | 2022.08.14 |
[Docker, Springboot] java.sql.SQLSyntaxErrorException: Unknown database (4) | 2022.08.03 |