๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐฑ์—”๋“œ/๋‚ด์ผ๋ฐฐ์›€์บ ํ”„_Java๋‹จ๊ธฐ์‹ฌํ™”8๊ธฐ

[TIL] Spring ์ˆ™๋ จ์ฃผ์ฐจ 2์ฃผ์ฐจ(Entity ์—ฐ๊ด€ ๊ด€๊ณ„, ์ง€์—ฐ๋กœ๋”ฉ/์ฆ‰์‹œ๋กœ๋”ฉ, ์˜์†์„ฑ ์ „์ด, My Select Shop ํ”„๋กœ์ ํŠธ-๊ฒ€์ƒ‰, ๋“ฑ๋ก, ์ˆ˜์ •, ์กฐํšŒ API)

by alswlfl 2026. 6. 30.

์˜ค๋Š˜ ํ•œ ์ผ

10:00 ~ 11:00 ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฝ”๋“œ์นดํƒ€ 2๋ฌธ์ œ
11:00 ~ 13:00 Spring ์ˆ™๋ จ์ฃผ์ฐจ(Entity ์—ฐ๊ด€๊ด€๊ณ„) ๊ฐ•์˜ ๋“ฃ๊ธฐ
14:00 ~ 15:40 Spring ์ˆ™๋ จ์ฃผ์ฐจ(์ง€์—ฐ๋กœ๋”ฉ/์ฆ‰์‹œ๋กœ๋”ฉ, ์˜์†์„ฑ์ „์ด, ๊ณ ์•„ ์—”ํ‹ฐํ‹ฐ, My Select Shop ํ”„๋กœ์ ํŠธ) ๊ฐ•์˜ ๋“ฃ๊ธฐ

 


๋ฐฐ์šด์ 

