스프링 DB 접근 기술-1

황준하·2023년 7월 7일

Spring 기본

목록 보기
9/38
post-thumbnail

개방-폐쇄 원칙 (OCP, Open-Closed Principle)

확장에는 열려있고, 수정, 변경에는 닫혀있다.

스프링 통합 테스트

@SpringBootTest
@Transactional
class MemberServiceIntegrationTest {


    @Autowired MemberService memberService;
    @Autowired MemberRepository memberRepository;

    @Test
    void 회원가입() {
        //given

        Member member = new Member();
        member.setName("spring");

        //when
        Long saveId = memberService.join(member);

        //then
        Member findMember = memberService.findOne(saveId).get();

        assertThat(member.getName()).isEqualTo(findMember.getName());
    }

    @Test
    public void 중복_회원_예외() {
        //given
        Member member1 = new Member();
        //ctrl + space , ctrl + shift + enter
        member1.setName("spring");

        Member member2 = new Member();
        //shift + F6
        member2.setName("spring");

        //when
        memberService.join(member1);
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
        //ctrl alt V
        assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
    }

@SpringBootTest: 스프링 컨테이너와 테스트를 함께 실행한다.

@Transactional: 테스트를 위해 join을 하고 findOne도 한 후 transaction이 롤백된다.

\=> 기존에 데이터를 지우는 코드를 넣지 않아도 반복적으로 테스트를 할 수 있다.

통합테스트보다 단위테스트가 더 좋은 테스트일 확률이 높다.

스프링 JdbcTemplate

생성자가 하나만 있으면 스프링 빈으로 등록되었을때 AutoWired를 생략할 수 있다.

public class JdbcTemplateMemberRepository implements MemberRepository{

    private final JdbcTemplate jdbcTemplate;

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

    @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;
    }

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

    @Override
    public Optional<Member> findByName(String name) {
        List<Member> result = jdbcTemplate.query("select * from member where name = ?", memberRowMapper(), name);
        return result.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"));
            return member;
        };
    }
}

springConfig.java

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

0개의 댓글