ORM(Object-Relational-Mapping)
우리가 일반적으로 알고 있는 애플리케이션 Class와 RDB(Relational DataBase)의 테이블을
매핑(연결)한다는 뜻이며, 기술적으로는 어플리케이션의 객체를 RDB 테이블에 자동으로 영속화 해주는 것이라고 보면된다.
1. build.gradle 파일에 아래와 같은 라이브러리를 추가
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
2. application.properties 파일에 설정을 추가
// JPA 설정
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none
1. Member 객체 수정
package hello.hellospring.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Member {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
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;
}
}
2. JPA 회원 리포지토리를 생성
// MemberRepository.java
public class JpaMemberRepository implements MemberRepository {
// JPA는 EntityManager가 직접 엔터티를 관리하므로 추가
// EntityManager가 persist, find, createQuery로 생성, 조회 및 쿼리 생성함
private final EntityManager em;
public JpaMemberRepository(EntityManager em) {
this.em = em;
}
public Member save(Member member) {
em.persist(member);
return member;
}
public Optional<Member> findById(Long id) {
Member member = em.find(Member.class, id);
return Optional.ofNullable(member);
}
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();
}
public List<Member> findAll() {
return em.createQuery("select m from Member m", Member.class)
.getResultList();
}
}
3. 서비스 계층에 트랜잭션을 추가
import org.springframework.transaction.annotation.Transactional
@Transactional
public class MemberService {
...
}
4. JPA를 사용하도록 스프링 설정을 변경
// SpringConfig.java
@Configuration
public class SpringConfig {
private final EntityManager em;
public SpringConfig(EntityManager em) {
this.em = em;
}
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new JpaMemberRepository(em);
}
}
1. 스프링 데이터 JPA 회원 리포지토리 만들기
public interface SpringDataJpaMemberRepository extends JpaRepository<Member,Long>, MemberRepository {
Optional<Member> findByName(String name);
}
2. 스프링 데이터 JPA를 이용하기 위해 스프링 설정을 변경
// SpringConfig.java
@Configuration
public class SpringConfig {
private final MemberRepository memberRepository;
public SpringConfig(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Bean
public MemberService memberService() {
return new MemberService(memberRepository);
}
}
8. JPA 회원 리포지토리에서 모든 멤버를 찾는 쿼리문을 포함하여 findAll 함수를 완성하시오
// MemberRepository.java
public class JpaMemberRepository implements MemberRepository {
private final EntityManager em;
public JpaMemberRepository(EntityManager em) {
this.em = em;
}
public Member save(Member member) {
em.persist(member);
return member;
}
public Optional<Member> findById(Long id) {
Member member = em.find(Member.class, id);
return Optional.ofNullable(member);
}
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();
}
public List<Member> findAll() {
// 코드 작성
}
}
9. 스프링 데이터 JPA를 사용하도록 하는 코드를 완성하시오.
// SpringConfig.java
// 어노테이션을 작성해주세요.
public class SpringConfig {
private final MemberRepository memberRepository;
public SpringConfig(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Bean
public MemberService memberService() {
// 코드 작성
}
}
8.
public List<Member> findAll() {
return em.createQuery("select m from Member m", Member.class)
.getResultList();
}
9.
// SpringConfig.java
@Configuration
public class SpringConfig {
private final MemberRepository memberRepository;
public SpringConfig(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Bean
public MemberService memberService() {
return new MemberService(memberRepository);
}
}
[출처] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 (기술 섹션 6.스프링 DB 접근 기술 JPA), 김영한 https://inf.run/WzVy
ⓒ 다라
[스프링3] 5장. API를 작성하는 다양한 방법 (0) | 2023.11.03 |
---|---|
[스프링3] 4장. 스프링 부트 애플리케이션 개발하기 (1) | 2023.10.13 |
[스프링3] 3장 개발 환경 구성 (0) | 2023.10.13 |
[스프링 3팀] 01-02 스프링 부트&개발 전 기초 지식 (0) | 2023.10.13 |
[스프링3] 섹션 4. 스프링 빈과 의존관계 (0) | 2023.09.29 |