Spring/Spring JPA ๊ธฐ๋ณธ

[์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 3. ์—”ํ‹ฐํ‹ฐ ๋งคํ•‘

hello_u 2023. 2. 25. 14:56

 

์—”ํ‹ฐํ‹ฐ ๋งคํ•‘

 

@Entity

@Entity
public class Member {
    @Id @GeneratedValue
    private Long id;

    private String username;
}

 

@Entity๊ฐ€ ๋ถ™์€ ํด๋ž˜์Šค๋Š” JPA๊ฐ€ ๊ด€๋ฆฌ

 

JPA๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘ํ•  ํด๋ž˜์Šค๋Š” @Entity ํ•„์ˆ˜

 

๊ธฐ๋ณธ ์ƒ์„ฑ์ž ํ•„์ˆ˜(ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—†๋Š” public ๋˜๋Š” protected ์ƒ์„ฑ์ž)

 

name ์†์„ฑ

@Entity(name = "Member")
public class Member {

 

JPA์—์„œ ์‚ฌ์šฉํ•  ์—”ํ‹ฐํ‹ฐ ์ด๋ฆ„์„ ์ง€์ •ํ•œ๋‹ค.

 

๊ธฐ๋ณธ๊ฐ’: ํด๋ž˜์Šค ์ด๋ฆ„์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ(์˜ˆ: Member)

 

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ์ž๋™ ์ƒ์„ฑ

jpa:
  hibernate:
    ddl-auto: create

 

DDL์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์‹œ์ ์— ์ž๋™ ์ƒ์„ฑ

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐฉ์–ธ์„ ํ™œ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋งž๋Š” ์ ์ ˆํ•œ DDL ์ƒ์„ฑ 

 

DDL(Data Definition Lanuage) : ๋ฐ์ดํ„ฐ์˜ ์ƒ์„ฑ,์ˆ˜์ •,์‚ญ์ œํ•˜๋Š” ์—ญํ• ์˜ ์–ธ์–ด 

 

 

 

 

 

 

ํ•„๋“œ์™€ ์ปฌ๋Ÿผ ๋งคํ•‘

 

@Column

@Column(name = "name")
private String username;

 

์ปฌ๋Ÿผ ๋งคํ•‘ 

 

name ์†์„ฑ : ๊ฐ์ฒด๋Š” username / DB์—๋Š” name

 

 

 

@Enumerated

@Enumerated(EnumType.STRING)
private RoleType roleType;

 

์ž๋ฐ” enum ํƒ€์ž…์„ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์˜ ์†์„ฑ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

@Enumerated ์• ๋…ธํ…Œ์ด์…˜์—๋Š” ๋‘ ๊ฐ€์ง€ EnumType์ด ์กด์žฌํ•œ๋‹ค.

 

EnumType.ORDINAL : enum ์ˆœ์„œ ๊ฐ’์„ DB์— ์ €์žฅ
EnumType.STRING : enum ์ด๋ฆ„์„ DB์— ์ €์žฅ
 

 

 

 

@Temporal

@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;

๋‚ ์งœํƒ€์ž…(java.util.Date, java.util.Calendar)์„ ๋งคํ•‘ํ• ๋•Œ ์‚ฌ์šฉ

 

 

TemporalType.DATE: ๋‚ ์งœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ dateํƒ€์ž…๊ณผ ๋งคํ•‘ (์˜ˆ: 2013-10-11)


TemporalType.TIME: ์‹œ๊ฐ„, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ timeํƒ€์ž…๊ณผ ๋งคํ•‘ (์˜ˆ: 12:00:00)


TemporalType.TIMESTAMP: ๋‚ ์งœ์™€ ์‹œ๊ฐ„, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ timestampํƒ€์ž…๊ณผ ๋งคํ•‘ (์˜ˆ:2013-10-11 12:00:00)

 

 

 

@Lob

@Lob
private String description;

 

 

๋งคํ•‘ํ•˜๋Š” ํ•„๋“œ ํƒ€์ž…์ด ๋ฌธ์ž๋ฉด CLOB ๋งคํ•‘, ๋‚˜๋จธ์ง€๋Š” BLOB ๋งคํ•‘

 

CLOB: String, char[], java.sql.CLOB

 

BLOB: byte[], java.sql.BLOB

 

 

@Transient

@Transient
private int temp;

 

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

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ, ์กฐํšŒ ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

 

 

๊ธฐ๋ณธ ํ‚ค ๋งคํ•‘

@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

 

 

์ง์ ‘ ํ• ๋‹น: @Id๋งŒ ์‚ฌ์šฉ


์ž๋™ ์ƒ์„ฑ(@GeneratedValue)

 

 

IDENTITY

@Id @GeneratedValue(strategy = GenerationType.IDENTITY)

 

๊ธฐ๋ณธ ํ‚ค ์ƒ์„ฑ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์œ„์ž„

 

์›๋ž˜๋Š” commit ์‹œ์ ์— INSERT SQL ์„๋ณด๋‚ธ๋‹ค .

 

IDENTITY : em.persist(memberA) -> ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— memberA๋ฅผ ๋„ฃ์„ ๋•Œ PK๊ฐ€ ์žˆ์–ด์•ผํ•œ๋‹ค .  

 

 

DB์— ๊ฐ’์„ ๋„ฃ์–ด๋ด์•ผ(INSERT ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ ค๋ด์•ผ) PK๋ฅผ ์•Œ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ํ›„์— PK๋ฅผ ์ฝ์–ด์˜จ๋‹ค . 

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— INSERT SQL์„ ์‹คํ–‰ํ•œ ์ดํ›„์— ID ๊ฐ’์„ ์•Œ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— 

 

IDENTITY ์ „๋žต์€ em.persist() ์‹œ์ ์— ์ฆ‰์‹œ INSERT SQL ์‹คํ–‰ ํ•˜๊ณ  DB์—์„œ ์‹๋ณ„์ž๋ฅผ ์กฐํšŒ

 

 

SEQUENCE

@Entity
@SequenceGenerator(
        name = "MEMBER_SEQ_GENERATOR",
        sequenceName = "MEMBER_SEQ",// ๋งคํ•‘ํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œํ€€์Šค ์ด๋ฆ„
        initialValue = 1, allocationSize = 1)
public class Member {

    @Id @GeneratedValue(strategy = GenerationType.SEQUENCE,
    generator = "MEMBER_SEQ_GENERATOR")
    private Long id;


๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œํ€€์Šค ์˜ค๋ธŒ์ ํŠธ ์‚ฌ์šฉ

 

@SequenceGenerator ํ•„์š”

 

 

em.persist(member) ํ•  ๋•Œ member ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋„ฃ์œผ๋ ค๋Š”๋ฐ ( PK๋ฅผ ์•Œ์•„์•ผํ•จ )

 

์‹œํ€€์Šค ์ „๋žต์ด๋„ค ? --> DBํ•œํ…Œ ๊ฐ’์„ ์–ป์–ด์™€์•ผ๊ฒ ๋„ค ! -> ์‹œํ€€์Šค PK๋ฅผ ์–ป์–ด์˜จ ํ›„ persist 

 

์ฟผ๋ฆฌ๋“ค์€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์Œ“์—ฌ์žˆ๊ณ  --> ํŠธ๋žœ์žญ์…˜ commit ํ•˜๋Š” ์‹œ์ ์— ์ฟผ๋ฆฌ๋“ค์„ ํ˜ธ์ถœ 

 

DBํ•œํ…Œ ์‹œํ€€์Šค ๊ฐ’ ์–ป์–ด์˜ค๊ธฐ

 

 

allocationSize = 50

 

์‹œํ€€์Šค ํ•œ ๋ฒˆ ํ˜ธ์ถœ์— ์ฆ๊ฐ€ํ•˜๋Š” ์ˆ˜(์„ฑ๋Šฅ ์ตœ์ ํ™”์— ์‚ฌ์šฉ๋จ)

 

50๊ฐœ๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ’์„ ์˜ฌ๋ ค๋‘๋Š” ๋ฐฉ์‹

 

 

 

TABLE

@Entity
@TableGenerator(
        name = "MEMBER_SEQ_GENERATOR",
        table = "MY_SEQUENCES",
        pkColumnValue = "MEMBER_SEQ", allocationSize = 1)
        public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE,
            generator = "MEMBER_SEQ_GENERATOR")
    private Long id;

 

ํ‚ค ์ƒ์„ฑ ์ „์šฉ ํ…Œ์ด๋ธ”์„ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œํ€€์Šค๋ฅผ ํ‰ ๋‚ด๋‚ด๋Š” ์ „๋žต

 

@TableGenerator ํ•„์š”

 

 

  

AUTO

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;


๋ฐฉ์–ธ์— ๋”ฐ๋ผ ์ž๋™ ์ง€์ •, ๊ธฐ๋ณธ๊ฐ’

 

 

 

 

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

JPA๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๊ฑฐ๋‚˜, ์‹ค๋ฌด์—์„œ JPA๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๊ธฐ๋ณธ ์ด๋ก ์ด ๋ถ€์กฑํ•˜์‹  ๋ถ„๋“ค์ด JPA์˜ ๊ธฐ๋ณธ ์ด๋ก ์„ ํƒ„ํƒ„ํ•˜๊ฒŒ ํ•™์Šตํ•ด์„œ ์ดˆ๋ณด์ž๋„ ์‹ค๋ฌด์—์„œ ์ž์‹ ์žˆ๊ฒŒ JPA๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., - ๊ฐ•์˜ ์†Œ๊ฐœ | ์ธํ”„๋Ÿฐ

www.inflearn.com