๐ŸŒ WEB/JPA

0. ์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ

์• ์ •์“ฐ 2021. 5. 11. 14:06

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

 

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

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

www.inflearn.com

์ธํ”„๋Ÿฐ์— ์žˆ๋Š” ๊ฐ•์˜๋ฅผ ๋ณด๋ฉฐ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค!

 

๋ชฉํ‘œ : ๊ฐ์ฒด์™€ ํ…Œ์ด๋ธ” ์„ค๊ณ„ ๋งคํ•‘ 

- ๊ฐ์ฒด์™€ ํ…Œ์ด๋ธ”์„ ์ œ๋Œ€๋กœ ์„ค๊ณ„ํ•˜๊ณ  ๋งคํ•‘ํ•˜๋Š” ๋ฐฉ๋ฒ•

- ๊ธฐ๋ณธ ํ‚ค์™€ ์™ธ๋ž˜ ํ‚ค ๋งคํ•‘

- 1:N, N:1, 1:1, N:M ๋งคํ•‘

- ์‹ค๋ฌด ๋…ธํ•˜์šฐ + ์„ฑ๋Šฅ ๊ณ ๋ ค

- JPA ๋‚ด๋ถ€ ๋™์ž‘ ๋ฐฉ์‹ ์ดํ•ดํ•˜๊ธฐ

- JPA๊ฐ€ ์–ธ์ œ, ์–ด๋–ค SQL์„ ๋งŒ๋“ค์–ด ์‹คํ–‰ํ•˜๋Š”์ง€ ์ดํ•ด

 

 

JPA๋ฅผ ๋ฐฐ์šฐ๊ธฐ ์•ž์„œ ์–ด๋–ค ๋ฌธ์ œ์ ์ด ์žˆ์—ˆ๊ณ  ์–ด๋–ค๊ฒŒ, ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ ํ•ด ๋ณผ๊ฒƒ์ด๋‹ค.

SQL ์ค‘์‹ฌ์ ์ธ ๊ฐœ๋ฐœ์˜ ๋ฌธ์ œ์ 

 

ํ˜„์žฌ

- ๋Œ€๋ถ€๋ถ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

- ๊ด€๊ณ„ํ˜• DB ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (NoSQL ๋ณด๋‹ค๋Š” ์•„์ง๊นŒ์ง€๋Š” ๊ด€๊ณ„ํ˜•)

 

๊ฒฐ๋ก ์ ์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๊ด€๊ณ„ํ˜• DB์— ๊ด€๋ฆฌํ•ด์•ผํ•œ๋‹ค. 

๊ทธ๋Ÿฌ๋ฏ€๋กœ SQL ๋ฐ–์— ๋ชจ๋ฅด๋Š” ๊ด€๊ณ„ํ˜• DB๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด SQL๋ฅผ ๊ณ„์†ํ•ด์„œ ์จ์ค˜์•ผํ•˜ ํ•œ๋‹ค -> ์ง€๋ฃจํ•˜๊ณ  ๋ฌดํ•œ ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค

 

ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ๋ถˆ์ผ์น˜

๊ฐ์ฒด vs ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

 

* ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค 

- ๊ฐ์ฒด -> SQL ๋ณ€ํ™˜ -> SQL -> RDB

   SQL ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ๊ฐ์˜ SQL๋ฌธ์„ ์ž‘์„ฑํ•˜๋Š” ๋…ธ๊ฐ€๋‹ค๋ฅผ ํ•œ๋‹ค.

- ์ง„์ •ํ•œ ์˜๋ฏธ์˜ ๊ณ„์ธต ๋ถ„ํ• ์ด ์–ด๋ ต๋‹ค. 

- Entity๋ฅผ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋‹ค. 

   ํ•ด๋‹น ์ฟผ๋ฆฌ๊ฐ€ ์–ด๋–ค๊ฑธ ์กฐํšŒํ•ด์„œ ๊ฐ€์ง€๊ณ  ์˜ค๋Š”์ง€ ๋ˆˆ์œผ๋กœ ํ™•์ธํ•˜์ง€ ์•Š๋Š” ์ด์ƒ ์ •ํ™•ํ•˜๊ฒŒ ์•Œ๊ธฐ ์–ด๋ ค์›€

- ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ๋กœ๋”ฉํ•  ์ˆ˜ ์—†๋‹ค

   ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•  ๋•Œ ์กฐ๊ฑด์„ ์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด ํ•ด๋‹น SQL๋ฅผ ๋˜ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

 

* ๊ฐ์ฒด

์ž๋ฐ” ์ปฌ๋ ‰์…˜์—์„œ ์กฐํšŒ๋ฅผ ํ•œ๋‹ค๋ฉด?

๊ฐ™์€ ์ฃผ์†Œ๊ฐ’์„ ๋ฐ”๋ผ๋ณด๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ๋ฐ˜ํ™˜ ๊ฐ’์„ ๊ฐ–๊ณ  ์žˆ์–ด Entity๋ฅผ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ฐ์ฒด๋‹ต๊ฒŒ ๋ชจ๋ธ๋ง ํ• ์ˆ˜๋ก ๋งคํ•‘ ์ž‘์—…๋งŒ ๋Š˜์–ด๋‚˜๊ฒŒ ๋œ๋‹ค.  -> ๊ทธ๋ž˜์„œ SQL ์ค‘์‹ฌ์ ์ธ ๊ฐœ๋ฐœ์„ํ•  ์ˆ˜ ๋ฐ–์— ์—†์—ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ์ƒ๊ฒจ๋‚œ๊ฒŒ JAVA ์ง„์˜์˜ ORM ๊ธฐ์ˆ  ํ‘œ์ค€ JPA ์ด๋‹ค.

 

ORM์€ ๋ญ˜๊นŒ?

ORM์€ Object Relational Mapping ์ฆ‰, ๊ฐ์ฒด-๊ด€๊ณ„ ๋งคํ•‘์˜ ์ค„์ž„๋ง์ด๋‹ค. ๊ฐ์ฒด-๊ด€๊ณ„ ๋งคํ•‘์„ ํ’€์–ด์„œ ์„ค๋ช…ํ•˜์ž๋ฉด ์šฐ๋ฆฌ๊ฐ€ OOP(Object Oriented Programming)์—์„œ ์“ฐ์ด๋Š” ๊ฐ์ฒด๋ผ๋Š” ๊ฐœ๋…์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์™€ RDB(Relational DataBase)์—์„œ ์“ฐ์ด๋Š” ๋ฐ์ดํ„ฐ์ธ ํ…Œ์ด๋ธ” ์ž๋™์œผ๋กœ ๋งคํ•‘(์—ฐ๊ฒฐ)ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํด๋ž˜์Šค์™€ ํ…Œ์ด๋ธ”์€ ์„œ๋กœ๊ฐ€ ๊ธฐ์กด๋ถ€ํ„ฐ ํ˜ธํ™˜๊ฐ€๋Šฅ์„ฑ์„ ๋‘๊ณ  ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ์ผ์น˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ์ด๋ฅผ ORM์„ ํ†ตํ•ด ๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ SQL๋ฌธ์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ ๋ถˆ์ผ์น˜๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ORM์„ ์ด์šฉํ•˜๋ฉด ๋”ฐ๋กœ SQL๋ฌธ์„ ์งค ํ•„์š”์—†์ด ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

์ถœ์ฒ˜: https://geonlee.tistory.com/207 [๋น ๋ฆฌ์˜ ํƒ์‹œ ์šด์ „์‚ฌ]

 

ํ”„๋กœ์ ํŠธ ์„ธํŒ…, ์‹ค์Šต 

๋”๋ณด๊ธฐ

0. h2 ์„ค์น˜ - ๊ฐ€์ƒDB

h2database.com/html/main.html

 

H2 Database Engine

H2 Database Engine Welcome to H2, the Java SQL database. The main features of H2 are: Very fast, open source, JDBC API Embedded and server modes; in-memory databases Browser based Console application Small footprint: around 2 MB jar file size     Suppor

h2database.com

