Spring/spring_old

07./ Spring Web MVC-DB연계-jdbc template

slow333 2023. 1. 13. 22:42

repository에서 jdbcMemberRepository를 JdbcTemplateMemberRepository로 변경

짧으니까 보면서 하던지 외우던지 해야 할듯...

public class JdbcTemplateMemberRepository implements MemberRepository{

  private final JdbcTemplate jdbcTemplate;

  @Autowired
  public JdbcTemplateMemberRepository(DataSource dataSource) {
    this.jdbcTemplate = new JdbcTemplate(dataSource);
  }

  @Override
  public Long save(Member member) throws ClassNotFoundException {
    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));
    return member.getId();
  }

  @Override
  public Optional<Member> findById(Long id) {
    List<Member> members = jdbcTemplate.query("select * from member where id = ?", memberRowMapper(), id);
    return members.stream().findAny();
  }

  @Override
  public Optional<Member> findByName(String name) {
    List<Member> members = jdbcTemplate.query("select * from member where name = ?", memberRowMapper(), name);
    return members.stream().findAny();
  }

  @Override
  public List<Member> findAll() {
    return jdbcTemplate.query("select * from member", memberRowMapper());
  }

  private RowMapper<Member> memberRowMapper() {
    return (rs, rowNum) -> {

      Member member = new Member();
      member.setId(rs.getLong("id"));
      member.setName(rs.getString("name"));
      member.setRegDate(rs.getDate("regdate"));
      return member;
    };
  }
}

@Configuration 변경

  @Bean
  public MemberRepository memberRepository(){
//    return new MemoryMemberRepository();
//    return new JdbcMemberRepository(dataSource);
    return new JdbcTemplateMemberRepository(dataSource);
  }

@Test

Spring test를 위해서는

@SpringBootTest와 @Transactional을 해 주어야함

==> Transational을 해주어야 개별 시험 후 원복(rollback)해서 시험이 정상으로 수행됨

개별 시험하는 것도 나뿐 방법은 아님

@SpringBootTest
@Transactional
class MemberServiceSpringTest {

  @Autowired MemberService memberService;
  @Autowired MemberRepository memberRepository ;

  @Test
  void join() throws ClassNotFoundException {
    //given
    Member member = new Member();
    member.setId(null);
    member.setName("5644asdf-OK");
    member.setRegDate(null);
    memberService.join(member);
//
//    Member byId = memberService.findId(joinId).get();
//    assertThat(byId.getName()).isEqualTo(member.getName());
  }

  @Test
  void checkDuplicateMember() throws ClassNotFoundException {
    Member member = new Member();
    member.setName("sp1dfs");
    member.setRegDate(new Date());

    Member member2 = new Member();
    member2.setName("sp1asf");
    member2.setRegDate(new Date());

    memberService.join(member);
    IllegalStateException e = Assertions.assertThrows(IllegalStateException.class, () -> memberService.join(member2));
    assertThat(e.getMessage()).isEqualTo("이미 회원이 있습니다.");
  }

  @Test
  void findMembers() throws ClassNotFoundException {
    Member member = new Member();
    member.setName("sp1asasf");
    member.setRegDate(new Date());
    memberService.join(member);

    Member member1 = new Member();
    member1.setName("sp2789g");
    member1.setRegDate(new Date());
    memberService.join(member1);

    List<Member> members = memberService.findMembers();
    System.out.println(members);
  }

  @Test
  void findId() {
  }
}