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

jy9922·2022년 8월 11일
0

Spring

목록 보기
10/34
post-thumbnail

🔸 JPA

  • JPA는 기존의 반복 코드는 물론이고, 기본적인 SQL도 JPA가 직접 만들어서 실행해준다.
  • JPA를 사용하면, SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환할 수 있다.
  • JPA를 사용하면 개발 생산성을 크게 높일 수 있다.

🔹 JPA 코드로 보기

  • 'build.gradle' 파일에 JPA, h2 데이터베이스 관련 라이브러리 추가
implementation 'org.springFramework.boot:spring-boot-starter-data-jpa'
  • application properties
spring.dataSource.url=jdbc:h2:tcp://localhost/~/test
spring.dataSource.driver-class-name=org.h2.Driver
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none
/* Member */
@Entity
public class Member {
	
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) // DB가 ID를 자동으로 생성해줌을 표시
    private Long id;
    
    @Column(name="username") // DB의 column명이 username인 것과 맵핑
    private String name;
    
    ...
    getter/setter
}
/* JpaMemberRepository */
public class JpaMemberRepository implements MemberRepository {
	
    // JPA Manager는 EntityManager로 동작함
    // spring boot가 EntityManager를 만들어줌
	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() {
    	// 객체를 대상으로 Query를 날림
        // select의 대상이 *이 아닌 Member Entity 자체
    	return em.createQuery("select m from Member m", Member.class)
        		.getResultList();
    }
}
  • MemberService에 @Transactional 추가
@Transactional
public class MemberService{
	...
}
  • SpringConfig
@Configuration
public class SpringConfig {

  private EntityManager em;

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

🔹 스프링 데이터 JPA

  • 스프링 부트와 JPA만 사용해도 개발 생산성이 증가하고, 개발해야할 코드도 줄어든다.
  • 여기에 스프링 데이터 JPA를 사용하면 기존의 한계를 넘어 리포지토리에 구현 클래스 없이 인터페이스 만으로 개발을 완료할 수 있다.
  • 반복 개발해온 CRUD 기능도 스프링 데이터 JPA가 모두 제공한다.
/* SpringDataJpaMemberRepository */
public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository {
    @Override
    Optional<Member> findByName(String name);
}
/* SpringConfig */
 private final MemberRepository memberRepository;

    @Autowired // 생성자 하나, 생략 가능
    public SpringConfig(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
//	@Bean (생략 가능)
//  public MemberRepository memberRepository(){
//      return new MemoryMemberRepository();
//  }
}

스프링 데이터 JPA 제공 기능

  • 인터페이스를 통한 기본적인 CRUD
  • findByName(), findByEmail()처럼 메서드 이름만으로 조회 기능 제공
  • 페이징 기능 자동 제공

    참고

    JPA와 스프링 데이터 JPA를 기본으로 사용하고, 복잡한 동적 쿼리는 Querydsl 라이브러리 사용

0개의 댓글