김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술을 보면서 공부한 내용입니다.
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으로 자동 생성을 끄고 사용한다.
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라는 객체 자체를 조회함
}
}
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);
}