오늘이라도

[VI. 스프링 DB 접근 기술] 22. JPA 본문

인프런/스프링 입문 (김영한)

[VI. 스프링 DB 접근 기술] 22. JPA

upcake_ 2022. 1. 13. 13:47
반응형

https://github.com/upcake/hello-spring

강의 링크

 

* 오늘의 단축키 & 기능

- inline variable : Ctrl + Alt + n

@Override
public List<Member> findAll() {
    List<Member> result = em.createQuery("select m from Member m", Member.class).getResultList();
    return result;
}
@Override
public List<Member> findAll() {
    return em.createQuery("select m from Member m", Member.class).getResultList();
}

1. JPA

- JPA는 기존의 반복 코드는 물론이고, 기본적인 SQL도 JPA가 직접 만들어서 실행해준다

- JPA를 사용하면, SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환할 수 있다.

- JPA를 사용하면 개발 생산성을 크게 높일 수 있다.

 

- build.gradle 파일에 JPA, h2 데이터베이스 관련 라이브러리 추가

dependencies {
   implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
   implementation 'org.springframework.boot:spring-boot-starter-web'
// implementation 'org.springframework.boot:spring-boot-starter-jdbc'
   implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
   runtimeOnly 'com.h2database:h2'
   testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

 

- application.properties 설정

#콘솔 색
spring.output.ansi.enabled=always

#DB 설정
spring.datasource.url=jdbc:h2:tcp://localhost/D:/workspace_ij/db/test
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

#JPA 설정
#JPA가 날리는 SQL 보는 설정
spring.jpa.show-sql=true
#JPA는 객체를 보고 테이블을 자동으로 생성해준다 (create/none)
spring.jpa.hibernate.ddl-auto=create

 

- JPA는 인터페이스 - hibernate는 구현체라고보면 된다.

- JPA는 ORM이라는 기술 : Object Relational Mapping

- 객체와 관계형 DB의 테이블을 맵핑해준다는 뜻

 

- Member.java

//@Entity : JPA가 관리하는 Entity
@Entity
public class Member {

    //@Id : PK
    //IDENTITY : DB가 자동으로 생성해주는 값
    @Id @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;        //시스템이 정하는 key 값

    //@Column(name = "username") 변수명이 칼럼명과 달라서 칼럼명이 username일 경우에 이렇게 어노테이션을 달아준다.
    private String name;    //고객의 이름

- JpaMemberRepository.java

public class JpaMemberRepository implements MemberRepository {

    //JPA를 사용하려면 EntityManager가 있어야 한다.
    //application.properties에 설정한 내용이랑 잘 조합해서 스프링부트가 알아서 EntityManager를 받아온다
    private final EntityManager em;

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

    @Override
    public Member save(Member member) {
        //persist() 영구 저장한다는 메소드
        //JPA가 알아서 insert 쿼리 만들어서 id까지 set해준다
        em.persist(member);
        return member;
    }

    @Override
    public Optional<Member> findById(Long id) {
        //find(조회할 타입, 식별자값)
        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() {
        //select 하는데 entity Member를 select 함
        return em.createQuery("select m from Member m", Member.class)
                .getResultList();
    }
}

 

- MemberService.java

//JPA를 사용하려면 Transactional이 있어야 한다.
//join에서만 필요한데 일단은 여기다 붙여준다.
//JPA는 join들어올때  모든 데이터 변경이 전부 트랜잭션안에서 실행된다
@Transactional
public class MemberService {

 

- SpringConfig.java

    /* JPA용 */
    private EntityManager em;

    @Autowired
    public SpringConfig(EntityManager em) {
        this.em = em;
    }

    @Bean
    public MemberRepository memberRepository() {
        //interface는 new가 안되므로 구현체를 return 해준다.
//        return new MemoryMemberRepository();
//        return new JdbcMemberRepository(dataSource);
//        return new JdbcTemplateMemberRepository(dataSource);
        return new JpaMemberRepository(em);
    }

 

- 테스트 결과

반응형