[스프링 입문] JPA

enxnong·2023년 5월 6일
0

Spring

목록 보기
20/26

김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술을 보면서 공부한 내용입니다.

JPA란?

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

환경 설정

build.gradle에 해당 코드를 추가한다.

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

[applcation.properties](http://applcation.properties) 에 해당 코드를 추가한다.

spring.jpa.show-sql=true // jpa가 날린 sql문을 볼 수 있다.
spring.jpa.hibernate.ddl-auto=none 
// jpa를 사용하면 객체를 보고 테이블도 자동으로 생성하는데
// 현재 테이블이 생성되어 있으므로 none으로 자동 생성을 끄고 사용한다.

Mapping

Member 클래스에 매핑한다.

// ORM : Object Relational Mapping
// JPA는 객체와 ORM이라는 기술이다.
@Entity // jpa가 관리하는 entity
public class Member {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) // pk를 mapping함
// @Id는 pk값으로 정하겠다는 뜻
// @GeneratedValue(strategy = GenerationType.IDENTITY)는 pk값을 DB가 자동생성해주겠다는 뜻
    private Long id; // 임의의 값 => 시스템이 저장하는 아이디

    private String name;

리포지토리

JpaMemberRepository 를 생성하여 아래 코드로 작성한다.

public class JpaMemberRepository implements MemberRepository {

    private final EntityManager em; // jpa는 EntityManager로 모든 동작을 한다.

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

    @Override
    public Member save(Member member) throws SQLException {
        em.persist(member); // persist : 영구 저장하닫
        return member;
    }

    @Override
    public Optional<Member> findById(Long id) {
        Member member = em.find(Member.class, id); // 조회할 타입, pk넣어서 조회
        return Optional.ofNullable(member);
    }

    /*
        기본적은 CRUD는 sql문을 작성할 필요가 없다.
        하지만 여러 개의 list를 돌리거나 pk기반이 아닌 것들은 sql문을 작성해야한다.
     */

    @Override
    public Optional<Member> findByName(String name) {
        List<Member> result = em.createQuery("select m from Member m where m.name = :name", Member.class) // 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();
        // 객체를 대상으로 쿼리를 날림
        // selet ^m^ : Member라는 객체 자체를 조회함
    }
}

SpringConfig 수정

privateEntityManager em;

publicSpringConfig(EntityManager em) {
this.em = em;
}

@Bean
    public MemberRepository memberRepository() {
       // return new MemoryMemberRepository();
        //  return new JdbcMemberRepository(dataSource);
        // return new JdbcTemplateMemberRepository(dataSource);
        return new JpaMemberRepository(em);
    }
profile
높은 곳을 향해서

0개의 댓글