Recent Posts
Recent Comments
Archives
๋ฐ˜์‘ํ˜•
250x250
ยซ   2024/04   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Today
Yesterday

Total
04-30 00:00
๊ด€๋ฆฌ ๋ฉ”๋‰ด

Hey Tech

Entity ๊ฐœ๋… ๋ฐ ๋งตํ•‘ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž! ๋ณธ๋ฌธ

SW ๊ฐœ๋ฐœ/Java

Entity ๊ฐœ๋… ๋ฐ ๋งตํ•‘ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž!

Tony Park 2021. 12. 28. 22:29
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ”ฅ ๋ชฉํ‘œ

Entity์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ๋งตํ•‘ ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•œ๋‹ค.

1. Entity ๊ฐœ๋…

  • 2์ฐจ์› Table ์ž์ฒด๋ฅผ Entity๋ผ๊ณ  ๋ถ€๋ฆ„
  • Table ๋‚ด ๊ฐ Row๊ฐ€ Entity ๊ฐ์ฒด์ด๋ฉฐ, ๊ฐ Column์ด Field
  • Entity๋Š” Table๊ณผ 1๋Œ€1 ๋Œ€์‘๋œ๋‹ค๊ณ  ํ‘œํ˜„
  • Table ๋‚ด ๋ชจ๋“  Column์€ Field๋กœ ๋ฐ˜๋“œ์‹œ ์ •์˜ํ•ด์•ผ ํ•จ
  • Entity ํด๋ž˜์Šค๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๊ฑฐ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด๋กœ์„œ ์‚ฌ์šฉ๋ถˆ๊ฐ€

2. Entity ํด๋ž˜์Šค ์‚ฌ์šฉ ๊ทœ์น™

  • Entity ํด๋ž˜์Šค๋Š” ํด๋ž˜์Šค ์ž‘์„ฑ ์‹œ Entity Annotation์„ ๋ถ™์—ฌ ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ Entity ํด๋ž˜์Šค์ž„์„ ๋ช…์‹œํ•ด์•ผ ํ•จ
  • Entity ํด๋ž˜์Šค์—์„œ Domain ๋กœ์ง๋งŒ ๊ตฌํ˜„ํ•˜๊ณ  Presentation ๋กœ์ง์€ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์Œ
  • Proxy ์ƒ์„ฑ์„ ์œ„ํ•ด ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋Š” ํ•„์ˆ˜์ด๋ฉฐ, public(์ง€์–‘) ๋˜๋Š” protected ์ƒ์„ฑ์ž์ด์–ด์•ผ ํ•จ(private ์‚ฌ์šฉ๋ถˆ๊ฐ€)
  • final, enum, interface, inner ํด๋ž˜์Šค๋Š” Entity๋กœ ์‚ฌ์šฉ๋ถˆ๊ฐ€
  • DB Table์— ์ €์žฅํ•  Field๋Š” final ์„ ์–ธ ๋ถˆ๊ฐ€
  • Setter ์‚ฌ์šฉ ์ง€์–‘
    • Entity ํด๋ž˜์Šค ์ƒ์„ฑ ์‹œ Getter๋Š” ๋งŒ๋“ค์–ด์•ผ ํ•˜์ง€๋งŒ Entity ์ผ๊ด€์„ฑ ๋ณด์กด์„ ์œ„ํ•ด Setter ์‚ฌ์šฉ์€ ์ง€์–‘
    • ๋ฌด๋ถ„๋ณ„ํ•œ Setter ์‚ฌ์šฉ์€ Entity ํด๋ž˜์Šค์˜ Instance๊ฐ€ ์–ธ์ œ, ์–ด๋””์—์„œ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์›€(์ฐธ๊ณ ๋ฌธํ—Œ)
    • Setter ๋Œ€์‹  Builder ํŒจํ„ด์„ ํ™œ์šฉํ•˜๋ฉด ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๊ฐ€ ๋งŽ์•„์ ธ๋„ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ Field์— ๋„ฃ๋Š” ๊ฒƒ์ด ์šฉ์ด

2.1. Annotation(i.e., @)

