BootCamp 45day

GyeongNamΒ·2024λ…„ 1μ›” 19일
0

BootCamp

λͺ©λ‘ 보기
39/49
post-thumbnail

πŸ“… 2024λ…„ 01μ›” 17일


45일차 : Spring (5)

Spring + JPA + MariaDB

@Repository
public class MemberJpaRepository implements MemberRepository {
    /*
    EntityManager λŠ” JPA 의 핡심 클래슀(객체)
    Entity 의 생λͺ…μ£ΌκΈ°λ₯Ό 관리. DB μ™€μ˜ λͺ¨λ“  μƒν˜Έμž‘μš©μ„ μ±…μž„.
    Entity λ₯Ό λŒ€μƒμœΌλ‘œ  CRUD ν•˜λŠ” κΈ°λŠ₯을 제곡
     */
    private EntityManager entityManager;
    public MemberJpaRepository(EntityManager entityManager){
        this.entityManager = entityManager;
    }
    @Override
    public List<Member> findAll() {
        /*
        jpql : jpa 의 쿼리문법
        μž₯점 : DB에 따라 문법이 달라지지 μ•ŠλŠ” 객체지ν–₯ μ–Έμ–΄, μ»΄νŒŒμΌνƒ€μž„μ—μ„œ 확인 (Spring data jpa 의 κΈ°λŠ₯)
        단점 : DB 고유의 κΈ°λŠ₯κ³Ό μ„œλŠ₯을 κ·ΉλŒ€ν™”ν•˜κΈ° 어렀움
         */
        List<Member> members = entityManager
                .createQuery("select m from Member m", Member.class)
                .getResultList();
        return members;
    }
    @Override
    public Member save(Member member) {
        /*
        persist μ „λ‹¬λœ Entity κ°€ EntityManager 의 관리 μƒνƒœκ°€
        λ˜λ„λ‘ λ§Œλ“€μ–΄μ£Όκ³ , νŠΈλžœμž­μ…˜μ΄ 컀밋될 λ•Œ DB 에 μ €μž₯.
        insert 포함.
         */
        entityManager.persist(member);
        return member;
    }
    @Override
    public Optional<Member> findById(long id) {
        // find λ©”μ„œλ“œλŠ” pkλ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ μ€€λ‹€.
        Member member =  entityManager.find(Member.class, id);
        return Optional.ofNullable(member);
    }
    @Override
    public void delete(Member member) {
        /*
        remove λ©”μ„œλ“œ μ‚¬μš©
        update 의 경우 merge λ©”μ„œλ“œ μ‚¬μš©
         */
    }
    @Override
    public void deleteById(long id) {

    }
    public List<Member> findByName(String name) {
        // κ·Έμ™Έ 컬럼으둜 μ‘°νšŒν•  λ•ŒλŠ” select m from Member where m.name = :mame
        List<Member> members =  entityManager.createQuery(
                "select m from Member m where m.name = :name" , Member.class
        )
                .setParameter("name", name)
                .getResultList();
        return members;
    }
}
1. μžλ™ DDL 생성 (ν…Œμ΄λΈ” 생성):
JPAλŠ” μ—”ν„°ν‹° 클래슀λ₯Ό 기반으둜 λ°μ΄ν„°λ² μ΄μŠ€μ˜ ν…Œμ΄λΈ”μ„ μžλ™μœΌλ‘œ μƒμ„±ν•œλ‹€.
μ—”ν„°ν‹° 클래슀의 ν•„λ“œμ™€ λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”μ˜ 컬럼 κ°„μ˜ 맀핑 정보λ₯Ό ν™œμš©ν•˜μ—¬ ν…Œμ΄λΈ”μ΄ μƒμ„±λœλ‹€.
hibernate.hbm2ddl.auto와 같은 속성을 μ„€μ •ν•˜μ—¬ DDL 생성을 μ‘°μ ˆν•  수 μžˆλ‹€.
2.  μžλ™ DML μ‹€ν–‰ (데이터 μ‘°μž‘):
JPAλŠ” μ—”ν„°ν‹° 객체의 μƒνƒœ λ³€ν™”λ₯Ό κ°μ§€ν•˜κ³ , λ°μ΄ν„°λ² μ΄μŠ€μ— λ°˜μ˜ν•˜λŠ” DML(SQL)을 μžλ™μœΌλ‘œ μƒμ„±ν•˜κ³  μ‹€ν–‰ν•œλ‹€.
νŠΈλžœμž­μ…˜ 컀밋 μ‹œμ μ— λ³€κ²½λœ μ—”ν„°ν‹° 객체에 λŒ€ν•œ DML이 λ°μ΄ν„°λ² μ΄μŠ€μ— μžλ™μœΌλ‘œ λ°˜μ˜λœλ‹€.
κ°œλ°œμžλŠ” λ³„λ„μ˜ SQL을 μž‘μ„±ν•˜μ§€ μ•Šμ•„λ„ μ—”ν„°ν‹° 객체λ₯Ό μ‘°μž‘ν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€μ™€ 동기화할 수 μžˆλ‹€.
3. 객체 쑰립:
JPAλŠ” μ—”ν„°ν‹° ν΄λž˜μŠ€μ™€ λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ” κ°„μ˜ 맀핑 정보λ₯Ό ν™œμš©ν•˜μ—¬ ν•„μš”ν•œ SQL을 μžλ™μœΌλ‘œ μƒμ„±ν•˜κ³  μ‹€ν–‰ν•œλ‹€.
μ—”ν„°ν‹° κ°μ²΄λŠ” μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ—μ„œ κ΄€λ¦¬λ˜λ©°, ν•„μš”μ— 따라 λ°μ΄ν„°λ² μ΄μŠ€μ™€ λ™κΈ°ν™”λœλ‹€.
객체 지ν–₯적인 μ½”λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό λ‹€λ£° 수 μžˆλ‹€.
  • EntityManager
    EntityManager은 JPA(Java Persistence API)μ—μ„œ μ œκ³΅ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€λ‘œ, μ—”ν„°ν‹°(Entity) 객체의 μ˜μ†μ„±μ„ κ΄€λ¦¬ν•˜λŠ” 역할을 ν•œλ‹€.

