์Šคํ”„๋ง ์ž…๋ฌธ - (17) JPA(Java Persistence API)

2023. 1. 28. 16:35ยทSpring/Spring ์ž…๋ฌธ

 

JPA๋Š” ์ž๋ฐ” ์ง„์˜์—์„œ ORM(Object-Relational Mapping) ๊ธฐ์ˆ  ํ‘œ์ค€์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ชจ์Œ์ด๋‹ค

์‹ค์ œ์ ์œผ๋กœ ๊ตฌํ˜„๋œ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ตฌํ˜„๋œ ํด๋ž˜์Šค์™€ ๋งคํ•‘์„ ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค.

JPA๋ฅผ ๊ตฌํ˜„ํ•œ ๋Œ€ํ‘œ์ ์ธ ์˜คํ”ˆ์†Œ์Šค๋กœ๋Š” Hibernate๊ฐ€ ์žˆ๋‹ค

( JPA๋Š” ์ธํ„ฐํŽ˜์ด์Šค /  ๊ตฌํ˜„ hibernate )

 

 

ORM(Object-Relational Mapping)
๋”๋ณด๊ธฐ

๊ฐ์ฒด-๊ด€๊ณ„ ๋งคํ•‘

๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์˜ ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ ์‚ฌ์ด์—์„œ ๋‚˜ํƒ€๋‚˜๋Š” ๋ฏธ๋ฌ˜ํ•œ ์ฐจ์ด์™€

์ด๋กœ ์ธํ•œ ๋ฌธ์ œ๋“ค์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ธฐ์ˆ ์ด๋‹ค.

 

์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜ ์ ์œผ๋กœ ์•Œ๊ณ  ์žˆ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ Class์™€ RDB(Relational DataBase)์˜ ํ…Œ์ด๋ธ”์„ ๋งคํ•‘(์—ฐ๊ฒฐ)ํ•œ๋‹ค๋Š” ๋œป์ด๋ฉฐ,

๊ธฐ์ˆ ์ ์œผ๋กœ๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐ์ฒด๋ฅผ RDB ํ…Œ์ด๋ธ”์— ์ž๋™์œผ๋กœ ์˜์†ํ™” ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๋ณด๋ฉด๋œ๋‹ค.

 

SQL๋ฌธ์ด ์•„๋‹Œ Method๋ฅผ ํ†ตํ•ด DB๋ฅผ ์กฐ์ž‘

(๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ DB๋ฅผ ์กฐ์ž‘ํ•จ. ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋ฅผ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์•„๋„๋จ)

 

 

JPA๋Š” ๊ธฐ์กด์˜ ๋ฐ˜๋ณต ์ฝ”๋“œ๋Š” ๋ฌผ๋ก ์ด๊ณ , ๊ธฐ๋ณธ์ ์ธ SQL๋„ JPA๊ฐ€ ์ง์ ‘ ๋งŒ๋“ค์–ด์„œ ์‹คํ–‰ํ•ด์ค€๋‹ค.


JPA
๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, SQL๊ณผ ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์˜ ์„ค๊ณ„์—์„œ ๊ฐ์ฒด ์ค‘์‹ฌ์˜ ์„ค๊ณ„๋กœ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์ „ํ™˜์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ํฌ๊ฒŒ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

 

 

build.gradle ํŒŒ์ผ์— JPA, h2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

spring-boot-starter-data-jpa ๋Š” ๋‚ด๋ถ€์— jdbc ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํฌํ•จํ•œ๋‹ค. ๋”ฐ๋ผ์„œ jdbc๋Š” ์ œ๊ฑฐํ•ด๋„ ๋œ๋‹ค.

 

 

์Šคํ”„๋ง ๋ถ€ํŠธ์— JPA ์„ค์ • ์ถ”๊ฐ€

resources/application.properties

spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none

 

show-sql : JPA๊ฐ€ ์ƒ์„ฑํ•˜๋Š” SQL์„ ์ถœ๋ ฅํ•œ๋‹ค.
ddl-auto : JPA๋Š” ํ…Œ์ด๋ธ”์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š”๋ฐ none ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๋ˆ๋‹ค.

create ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—”ํ‹ฐํ‹ฐ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ…Œ์ด๋ธ”๋„ ์ง์ ‘ ์ƒ์„ฑํ•ด์ค€๋‹ค. ํ•ด๋ณด์ž.

 

 

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

import javax.persistence.Entity;

@Entity
public class Member

 

@Entity

 

๋”๋ณด๊ธฐ

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

 

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

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

 

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

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

 

insert into member(name) values("spring1");

์ฟผ๋ฆฌ์— id๋ฅผ ๋„ฃ์ง€์•Š์•˜์Œ

 