@Entity

  • ํด๋ž˜์Šค ์„ ์–ธ ์‹œ Annotation์„ ์ž…๋ ฅํ•˜๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ Entity ํด๋ž˜์Šค์ž„์„ ๋ช…์‹œํ•˜๋Š” ์—ญํ• 
  • Entity ํด๋ž˜์Šค๋Š” JPA์—์„œ ์ •์˜ํ•œ ํ•„๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Table ์ƒ์„ฑ

@Builder

  • @AllArgsConstructor๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ์ฒ˜๋Ÿผ Entity ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ Builder pattern ์ƒ์„ฑ

@AllArgsConstructor

  • ๋ชจ๋“  Field๋ฅผ Parameter๋กœ ๋ฐ›๋Š” ์ƒ์„ฑ์ž ์ƒ์„ฑ
  • ๋””๋ฒ„๊น… ์–ด๋ ค์›€ ๋ฐ ๋‹ค์–‘ํ•œ ๋ฒ„๊ทธ ์ƒ์„ฑ์„ ์•ผ๊ธฐํ•˜๋ฏ€๋กœ ํ•ด๋‹น annotation ์‚ฌ์šฉ์€ ์ง€์–‘(์ฐธ๊ณ ๋ฌธํ—Œ)
  • ์ƒ์„ฑ์ž๋ฅผ ์ง์ ‘ ๋งŒ๋“ค๊ณ  ์ƒ์„ฑ์ž์— @Builder๋ฅผ ๋ถ™์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ

@RequiredArgsConstructor

  • final ๋˜๋Š” @NonNull์— ํ•ด๋‹นํ•˜๋Š” Field๋งŒ Parameter๋กœ ๋ฐ›๋Š” ์ƒ์„ฑ์ž ์ƒ์„ฑ(null์ธ ๊ฒฝ์šฐ NullPointerException ๋ฐœ์ƒ)
  • ์ƒ์„ฑ์ž ์ฃผ์ž… ์‹œ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ์ž‘์„ฑ์„ ์ค„์—ฌ ํด๋ฆฐ ์ฝ”๋“œ ์ž‘์„ฑ ์‹œ ์œ ์šฉํ•จ
  • ๋””๋ฒ„๊น… ์–ด๋ ค์›€ ๋ฐ ๋‹ค์–‘ํ•œ ๋ฒ„๊ทธ ์ƒ์„ฑ์„ ์•ผ๊ธฐํ•˜๋ฏ€๋กœ ํ•ด๋‹น annotation ์‚ฌ์šฉ์€ ์ง€์–‘(์ฐธ๊ณ ๋ฌธํ—Œ)

@NoArgsConstructor

  • Parameter ์—†๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ์ƒ์„ฑ
  • ์ดˆ๊ธฐ๊ฐ’์ด final ํ•„๋“œ์ธ ๊ฒฝ์šฐ ์ปดํŒŒ์ผ ์—๋Ÿฌ ๋ฐœ์ƒ

์†์„ฑ

  • access
    • ์—ญํ• 
      • ์†์„ฑ๊ฐ’์ด protected์ธ ๊ฒฝ์šฐ(๊ถŒ์žฅ), ์™ธ๋ถ€์—์„œ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ํ•ด๋‹น Entity์˜ ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ์ง€
      • ์†์„ฑ๊ฐ’์ด public์ธ ๊ฒฝ์šฐ(์ง€์–‘), ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ ์•ˆ์ „์„ฑ ์ €ํ•˜ ์œ ๋ฐœ
    • ์ž‘์„ฑ ์˜ˆ์‹œ: @NoArgsConstructor(access = AccessLevel.PROTECTED)

@Getter

  • ํ•„๋“œ๊ฐ’ ์กฐํšŒ๋ฅผ ์œ„ํ•œ Getter ์ž๋™ ์ƒ์„ฑ

@ToString

  • ํด๋ž˜์Šค์—์„œ ์„ ์–ธํ•œ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” toString ๋ฉ”์†Œ๋“œ ์ƒ์„ฑ
  • exclude ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ง• Field๋Š” ์ถœ๋ ฅํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ

