오늘이라도
[VI. 스프링 DB 접근 기술] 22. JPA 본문
반응형
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);
}
- 테스트 결과
반응형
'인프런 > 스프링 입문 (김영한)' 카테고리의 다른 글
[VII. AOP] 24. AOP가 필요한 상황 (0) | 2022.01.13 |
---|---|
[VI. 스프링 DB 접근 기술] 23. 스프링 데이터 JPA (0) | 2022.01.13 |
[VI. 스프링 DB 접근 기술] 21. 스프링 JdbcTemplate (0) | 2022.01.10 |
[VI. 스프링 DB 접근 기술] 20. 스프링 통합 테스트 (0) | 2022.01.10 |
[VI. 스프링 DB 접근 기술] 19. 순수 JDBC (0) | 2022.01.10 |