ํธ๋์ญ์ AOP + ์์ธ ์ ํ ์ ์ฉํ Service ๊ณ์ธต ๋ถ๋ฆฌ
by rlaehddnd0422Repository ๋ฐ์ดํฐ ๋ฒ ์ด์ค ์ ๊ทผ ๊ณ์ธต์์ ๋ฐ์ํ ์์ธ๊ฐ Service ๊ณ์ธต๊น์ง ๋์๋๋ ์์ธ๋์ ๋ฌธ์ ๋ฅผ ์์ธ ์ ํ์ ์ ์ฉํด์ ํด๊ฒฐํด ๋ณด๊ฒ ์ต๋๋ค. ์์ธ ๋์๊น์ง ์ฒ๋ฆฌํ๊ฒ๋๋ฉด ์ต์ข ์ ์ผ๋ก Service๊ณ์ธต์ ์์ํ ๋น์ฆ๋์ค๋ก์ง์ ๋ฌ์ฑํ ์ ์๊ฒ ๋ฉ๋๋ค.
๋จผ์ ์ด์ MemberRepository ์ธํฐํ์ด์ค๋ฅผ ๋์ ํด์ ๊ตฌํ ๊ธฐ์ ์ ์ฝ๊ฒ ๊ฐ์๋ผ์ธ ์ ์๋๋ก ํ๊ฒ ์ต๋๋ค.
๊ธฐ์กด์ ์ธํฐํ์ด์ค๋ฅผ ๋์ ํ์ง ์์๋ ์ด์ ๋ ์ธํฐํ์ด์ค์๋ ๋ฉ์๋๋ฅผ ์ ์ธํ ๋, throws SQLException์ ๋ถ์ฌ์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋์ ํ์ง ์์์ง๋ง(throws SQLException์ ์ ์ฉํ๊ฒ ๋๋ฉด ์ธํฐํ์ด์ค ๋ํ ํน์ ๊ธฐ์ ์ ์์กดํ๊ธฐ ๋๋ฌธ์ DIP๋ฅผ ์งํจ๋ค๊ณ ๋ณด๊ธฐ ์ด๋ ค์), ์ด์ ์ค์ DB๋ก ๋ถํฐ ๋์๋ Check ์์ธ๋ฅผ Unchecked ์์ธ๋ก ์ ํํด์ ๋์ง ์์ ์ด๋ฏ๋ก ์ด์ ์์ผ ์ธํฐํ์ด์ค๋ฅผ ๋์ ํ์ต๋๋ค.
MemberRepositoryt Interface
public interface MemberRepository {
Member save(Member member);
Member findById(String memberId);
void update(String memberId, int money);
void delete(String memberId);
}
์ ํํ Unchekced ๋ฐํ์ ์์ธ ์ ์
public class MyDbException extends RuntimeException{
public MyDbException() {
}
public MyDbException(String message) {
super(message);
}
public MyDbException(String message, Throwable cause) {
super(message, cause);
}
public MyDbException(Throwable cause) {
super(cause);
}
}
MemberRepositoryV4_1
public class MemberRepositoryV4_1 implements MemberRepository {
...
public Member save(Member member)
{
String sql = "insert into member(member_id, money) values(?,?)";
Connection con = null;
PreparedStatement pstmt = null;
try
{
con = getConnection();
pstmt = con.prepareStatement(sql);
pstmt.setString(1,member.getMemberId());
pstmt.setInt(2, member.getMoney());
pstmt.executeUpdate();
return member;
} catch (SQLException e) {
log.error("db error",e);
throw new MyDbException(e);
}finally {
close(con, pstmt, null);
}
}
...
}
- ์์ธ๋ฅผ ์์์ ์ ์ํ ๋ฐํ์ ์์ธ๋ก ์ ํํด์ ๋์ง๋ ๋ฐฉ์์ ์ฑํํจ์ผ๋ก์จ ๋ฉ์๋ ์์ "throws ์์ธ"๋ฅผ ๋ถํ์ฃผ์ง ์์๋ ๋๊ฒ ๋์์ต๋๋ค.
- save ๋ฉ์๋ ๋ฟ๋ง ์๋๋ผ update, findById, delete์๋ ๋์ผํ๊ฒ ์ ์ฉ๋ฉ๋๋ค.
- ์ด๋ ๊ฒ ์์ธ๋ฅผ ๋ฐํ์ ์์ธ๋ก ์ ํํ๊ฒ ๋๋ฉด Repository ๊ณ์ธต ๋ฟ๋ง ์๋๋ผ Service ๊ณ์ธต์์๋ throws ํค์๋๋ฅผ ์๋ตํ ์ ์์ต๋๋ค.
์ด์ MemberService ๋ํ ์ธํฐํ์ด์ค๋ก ์ ํํด๋ ๋ฉ๋๋ค.
MemberService Interface
public interface MemberService {
public void accountTransfer(String fromId, String toId, int money);
}
MemberServiceV4
@Slf4j
@RequiredArgsConstructor
public class MemberServiceV4 implements MemberService{
private final MemberRepository memberRepository;
@Transactional
public void accountTransfer(String fromId, String toId, int money) {
buisnesslogic(fromId,toId,money);
}
private void buisnesslogic(String fromId, String toId, int money) {
// ๋น์ฆ๋์ค ๋ก์ง
Member fromMember = memberRepository.findById(fromId);
Member toMember = memberRepository.findById(toId);
memberRepository.update(fromId, fromMember.getMoney()- money);
validation(toMember);
memberRepository.update(toId,toMember.getMoney()+ money);
}
- ์ด์ ์๋น์ค ๊ณ์ธต์ ๊ณ์ข์ด์ฒด ๋น์ฆ๋์ค ๋ก์ง์ "throws ์์ธ" ํค์๋๋ฅผ ์ ๊ฑฐํ์ฌ ์์ธ๋์ ๋ฌธ์ ๊น์ง ํด๊ฒฐํ๋ฉด์ ๋น์ฆ๋์ค ๋ก์ง์ ๊น๋ํ๊ฒ ์งค ์ ์์ต๋๋ค.
TestCode
@TestConfiguration
static class TestConfig
{
private final DataSource dataSource;
public TestConfig(DataSource dataSource)
{
// dataSource - application.properties ์ ๋ฑ๋ก๋์ด ์๋ ์ฃผ์
๋จ
// JDBC - DataSource๋ DriverManagerDataSource(URL,USERNAME,PASSWORD),
// TransactionManager๋ JdbcTransactionManager ์๋ ๋ฑ๋ก
this.dataSource = dataSource;
}
@Bean
MemberRepository memberRepository()
{
return new MemberRepositoryV4_3(dataSource);
}
@Bean
MemberService memberService()
{
return new MemberServiceV4(memberRepository());
}
}
๊ตฌํ์ฒด๋ ์คํ๋ง ์ปจํ ์ด๋์ ๋ฑ๋กํด DI ํด์ฃผ์์ต๋๋ค.
<์ฐธ๊ณ ์๋ฃ>
'๐ Backend > DB Access' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring์ด ์ ๊ณตํ๋ ์์ธ ์ถ์ํ, ์์ธ ๋ณํ๊ธฐ ์ฌ์ฉ (0) | 2023.04.07 |
---|---|
ErrorCode๋ฅผ ์ด์ฉํ ํน์ ์์ธ ๋ณต๊ตฌ (0) | 2023.04.07 |
Spring ํธ๋์ญ์ AOP - @Transactional ์ฌ์ฉ (0) | 2023.04.05 |
ํธ๋์ญ์ ์ธํฐํ์ด์ค, ํธ๋์ญ์ ํ ํ๋ฆฟ์ ์ด์ฉํ Service ๊ณ์ธต์ Transaction ๋ฌธ์ ํด๊ฒฐ (0) | 2023.04.05 |
Spring์ ์ฌ์ฉํ์ง ์๊ณ Transaction ํด๊ฒฐ (0) | 2023.04.04 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422