@Table

  • Entity์™€ Mapping ํ•  Table ์ง€์ •

์†์„ฑ

  • name(String, Optional)
    • ์—ญํ• : Mapping ํ•  ํ…Œ์ด๋ธ” ์ด๋ฆ„ ์ง€์ •
    • ๊ธฐ๋ณธ๊ฐ’: Entity ์ด๋ฆ„
    • ์ž‘์„ฑ ์˜ˆ์‹œ: @Table(name = "ํ…Œ์ด๋ธ” ์ด๋ฆ„")
  • catalog(String, Optional)
    • ์—ญํ• : DB catalog mapping
  • catalog(String, Optional)
    • ์—ญํ• : DB schema mapping
  • schema(String, Optional)
    • ์—ญํ• : DB schema mapping
  • indexes(Index[], Optional)
    • ์—ญํ• : DB index mapping
  • uniqueConstraints(UniqueConstraint[], Optional)
    • ์—ญํ• : DDL ์ƒ์„ฑ ์‹œ Unique ์ œ์•ฝ์‚ฌํ•ญ ์ง€์ •

@Id

  • Entity์˜ Primary Key ๊ฐ’ ์ง€์ •

@GeneratedValue(strategy = GenerationType.IDENTITY)

  • MySQL์—์„œ์˜ Auto Increment์™€ ๊ฐ™์€ ์—ญํ•  ์ˆ˜ํ–‰

@Column

์†์„ฑ

  • name(String, Optional)
    • ์—ญํ• : Column ์ด๋ฆ„ ์ง€์ •
    • ๊ธฐ๋ณธ๊ฐ’: ํ•ด๋‹น ๊ฐ์ฒด ์ด๋ฆ„
  • nullable(Boolean, Optional)
    • ์—ญํ• : ํ•ด๋‹น Field ๊ฐ’์ด ๋ฐ˜๋“œ์‹œ ์ž…๋ ฅ๋ฐ›์•„์•ผ ํ• ์ง€ ์—ฌ๋ถ€ ๊ฒฐ์ •
    • ๊ธฐ๋ณธ๊ฐ’: true
  • length(int, Optional)
    • ์—ญํ• : ๋ฌธ์ž์—ด ๊ธธ์ด ์ œํ•œ
    • ํŠน์ง•: String type์—์„œ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅ

@ManyToOne

  • ํ•˜๋‚˜์˜ Entity์™€ ๋‹ค๋ฅธ N๊ฐœ์˜ Entity ๊ฐ„ ๊ด€๊ณ„ ํ˜•์„ฑ ์ง€์›

2.2. Entity ํด๋ž˜์Šค ์ž‘์„ฑ ์˜ˆ์‹œ

๊ทธ๋ฆผ 1. 2์ฐจ์› ํ…Œ์ด๋ธ”(i.e., Entity) ์˜ˆ์‹œ

  • ์œ„ ๊ทธ๋ฆผ 1 ๋‚ด Not Null ์†์„ฑ์„ ๊ฐ–๋Š” id, name, age, salary๋ผ๋Š” Column์„ ๊ฐ–๋Š” employee๋ผ๋Š” Table์ด ์žˆ๋‹ค๊ณ  ํ•˜๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด employee Entity๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Œ
@Entity
@Table(name = "employee") 
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id; // ํ•„์ˆ˜ ์ž…๋ ฅ & 10๊ธ€์ž ์ดˆ๊ณผ ์ž…๋ ฅ๋ถˆ๊ฐ€
    @Column(nullable = false, length = 10)
    private String name;
    @Column
    private int age; // ๊ฐ์ฒด ์ด๋ฆ„๊ณผ ๋‹ค๋ฅด๊ฒŒ column ์ด๋ฆ„ ๊ฐœ๋ณ„์ง€์ •
    @Column(name = "salary") 
    private int pay; 
}

ํฌ์ŠคํŒ… ๋‚ด์šฉ์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ์•„๋ž˜์— ๋Œ“๊ธ€ ๋‚จ๊ฒจ์ฃผ์„ธ์š”!
๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค :)

728x90
๋ฐ˜์‘ํ˜•
Comments