@Id @GeneratedValue(strategy = GenerationType.IDENTITY)

 

@Id

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ํ‚ค(PK)์™€ ๊ฐ์ฒด์˜ ํ•„๋“œ๋ฅผ ๋งคํ•‘์‹œ์ผœ์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค.

 

๊ธฐ๋ณธ ํ‚ค๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ง์ ‘ ์—”ํ‹ฐํ‹ฐํด๋ž˜์Šค์˜ @Id ํ•„๋“œ์— setํ•ด์ค€๋‹ค.

๊ธฐ๋ณธ ํ‚ค๋ฅผ ์ง์ ‘ ํ• ๋‹นํ•˜๋Š” ๋Œ€์‹  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด @GeneratedValue๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

@GeneratedValue

๊ธฐ๋ณธ ํ‚ค๋ฅผ ์ž๋™ ์ƒ์„ฑํ•ด์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค.

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

 

@GeneratedValue(strategy = GenerationType.IDENTITY)

-> DB์— ๊ฐ’์„ ๋„ฃ์œผ๋ฉด DB๊ฐ€ id๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑ  == IDENTITY ์ „๋žต

์ฆ‰, id ๊ฐ’์„ null๋กœ ํ•˜๋ฉด DB๊ฐ€ ์•Œ์•„์„œ AUTO_INCREMENT ํ•ด์ค€๋‹ค.

 

JPA ํšŒ์› ๋ฆฌํฌ์ง€ํ† ๋ฆฌ

public class JpaMemberRepository implements MemberRepository{

    private final EntityManager em;

    public JpaMemberRepository(EntityManager em) {
        this.em = em;
    }

 

EntityManager

๋”๋ณด๊ธฐ

Entity

  • ํ…Œ์ด๋ธ”๊ณผ ๋งค์นญ๋˜๋Š” ๊ฐœ๋…
  • ORM ์„ ์ด๋ฃจ๋Š” ๊ธฐ๋ฐ˜ ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜. ๊ฐ์ฒด์™€ RDB ๊ฐ„ ์—ฐ๊ฒฐ์‹œ์ผœ์ฃผ๋Š” ์กด์žฌ

 

EntityManager

  • ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

JPA๋Š” EntityManager๋กœ ๋ชจ๋“ ๊ฒƒ์„ ๋™์ž‘

์Šคํ”„๋ง๋ถ€ํŠธ๊ฐ€ ์ž๋™์œผ๋กœ EntityManager๋ฅผ ์ƒ์„ฑํ•ด์คŒ ( ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐ์„ ๋‹ค ํ•œ ์ƒํƒœ ) 

์šฐ๋ฆฌ๋Š” ๋งŒ๋“ค์–ด์ง„๊ฒƒ์„ ์ธ์ ์…˜ ๋ฐ›์œผ๋ฉด ๋œ๋‹ค 

 

 

[JPA] EntityManager ๋ช…๋ น์–ด ์ •๋ฆฌ

๋”๋ณด๊ธฐ

 

 

@Override
public Member save(Member member) {
    em.persist(member);
    return member;
}

 

 

 

@Override
public Optional<Member> findById(Long id) {
     Member member = em.find(Member.class, id);
    return Optional.ofNullable(member);
}

find(class์ด๋ฆ„,๊ธฐ๋ณธํ‚ค)

  • EntityManager์˜ find() ๋ฉ”์„œ๋“œ๋Š” DB๋ฅผ ํ†ตํ•ด์„œ ์‹ค์ œ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฉ”์„œ๋“œ
  • ํ•ด๋‹นํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค. 

 

 

@Override
public List<Member> findAll() {
    return em.createQuery("select m from Member as m", Member.class)
            .getResultList();
}

createQuery(jpql)

jpql์„ sql๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ „์†กํ•œ๋‹ค.

 

query.getResultList()

๊ฒฐ๊ณผ๋ฅผ ์ปฌ๋ ‰์…˜์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

๊ฐ์ฒด(์—”ํ‹ฐํ‹ฐ)๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฐ๋‹ค -> sql ๋กœ ๋ฒˆ์—ญ

 

from Member as m : ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒ

select m : member ์—”ํ‹ฐํ‹ฐ ์ž์ฒด๋ฅผ select

 

 

JPQL

๋”๋ณด๊ธฐ

(JPQL์€ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ์ฟผ๋ฆฌ ์–ธ์–ด์ด๋‹ค.)

 

๊ฒฐ๊ณผ ์กฐํšŒ

