# ํŠธ๋žœ์žญ์…˜ AOP + ์˜ˆ์™ธ ์ „ํ™˜ ์ ์šฉํ•œ Service ๊ณ„์ธต ๋ถ„๋ฆฌ
Study Repository

ํŠธ๋žœ์žญ์…˜ AOP + ์˜ˆ์™ธ ์ „ํ™˜ ์ ์šฉํ•œ Service ๊ณ„์ธต ๋ถ„๋ฆฌ

by rlaehddnd0422

Repository ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ ‘๊ทผ ๊ณ„์ธต์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๊ฐ€ Service ๊ณ„์ธต๊นŒ์ง€ ๋ˆ„์ˆ˜๋˜๋Š” ์˜ˆ์™ธ๋ˆ„์ˆ˜ ๋ฌธ์ œ๋ฅผ ์˜ˆ์™ธ ์ „ํ™˜์„ ์ ์šฉํ•ด์„œ ํ•ด๊ฒฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ์™ธ ๋ˆ„์ˆ˜๊นŒ์ง€ ์ฒ˜๋ฆฌํ•˜๊ฒŒ๋˜๋ฉด ์ตœ์ข…์ ์œผ๋กœ Service๊ณ„์ธต์˜ ์ˆœ์ˆ˜ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค๋กœ์ง์— ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

๋จผ์ € ์ด์ œ MemberRepository ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋„์ž…ํ•ด์„œ ๊ตฌํ˜„ ๊ธฐ์ˆ ์„ ์‰ฝ๊ฒŒ ๊ฐˆ์•„๋ผ์šธ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•จ์œผ๋กœ์จ DIP ์ ์šฉ ๊ฐ€๋Šฅ

๊ธฐ์กด์— ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋„์ž…ํ•˜์ง€ ์•Š์•˜๋˜ ์ด์œ ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์—๋„ ๋ฉ”์†Œ๋“œ๋ฅผ ์„ ์–ธํ•  ๋•Œ, 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 ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

<์ฐธ๊ณ ์ž๋ฃŒ>

 

 

์Šคํ”„๋ง DB 1ํŽธ - ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ํ•ต์‹ฌ ์›๋ฆฌ - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ DB ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ธฐ์ˆ ์„ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์ดํ•ดํ•˜๊ณ , ์™„์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง DB ์ ‘๊ทผ ๊ธฐ์ˆ ์˜ ์›๋ฆฌ์™€ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ , ๋” ๊นŠ์ด์žˆ๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., - ๊ฐ•์˜

www.inflearn.com

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Study Repository

rlaehddnd0422

ํ™œ๋™ํ•˜๊ธฐ