Entity, DTO, DAO, VO

μš©μ–΄μ„€λͺ…μ£Όμš” νŠΉμ§• 및 μ—­ν• 
VOValue Object (κ°’ 객체)λΆˆλ³€ν•˜λ©° 주둜 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ—μ„œ μ‚¬μš©λ˜λŠ” κ°’ 객체
DTOData Transfer Object (데이터 전솑 객체)데이터 전솑을 μœ„ν•œ 객체둜, 주둜 ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλΉ„μŠ€ 간에 데이터 전솑에 μ‚¬μš©
DAOData Access Object (데이터 μ•‘μ„ΈμŠ€ 객체)λ°μ΄ν„°λ² μ΄μŠ€ μ•‘μ„ΈμŠ€λ₯Ό λ‹΄λ‹Ήν•˜λ©° 주둜 CRUD 연산을 μˆ˜ν–‰
Repository쀑간 κ³„μΈ΅μœΌλ‘œ 데이터 μ•‘μ„ΈμŠ€λ₯Ό μΆ”μƒν™”ν•˜κ³  λΉ„μ¦ˆλ‹ˆμŠ€ 둜직과 λ°μ΄ν„°λ² μ΄μŠ€ κ°„μ˜ 결합을 μ€„μž„ν΄λΌμ΄μ–ΈνŠΈμ™€ λ°μ΄ν„°λ² μ΄μŠ€ κ°„μ˜ μ€‘μž¬ 역할을 μˆ˜ν–‰
Entityλ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μ‹€μ œ 데이터λ₯Ό λ‚˜νƒ€λ‚΄λŠ” κ°μ²΄λ°μ΄ν„°λ² μ΄μŠ€μ˜ ν…Œμ΄λΈ”κ³Ό λ§€ν•‘λ˜λ©° 주둜 데이터λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 객체

μ„€λͺ…곡톡점차이점
Entityλ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μ‹€μ œ 데이터λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 객체데이터λ₯Ό ν‘œν˜„ν•œλ‹€.주둜 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ 담지 μ•ŠμŒ.
VOλΆˆλ³€ν•˜λ©° 주둜 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ—μ„œ μ‚¬μš©λ˜λŠ” κ°’ 객체데이터λ₯Ό ν‘œν˜„ν•˜λ©° λΆˆλ³€μ„±μ„ 가진닀.주둜 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ—μ„œ μ‚¬μš©λ˜λ©° λΆˆλ³€μ„±μ„ κ°•μ‘°ν•œλ‹€.

