[Spring][ํ˜ผ๊ณต] 6. ์Šคํ”„๋ง DB ์ ‘๊ทผ ๊ธฐ์ˆ  - (5) JPA

2021. 10. 4. 17:20ยท๐Ÿ“ Language/โœ JAVA

์Šคํ”„๋ง DB ์ ‘๊ทผ ๊ธฐ์ˆ 

5. JPA

  • JPA๋Š” ๊ธฐ์กด์˜ ๋ฐ˜๋ณต ์ฝ”๋“œ๋Š” ๋ฌผ๋ก ์ด๊ณ  SQL๋„ ์ง์ ‘ ๋งŒ๋“ค์–ด์„œ ์‹คํ–‰ํ•ด์ค€๋‹ค.
  • SQL๊ณผ ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์˜ ์„ค๊ณ„์—์„œ ๊ฐ์ฒด ์ค‘์‹ฌ์˜ ์„ค๊ณ„๋กœ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ํฌ๊ฒŒ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

 

1) ํ™˜๊ฒฝ ์„ค์ •

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

build.gradle

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

resources/application.properties

 

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

  • JPA๋Š” ์ž๋ฐ” ํ‘œ์ค€์—์„œ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์ •์˜ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.
  • JPA์˜ ๊ตฌํ˜„์ฒด๋กœ hibernate ๋“ฑ์ด ์žˆ๊ณ  ์ด ๊ตฌํ˜„ ๊ธฐ์ˆ ์„ ์ด์šฉํ•ด JPA๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • @Entity: JPA๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด๋กœ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘(ORM)์„ ๋„์™€์ค€๋‹ค.
package hello.hello.spring.domain;

import javax.persistence.*;

@Entity
public class Member {

    @Id // ๊ธฐ๋ณธํ‚ค(pk)
    @GeneratedValue(strategy = GenerationType.IDENTITY) // DB๊ฐ€ ์ƒ์„ฑํ•˜๋Š” key(id)๋ผ๋Š” ๋œป
    private Long id; // ์‹œ์Šคํ…œ์ด ์ €์žฅํ•œ ์ž„์˜์˜ ๊ฐ’

    // @Column(name = "username"): ๋งŒ์•ฝ DB์˜ ์ปฌ๋Ÿผ ๋ช…์ด ๋‹ค๋ฅด๋‹ค๋ฉด ์ง์ ‘ ์„ค์ •
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 

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

MemberService.java

  • ์Šคํ”„๋ง์€ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๊ณ , ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์ƒ ์ข…๋ฃŒ๋˜๋ฉด ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•œ๋‹ค. ๋งŒ์•ฝ ๋Ÿฐํƒ€์ž„ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋กค๋ฐฑํ•œ๋‹ค.
  • JPA๋ฅผ ํ†ตํ•œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ๋ณ€๊ฒฝ์€ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค

 

4) JPA ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ตฌํ˜„

package hello.hello.spring.repository;

import hello.hello.spring.domain.Member;

import javax.persistence.EntityManager;
import java.util.List;
import java.util.Optional;

public class JpaMemberRepository implements MemberRepository {

    private final EntityManager em;

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

    @Override
    public Member save(Member member) {
        // insert ์ฟผ๋ฆฌ, DB ์ €์žฅ, SetID ๋“ฑ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ JPA๊ฐ€ ์ฒ˜๋ฆฌํ•œ๋‹ค.
        em.persist(member);
        return member;
    }

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

    @Override
    public Optional<Member> findByName(String name) {
        // pk ๊ธฐ๋ฐ˜์ด ์•„๋‹ˆ๋ผ ์ฟผ๋ฆฌ ์ž‘์„ฑ์ด ํ•„์š”ํ•˜๋‹ค.
        List<Member> result = em.createQuery("select m from Member m where m.name = :name", Member.class)
                .setParameter("name", name)
                .getResultList();
        return result.stream().findAny();
    }

    @Override
    public List<Member> findAll() {
        // ๊ฐ์ฒด(์—”ํ‹ฐํ‹ฐ) ์ž์ฒด๋ฅผ select ํ•œ๋‹ค.
        return em.createQuery("select m from Member m", Member.class)
                .getResultList();
    }
}

 

package hello.hello.spring;

import hello.hello.spring.repository.*;
import hello.hello.spring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.persistence.EntityManager;
import javax.sql.DataSource;

@Configuration
public class SpringConfig {

    private EntityManager em;

    @Autowired
    public SpringConfig(EntityManager em) {
        this.em = em;
    }

    @Bean
    public MemberService memberService() {
        return new MemberService(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        //return new MemoryMemberRepository();
        //return new JdbcMemberRepository(dataSource);
        //return new JdbcTemplateMemberRepository(dataSource);
        return new JpaMemberRepository(em);
    }
}
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
'๐Ÿ“ Language/โœ JAVA' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Spring][ํ˜ผ๊ณต] 7. AOP(Aspect Oriented Programming) - (1) AOP๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ
  • [Spring][ํ˜ผ๊ณต] 6. ์Šคํ”„๋ง DB ์ ‘๊ทผ ๊ธฐ์ˆ  - (6) ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA
  • [Spring][ํ˜ผ๊ณต] 6. ์Šคํ”„๋ง DB ์ ‘๊ทผ ๊ธฐ์ˆ  - (4) ์Šคํ”„๋ง JDBC Template
  • [Spring][ํ˜ผ๊ณต] 6. ์Šคํ”„๋ง DB ์ ‘๊ทผ ๊ธฐ์ˆ  - (3) ์Šคํ”„๋ง ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ
Blxxming
Blxxming
CS ์ง€์‹๊ณผ ๊ณต๋ถ€ํ•˜๋‹ค ๋ฐฐ์šด ๊ฒƒ, ๊ฒฝํ—˜ํ•œ ๊ฒƒ ๋“ฑ์„ ๊ธฐ๋กํ•˜๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
  • Blxxming
    ๐Ÿ’ก๋ฒˆ๋œฉ๐Ÿ’ก
    Blxxming
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
  • ๊ณต์ง€์‚ฌํ•ญ

    • Tech Interview
    • ๐Ÿ“š Tech (246)
      • ๐Ÿ“ Computer Science (96)
        • โœ OS (12)
        • โœ Network & Web (10)
        • โœ Database (11)
        • โœ Data Structure (6)
        • โœ Algorithm (40)
        • โœ Design Pattern (9)
        • โœ Cloud Computing (3)
        • โœ (5)
      • ๐Ÿ“ Language (73)
        • โœ Language (6)
        • โœ C & C++ (11)
        • โœ C# (19)
        • โœ JAVA (37)
      • ๐Ÿ“ Game (43)
        • โœ Computer Graphics (2)
        • โœ Unity (14)
        • โœ Unreal (26)
        • โœ (1)
      • ๐Ÿ“ Book (34)
        • โœ Effective (3)
        • โœ Game Server (16)
        • โœ Clean Code (14)
        • โœ (1)
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
Blxxming
[Spring][ํ˜ผ๊ณต] 6. ์Šคํ”„๋ง DB ์ ‘๊ทผ ๊ธฐ์ˆ  - (5) JPA
์ƒ๋‹จ์œผ๋กœ

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