1. Entity ์—ฐ๊ด€๊ด€๊ณ„

  • DB์—์„œ๋Š” ํ…Œ์ด๋ธ” ์‚ฌ์ด์˜ ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ FK(์™ธ๋ž˜ ํ‚ค)๋กœ ๋งบ์„ ์ˆ˜ ์žˆ๊ณ , ๋ฐฉํ–ฅ ์ƒ๊ด€์—†์ด ์กฐํšŒ ๊ฐ€๋Šฅ(๋ฐฉํ–ฅ ๊ฐœ๋… X)
  • Entity์—์„œ๋Š” ์ƒ๋Œ€ Entity๋ฅผ ์ฐธ์กฐํ•ด Entity ์‚ฌ์ด์˜ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งบ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐฉํ–ฅ ๊ฐœ๋… ์กด์žฌํ•จ
  • 1๋Œ€ 1 ๊ด€๊ณ„ → @OneToOne ์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉ
    • ๋‹จ๋ฐฉํ–ฅ
      1) Entity์—์„œ ์™ธ๋ž˜ ํ‚ค์˜ ์ฃผ์ธ์€ ์ผ๋ฐ˜์ ์œผ๋กœ N(๋‹ค)์˜ ๊ด€๊ณ„์ธ Entity์ด์ง€๋งŒ, 1๋Œ€ 1 ๊ด€๊ณ„์—์„œ๋Š” ์™ธ๋ž˜ ํ‚ค์˜ ์ฃผ์ธ์„ ์ง์ ‘ ์ง€์ •ํ•ด์•ผํ•จ2) @JoinColumn()์€ ์™ธ๋ž˜ ํ‚ค์˜ ์ฃผ์ธ์ด ํ™œ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ, ์™ธ๋ž˜ ํ‚ค ์ฃผ์ธ๋งŒ์ด ์™ธ๋ž˜ ํ‚ค๋ฅผ ๋“ฑ๋ก, ์ˆ˜์ •, ์‚ญ์ œ ๊ฐ€๋Šฅํ•จ
    • ์–‘๋ฐฉํ–ฅ
      1) ์™ธ๋ž˜ ํ‚ค์˜ ์ฃผ์ธ์„ ์ง€์ •ํ•ด์ค„ ๋•Œ mappedBy ์˜ต์…˜ ์‚ฌ์šฉmappedBy ์†์„ฑ ๊ฐ’์€ ์™ธ๋ž˜ ํ‚ค์˜ ์ฃผ์ธ์ธ ์ƒ๋Œ€ Entity์˜ ํ•„๋“œ๋ช…
      2) ์™ธ๋ž˜ ํ‚ค ์ฃผ์ธ์€ ์ƒ๋Œ€ Entity ํƒ€์ž…์˜ ํ•„๋“œ ๊ฐ€์ง€๋ฉด์„œ @JoinColumn()์„ ํ™œ์šฉํ•ด ์™ธ๋ž˜ ํ‚ค์˜ ์†์„ฑ ์„ค์ •
      3) ์ƒ๋Œ€ Entity๋Š” ์™ธ๋ž˜ ํ‚ค์˜ ์ฃผ์ธ Entity ํƒ€์ž…์˜ ํ•„๋“œ๋ฅผ ๊ฐ€์ง€๋ฉด์„œ mappedBy ์˜ต์…˜ ์‚ฌ์šฉํ•ด ์†์„ฑ ๊ฐ’์œผ๋กœ ์™ธ๋ž˜ ํ‚ค์˜ ์ฃผ์ธ Entity์— ์„ ์–ธ๋œ ํ•„๋“œ๋ช… ๋„ฃ์–ด์ฃผ๋ฉด ๋จ
  • N๋Œ€ 1 ๊ด€๊ณ„ → @ManyToOne ์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉ
    • ๋‹จ๋ฐฉํ–ฅ
    • ์–‘๋ฐฉํ–ฅ
      1) ์–‘๋ฐฉํ–ฅ ์ฐธ์กฐ๋ฅผ ์œ„ํ•ด 1์— ํ•ด๋‹นํ•˜๋Š” Entity์—์„œ Java ์ปฌ๋ ‰์…˜ ์‚ฌ์šฉํ•ด์„œ ์ฐธ์กฐ
  • 1๋Œ€ N ๊ด€๊ณ„ → @OneToMany ์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉ
    • ๋‹จ๋ฐฉํ–ฅ
      1) 1 : N์—์„œ N ๊ด€๊ณ„์˜ ํ…Œ์ด๋ธ”์ด ์™ธ๋ž˜ ํ‚ค๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ž˜ ํ‚ค๋Š” N ๊ด€๊ณ„์ธ ํ…Œ์ด๋ธ”์— ์ปฌ๋Ÿผ ๋งŒ๋“ค์–ด ์ถ”๊ฐ€ํ•˜์ง€๋งŒ, ์™ธ๋ž˜ ํ‚ค์˜ ์ฃผ์ธ์ธ ์—”ํ‹ฐํ‹ฐ๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌํ•จ
      2) ์ถ”๊ฐ€์ ์ธ UPDATE ๋ฐœ์ƒํ•˜๋Š” ๋‹จ์  ์กด์žฌ
    • ์–‘๋ฐฉํ–ฅ
      1) 1๋Œ€ N๊ด€๊ณ„์—์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„ ์กด์žฌ X
      2) @ManyToOne ์–ด๋…ธํ…Œ์ด์…˜์€ mappedBy ์†์„ฑ ์ œ๊ณต X
  • N๋Œ€ M ๊ด€๊ณ„ → @ManyToMany ์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉ
    - N : M ๊ด€๊ณ„๋ฅผ ์œ„ํ•ด ์ค‘๊ฐ„ ํ…Œ์ด๋ธ” ์ƒ์„ฑํ•ด ์‚ฌ์šฉํ•จ
    • ๋‹จ๋ฐฉํ–ฅ
      1) ์ƒ์„ฑ๋˜๋Š” ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”์€ PK๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•„ ์ปจํŠธ๋กคํ•˜๊ธฐ ์–ด๋ ค์›€
    • ์–‘๋ฐฉํ–ฅ
      1) ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์ธ Entity์— @ManyToMany๋กœ ์™ธ๋ž˜ ํ‚ค ์ฃผ์ธ์ธ Entity์™€ ์—ฐ๊ฒฐํ•˜๊ณ  mappedBy ์˜ต์…˜ ์„ค์ •ํ•ด ์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„ ๋งบ์Œ
    • ์ค‘๊ฐ„ ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ
      1) ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”์„ ์ปจํŠธ๋กคํ•˜๊ธฐ ํž˜๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์ง์ ‘ ์ค‘๊ฐ„ ํ…Œ์ด๋ธ” ์ƒ์„ฑํ•ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ

