[스프링1] 섹션6. 스프링 DB 접근 기술 JPA
1. 스프링 DB접근 기술 JPA
📌 JPA(Java Persistence API)?
- 자바 진영의 ORM(Object Relational Mapping) 기술 표준입니다.
- 쿼리 문을 사용하지 않고도 데이터베이스에서 데이터를 추가, 수정, 조회, 삭제할 수 있는 기술을 제공합니다.
ORM(Object Relational Mapping)이란?
객체와 관계형 데이터베이스를 매핑해 주는 것입니다.
- 객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용하기 때문에 그 둘 사이 불일치가
존재하는데 ORM이 그것을 해결해 줍니다.
📌 왜 사용해야 하나?
- JPA는 기존의 반복 코드, SQL문도 직접 만들어주어 생산성을 크게 높일 수 있습니다.
- SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환할 수 있습니다.
💻 JPA설정
...
@Entity
public class Member {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
...
}
- @Entity는 JPA가 관리하는 entity라고 명시해주는 역할입니다.
- @Id @GeneratedValue(strategy = GenerationType.IDENTITY)를 통해 데이터 삽입시 JPA가 자동으로 id 값을 설정해 줍니다.
💻 JPA 회원 리포지토리 생성
public class JpaMemberRepository implements MemberRepository {
private final EntityManager em;
...
public Member save(Member member) {
em.persist(member);
return member;
}
...
public List<Member> findAll() {
return em.createQuery("select m from Member m", Member.class)
.getResultList();
}
...
- JPA는 EntityManager가 직접 엔터티를 관리합니다.
- 회원을 저장하는 경우 EntityManager가 직접 데이터를 생성해 주지만, 회원을 찾아야 하는 경우(조회) 엔터티를 대상으로 직접 쿼리문을 작성해야 합니다.
📌 서비스 계층에 트랜잭션 추가
- 트랜잭션을 통해서 데이터가 변경되기 때문에 반드시 JPA를 통한 모든 데이터 변경을 트랜잭션 안에서 실행해야 합니다.
@Transactional
public class MemberService {
...
💻 JPA를 사용할 수 있도록 스프링 설정 변경
@Configuration
public class SpringConfig {
private final DataSource dataSource;
private final EntityManager em;
public SpringConfig(DataSource dataSource, EntityManager em) {
this.dataSource = dataSource;
this.em = em;
}
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new JpaMemberRepository(em);
}
}
- 만들어 놓은 JpaMemberRepository를 빈에 등록합니다.
2. 스프링 데이터 JPA
📌 스프링 데이터 JPA(Java Persistence API)?
- 스프링 프레임워크에서 JPA를 편리하게 사용할 수 있게 해주는 모듈입니다.
- 리포지토리에 구현 클래스 없이 인터페이스 만으로 개발을 완료할 수 있습니다.
- 사용자가 더 간단하게 데이터에 접근이 가능합니다.
💻 스프링 데이터 JPA 회원 리포지토리
public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository {
Optional<Member> findByName(String name);
}
- 각종 CRUD 함수는 인터페이스에서 제공되기 때문에 바로 사용할 수 있습니다.
- 제공하지 않는 함수의 경우 findByName처럼 특정한 규칙을 따르기만 하면 쿼리문을 자동으로 만들어 함수를 생성해 줍니다.
📌 스프링 데이터 JPA 회원 리포지토리를 사용하도록 스프링 설정 변경
- JPA가 SpringDataJpaMemberRepository를 스프링 빈으로 자동 등록해 줍니다.
QUIZ
1. 자바 진영의 ORM(Object Relational Mapping) 기술 표준으로 쿼리 문을 사용하지 않고도 데이터베이스에서 데이터를 추가, 수정, 조회, 삭제할 수 있는 기술을 제공하는 DB접근 기술을 무엇이라고 하나요?
2. JPA는 자동으로 쿼리문을 작성해준다.(O/X)
3. JPA가 관리하는 entity라고 명시해 주기 위해 어떤 어노테이션을 붙이나요?
4. JPA에서 엔터티를 관리하는 객체는 무엇인가요?
5. 데이터가 변경되는 서비스 계층에 무엇을 추가해야 하나요?
6. 스프링 프레임워크에서 JPA를 편리하게 사용할 수 있게 해주는 것이 무엇인가요?
7. 스프링 데이터 JPA를 사용하면 JPA리포지토리를 직접 스프링 빈으로 등록할 필요가 없다.(O/X)
8. 코너 회원의 도메인을 만들기 위해 다음의 코드를 작성하고자 합니다. [ ] 안에 들어갈 어노테이션을 작성하세요.
@Entity
public class CornerMember {
[ ]
private Long id;
private String name;
public Long getId() {
return id;
...
}
9. 스프링 데이터 JPA를 사용하여 코너 멤버의 회원가입 메서드를 작성하고자 합니다. 다음을 완성하세요.
...
private final EntityManager em;
...
public Member save(Member member) {
}
```
해당 포스트는 김영한, [스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술], (2022, 11월 28일), 섹션 6. 스프링 DB 접근기술 강의를 참고하여 작성하였습니다.
아리