๐Ÿค” kotlin์—์„œ Entity๋ฅผ Data Class๋กœ ์ง€์ •ํ•˜๋ฉด ์•ˆ๋˜๋Š” ์ด์œ 

๊น€์„ฑ๊ธธยท2023๋…„ 4์›” 11์ผ
0

๊ธฐ์ˆ  ๋ฉด์ ‘ ์ค€๋น„

๋ชฉ๋ก ๋ณด๊ธฐ
5/7

ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ Entity์— ํ”ํžˆ DTO์— ์“ฐ๋Š” Data Class ์‚ฌ์šฉํ•ด๋„ ๋ ๊นŒ๋ผ๋Š” ์˜๋ฌธ์ด ๋“ค์—ˆ๋‹ค. Data Class๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์„ ๋•Œ ์‚ฌ์šฉํ•˜๊ณ , ์œ ์š”ํ•œ copy(), equal(), toString() ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋“ค์„ ์ง€์›ํ•ด์ฃผ๋‹ˆ๊นŒ ์‚ฌ์šฉํ•ด๋„ ๋˜๊ฒ ์ง€! ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์ง€๋งŒ ๊ฒฐ๋ก ์€ ๋ถ™ํžˆ๋ฉด ์•ˆ๋˜๋Š”๊ฒƒ์„ ๊นจ๋‹ณ์•˜๋‹ค.

Data Class

์ผ๋‹จ ์ฒซ๋ฒˆ์งธ๋กœ data class๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด์ž.

Data Class๋Š” ์ผ๋ฐ˜ ํด๋ž˜์Šค์™€ ๋‹ฌ๋ฆฌ, ์œ„์—์„œ ๋งํ–ˆ๋‹ค ์‹ถ์ด ๋ฐ์ดํ„ฐ ๋ณด๊ด€ ๋ชฉ์ ์œผ๋กœ ๋งŒ๋“  ํด๋ž˜์Šค์ด๊ณ , ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•ด์ฃผ๋Š” ํด๋ž˜์Šค์ด๋‹ค.

Data Class ์ƒ์„ฑ์‹œ ๋งŒ๋“ค์–ด์ง€๋Š” ๋ฉ”์„œ๋“œ๋กœ๋Š”

  • hashCode()
  • copy()
  • equal()
  • toString()
  • componentsN()

์ด๋ ‡๊ฒŒ ์žˆ๊ณ , ๋˜ํ•œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  • ๊ธฐ๋ณธ ์ƒ์„ฑ์ž์— 1๊ฐœ ์ด์ƒ์˜ val, var๋ฅผ ๋ถ™ํžŒ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ์–ด์•ผํ•œ๋‹ค.
  • ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•  ์ˆ˜ ์—†๋‹ค. (sealed ํด๋ž˜์Šค ์ƒ์† ๊ฐ€๋Šฅ, ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ ๊ฐ€๋Šฅ)
  • abstract, open, sealed, inner ๋“ฑ์˜ ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™ํž ์ˆ˜ ์—†๋‹ค.
  • ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•  ๊ฒฝ์šฐ, ์˜ค๋ฒ„๋ผ์ด๋“œ ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

Entity Dirty Check

Dirty Check์€ Entity๋ฅผ ์Šค๋ƒ…์ƒท์„ ์ฐ์–ด ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด ๋ง ๊ทธ๋Œ€๋กœ ๋ณ€๊ฒฝ๋œ๊ฒƒ์ด ์žˆ์œผ๋ฉด ์•Œ์•„์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•ด์ฃผ๋Š”๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

Entity๋ฅผ Data Class๋กœ ์ง€์ •ํ•ด์„œ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๋ฉด hashCode(), equal() ๋ฉ”์„œ๋“œ๊ฐ€ Hibernate์˜ Dirty Check ๊ฒ€์‚ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ์š”๊ตฌ์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š์•„ Dirty Check๊ฐ€ ๋ถˆ๊ฐ€๋Šฅ ํ•˜๋‹ค.

๋˜ํ•œ equal() ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด์˜ ๋ชจ๋“  ํ•„๋“œ ์†์„ฑ์ด ๋™์ผํ•œ์ง€ ๋น„๊ตํ•˜์ง€๋งŒ Hibernate๋Š” ๊ธฐ๋ณธ ํ‚ค ํ•„๋“œ๋งŒ ๋น„๊ตํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ชจ๋“  ํ•„๋“œ์˜ ์†์„ฑ์ด ๋™์ผํ•œ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ง€์—ฐ ๋กœ๋”ฉ

์ง€์—ฐ ๋กœ๋”ฉ์€ ๊ฐ์ฒด๋ฅผ ํ•„์š”ํ•œ ์‹œ์ ์— ์—ฐ๊ด€๋œ ๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š”๊ฒƒ์ด๋‹ค. ์ง€์—ฐ๋กœ๋”ฉ์˜ ๋ฐ˜๋Œ€๋Š” ์ฆ‰์‹œ ๋กœ๋”ฉ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ• ๋•Œ ์—ฐ๊ด€๋œ ๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— ๋ถˆ๋ ค์˜ค๋Š”๊ฒƒ์ด๋‹ค. ์ฆ‰์‹œ ๋กœ๋”ฉ์œผ๋กœ ์—ฐ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋ฉด ์†๋„๋Š” ๋น ๋ฅด๊ฒ ์ง€๋งŒ ๋ถˆ๋Ÿฌ๋†“๊ณ  ์“ฐ์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋งŒ ์†Œ๋น„ ๋œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

@Entity
public class Member {

    @Id
    @Column(name = "member_id")
    private String id;

    private String name;

    private int age;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "team_id")
    private Team team;
}


// ์ง€์—ฐ ๋กœ๋”ฉ ์‹คํ–‰ ์ฝ”๋“œ
Member member = em.find(Member.class, "member1");
Team team = member.getTeam(); // ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰
team.getName(); // ํŒ€ ๊ฐ์ฒด ์‹ค์ œ ์‚ฌ์šฉ

์œ„์˜ ์ง€์—ฐ ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๋ฅผ ์˜ˆ๋กœ ๋ณด์ž๋ฉด Entity Manger๋ฅผ ์ด์šฉํ•ด์„œ member๋ฅผ ์กฐํšŒ ํ• ๋•Œ member1๋งŒ ์กฐํšŒํ•˜๊ณ  team์€ ์กฐํšŒํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋Œ€์‹ ์— ๊ฐ์ฒด๋ฅผ ์ƒ์†์„ ์ด์šฉํ•ด์„œ proxy ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์กฐํšŒํ•œ๋‹ค.

์œ„์—์„œ ๋งํ–ˆ๋‹ค ์‹ถ์ด Data Class๋Š” ์ƒ์†์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค! ์ƒ์†์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ open ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™ํž ์ˆ˜๋„ ์—†๋‹ค!

์ด ๋•Œ๋ฌธ์— Entity์— Data Class๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ง€์—ฐ๋กœ๋”ฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€