2026.06.30 - [๋ฐฑ์—”๋“œ/spring&springboot] - [๋‚ด์ผ๋ฐฐ์›€์บ ํ”„_Spring Boot ์ˆ™๋ จ์ฃผ์ฐจ] JPA ํ•œ ๊ฑธ์Œ ๋” ๋‚˜์•„๊ฐ€๊ธฐ(Entity ์—ฐ๊ด€๊ด€๊ณ„, 1๋Œ€ 1, N๋Œ€ 1, 1๋Œ€ N, N๋Œ€ M)

 

[๋‚ด์ผ๋ฐฐ์›€์บ ํ”„_Spring Boot ์ˆ™๋ จ์ฃผ์ฐจ] JPA ํ•œ ๊ฑธ์Œ ๋” ๋‚˜์•„๊ฐ€๊ธฐ(Entity ์—ฐ๊ด€๊ด€๊ณ„, 1๋Œ€ 1, N๋Œ€ 1, 1๋Œ€ N, N๋Œ€

Entity ์—ฐ๊ด€ ๊ด€๊ณ„์ฃผ๋ฌธ APP DB table ์„ค๊ณ„๊ณ ๊ฐ(users) ํ…Œ์ด๋ธ”idname1Robbie2Robbertcreate table users( id bigint not null auto_increment, name varchar(255), primary key (id)); ์Œ์‹(food) ํ…Œ์ด๋ธ”idnameprice1ํ›„๋ผ์ด๋“œ ์น˜ํ‚จ150002์–‘๋… ์น˜ํ‚จ2

basicconcept.tistory.com

 

2. ์ง€์—ฐ ๋กœ๋”ฉ๊ณผ ์ฆ‰์‹œ ๋กœ๋”ฉ, ์˜์†์„ฑ ์ „์ด, ๊ณ ์•„ Entity

  • JPA์—์„œ๋Š” ์—ฐ๊ด€ ๊ด€๊ณ„๊ฐ€ ์„ค์ •๋œ Entity์˜ ์ •๋ณด๋ฅผ ๋ฐ”๋กœ ๊ฐ€์ ธ์˜ฌ์ง€ ํ˜น์€ ํ•„์š”ํ•  ๋•Œ ๊ฐ€์ ธ์˜ฌ์ง€ ์ •ํ•  ์ˆ˜ ์žˆ์ŒFetchType
    • ์ง€์—ฐ ๋กœ๋”ฉ(LAZY): ํ•„์š”ํ•œ ์‹œ์ ์— ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ด
      - @?ToMany ํ˜•ํƒœ์ธ ๊ฒฝ์šฐ default๊ฐ€ LAZY์ž„
      - ์ง€์—ฐ ๋กœ๋”ฉ๋œ Entity ์ •๋ณด๋ฅผ ์กฐํšŒ(Select)ํ•  ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•จ! ์ฆ‰, ํŠธ๋žœ์žญ์…˜์ด ์ ์šฉ๋˜์–ด ์žˆ์–ด์•ผ ํ•จ!
    • ์ฆ‰์‹œ ๋กœ๋”ฉ(EAGER): ์ฆ‰์‹œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ด
      - @?ToOne ํ˜•ํƒœ์ธ ๊ฒฝ์šฐ default๊ฐ€ EAGER์ž„
  • ์˜์†์„ฑ ์ „์ด(Cascade Persist)๋Š” ์˜์† ์ƒํƒœ์˜ Entity์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ์ž‘์—…๋“ค์ด ์—ฐ๊ด€๋œ Entity ๊นŒ์ง€ ์ „ํŒŒ๋˜๋Š” ์ƒํ™ฉ
    • Casecade persist option ์„ค์ • → ex) @OneToMany(mappedBy = "", cascade = CascadeType.PERSIST)
    • ์‚ญ์ œ: CascadeType.REMOVE
  • ๊ณ ์•„ Entity(onphanRemoval): ์—ฐ๊ด€ ๊ด€๊ณ„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์šธ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•
  • orphanRemoval ์˜ต์…˜๊ณผ Cascade.DELETE ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ, ์‚ญ์ œํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ทธ ์—ฐ๊ด€๋œ Entity๋ฅผ ๋‹ค๋ฅธ ๊ณณ์—์„œ๋„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•„๋‹Œ์ง€๋ฅผ ๊ผญ ํ™•์ธํ•ด์•ผ ํ•จ!

