์ด๋ฒ ํฌ์คํ ์์๋ EntityGraph์ ์ฌ์ฉ์ ๋ํด ์์๋ณด๋ ค๊ณ ํ๋ค.
Entity๊ตฌ์ฑ์ ๋ค์๊ณผ ๊ฐ๋ค
@Entity
class Team(
var title: String,
) {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // DB์์ ์๋์ผ๋ก ID increment
@Column(name = "team_id")
var id: Long = 0L
// Onwer Entity๋ฅผ Player๋ก ์ง์ , Lazy type fetch, Persistence ์ ์ด ํ์
@OneToMany(mappedBy="team", cascade=[CascaseType.ALL], fetch = FetchType.LAZY)
var players : MutableList<Player> = mutableListOf()
}
@Entity
class Player(
var name : String,
@ManyToOne
@JoinColumn(name = "team_id") // ์ธ๋ํค ๋งคํ์ ์ํ ์ค์
var game: Game
) {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // DB์์ ์๋์ผ๋ก ID increment
@Column(name = "player_id")
var id: Long = 0L
var count : Long
}
Game <--> Player ์ํฐํฐ๊ฐ 1:N์ผ๋ก ์ค์ ๋์ด ์๋ค.
ํ์ฌ Team์ players๋ LAZY type์ผ๋ก ๊ฐ์ ธ์ค๊ฒ ๋์ด์๋๋ฐ,
ํ๋์ team.players ์กฐํ์ ๋ค์๊ณผ ๊ฐ์ด 2๊ฐ์ query๊ฐ ์์ฑ๋๋ค.
select
team0_.team_id as team_id1_3_0_,
team0_.name as name2_3_0_
from
team team0_
where
team0_.team_id=?
select
players0_.team_id as team_id4_1_0_,
players0_.player_id as player_i1_1_0_,
players0_.player_id as player_i1_1_1_,
players0_.count as count2_1_1_,
players0_.name as name3_1_1_,
players0_.team_id as team_id4_1_1_
from
player players0_
where
players0_.team_id=?
๋ค๋ฅธ ์ฌ๋๋ค์ ๊ธ๋ค์ ๋ณด๋, ์ฌ๊ธฐ์์ N + 1๊ฐ์ Query๋ฌธ์ด ๋ฐ์ํ๋ค๊ณ ํ๋๋ฐ,
Fetch type์ EAGER, LAZY๋ก ๋ณ๊ฒฝํ๊ณ ๋ค๋ฅธ ์ต์ ๋ค์ ๋ง์ ธ๋ณด์๋
Query๋ฌธ์ ๋์ผํ๊ฒ 2๊ฐ๋ง ๋ฐ์ํ๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
(์์ง JPA ORM๊ณผ ์น์ํ์ง ์์์ ๋ชป๋ค๋ฃจ๋ ๊ฒ ์ผ์๋ ์๋ค..)
ํ์ง๋ง ํ๋์ request์ ๋ํด 2๊ฐ์ ์ฟผ๋ฆฌ๋ฌธ์ด ์๊ธฐ๋ ๊ฒ๋ ์ด์์ ์ด์ง๋ ์๊ธฐ์,
ํ๋์ left outer join Query ๋ฅผ ๋ง๋ค์ด ๋ณด์.
Team Repository์ ๋ค์๊ณผ ๊ฐ์ด @EntityGraph๋ฅผ ์ค์ ํ๋ค.
interface TeamRepository : CrudRepository<Team, Long> {
@EntityGraph(attributePaths = ["players"])
override fun findById(id: Long): Optional<Team>
}
๋ณ๊ฒฝ ํ์๋ ๋ค์๊ณผ ๊ฐ์ด Query๊ฐ ๋๊ฐ๊ฒ ๋๋ค.
select
team0_.team_id as team_id1_3_0_,
team0_.name as name2_3_0_,
players1_.team_id as team_id4_1_1_,
players1_.player_id as player_i1_1_1_,
players1_.player_id as player_i1_1_2_,
players1_.count as count2_1_2_,
players1_.name as name3_1_2_,
players1_.team_id as team_id4_1_2_
from
team team0_
left outer join
player players1_
on
team0_.team_id=players1_.team_id
where
team0_.team_id=?
์ด๋ก ์ธํด fetch type EAGER์๋ ๋น์ทํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
์ค๋์ ์ฌ๊ธฐ๊น์ง..
ํ๋ฆฐ ๋ด์ฉ์ ๋ํ ์ง์ ์ ์ธ์ ๋ ์ง ํ์์ ๋๋ค
'Coding > SpringBoot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SpringBoot] Kotlin - Database Lock - 1 (0) | 2021.04.21 |
---|