[์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 1. JPA ๊ตฌ๋™ ๋ฐฉ์‹

2023. 2. 24. 15:02ยทSpring/Spring JPA ๊ธฐ๋ณธ

 

JPA ๊ตฌ๋™ ๋ฐฉ์‹

 

EntityManagerFactory

 

์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋Š” ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•˜๋ฉด ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์Šค๋ ˆ๋“œ ๊ฐ„์— ์ ˆ๋Œ€ ๊ณต์œ ํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.

 

 

๋™์‹œ์„ฑ(Concurrency): ์œ ์ €๊ฐ€ ์ฒด๊ฐํ•˜๊ธฐ์—๋Š” ๋™์‹œ์— ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฑฐ ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ

 

์‚ฌ์‹ค์€ ์œ ์ €๊ฐ€ ์ฒด๊ฐํ•  ์ˆ˜ ์—†๋Š” ์งง์€ ์‹œ๊ฐ„๋‹จ์œ„๋กœ ์ž‘์—…๋“ค์„ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉด์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.


๋‚ด๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์žˆ๋Š”๋ฐ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ์ˆ˜์ •ํ•ด๋ฒ„๋ฆฌ๋ฉด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์—


์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋Š” ํ•˜๋‚˜๋ฅผ ๊ณต์œ ํ•˜๋ฉด ์•ˆ ๋˜๊ณ , ์ƒํ™ฉ์— ๋”ฐ๋ผ ๊ณ„์† ๋งŒ๋“ค์–ด์ค˜์•ผํ•œ๋‹ค.


์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ € ํŒฉํ† ๋ฆฌ์ด๋‹ค.

 

 

EntityManager

 

Entity๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํด๋ž˜์Šค์ด๋‹ค.


์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ € ๋‚ด๋ถ€์— ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ(Persistence Context)๋ผ๋Š” ๊ฑธ ๋‘์–ด์„œ ์—”ํ‹ฐํ‹ฐ๋“ค์„ ๊ด€๋ฆฌํ•œ๋‹ค.

 

@PersistenceContext
private EntityManager em;

@PersistenceContext : EntityManager๋ฅผ ๋นˆ์œผ๋กœ ์ฃผ์ž…ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜

 

 

@PersistenceContext๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

๋”๋ณด๊ธฐ
๋‹ซ๊ธฐ

 

 

EntityManager๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€ 

 

์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•˜๋ฉด ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ

 

์“ฐ๋ ˆ๋“œ ๊ฐ„์—๋Š” EntityManager๋ฅผ ๊ณต์œ ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

 

 

์ผ๋ฐ˜์ ์œผ๋กœ ์Šคํ”„๋ง์€ ์‹ฑ๊ธ€ํ†ค ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ์— ๋นˆ์€ ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ @PersistenceContext์œผ๋กœ EntityManager๋ฅผ ์ฃผ์ž…๋ฐ›์•„๋„ ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

 

 ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š”

 

 ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๋ฉด์„œ @PersistenceContext์œผ๋กœ ์ฃผ์ž…๋ฐ›์€ EntityManager๋ฅผ Proxy๋กœ ๊ฐ์Œ‰๋‹ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  EntityManager ํ˜ธ์ถœ ์‹œ ๋งˆ๋‹ค Proxy๋ฅผ ํ†ตํ•ด EntityManager๋ฅผ ์ƒ์„ฑํ•˜์—ฌ Thread-Safe๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

 

 Entity(์—”ํ‹ฐํ‹ฐ)

 

 

JPA์—์„œ ์—”ํ‹ฐํ‹ฐ๋ž€ ์‰ฝ๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด, DB ํ…Œ์ด๋ธ”์— ๋Œ€์‘ํ•˜๋Š” ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

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

 

JPA๋ฅผ ์‚ฌ์šฉํ•ด์„œ DB ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘ํ•  ํด๋ž˜์Šค๋Š” @Entity๋ฅผ ๊ผญ ๋ถ™์—ฌ์•ผ๋งŒ ๋งคํ•‘์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋Š” ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘๋˜๋Š” ํด๋ž˜์Šค์ด๋‹ค. 

 

์• ๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ ์ ˆํžˆ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ , ์™„์„ฑ๋œ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋Š” ๋ช…์„ธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘๋œ๋‹ค.

 

 

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” 2์ฐจ์› ํ…Œ์ด๋ธ”

 

์ด ํ…Œ์ด๋ธ”์— ์„œ๋น„์Šค์—์„œ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋‹ค ์ €์žฅํ•˜๊ณ  ํ™œ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์„ธ๋กœ์˜ ์—ด ๋ถ€๋ถ„์ด Column ์ด๊ณ , ๊ฐ€๋กœ์˜ ํ–‰ ๋ถ€๋ถ„์ด ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๊ฐ€ ๋œ๋‹ค.

 

์ด ํ…Œ์ด๋ธ” ์ „์ฒด๊ฐ€ ์—”ํ‹ฐํ‹ฐ ์ด๊ณ , ๊ฐ 1๊ฐœ์˜ ํ–‰๋“ค์ด ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

 

 

 

@Entity
public class Member {

    @Id @GeneratedValue
    private Long id;
    private String username;
}

 

@Entity : ํด๋ž˜์Šค ์œ„์— ์„ ์–ธํ•˜์—ฌ ์ด ํด๋ž˜์Šค๊ฐ€ ์—”ํ‹ฐํ‹ฐ์ž„์„ ์•Œ๋ ค์ค€๋‹ค.

 

์ด๋ ‡๊ฒŒ ๋˜๋ฉด JPA์—์„œ ์ •์˜๋œ ํ•„๋“œ๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์–ด์ค€๋‹ค.

 

ํ•„๋“œ๋ผ๋Š” ๊ฒƒ์€ ์—”ํ‹ฐํ‹ฐ์˜ ๊ฐ Column์„ ์˜๋ฏธํ•œ๋‹ค.

 

 

@Id : ํ•ด๋‹น ์—”ํ‹ฐํ‹ฐ์˜ ์ฃผ์š” ํ‚ค(Primary Key, PK)๊ฐ€ ๋  ๊ฐ’์„ ์ง€์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด @Id ์ด๋‹ค.

 

@GeneratedValue ๋Š” ์ด PK๊ฐ€ ์ž๋™์œผ๋กœ 1์”ฉ ์ฆ๊ฐ€ํ•˜๋Š” ํ˜•ํƒœ๋กœ ์ƒ์„ฑ๋ ์ง€ ๋“ฑ์„ ๊ฒฐ์ •ํ•ด์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค.

 

 

 

 

JPA์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์€ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ์‹คํ–‰ 

 

ํŠธ๋žœ์žญ์…˜์ด๋ž€ ? 

 

๋ชจ๋“  ์ž‘์—…๋“ค์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์–ด์•ผ ์ž‘์—… ๋ฌถ์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ ์šฉํ•˜๊ณ ,

 

์–ด๋–ค ์ž‘์—…์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ๋Š” ์ด์ „์— ์žˆ๋˜ ๋ชจ๋“  ์ž‘์—…๋“ค์ด ์„ฑ๊ณต์ ์ด์—ˆ๋”๋ผ๋„

 

์—†์—ˆ๋˜ ์ผ์ฒ˜๋Ÿผ ์™„์ „ํžˆ ๋˜๋Œ๋ฆฌ๋Š” ๊ฒƒ์ด ํŠธ๋žœ์žญ์…˜์˜ ๊ฐœ๋…

 

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ํŠธ๋žœ์žญ์…˜์„ ์ ์šฉํ•˜๋ฉด

 

๋ฐ์ดํ„ฐ ์ถ”๊ฐ€, ๊ฐฑ์‹ , ์‚ญ์ œ ๋“ฑ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋˜ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ

 

 ๋ชจ๋“  ์ž‘์—…๋“ค์„ ์›์ƒํƒœ๋กœ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

 

๋ชจ๋“  ์ž‘์—…๋“ค์ด ์„ฑ๊ณตํ•ด์•ผ๋งŒ ์ตœ์ข…์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜ํ•˜๋„๋ก ํ•œ๋‹ค.

 

 

 

JPQL

SQL์„ ์ถ”์ƒํ™”ํ•œ JPQL

 

 SQL ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์„ ๋Œ€์ƒ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์งˆ์˜ํ•œ๋‹ค . 

 

 

๋ฐ˜๋ฉด์— JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ธฐ ๋•Œ๋ฌธ์— 

 

 JPQL ์€ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์งˆ์˜ํ•œ๋‹ค . 

 

 

 

 

https://endyd1567.tistory.com/282
 

[์‹ค์ „! ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ JPA ํ™œ์šฉ1] - 0. Entity / EntityManager

Entity(์—”ํ‹ฐํ‹ฐ) JPA์—์„œ ์—”ํ‹ฐํ‹ฐ๋ž€ ์‰ฝ๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด, DB ํ…Œ์ด๋ธ”์— ๋Œ€์‘ํ•˜๋Š” ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @Entity๊ฐ€ ๋ถ™์€ ํด๋ž˜์Šค๋Š” JPA๊ฐ€ ๊ด€๋ฆฌํ•ด์ฃผ๋ฉฐ, JPA๋ฅผ ์‚ฌ์šฉํ•ด์„œ DB ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘ํ•  ํด๋ž˜์Šค

endyd1567.tistory.com

 

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

 

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

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

www.inflearn.com

 

์ €์ž‘์žํ‘œ์‹œ

'Spring > Spring JPA ๊ธฐ๋ณธ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 5. ๋‹ค๋Œ€์ผ[N:1] / ์ผ๋Œ€๋‹ค[1:N] / ์ผ๋Œ€์ผ[1:1] / ๋‹ค๋Œ€๋‹ค[N:M]  (0) 2023.02.27
[์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 4. ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘  (0) 2023.02.26
[์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 3. ์—”ํ‹ฐํ‹ฐ ๋งคํ•‘  (0) 2023.02.25
[์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 2. PersistenceContext (์˜์†์„ฑ ์ปจํ…์ŠคํŠธ)  (0) 2023.02.24
[์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 0. SQL ์ค‘์‹ฌ์ ์ธ ๊ฐœ๋ฐœ ๋ฌธ์ œ์  / ORM ์ด๋ž€ ?  (0) 2023.02.23
'Spring/Spring JPA ๊ธฐ๋ณธ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 4. ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘
  • [์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 3. ์—”ํ‹ฐํ‹ฐ ๋งคํ•‘
  • [์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 2. PersistenceContext (์˜์†์„ฑ ์ปจํ…์ŠคํŠธ)
  • [์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 0. SQL ์ค‘์‹ฌ์ ์ธ ๊ฐœ๋ฐœ ๋ฌธ์ œ์  / ORM ์ด๋ž€ ?
hello_u
hello_u
  • hello_u
    ๐Ÿ˜œ
    hello_u
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๐Ÿ˜œ (345)
      • Hardware (2)
        • BMC (2)
      • Spring (109)
        • Spring ์ž…๋ฌธ (20)
        • Spring ๊ธฐ๋ณธ (27)
        • Spring MVC (18)
        • Spring DB (22)
        • Spring JPA ๊ธฐ๋ณธ (16)
        • Spring JPA ํ™œ์šฉ (6)
      • Develop (27)
        • DB (8)
        • JAVA (4)
        • Web (2)
        • Python (7)
        • OSS (2)
        • Git (2)
        • API (2)
      • Algorithm (155)
        • CodeUp ๊ธฐ์ดˆ (44)
        • ํŒŒ์ด์ฌ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ (64)
        • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค (4)
        • SWEA (30)
        • Softeer (10)
        • BOJ (2)
      • CS (9)
        • ์ปดํ“จํ„ฐ์ผ๋ฐ˜ (3)
        • ์šด์˜์ฒด์ œ (3)
        • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (0)
        • ์ •๋ณดํ†ต์‹  (1)
        • ์ž๋ฃŒ๊ตฌ์กฐ (1)
        • ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ (1)
        • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด (0)
        • ์ตœ์‹  ๋””์ง€ํ„ธ, ์ผ๋ฐ˜์ƒ์‹ (0)
      • ์ž๊ฒฉ์ฆ (41)
        • ์ •๋ณด๋ณด์•ˆ๊ธฐ์‚ฌ (9)
        • ์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌ (22)
        • ๋ฆฌ๋ˆ…์Šค๋งˆ์Šคํ„ฐ 1๊ธ‰ (3)
        • SQLD (7)
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
hello_u
[์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 1. JPA ๊ตฌ๋™ ๋ฐฉ์‹
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”