๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ์ ์ฅ/์กฐํ ํด๋์ค์์
@Id์ @GeneratedValue๋ฅผ ์ค์ ํ๋ค.
๊ณผ์ฐ @Id์ @GeneratedValue๊ฐ ๋ญ๊น?
@Id
- @Id๋ฅผ ๋ถ์ฌ, JPA์๊ฒ ํด๋น ํ๋๊ฐ ์ด ํ ์ด๋ธ์์ ๊ธฐ๋ณธ ํค(Primary Key)๋ฅผ ์๋ฆฐ๋ค.
- ํด๋น ํ๋๋ ๊ฐ์ฒด์ ๊ณ ์ ๋ฒํธ๋ฅผ ๋ด๋นํ๊ฒ ๋๋ค.
- JPA๋ ๊ธฐ๋ณธ ํค๋ฅผ ํตํด ์ ์ฅ/์กฐํ/์์ /์ญ์ ํ ๋ ์ ํํ ์ด๋ค ํ(row)์ธ์ง ๊ตฌ๋ณํ๋ค.
@GeneratedValue
- @Id ํ๋ ๊ฐ์ ์ด๋ป๊ฒ ์๋์ผ๋ก ๋ง๋ค์ง JPA์๊ฒ ์๋ ค์ฃผ๋ ์ด๋ ธํ ์ด์ ์ด๋ค.
- ๊ธฐ๋ณธํค(PK)๋ฅผ ์ง์ ์ธํ ํ์ง ์๊ณ , ํ๋ก๋ฐ์ด๋๊ฐ ๋ง๋ค๋๋ก ํ๋ค.
- @GeneratedValue๋ฅผ ์ง์ ์ฌ์ฉํ์ง ์๊ณ @Id ์ดํ ๋ค์ด์ ๋ง ์ฌ์ฉํ๋ค๋ฉด ์ง์ ํ ๋นํด์ผํ๋ค.
- ๊ธฐ๋ณธํค(PK) ๊ฐ์ ๋ํ ์์ฑ ์ ๋ต์ ์ ๊ณตํ๋ค.
Q. ํ๋ก๋ฐ์ด๋๋?
A. JPA ํ์ค์ ์ค์ ๋ก ๋์ํ๊ฒ ๋ง๋ค์ด์ฃผ๋ ORM ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ์คํ๋ง์์ ํ๋ก๋ฐ์ด๋ ์์๋ก ํ๋ฒ๋ค์ดํธ(Hibervate)๊ฐ ์๋ค. ์ข ๋ ์ฝ๊ฒ ์ค๋ช ํด๋ณด๋ฉด JPA๋ ๊ท์น์ด๋ผ๊ณ ๋ณด๋ฉด ๋๊ณ , ๊ทธ ๊ท์น์ ์คํํ๋ ์ญํ ์ Hibernate๋ผ๊ณ ์๊ฐํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
Q. @GeneratedValue๋ @Id ๊ฐ์ ์ด๋ป๊ฒ ์๋์ผ๋ก ๋ง๋ค์ง ์๋ ค์ค๋ค๊ณ ํ๋๋ฐ, ์ฌ๊ธฐ์ ์๋์ผ๋ก ๋ง๋ ๋ค๋๊ฒ ๋ฌด์จ ๋ง์ผ๊น?
A. ๋ง์ฝ @GeneratedValue๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด, member.setId(1L); ์ด๋ฐ์์ผ๋ก ์ง์ ๊ฐ์ ์๋์ ์ผ๋ก ๋ฃ์ด์ค์ผํ๋ค. ๊ทธ๋ฐ๋ฐ @GeneratedValue๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ฅ ์์ ์์ id๊ฐ ์๋์ผ๋ก ์ฑ์์ง๊ฒ ๋๋ค. ๊ฐ๋ฐ์๊ฐ ์ผ์ผ์ด ๊ด๋ฆฌํ๋ฉด ์ค์๊ฐ ์๊ธฐ๊ฑฐ๋, ๋์์ ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๋ฒํธ๊ฐ ์ค๋ณต๋ ์ ์๊ธฐ ๋๋ฌธ์ @GeneratedValue๋ฅผ ์ฌ์ฉํ๋๊ฒ ํธ๋ฆฌํ๋ค.
@GeneratedValue์ ์ ๋ต
- IDENTITY - @GeneratedValue(strategy = GenerationType.IDENTITY)
: ๊ธฐ๋ณธํค ์์ฑ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์๊ฒ ์์ํ๋ ๋ฐฉ์์ผ๋ก id ๊ฐ์ ๋ฐ๋ก ํ ๋นํ์ง ์์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๋์ผ๋ก AUTO_INCREMENT๋ฅผ ํ์ฌ ๊ธฐ๋ณธํค๋ฅผ ์์ฑํด์ค๋ค. ์ฃผ๋ก MySQL, PostgreSQL, SQL Server, DB2์์ ์ฌ์ฉํ๋ค. - SEQUENCE - @GeneratedValue(strategy = GenerationType.SEQUENCE)
: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ Sequence Object๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๋์ผ๋ก ๊ธฐ๋ณธํค๋ฅผ ์์ฑํ๋ค. ์ํ์ค ๊ฐ์ฒด์์ ๋ฒํธ๋ฅผ ๋ฝ์ ์ฐ๋๋ฐ, ์ด ์ํ์ค๋ฅผ ํ์ฉํ์ฌ Id ๊ฐ์ ์ฆ๊ฐ ์ํจ๋ค. INSERT ์ ์ ๊ธฐ๋ณธํค๋ฅผ ๋ฏธ๋ฆฌ ์ ์ ์์ด ๋ฐฐ์น ์ฝ์ ์ ์ข๋ค. ๊ทธ๋ฆฌ๊ณ sequenceName์ผ๋ก ์ํ์ค๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ง์ ํ ์ ์์ผ๋ฉฐ allocationSize๋ก ํ ๋ฒ์ ์ฌ์ฉํ ์ํ์ค ๋ฉ์ด๋ฆฌ ์ฌ์ด์ฆ๋ฅผ ์ ํด์ ์ต์ ํ ํ ์ ์๋ค. ์ฃผ๋ก ์ค๋ผํด, PostgreSQL, DB2, H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฌ์ฉํ๋ค. ๋ณดํต @SequenceGenerator์ ํจ๊ป ์ฌ์ฉํ๋ค. - TABLE - @GeneratedValue(strategy = GenerationType.TABLE)
: ํค ์์ฑ ์ ์ฉ ํ ์ด๋ธ์ ํ๋ ๋ง๋ค์ด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํ์ค๋ฅผ ํ๋ด๋ด๋ ์ ๋ต์ผ๋ก, ์ ์ฉ ํ ์ด๋ธ์ ๋ง์ง๋ง ID ๊ฐ์ ์ ์ฅํด ์ฆ๊ฐ์ํค๋ ๋ฐฉ์์ด๋ค. @TableGenerator์ ํจ๊ป ์ฌ์ฉํ๋ค. ๋ชจ๋ DB์์ ๋์ํ์ง๋ง, ๋๋ฆฌ๊ธฐ๋ ํ๊ณ ์ฑ๋ฅ์ ์ธ ์ํด๊ฐ ์์ด ๋ณดํต ์ ์ฐ์ง๋ ์๋๋ค. - AUTO - @GeneratedValue(strategy = GenerationType.AUTO)
: hibernate.dialect์ ์ค์ ๋ DB ๋ฐฉ์ธ ์ข ๋ฅ์ ๋ฐ๋ผ ์๋์ผ๋ก IDENTITY, SEQUENCE, TABLE ์ค ํ๋๋ฅผ ์ ํํ๋ค. ์ฒ์์ ํธํ ์ ์์ง๋ง, DB๋ฅผ ๋ฐ๊ฟ์ผํ๋ ๊ฒฝ์ฐ ์ด๋ค ๋ฐฉ์์ด ์ฐ์๋์ง ๋ชจ๋ฅด๋ฉด ์ด์์ฑ์ด ๋จ์ด์ง ์ ์์ด ์ ์ํด์ผํ๋ค. ๊ทธ๋ฆฌ๊ณ ํ๋ฒ๋ค์ดํธ๋ฅผ ๋ฌด์กฐ๊ฑด ๋ฏฟ์ด์ ์๋๋ค. ์ง์ DBMS์ ๋ง๋ ์ ๋ต์ ์ง์ ํ๋๊ฒ ๋ ์ข๋ค. - UUID - @org.hibernate.annotations.UuidGenerator
: id๊ฐ UUID์ผ ๋ UUID Generator๋ฅผ ์ฌ์ฉํ๋ค. ์ต์ ๋ฒ์ ์์ UUID ๊ธฐ๋ฐ ์์ฑ์ด ์ง์๋๋๋ฐ, ๋คํธ์ํฌ ๋ถ์ฐํ๊ฒฝ์์ ์ถฉ๋ ์ํ์ด ๋ฎ๋ค. IDENTITY๋ INSERT๋ฅผ ๋จผ์ ํด์ผ DB๊ฐ ๋ฒํธ๋ฅผ ๋ง๋ค์ด์ค๋ค. ๊ทธ๋ฆฌ๊ณ SEQUENCE๋ INSERT ์ ์ nextval์ ๋ฐ์ผ๋ ค๊ณ DB ํธ์ถ 1ํ๊ฐ ๊ผญ ํ์ํ๋ค. ๊ทธ๋ฐ๋ฐ UUID๋ ๋ค์ ๋ฒํธ๋ฅผ ๋ฐ์์ผํ๋ ์ถ๊ฐ ์์ฒญ์ด ํ์ ์์ด, ๊ธฐ๋ณธํค๋ฅผ ๋ฏธ๋ฆฌ ์๊ณ INSERTํ๋ค. ๊ทธ๋์ ๋คํธ์ํฌ ์ง์ฐ์ด ์ค์ด๋ ๋ค. ๊ทธ๋ฌ๋ ์ธ๋ฑ์ค ํน์ ์ ๋ ฌ ์ฑ๋ฅ์ ์ซ์ ๊ธฐ๋ณธํค๋ณด๋ค ๋ถ๋ฆฌํ๋ค.
์ ๋ต | ๋๊ฐ ๋ง๋๋๊ฐ? | ์ธ์ ์๊ธฐ๋? | ํน์ง |
IDENTITY | DB๊ฐ AUTO_INCREMENT๋ก | INSERT ์งํ | ๋ฐฐ์น INSERT ์ต์ ํ๋ ์ด๋ ค์ |
SEQUENCE | DB ์ํ์ค๋ก ๋ฒํธ๋ฅผ ๋ฝ์์ | INSERT ์ ์ | ๋ฐฐ์น์ ๋ฆฌ, ์ฑ๋ฅ ํ๋ ์ฌ์ |
TABLE | ์ ์ฉ ํ ์ด๋ธ์์ ์ฆ๊ฐ๊ฐ ๊ด๋ฆฌ | ๋ณดํต INSERT ์ /์ค | ์ ์ ์. |
UUID | ํ๋ก๋ฐ์ด๋๋ ์ฑ์ด UUID ์์ฑ | INSERT ์ ์ | ๋ถ์ฐํ๊ฒฝ์ ์ ๋ฆฌ |
@Id์ @GeneratedValue์ ์ฝ๋ ์์(GPT)
- IDENTITY
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
- SEQUENCE
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "member_seq_gen")
@SequenceGenerator(name = "member_seq_gen", sequenceName = "member_seq", allocationSize = 50)
private Long id;
- TABLE
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "member_tbl_gen")
@TableGenerator(name = "member_tbl_gen", table = "id_gen", pkColumnName = "gen_name",
valueColumnName = "gen_val", pkColumnValue = "member_id", allocationSize = 10)
private Long id;
- AUTO
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
- UUID
@Id
@GeneratedValue
@org.hibernate.annotations.UuidGenerator
private UUID id;
๋ด๊ฐ ์ง์ ์ฌ์ฉํ๋ ์ฝ๋ ์์_(H2DataBase๋ฅผ IDENTITY๋ก ์ฌ์ฉํด ๋ณธ ๊ฒ์ ๋ํ์ฌ...)
@Entity
@Getter
@Setter
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String userId;
private String pw;
private String tel;
private String birth;
private String email;
}
IDENTITY๋ MySQL, PostgreSQL, SQL Server, DB2์์ ์ฃผ๋ก ์ฌ์ฉํ๋ค๊ณ ํ๋๋ฐ... ๋๋ H2DataBase๋ฅผ ์ฌ์ฉํ๋ค. H2DataBase๋ SEQUENCE ์ ๋ต์ ๋ง๋ค๊ณ ์จ์๋๋ฐ, ์ด ์ฝ๋๋ฅผ ๋ง๋ค๋ ๋น์๋ฅผ ์๊ฐํด๋ณด๋ฉด ์ํ์ค ํ์ ์ค๋ช ์ด ์ดํดํ๊ธฐ ์ด๋ ค์์ ๋ด๊ฐ ์ดํดํ๊ธฐ ์ฌ์ด ๋ฐฉ์์ธ IDENTITY๋ฅผ ๊ณจ๋๋ ๊ฒ ๊ฐ๋ค.(๋ด ์์ฃผ๋ก ๋์๊ฐ๋ ํ๋ก์ ํธ... ์ค๋ @GeneratedValue์ ๋ํด ๊ณต๋ถํ๊ณ ๋๋๊น ๊ทธ๋ ๊ฒ ์งํํ๋๊ฒ ์กฐ๊ธ ๋ถ๋๋ฝ๋ค.) ์๋ง ๋ฌธ์ ์์ด ๋์๊ฐ ์ด์ ๋ ๋ณ๋ค๋ฅธ ๊ธฐ๋ฅ ์๋ ์ฐ์ต ํ๋ก์ ํธ์์ด์ ๊ทธ๋ฐ ๊ฒ ๊ฐ๋ค. ๊ทธ๋ฅ ๊ธฐ๋ณธ์ ์ธ ํ์๊ฐ์ /๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ด ์๋ ํ๋ก์ ํธ์๊ธฐ์ ์ ์ฅ ๋ง๊ณ ๋ DB๋ก ์ํํ๋ ๊ธฐ๋ฅ์ด ๋ฑํ ์๋ค.
๊ทธ๋๋ ํน์ ๋ชจ๋ฅด๋ GPT์๊ฒ ๋ฌผ์ด๋ดค๋ค.
ํ์คํ ํ ์คํธ ๊ท๋ชจ๊ฐ ์์ ๊ฒฝ์ฐ๋ ํฐ ๋ฌธ์ ๊ฐ ์๋ ๋ฏ ํ๋ค. ๋ค๋ง ๋๋ ์ฝ์ (batch) ์ต์ ํ๊ฐ ์ ํ๋ ์ ์๊ณ persist( ) ์์ ์ ์ฆ์ flush๊ฐ ์์ผ ์ ์๋ค๊ณ ํ๋ค. ๊ทธ ์ธ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ ์ค๋ง๊ฐ์ง์ ๋ฐฉ๋ฒ์ ์๋ ค์คฌ๋๋ฐ, ๊ทธ๋ฅ ๋ง๋ ์ ๋ต ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
์๋์ ์ถ์ฒ๋ฅผ ๋จ๊ฒจ๋๊ฒ ์ต๋๋ค.
๋ธ๋ก๊ทธ์ ์ ๊ฐ ์ต๋ํ ์ดํดํ ๋ด์ฉ๊น์ง๋ง ์ ๋๊ฑฐ๋ผ
์ถ์ฒ์ ๋ค์ด๊ฐ์๋ฉด ๋ ๋ง์ ๋ด์ฉ์ด ์์ด ๊ณต๋ถํ์๋๋ฐ ๋์๋์ค๊ฒ๋๋ค.
๐ชฝ
ํ๋ฆฐ ๋ด์ฉ์ด ์๋ค๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์
- @Id์ @GeneratedValue์ ๋ํ์ฌ
JPA ๊ธฐ๋ณธํค ์์ฑ ์ ๋ต, @GeneratedValue ์ฌ์ฉ์ ์ฃผ์์
JPA๋ก ํ ์ด๋ธ๊ณผ ์ํฐํฐ๋ฅผ ๋งคํํ ๋, ์๋ณ์๋ก ์ฌ์ฉํ ํ๋ ์์ @Id ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ ํ ์ด๋ธ์ Primary Key์ ์ฐ๊ฒฐ ์์ผ์ค์ผํ๋ค. ์ด ๋, ์ปฌ๋ผ ๋ช ์ ๋ฐ๋ก ์ง์ ํ์ง ์์ผ๋ฉด, ๊ด๋ก์ ๋ฐ๋ผ ๋งคํ๋๋
devcamus.tistory.com
- @Id์ @GeneratedValue์ ๋ํ์ฌ
@Id / @GeneratedValue์ ๋ํด ์์๋ณด์
@Id / @GeneratedValue์ ๋ํด ์์๋ณด์ PK๋ฅผ ๋ํ๋ด๊ธฐ ์ํด @Id ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ฉฐ, ์์ฑ ์ ๋ต์ ์ ์ํ๊ธฐ ์ํด @GeneratedValue ๋ฅผ ์ฌ์ฉํ๋ค. ํด๋น ์ด๋ ธํ ์ด์ ์ ๋ํด์ ์์๋ณด๋๋ก ํ์. @Id package javax
rutgo-letsgo.tistory.com
'๐ท Spring > ๊ฐ๋ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] StringUtils.hasText()๋ก ๋ฌธ์์ด ์ ํจ์ฑ ๊ฒ์ฆํ๊ธฐ. (0) | 2025.09.16 |
---|---|
[Spring][JPA] @Entity๋ ๋ฌด์์ผ๊น? (0) | 2025.09.09 |
[SpringSecurity] @EnableWebSecurity, SecurityFilterChain ๊ฐ๋ ๊ณผ ์์ (2) | 2025.08.28 |
[Spring] @RequestMapping์ด๋? (0) | 2025.08.20 |
[Spring] CORS์ SOP์ ์๋ฏธ, @CrossOrigin์ WebMvcConfigurer ์ฝ๋ ์์ (2) | 2025.08.19 |