2026.06.30 - [๋ฐฑ์—”๋“œ/spring&springboot] - [๋‚ด์ผ๋ฐฐ์›€์บ ํ”„_Spring Boot ์ˆ™๋ จ์ฃผ์ฐจ] JPA ํ•œ ๊ฑธ์Œ ๋” ๋‚˜์•„๊ฐ€๊ธฐ(์ง€์—ฐ ๋กœ๋”ฉ๊ณผ ์ฆ‰์‹œ ๋กœ๋”ฉ, ์˜์†์„ฑ ์ „์ด, ๊ณ ์•„ Entity)

 

[๋‚ด์ผ๋ฐฐ์›€์บ ํ”„_Spring Boot ์ˆ™๋ จ์ฃผ์ฐจ] JPA ํ•œ ๊ฑธ์Œ ๋” ๋‚˜์•„๊ฐ€๊ธฐ(์ง€์—ฐ ๋กœ๋”ฉ๊ณผ ์ฆ‰์‹œ ๋กœ๋”ฉ, ์˜์†์„ฑ ์ „์ด,

์ง€์—ฐ ๋กœ๋”ฉ(LAZY)๊ณผ ์ฆ‰์‹œ ๋กœ๋”ฉ(EAGER)์Œ์‹ ํ…Œ์ด๋ธ”๊ณผ ๊ณ ๊ฐ ํ…Œ์ด๋ธ”์ด N:1 ๊ด€๊ณ„๋กœ ์„ค์ •ํ•˜๊ณ  ์‹œ์ž‘@Entity@Getter@Setter@Table(name = "food")public class Food { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; priva

basicconcept.tistory.com

 

3. My Select Shop ํ”„๋กœ์ ํŠธ

  • ๋„ค์ด๋ฒ„ Open API ํ™œ์šฉํ•ด ์ƒํ’ˆ ๊ฒ€์ƒ‰ API ๊ตฌํ˜„
  • ๊ด€์‹ฌ ์ƒํ’ˆ ๋“ฑ๋ก API ๊ตฌํ˜„
  • ๊ด€์‹ฌ ์ƒํ’ˆ ํฌ๋ง ์ตœ์ €๊ฐ€ ์ˆ˜์ • API ๊ตฌํ˜„
  • ๊ด€์‹ฌ ์ƒํ’ˆ ์กฐํšŒ API ๊ตฌํ˜„

2026.06.30 - [๋ฐฑ์—”๋“œ/spring&springboot] - [๋‚ด์ผ๋ฐฐ์›€์บ ํ”„_Spring Boot ์ˆ™๋ จ์ฃผ์ฐจ] My Select Shop(์ƒํ’ˆ ๊ฒ€์ƒ‰, ๊ด€์‹ฌ ์ƒํ’ˆ ๋“ฑ๋ก, ๊ด€์‹ฌ ์ƒํ’ˆ ํฌ๋ง ์ตœ์ €๊ฐ€ ์ˆ˜์ •, ๊ด€์‹ฌ ์ƒํ’ˆ ์กฐํšŒ API ๊ตฌํ˜„)

 

[๋‚ด์ผ๋ฐฐ์›€์บ ํ”„_Spring Boot ์ˆ™๋ จ์ฃผ์ฐจ] My Select Shop(์ƒํ’ˆ ๊ฒ€์ƒ‰, ๊ด€์‹ฌ ์ƒํ’ˆ ๋“ฑ๋ก, ๊ด€์‹ฌ ์ƒํ’ˆ ํฌ๋ง ์ตœ์ €๊ฐ€

์„ค๊ณ„ ๋ฐ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ/์„ค์ •์š”๊ตฌ์‚ฌํ•ญ ํŒŒ์•…1. ํ‚ค์›Œ๋“œ๋กœ ์ƒํ’ˆ์˜ ์ •๋ณด ๊ฒ€์ƒ‰๋„ค์ด๋ฒ„ ์‡ผํ•‘ API ์ด์šฉ์ƒํ’ˆ ์ด๋ฆ„(title), ๋งํฌ URL(link), ์ด๋ฏธ์ง€ URL(image), ์ตœ์ €๊ฐ€(price)2. ๊ด€์‹ฌ ์ƒํ’ˆ ๋“ฑ๋กํ•˜๊ธฐDB์— ์ƒํ’ˆ์ •๋ณด ์ž…๋ ฅ(I

basicconcept.tistory.com


๋‚ด์ผ ํ•  ์ผ

  • [JAVA๋‹จ๊ธฐ์‹ฌํ™”] MSA(Microservice Architecture) ๊ฐ•์˜ ๋“ฃ๊ณ  ์š”์•ฝ ์ •๋ฆฌ