1. ์˜์กด์„ฑ ์„ค์ •

hibernate๋ฅผ ์˜์กด์„ฑ์— ์ถ”๊ฐ€ํ•ด์ค„๊ฑด๋ฐ. ๋ณดํ†ต JPA๋Š” Spring๊ณผ ์—ฐ๋™ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— 

docs.spring.io/spring-boot/docs/current/reference/html/appendix-dependency-versions.html#dependency-versions

 

Dependency versions

 

docs.spring.io

์—์„œ ์‚ฌ์šฉํ•  Spring ํ”„๋กœ์ ํŠธ ๋ฒ„์ „์— ๋งž์ถฐ hibernate๋ฅผ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•œ๋‹ค.

    implementation 'org.hibernate:hibernate-entitymanager:5.4.30.Final'
    implementation 'com.h2database:h2:1.4.200'

 

2. JPA ์„ค์ • - persistence.xml

- JPA ์„ค์ • ํŒŒ์ผ

- /META-INF/persistence.xml  ( ํ‘œ์ค€์œ„์น˜ )

- javax.persistence๋กœ ์‹œ์ž‘ : JPA ํ‘œ์ค€ ์†์„ฑ

- hibernate๋กœ ์‹œ์ž‘ : ํ•˜์ด๋ฒ„๋„ค์ดํŠธ ์ „์šฉ ์†์„ฑ

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
             xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
    <persistence-unit name="hello">
        <properties>
            <!-- ํ•„์ˆ˜ ์†์„ฑ -->
            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
            <property name="javax.persistence.jdbc.user" value="sa"/>
            <property name="javax.persistence.jdbc.password" value=""/>
            <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
            <!-- ์˜ต์…˜ -->
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.use_sql_comments" value="true"/>
            <!--<property name="hibernate.hbm2ddl.auto" value="create" />-->
        </properties>
    </persistence-unit>
</persistence>

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐฉ์–ธ  -> dialect  ์— ์„ค์ •

- JPA๋Š” ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ข…์† ํ•˜์ง€ ์•Š๋Š”๋‹ค. 

- ๊ฐ๊ฐ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” SQL ๋ฌธ๋ฒ•๊ณผ ํ•จ์ˆ˜๋Š” ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅด๋‹ค.

- SQL ํ‘œ์ค€์„ ์ง€ํ‚ค์ง€ ์•Š๋Š” ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋งŒ์˜ ๊ณ ์œ ํ•œ ๊ธฐ๋Šฅ(๋ฐฉ์–ธ)

 

JPA๋ฅผ ์™œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๊ฑธ๊นŒ?

1. ์ƒ์‚ฐ์„ฑ

JPA์— ์ฟผ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์–ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ๋Ÿฌ์™€์„œ ์“ฐ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

์˜ˆ) ์ €์žฅ : jpa.persist(member)

      ์กฐํšŒ : Member member = jpa.find(memberId) ๋“ฑ๋“ฑ ... 

2. ์œ ์ง€๋ณด์ˆ˜

๊ธฐ์กด์—๋Š” ํ•„๋“œ ๋ณ€๊ฒฝ์‹œ ๋ชจ๋“  SQL์„ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค. (์œผ์… ใ… )

JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•„๋“œ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค SQL์€ JPA๊ฐ€ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค!

3. ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ๋ถˆ์ผ์น˜ ํ•ด๊ฒฐ

- ์ƒ์†

JPA๊ฐ€ ์ €์žฅ์„ ํ•˜๊ฑฐ๋‚˜ ์กฐํšŒ๋ฅผ ํ• ๋•Œ ์•Œ์•„์„œ ์กฐ์ธ์„ ํ•˜๊ฑฐ๋‚˜ ์ฟผ๋ฆด๋ฅด ๋‚ ๋ฆฐ๋‹ค.

- ์—ฐ๊ด€๊ด€๊ณ„, ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰

์ž๋ฐ” ์ปฌ๋ ‰์…˜์— ๋„ฃ๋Š”๊ฒƒ ์ฒ˜๋Ÿผ get์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ -> ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰

