From 12c0ec71dc127e49a2d2a5dd585210b4d6b66bfb Mon Sep 17 00:00:00 2001 From: haerong22 Date: Thu, 5 May 2022 11:53:39 +0900 Subject: [PATCH] #9 jdbc: JdbcTemplate --- .../jdbc/repository/MemberRepositoryV5.java | 60 +++++++++ .../jdbc/service/MemberServiceV5Test.java | 114 ++++++++++++++++++ 2 files changed, 174 insertions(+) create mode 100644 jdbc/src/main/java/com/example/jdbc/repository/MemberRepositoryV5.java create mode 100644 jdbc/src/test/java/com/example/jdbc/service/MemberServiceV5Test.java diff --git a/jdbc/src/main/java/com/example/jdbc/repository/MemberRepositoryV5.java b/jdbc/src/main/java/com/example/jdbc/repository/MemberRepositoryV5.java new file mode 100644 index 00000000..b68e2dfc --- /dev/null +++ b/jdbc/src/main/java/com/example/jdbc/repository/MemberRepositoryV5.java @@ -0,0 +1,60 @@ +package com.example.jdbc.repository; + +import com.example.jdbc.domain.Member; +import lombok.extern.slf4j.Slf4j; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; + +import javax.sql.DataSource; + +/** + * JdbcTemplate 사용 + */ +@Slf4j +public class MemberRepositoryV5 implements MemberRepository { + + private final JdbcTemplate template; + + public MemberRepositoryV5(DataSource dataSource) { + this.template = new JdbcTemplate(dataSource); + } + + @Override + public Member save(Member member) { + String sql = "insert into member(member_id, money) values(?, ?)"; + + template.update(sql, member.getMemberId(), member.getMoney()); + + return member; + } + + @Override + public Member findById(String memberId) { + String sql = "select * from member where member_id = ?"; + + return template.queryForObject(sql, memberRowMapper(), memberId); + } + + private RowMapper memberRowMapper() { + return (rs, rowNum) -> { + Member member = new Member(); + member.setMemberId(rs.getString("member_id")); + member.setMoney(rs.getInt("money")); + return member; + }; + } + + @Override + public void update(String memberId, int money) { + String sql = "update member set money=? where member_id=?"; + + template.update(sql, money, memberId); + } + + @Override + public void delete(String memberId) { + String sql = "delete from member where member_id=?"; + + template.update(sql, memberId); + } +} diff --git a/jdbc/src/test/java/com/example/jdbc/service/MemberServiceV5Test.java b/jdbc/src/test/java/com/example/jdbc/service/MemberServiceV5Test.java new file mode 100644 index 00000000..ae6a55ef --- /dev/null +++ b/jdbc/src/test/java/com/example/jdbc/service/MemberServiceV5Test.java @@ -0,0 +1,114 @@ +package com.example.jdbc.service; + +import com.example.jdbc.domain.Member; +import com.example.jdbc.repository.MemberRepository; +import com.example.jdbc.repository.MemberRepositoryV5; +import lombok.extern.slf4j.Slf4j; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.aop.support.AopUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.annotation.Bean; + +import javax.sql.DataSource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +/** + * JdbcTemplate 사용 + */ +@Slf4j +@SpringBootTest +class MemberServiceV5Test { + + public static final String MEMBER_A = "memberA"; + public static final String MEMBER_B = "memberB"; + public static final String MEMBER_EX = "ex"; + + @Autowired + private MemberRepository memberRepository; + @Autowired + private MemberServiceV4 memberService; + + @TestConfiguration + static class TestConfig { + + private final DataSource dataSource; + + public TestConfig(DataSource dataSource) { + this.dataSource = dataSource; + } + + @Bean + MemberRepository memberRepository() { + return new MemberRepositoryV5(dataSource); + } + + @Bean + MemberServiceV4 memberServiceV4() { + return new MemberServiceV4(memberRepository()); + } + } + + @AfterEach + void after() { + memberRepository.delete(MEMBER_A); + memberRepository.delete(MEMBER_B); + memberRepository.delete(MEMBER_EX); + } + + @Test + void AopCheck() { + log.info("memberService class={}", memberService.getClass()); + log.info("memberRepository class={}", memberRepository.getClass()); + + Assertions.assertThat(AopUtils.isAopProxy(memberService)).isTrue(); + Assertions.assertThat(AopUtils.isAopProxy(memberRepository)).isFalse(); + } + + @Test + @DisplayName("정상 이체") + void accountTransfer() { + // given + Member memberA = new Member(MEMBER_A, 10000); + Member memberB = new Member(MEMBER_B, 10000); + memberRepository.save(memberA); + memberRepository.save(memberB); + + // when + memberService.accountTransfer(memberA.getMemberId(), memberB.getMemberId(), 2000); + + // then + Member findMemberA = memberRepository.findById(memberA.getMemberId()); + Member findMemberB = memberRepository.findById(memberB.getMemberId()); + + assertThat(findMemberA.getMoney()).isEqualTo(8000); + assertThat(findMemberB.getMoney()).isEqualTo(12000); + } + + @Test + @DisplayName("이체중 예외 발생") + void accountTransferEx() { + // given + Member memberA = new Member(MEMBER_A, 10000); + Member memberEx = new Member(MEMBER_EX, 10000); + memberRepository.save(memberA); + memberRepository.save(memberEx); + + // when + assertThatThrownBy(() -> memberService.accountTransfer(memberA.getMemberId(), memberEx.getMemberId(), 2000)) + .isInstanceOf(IllegalStateException.class); + + // then + Member findMemberA = memberRepository.findById(memberA.getMemberId()); + Member findMemberB = memberRepository.findById(memberEx.getMemberId()); + + assertThat(findMemberA.getMoney()).isEqualTo(10000); + assertThat(findMemberB.getMoney()).isEqualTo(10000); + } +} \ No newline at end of file