  • query.getResultList()๊ฒฐ๊ณผ๋ฅผ ์ปฌ๋ ‰์…˜์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ฒฐ๊ณผ๊ฐ€ ์—†์œผ๋ฉด ๋นˆ ์ปฌ๋ ‰์…˜์ด ๋ฐ˜ํ™˜๋œ๋‹ค. 1๊ฑด์ด๋ฉด 1๊ฑด๋งŒ ๋“ค์–ด๊ฐ„ ์ปฌ๋ ‰์…˜์ด ๋ฐ˜ํ™˜๋œ๋‹ค.

 

https://joont92.github.io/jpa/JPQL/

 

 

@Override
public Optional<Member> findByName(String name) {
    List<Member> result = em.createQuery("select m from Member as m where m.name = :name", Member.class)
            .setParameter("name", name)
            .getResultList();

    return result.stream().findAny();
}

query.getResultList()

๊ฒฐ๊ณผ๋ฅผ ์ปฌ๋ ‰์…˜์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ

๋”๋ณด๊ธฐ

์•„๋ž˜์™€ ๊ฐ™์€ ์ด๋ฆ„ ๊ธฐ์ค€ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ์ง€์›ํ•œ๋‹ค.

TypedQuery<Member> query = 
    em.createQuery("SELECT m FROM Member m WHERE m.username = :username", Member.class)
    .setParameter("username", "joont1"); // JPQL์€ ๋Œ€๋ถ€๋ถ„ ๋ฉ”์„œ๋“œ ์ฒด์ธ ๋ฐฉ์‹์œผ๋กœ ๋˜์–ด์žˆ์–ด์„œ ์ด๋ ‡๊ฒŒ ์—ฐ์†ํ•ด์„œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค

List<Member> result = query.getResultLst();

username์€ Member ํด๋ž˜์Šค์— ์ •์˜๋œ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์ด๋‹ค. ์•ž์— :๋ฅผ ๋ถ™์—ฌ์„œ ๋ฐ”์ธ๋”ฉํ•œ๋‹ค.
username ์— joont1 ์ด ๋ฐ”์ธ๋”ฉ ๋  ๊ฒƒ์ด๋‹ค.

 

JPA๋ฅผ ์“ธ๋ ค๋ฉด ํŠธ๋žœ์žญ์…˜์ด ์žˆ์–ด์•ผํ•จ ( ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ๋•Œ ) 

-> ์„œ๋น„์Šค ๊ณ„์ธต์— ํŠธ๋žœ์žญ์…˜ ์ถ”๊ฐ€

import org.springframework.transaction.annotation.Transactional

@Transactional
public class MemberService {}

์Šคํ”„๋ง์€ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๊ณ , ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์ƒ ์ข…๋ฃŒ๋˜๋ฉด ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•œ๋‹ค.

๋งŒ์•ฝ ๋Ÿฐํƒ€์ž„ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋กค๋ฐฑํ•œ๋‹ค.


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

 

 

JPA๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์Šคํ”„๋ง ์„ค์ • ๋ณ€๊ฒฝ

public class SpringConfig {
    
    private EntityManager em;

    @Autowired
    public SpringConfig(EntityManager em) {
        this.em = em; 
    }
public MemberRepository memberRepository() {
    return new JpaMemberRepository(em);
}

 

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

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

์Šคํ”„๋ง ์ž…๋ฌธ - (19) AOP (Aspect Oriented Programming)  (0) 2023.01.29
์Šคํ”„๋ง ์ž…๋ฌธ - (18) ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA  (0) 2023.01.28
์Šคํ”„๋ง ์ž…๋ฌธ - (16) ์Šคํ”„๋ง JdbcTemplate  (0) 2023.01.27
์Šคํ”„๋ง ์ž…๋ฌธ - (15) ์Šคํ”„๋ง ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ  (0) 2023.01.27
์Šคํ”„๋ง ์ž…๋ฌธ - (14) ์Šคํ”„๋ง DB ์ ‘๊ทผ ๊ธฐ์ˆ  / ์ˆœ์ˆ˜ Jdbc  (0) 2023.01.26
'Spring/Spring ์ž…๋ฌธ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • ์Šคํ”„๋ง ์ž…๋ฌธ - (19) AOP (Aspect Oriented Programming)
  • ์Šคํ”„๋ง ์ž…๋ฌธ - (18) ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA
  • ์Šคํ”„๋ง ์ž…๋ฌธ - (16) ์Šคํ”„๋ง JdbcTemplate
  • ์Šคํ”„๋ง ์ž…๋ฌธ - (15) ์Šคํ”„๋ง ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ
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
์Šคํ”„๋ง ์ž…๋ฌธ - (17) JPA(Java Persistence API)
์ƒ๋‹จ์œผ๋กœ

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