μ„€λͺ…곡톡점차이점
Repository데이터 μ•‘μ„ΈμŠ€λ₯Ό μΆ”μƒν™”ν•˜κ³  λΉ„μ¦ˆλ‹ˆμŠ€ 둜직과 λ°μ΄ν„°λ² μ΄μŠ€ κ°„μ˜ 결합을 μ€„μž„λ°μ΄ν„° μ•‘μ„ΈμŠ€λ₯Ό λ‹΄λ‹Ήν•˜λ©° μ€‘μž¬ 역할을 ν•œλ‹€.λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ μƒν˜Έμž‘μš©μ„ μΆ”μƒν™”ν•˜κ³ , λ°μ΄ν„°λ² μ΄μŠ€μ— λŒ€ν•œ μ˜μ‘΄μ„±μ„ μ΅œμ†Œν™”ν•œλ‹€.
DAOλ°μ΄ν„°λ² μ΄μŠ€ μ•‘μ„ΈμŠ€λ₯Ό λ‹΄λ‹Ήν•˜λ©° 주둜 CRUD 연산을 μˆ˜ν–‰λ°μ΄ν„° μ•‘μ„ΈμŠ€λ₯Ό λ‹΄λ‹Ήν•œλ‹€.주둜 λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ μƒν˜Έμž‘μš©μ— μ΄ˆμ μ„ λ§žμΆ”λ©°, 데이터 μ•‘μ„ΈμŠ€ λ‘œμ§μ„ μ²˜λ¦¬ν•œλ‹€.

@Transactional

  • νŠΈλžœμž­μ…˜ νŠΉμ§•
νŠΉμ§•μ„€λͺ…
μ›μžμ„± (Atomicity)νŠΈλžœμž­μ…˜μ€ λͺ¨λ“  μž‘μ—…μ΄ μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œλ˜κ±°λ‚˜, ν•˜λ‚˜λ„ μˆ˜ν–‰λ˜μ§€ μ•Šμ€ μƒνƒœλ‘œ μœ μ§€λ˜μ–΄μ•Ό ν•œλ‹€.
일관성 (Consistency)νŠΈλžœμž­μ…˜μ΄ μ™„λ£Œλœ 후에도 λ°μ΄ν„°λ² μ΄μŠ€λŠ” μΌκ΄€λœ μƒνƒœλ₯Ό μœ μ§€ν•΄μ•Ό ν•œλ‹€.
고립성 (Isolation)μ—¬λŸ¬ νŠΈλžœμž­μ…˜μ΄ λ™μ‹œμ— 싀행될 λ•Œ 각 νŠΈλžœμž­μ…˜μ€ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ— 영ν–₯을 주지 μ•Šκ³  λ…λ¦½μ μœΌλ‘œ μ‹€ν–‰λ˜μ–΄μ•Ό ν•œλ‹€.
지속성 (Durability)νŠΈλžœμž­μ…˜μ΄ μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œλœ ν›„μ—λŠ” κ·Έ κ²°κ³Όκ°€ 영ꡬ적으둜 λ°˜μ˜λ˜μ–΄μ•Ό ν•˜λ©°, μ‹œμŠ€ν…œ μž₯애에도 볡ꡬ κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€.
  • νŠΈλžœμž­μ…˜ μ—°μ‚°
μ—°μ‚°μ„€λͺ…
νŠΈλžœμž­μ…˜ μ‹œμž‘ (Begin)νŠΈλžœμž­μ…˜ 연산은 νŠΈλžœμž­μ…˜μ„ λͺ…μ‹œμ μœΌλ‘œ μ‹œμž‘ν•΄μ•Ό ν•©λ‹ˆλ‹€.
μž‘μ—… μˆ˜ν–‰ (Execute)νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œ μ›μžμ μΈ μž‘μ—…λ“€μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€. 각 μž‘μ—…μ€ 성곡 λ˜λŠ” μ‹€νŒ¨λ‘œ μ™„λ£Œλ©λ‹ˆλ‹€.
νŠΈλžœμž­μ…˜ μ’…λ£Œ (Commit/Rollback)νŠΈλžœμž­μ…˜μ€ μ™„λ£Œλœ 후에 λͺ…μ‹œμ μœΌλ‘œ 컀밋(Commit) λ˜λŠ” λ‘€λ°±(Rollback)λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • 컀밋과 λ‘€λ°±
  1. 컀밋 (Commit):
    νŠΈλžœμž­μ…˜μ˜ 성곡적인 μ™„λ£Œλ₯Ό 의미.
    λͺ¨λ“  μž‘μ—…μ΄ μ •μƒμ μœΌλ‘œ μ‹€ν–‰λ˜μ—ˆμ„ λ•Œ, νŠΈλžœμž­μ…˜μ˜ κ²°κ³Όλ₯Ό 영ꡬ적으둜 λ°μ΄ν„°λ² μ΄μŠ€μ— λ°˜μ˜ν•˜κΈ° μœ„ν•΄ 컀밋을 μˆ˜ν–‰.
    컀밋이 μˆ˜ν–‰λ˜λ©΄ νŠΈλžœμž­μ…˜μ€ μ’…λ£Œλ˜κ³ , λ°μ΄ν„°λ² μ΄μŠ€λŠ” νŠΈλžœμž­μ…˜μ˜ λ³€κ²½ 사항을 λ°˜μ˜ν•˜μ—¬ μΌκ΄€λœ μƒνƒœλ₯Ό μœ μ§€.
  1. λ‘€λ°± (Rollback):
    νŠΈλžœμž­μ…˜μ˜ μ‹€νŒ¨ λ˜λŠ” μ˜ˆμ™Έ λ°œμƒ μ‹œ νŠΈλžœμž­μ…˜μ„ μ·¨μ†Œν•˜κ³  이전 μƒνƒœλ‘œ λ˜λŒλ¦°λ‹€.
    μ–΄λ–€ μ΄μœ λ‘œλ“  νŠΈλžœμž­μ…˜μ„ μ€‘λ‹¨ν•˜κ³  μ΄μ „μ˜ μΌκ΄€λœ μƒνƒœλ‘œ λŒμ•„κ°€μ•Ό ν•  λ•Œ μ‚¬μš©.
    둀백을 μˆ˜ν–‰ν•˜λ©΄ νŠΈλžœμž­μ…˜μ˜ λ³€κ²½ 사항이 λͺ¨λ‘ μ·¨μ†Œλ˜κ³ , λ°μ΄ν„°λ² μ΄μŠ€λŠ” νŠΈλžœμž­μ…˜ μ΄μ „μ˜ μƒνƒœλ‘œ λŒμ•„κ°€κ²Œ λœλ‹€.
  • @Transactional은 μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ—μ„œ μ œκ³΅ν•˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ, νŠΈλžœμž­μ…˜μ„ κ΄€λ¦¬ν•˜λŠ”λ° μ‚¬μš©
