MyJdbcTemplate에서 Connection을 받도록 만들어놨다.
하지만 MyDataSource에서 트랜잭션 감지 기능이 추가된 DataSource가 추가되면서
Connection을 직접 주고 받을 필요없이 MyDataSource에서 커넥션을 뽑아 쓸 수 있게됐다.
MyJdbcTemplate에서Connection을 받는 메소드 제거하고
MyDataSource로Connection을 받는 방식으로 바꿀 것이다.
public class MyJdbcTemplate {
private final MyDataSource myDataSource; // 추가됨
// 추가됨
public MyJdbcTemplate(MyDataSource myDataSource) {
this.myDataSource = myDataSource;
}
// 제거됨
/* public int update(Connection conn, MyPreparedStatementCreator psc, MyKeyHolder myKeyHolder) {
// 커넥션을 직접 받는다.
try(PreparedStatement ps = psc.createPreparedStatement(conn)) {
int result = ps.executeUpdate();
myKeyHolder.setId(findGeneratedId(ps));
return result;
} catch (SQLException e) {
throw new RuntimeException(e);
}
} */
// 추가됨
public int update(MyPreparedStatementCreator psc, MyKeyHolder myKeyHolder) {
try(
// 커넥션을 직접 뽑아 쓴다.
Connection conn = myDataSource.getConnection();
PreparedStatement ps = psc.createPreparedStatement(conn)
) {
int result = ps.executeUpdate();
myKeyHolder.setId(findGeneratedId(ps));
return result;
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
...
}
MyJdbcTemplate 내부적으로 Connection을 얻어오면서,
Repository에서 Connection 의존성이 제거됐다.
public class UsersRepository {
// private final MyDataSource myDataSource; 제거됨 - 1
private final MyJdbcTemplate myJdbcTemplate;
// 제거됨 - 1
/* public UsersRepository(MyDataSource myDataSource, MyJdbcTemplate myJdbcTemplate) {
this.myDataSource = myDataSource;
this.myJdbcTemplate = myJdbcTemplate;
} */
// 추가됨 - 1
public UsersRepository(MyJdbcTemplate myJdbcTemplate) {
this.myJdbcTemplate = myJdbcTemplate;
}
// 제거됨 - 2
/* public Users findById(long id) {
try (Connection conn = myDataSource.getConnection()) {
try {
return myJdbcTemplate.queryForObject(conn, """
SELECT id, name, balance
FROM USERS
WHERE id = ?
""",
userRowMapper, id);
} catch(EmptyResultException e) {
throw new IllegalArgumentException("음식을 찾을 수 없습니다. userId=%d".formatted(id), e);
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
} */
// 추가됨 - 2
public Users findById(long id) {
try {
return myJdbcTemplate.queryForObject("""
SELECT id, name, balance
FROM USERS
WHERE id = ?
""",
userRowMapper, id);
} catch(EmptyResultException e) {
throw new IllegalArgumentException("음식을 찾을 수 없습니다. userId=%d".formatted(id), e);
}
}
// 제거됨 - 3
/* public void updateBalance(long userId, int balance) {
try (Connection conn = myDataSource.getConnection()) {
myJdbcTemplate.update(conn, """
UPDATE users
SET balance = ?
WHERE id = ?
""", balance, userId);
} catch (SQLException e) {
throw new RuntimeException(e);
}
} */
// 추가됨 - 3
public void updateBalance(long userId, int balance) {
myJdbcTemplate.update("""
UPDATE users
SET balance = ?
WHERE id = ?
""", balance, userId);
}
...
}