์—ฐ๊ด€๊ด€๊ณ„(์—ฐ๊ด€๋˜์–ด์žˆ๋Š” ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ)๋ฅผ ์ €์žฅํ•˜๋Š”๊ฒƒ ๋˜ํ•œ set์œผ๋กœ ์ €์žฅ -> ์—ฐ๊ด€๊ด€๊ณ„ ์ €์žฅ

- ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์—”ํ‹ฐํ‹ฐ, ๊ณ„์ธต

์ง€์—ฐ๋กœ๋”ฉ์ด๋ผ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์–ด์„œ ์ž์œ ๋กœ์šด ๊ฐ์ฒด ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ง์ ‘ ๊ฐ€์ง€๊ณ  ์˜จ๊ฑฐ๊ธฐ ๋•Œ๋ฌธ์— ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 -> ๋™์ผํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์กฐํšŒํ•œ ์—”ํ‹ฐํ‹ฐ๋Š” ๊ฐ™์Œ์„ ๋ณด์žฅ

4. JPA์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋Šฅ

- 1์ฐจ ์บ์‹œ์™€ ๋™์ผ์„ฑ ๋ณด์žฅ

๊ฐ™์€ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ๋Š” ๊ฐ™์€ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. -> ๊ฐ™์€ ์กฐํšŒ๋ฅผ ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์˜จ๋‹ค. (๊ฒฐ๊ณผ์ ์œผ๋กœ SQL 1๋ฒˆ ์‹คํ–‰)

- ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜๋Š” ์“ฐ๊ธฐ ์ง€์—ฐ

๋ฒ„ํผ๋ง ๊ธฐ๋Šฅ์„ ๋งํ•œ๋‹ค. ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•  ๋•Œ๊นŒ์ง€ INSERT SQL์„ ๋ชจ์•„์ค€๋‹ค -> JDBC BATCH SQL ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด์„œ ํ•œ๋ฒˆ์— SQL ์ „์†ก

- ์ง€์—ฐ ๋กœ๋”ฉ / ์ฆ‰์‹œ ๋กœ๋”ฉ

์ง€์—ฐ ๋กœ๋”ฉ : ๊ฐ์ฒด๊ฐ€ ์‹ค์ œ ์‚ฌ์šฉ๋  ๋•Œ ๋กœ๋”ฉ

์ฆ‰์‹œ ๋กœ๋”ฉ: JOIN SQL๋กœ ํ•œ๋ฒˆ์— ์—ฐ๊ด€๋œ ๊ฐ์ฒด๊นŒ์ง€ ๋ฏธ๋ฆฌ ์กฐํšŒ

 

 

 

 

๊ทธ๋Ÿผ JPA ์•ˆ์—์„œ JDBC๋Š” ์–ด๋–ป๊ฒŒ ์ž‘๋™ ๋˜๋Š”๊ฑธ๊นŒ?

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด JPA์—๊ฒŒ ๋ช…๋ น์„ ๋‚ด๋ ค์„œ JDBC API๋ฅผ ์‚ฌ์šฉ ํ•œ๋‹ค.

JPA๊ฐ€ ์ค‘๊ฐ„์—์„œ ๊ฐ์ฒด์— ๋”ฐ๋ผ SQL๋ฌธ์„ ์ž๋™์œผ๋กœ ์ž‘์„ฑํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

JPA ๊ธฐ๋ณธ - ๊น€์˜ํ•œ / ์ธํ”„๋Ÿฐ

JPA๋Š” ์ด๋ ‡๊ฒŒ ์ƒ๊ฒจ๋‚ฌ์–ด์š”!

 EJB(์ž๋ฐ” ํ‘œ์ค€) -> ํ•˜์ด๋ฒ„๋„ค์ดํŠธ(์˜คํ”ˆ ์†Œ์Šค) -> JPA(์ž๋ฐ” ํ‘œ์ค€)

 

JPA๋Š” ์ด๋ ‡๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด์žˆ์–ด์š”!

 

๋ฐ˜์‘ํ˜•