1. νŠΈλžœμž­μ…˜ λ²”μœ„ μ„€μ •:
@Transactional은 λ©”μ„œλ“œλ‚˜ ν΄λž˜μŠ€μ— 적용 κ°€λŠ₯ν•˜λ©°, λ©”μ„œλ“œμ— μ μš©ν•  경우 ν•΄λ‹Ή λ©”μ„œλ“œλŠ” νŠΈλžœμž­μ…˜ λ²”μœ„ λ‚΄μ—μ„œ μ‹€ν–‰λœλ‹€.
ν΄λž˜μŠ€μ— μ μš©ν•  경우 클래슀의 λͺ¨λ“  λ©”μ„œλ“œλŠ” νŠΈλžœμž­μ…˜ λ²”μœ„ λ‚΄μ—μ„œ μˆ˜ν–‰λœλ‹€.
2. νŠΈλžœμž­μ…˜ 속성 μ„€μ •:
@Transactional μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ νŠΈλžœμž­μ…˜μ˜ 속성을 μ„€μ •ν•  수 있으며, 격리 μˆ˜μ€€, 읽기 μ „μš© μ—¬λΆ€, λ‘€λ°± κ·œμΉ™ 등을 μ„€μ •ν•  수 μžˆλ‹€.
3. μ˜ˆμ™Έ μ²˜λ¦¬μ™€ λ‘€λ°±:
νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ 기본적으둜 λ‘€λ°±λœλ‹€. λ‹€μ‹œ 말해, νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ 이전 μƒνƒœλ‘œ λ‘€λ°±λ˜μ–΄ λ°μ΄ν„°λ² μ΄μŠ€μ™€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μƒνƒœλ₯Ό 일관성 있게 μœ μ§€ν•œλ‹€.
4. νŠΈλžœμž­μ…˜ κ΄€λ¦¬μžμ™€ 톡합:
@Transactional은 μŠ€ν”„λ§μ˜ νŠΈλžœμž­μ…˜ κ΄€λ¦¬μžμ™€ ν†΅ν•©λ˜μ–΄ λ™μž‘ν•œλ‹€. 이 μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ νŠΈλžœμž­μ…˜μ„ μ‹œμž‘, 컀밋, λ‘€λ°±ν•˜λŠ” 데 ν•„μš”ν•œ λͺ¨λ“  관리 μž‘μ—…μ„ μŠ€ν”„λ§μ΄ μˆ˜ν–‰ν•œλ‹€.
5. μ„€μ • μ˜΅μ…˜:
@Transactional μ–΄λ…Έν…Œμ΄μ…˜μ€ μ„€μ • μ˜΅μ…˜μ„ 톡해 νŠΈλžœμž­μ…˜μ˜ λ™μž‘μ„ μ„Έλ°€ν•˜κ²Œ μ‘°μ •ν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, νŠΉμ • μ˜ˆμ™Έμ— λŒ€ν•œ λ‘€λ°± μ •μ±…, νƒ€μž„μ•„μ›ƒ, 읽기 μ „μš© νŠΈλžœμž­μ…˜ 등을 μ„€μ •ν•  수 μžˆλ‹€.

Spring μ‹€μŠ΅ github 링크

profile
503 Service Unavailable Error

0개의 λŒ“κΈ€