본문 바로가기
Spring Tutorial

[Spring 입문 13] 스프링 DB 접근 기술: JPA

by 미소5 2024. 8. 4.

[Spring 입문 12] 스프링 DB 접근 기술: 스프링 JdbcTemplate (tistory.com)

 

[Spring 입문 12] 스프링 DB 접근 기술: 스프링 JdbcTemplate

[Spring 입문 10] 스프링 DB 접근 기술: 순수 JDBC (tistory.com) [Spring 입문 10] 스프링 DB 접근 기술: 순수 JDBC환경 설정build.gradle - jdbc, h2 데이터베이스 관련 라이브러리 추가implementation 'org.springframework.boo

joly156.tistory.com

 

  • JPA
    • JPA는 JAVA의 표준 인터페이스이고, 그 구현체로 구현기술들( hibernate , ...)이 여러개 있다.
    • 반복 코드는 물론이고, 기본적인 SQL JPA가 자동으로 만들어서 실행해준다. 
    • SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환할 수 있다.

개발 생산성을 크게 높일 수 있다

 


  • build.gradle - JPA 관련 라이브러리 추가
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
  • spring-boot-starter-data-jpa 는 내부에 jdbc 관련 라이브러리를 포함한다. (jdbc 제거해도 됨)

build.gradle


  • application.properties - 스프링 부트에 JPA 설정 추가
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none	//만들어져있는 테이블을 쓸것이므로, none
  •  show-sql  : JPA가 생성하는 SQL을 출력
  •  ddl-auto  : JPA가 테이블을 자동으로 생성
    • create : 엔티티 정보를 바탕으로 테이블을 직접 생성해준다.
    • none : 해당 기능을 끈다.

application.properties

[Spring 입문 10] 스프링 DB 접근 기술: 순수 JDBC (tistory.com)

 

[Spring 입문 10] 스프링 DB 접근 기술: 순수 JDBC

환경 설정build.gradle - jdbc, h2 데이터베이스 관련 라이브러리 추가implementation 'org.springframework.boot:spring-boot-starter-jdbc'runtimeOnly 'com.h2database:h2' application.properties - 스프링 부트 데이터베이스 연결 설

joly156.tistory.com


  • JPA 엔티티 매핑
    • ORM (Object Relational Mapping): 객체(Object) 와 관계형 데이터베이스의 데이터(Relational)를 연결(Mapping)  
@Entity
public class Member {

    @Id
    @GeneratedValue(strategy =GenerationType.IDENTITY)
    private long id;

    //@Column(name='username') //DB에 있는 칼럼명이 username일 경우
    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;
    }
}

 → 어노테이션@ 으로 매핑

  • @Entity
    • JPA가 관리하는 엔티티(객체)  매핑
  • @Id
    • 기본키(PK) 매핑
  • @GeneratedValue(strategy =GenerationType.IDENTITY)
    • DB에서 PK 값을 생성해준다. 쿼리에 PK 값을 직접 넣지 않아도, DB가 PK 값을 자동으로 생성해준다. →이것을 IDENTITY 전략이라고한다.

ID 자동 생성


 

  • JpaMemberRepository에 의존관계 추가 
private final EntityManager em;	//EntityManager를 주입받는다

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

 

JPA는 EntityManager로 모든것이 동작. 즉, JPA를 사용하려면 EntityManager를 주입받아야 한다. ( spring-boot-starter-data-jpa  EntityManager 자동 생성)

  • 저장: em.persist()
  • 조회: em.find(조회할 타입, 식별자 PK 값)

 


  • JPA 회원 리포지토리
public class JpaMemberRepository implements MemberRepository{
    private final EntityManager em;

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

    @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);
    }

    @Override
    public Optional<Member> findByName(String name) {
        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() {
        return em.createQuery("select m from Member m", Member.class)
                .getResultList();
    }
}
  • 기본적인 SQL(저장, 조회, 수정) 외에,  findByNamefindAllJPQL(객체지향쿼리언어) 작성해주어야 한다.

[Spring 입문 14] 스프링 DB 접근 기술: 스프링 데이터 JPA (tistory.com)

 

[Spring 입문 14] 스프링 DB 접근 기술: 스프링 데이터 JPA

[Spring 입문13] JPA (tistory.com) [Spring 입문13] JPA JPA 반복 코드는 물론이고, 기본적인 SQL도 JPA가 (자동으로)직접 만들어서 실행해준다. SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을

joly156.tistory.com


  • 서비스 계층에 트랜잭션( @Transactional  ) 추가 
    •  org.springframework.transaction.annotation.Transactional 

  • 스프링은 해당 클래스의 메서드를 실행할 때 트랜잭션을 시작하고, 메서드가 정상 종료되면 트랜잭션을 커밋한다. 만약 런타임 예외가 발생하면 롤백한다.
  • JPA를 통한 모든 데이터 변경은 트랜잭션 안에서 실행해야 한다. →데이터를 저장하거나 변경할 땐, 항상 트랜잭션 있어야 한다.

  • JPA를 사용하도록 스프링 설정 변경
@Configuration
public class SpringConfig {

 	private EntityManager em;
    
 	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);
        }
        
}

실행 성공

 

728x90
반응형