김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술을 보면서 공부한 내용입니다.
넘 길어져서 두개로 나눴다,,
반복 코드 제거 + SQL 직접 실행
→ 객체중심의 설계 & 생산성에 큰 향상
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.h2database:h2'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none
spring.jpa.show-sql : JPA가 생성하는 sql의 출력
spring.jpa.hibernate.ddl-auto : JPA의 모델 자동 생성 기능
→ create 사용시에는 model에 따라 자동으로 테이블 생성해주는 기능
→ ORM
: db의 테이블과 일대일 매핑해준다.
→ 객체의 인스턴스 하나가 테이블 레코드 하나임
: 테이블상의 PK와 마찬가지로, 엔티티를 유일하게 식별할 수 있는 키
: db에 입력시 db가 자동으로 PK를 생성해서 인서트되므로
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
→ MySQL의 Auto Increament와 같다고 생각하면 될 것 같다.
JPA 사용하면서 데이터를 저장/변경 시에는 항상 트랜잭션이 있어야한다.
→ Service계층에 @Transactional 추가하기
→ 모든 데이터의 변경이 트랜잭션안에서
: 엔티티 관리를 수행하는 클래스
private final EntityManager em;
public JPAMemberRepository(EntityManager em) {
this.em = em;
}
: find() 사용
@Override
public Optional<Member> findById(Long id) {
Member member = em.find(Member.class, id);
return Optional.ofNullable(member);
}
: JPQL 사용
→ 엔티티를 대상으로 쿼리를 날리면 sql로 변환됨 -> 객체 자체의 셀렉트
@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();
}
JPAMemberRepository를 빈에 등록한다.
return new JPAMemberRepository(em);
음 초록불 굿,,
아까 application.properties에서 설정해준대로, 콘솔창에 JPA가 생성한 쿼리문이 찍히는 것도 확인이 가능하다.
JPA는 자바 진영안의 표준으로 기술명세이다.
→ 라이브러리가 아닌 인터페이스!
: 자바 어플리케이션에서 RDB스를 어떻게 사용해야 하는지를 정의
Hibernate는 이의 구현체이다.
김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술을 보면서 공부한 내용입니다.