목차
JdbcTemplate
public class JdbcTemplateMemberRepository implements MemberRepository {
private final JdbcTemplate jdbcTemplate;
public JdbcTemplateMemberRepository(DataSource dataSource) {
jdbcTemplate = new JdbcTemplate(dataSource);
}
...
}
//JdbcTemplateMemberRepository.java
@Override
public Member save(Member member) {
SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
jdbcInsert.withTableName("member").usingGeneratedKeyColumns("id");
Map<String, Object> parameters = new HashMap<>();
parameters.put("name", member.getName()); //(필드이름, 값)
Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(parameters));
member.setId(key.longValue());
return member;
}
// JdbcTemplateMemberRepository.java > 저장 부분
@Override
public Optional<Member> findByName(String name) {
List<Member> result = jdbcTemplate.query("select * from member where name = ?", memberRowMapper(), name);
return result.stream().findAny();
} //이름으로 조회 기능
private RowMapper<Member> memberRowMapper() {
return (rs, rowNum) -> {
Member member = new Member();
member.setId(rs.getLong("id"));
member.setName(rs.getString("name"));
return member;
};
} // memberRowMapper구현 코드
@Bean
public MemberRepository memberRepository() {
//return new MemoryMemberRepository();
//return new JdbcMemberRepository(dataSource);
return new JdbcTemplateMemberRepository(dataSource);
}
// SpringConfig.java
테스트 정상 작동
JPA
& 반복 코드는 물론이고, 기본적인 SQL도 JPA가 직접 만들어서 실행
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa
// build.gradle > dependencies
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none
// application.properties
@Entity
public class Member {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
...
}
// Member.java
public class JpaMemberRepository implements MemberRepository{
private final EntityManager em; // ENtityManager 생성
public JpaMemberRepository(EntityManager em) {
this.em = em;
}
public Member save(Member member) { // 저장
em.persist(member); // DB 저장
return member;
}
public Optional<Member> findById(Long id) { // id로 찾기
Member member = em.find(Member.class, id); //@id 기반으로 검색
return Optional.ofNullable(member);
}
public List<Member> findAll() { // 모두 찾기
return em.createQuery("select m from Member m", Member.class)
.getResultList(); // alias로 전체 조회
}
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.java
테스트 및 Hibernate=true 확인
스프링 데이터 JPA
public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository {
@Override
Optional<Member> findByName(String name);
}
// SpringDataJpaMemberRepository.java(인터페이스)
...
private final MemberRepository memberRepository;
public SpringConfig(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Bean
public MemberService memberService() {
return new MemberService(memberRepository);
}
...
// SpringConfig.java