+) 22. 09. 03. μ 리 μΆκ°!!
μΉμ 4. μ€νλ§κ³Ό λ¬Έμ ν΄κ²° - νΈλμμ μκ° μλ£!!
νλ μ ν μ΄μ κ³μΈ΅
μλΉμ€ κ³μΈ΅
λ°μ΄ν° μ κ·Ό κ³μΈ΅
μμν μλΉμ€ κ³μΈ΅
μ¬κΈ°μ κ°μ₯ μ€μν κ³³μ ν΅μ¬ λΉμ¦λμ€ λ‘μ§μ΄ λ€μ΄μλ μλΉμ€ κ³μΈ΅μ΄λ€. λΉμ¦λμ€ λ‘μ§μ μ΅λν λ³κ²½μμ΄ μ μ§λμ΄μΌ νλ€.
μ΄λ κ² νλ €λ©΄ μλΉμ€ κ³μΈ΅μ νΉμ κΈ°μ μ μ’
μμ μ΄μ§ μκ² κ°λ°ν΄μΌ νλ€. μμ κ°μ΄ κ³μΈ΅μ λλ μ΄μ λ μλΉμ€ κ³μΈ΅μ μ΅λν μμνκ² μ μ§νκΈ° μν λͺ©μ μ΄ ν¬λ€.
μ 리νμλ©΄ μλΉμ€ κ³μΈ΅μ κ°κΈμ λΉμ¦λμ€ λ‘μ§λ§ ꡬννκ³ νΉμ κΈ°μ μ μ§μ μμ‘΄ν΄μλ μ λλ€. μ΄λ κ² νλ©΄ ν₯ν ꡬν κΈ°μ μ΄ λ³κ²½λ λ λ³κ²½ μν₯ λ²μλ₯Ό μ΅μνν μ μλ€.
@RequiredArgsConstructor
public class MemberServiceV1 {
private final MemberRepositoryV1 memberRepository;
public void accountTransfer(String fromId, String toId, int money) throws SQLException {
Member fromMember = memberRepository.findById(fromId);
Member toMember = memberRepository.findById(toId);
memberRepository.update(fromId, fromMember.getMoney() - money);
memberRepository.update(toId, toMember.getMoney() + money);
}
}
MemberServiceV1μ νΉμ κΈ°μ μ μ’
μμ μ΄μ§ μκ³ μμν λΉμ¦λμ€ λ‘μ§λ§ μ‘΄μ¬νλ€. νΉμ κΈ°μ κ³Ό κ΄λ ¨λ μ½λκ° κ±°μ μμ΄μ μ½λκ° κΉλνκ³ μ μ§λ³΄μνκΈ° μ½λ€.
νμ§λ§ μ¬κΈ°μλ λ¨μ λ¬Έμ κ° μλ€. λ°λ‘ SQLExceptionμ΄λΌλ JDBC κΈ°μ μ μμ‘΄νλ€λ μ μ΄λ€.
κ·Έλ¦¬κ³ MemberRepositoryV1μ΄λΌλ ꡬ체 ν΄λμ€μ μ§μ μμ‘΄νκ³ μλ€. μ΄κ²μ MemberRepository μΈν°νμ΄μ€λ₯Ό λμ
νμ¬ MemberServiceμ μ½λ λ³κ²½ μμ΄ λ€λ₯Έ ꡬν κΈ°μ λ‘ μμ½κ² λ³κ²½ν μ μλ€.
public class MemberServiceV2 {
private final DataSource dataSource;
private final MemberRepositoryV2 memberRepository;
public void accountTransfer(String fromId, String toId, int money) throws SQLException {
Connection con = dataSource.getConnection();
try {
con.setAutoCommit(false); //νΈλμμ
μμ
//λΉμ¦λμ€ λ‘μ§
bizLogic(con, fromId, toId, money);
con.commit(); //μ±κ³΅ μ 컀λ°
} catch (Exception e) {
con.rollback(); //μ€ν¨ μ λ‘€λ°±
throw new IllegalStateException(e);
} finally {
release(con);
}
}
}
νΈλμμ
μ λΉμ¦λμ€ λ‘μ§μ΄ μλ μλΉμ€ κ³μΈ΅μμ μμνλ κ²μ΄ μ’λ€.
κ·Έλ¬λ λ¬Έμ λ, νΈλμμ
μ μ¬μ©νκΈ° μν΄ javax.sql.DataSource
, java.sql.Connection
, java.sql.SQLException
κ°μ JDBC κΈ°μ μ μμ‘΄ν΄μΌ νλ€λ μ μ΄λ€.
κ²°κ³Όμ μΌλ‘ λΉμ¦λμ€ λ‘μ§λ³΄λ€ JDBCλ₯Ό μ¬μ©ν΄μ νΈλμμ
μ μ²λ¦¬νλ μ½λκ° λ λ§λ€. ν΅μ¬ λΉμ¦λμ€ λ‘μ§κ³Ό JDBC κΈ°μ μ΄ μμ¬ μμ΄μ μ μ§λ³΄μνκΈ° μ΄λ ΅λ€.
JDBC ꡬν κΈ°μ μ΄ μλΉμ€ κ³μΈ΅μ λμλλ λ¬Έμ
νΈλμμ λκΈ°ν λ¬Έμ
νΈλμμ μ μ© λ°λ³΅ λ¬Έμ
ꡬν κΈ°μ μ λ°λ₯Έ νΈλμμ μ¬μ©λ²
νΈλμμ μΆμν μΈν°νμ΄μ€
public interface TxManager {
begin();
commit();
rollback();
}
TxManager μΈν°νμ΄μ€λ₯Ό κΈ°λ°μΌλ‘ κ°κ°μ κΈ°μ μ λ§λ ꡬν체λ₯Ό λ§λ€λ©΄ λλ€.
μλΉμ€λ νΉμ νΈλμμ
μ κΈ°μ μ μ§μ μμ‘΄νλ κ²μ΄ μλλΌ, TxManager
λΌλ μΆμνλ μΈν°νμ΄μ€μ μμ‘΄νλ€. μ΄μ μνλ ꡬν체λ₯Ό DIλ₯Ό ν΅ν΄ μ£Όμ
νλ©΄ λλ€.
μ°λ¦¬λ μ€νλ§μ΄ μ 곡νλ νΈλμμ μΆμν κΈ°μ μ μ¬μ©νλ©΄ λλ€.
μ€νλ§ νΈλμμ
μΆμνμ ν΅μ¬μ PlatformTransactionManager
μΈν°νμ΄μ€μ΄λ€.
PlatformTransactionManager μΈν°νμ΄μ€
public interface PlatformTransactionManager extends TransactionManager {
TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
μ€νλ§μ΄ μ 곡νλ νΈλμμ 맀λμ λ ν¬κ² 2κ°μ§ μν μ νλ€.
νΈλμμ 맀λμ μ νΈλμμ λκΈ°ν 맀λμ
μ€νλ§μ νΈλμμ
λκΈ°ν 맀λμ λ₯Ό μ 곡νλ€. μ΄κ²μ ThreadLocal
μ μ¬μ©ν΄μ 컀λ₯μ
μ λκΈ°ν ν΄μ€λ€. νΈλμμ
맀λμ λ λ΄λΆμμ νΈλμμ
λκΈ°ν 맀λμ λ₯Ό μ¬μ©νλ€.
컀λ₯μ
μ΄ νμνλ©΄ νΈλμμ
λκΈ°ν 맀λμ λ₯Ό ν΅ν΄ μ»μΌλ©΄ λλ€.
μ°Έκ³
μ€λ λ λ‘컬μ μ¬μ©νλ©΄ κ° μ€λ λλ§λ€ λ³λμ μ μ₯μκ° λΆμ¬λλ€. λ°λΌμ ν΄λΉ μ€λ λλ§ λ°μ΄ν°μ μ κ·Όν μ μλ€.
DataSourceUtils.getConnection()
DataSourceUtils.getConnection()
λ νΈλμμ
λκΈ°ν 맀λμ κ° κ΄λ¦¬νλ 컀λ₯μ
μ΄ μμΌλ©΄ ν΄λΉ 컀λ₯μ
μ λ°ννλ€.
νΈλμμ
λκΈ°ν 맀λμ κ° κ΄λ¦¬νλ 컀λ₯μ
μ΄ μλ κ²½μ° μλ‘μ΄ μ»€λ₯μ
μ μμ±ν΄μ λ°ννλ€.
DataSourceUtils.releaseConnection()
DataSourceUtils.releaseConnection()
μ μ¬μ©νλ©΄ 컀λ₯μ
μ λ°λ‘ λ«μ§ μλλ€.
νΈλμμ
μ μ¬μ©νκΈ° μν΄ λκΈ°νλ 컀λ₯μ
μ λ«μ§ μκ³ κ·Έλλ‘ μ μ§ν΄μ€λ€.
νΈλμμ
λκΈ°ν 맀λμ κ° κ΄λ¦¬νλ 컀λ₯μ
μ΄ μλ κ²½μ° ν΄λΉ 컀λ₯μ
μ λ«λλ€.
νΈλμμ
μ μ¬μ©νλ λ‘μ§μ μ΄ν΄λ³΄λ©΄ κ°μ ν¨ν΄μ΄ λ°λ³΅λλ κ²μ λ³Ό μ μλ€.
νΈλμμ
μ μμνκ³ , λΉμ¦λμ€ λ‘μ§μ μ€ννκ³ , μ±κ³΅νλ©΄ 컀λ°νκ³ , μ€ν¨νλ©΄ λ‘€λ°±νλ€.
μ΄λ° ννλ κ°κ°μ μλΉμ€μμ λ°λ³΅λλ€. λ¬λΌμ§λ λΆλΆμ λΉμ¦λμ€ λ‘μ§λΏμ΄λ€.
μ΄λ΄ λ ν
νλ¦Ώ μ½λ°± ν¨ν΄μ νμ©νλ©΄ λ°λ³΅ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€.
TransactionTemplate
public class TransactionTemplate {
private PlatformTransactionManager transactionManager;
public <T> T execute(TransactionCallback<T> action){..}
void executeWithoutResult(Consumer<TransactionStatus> action){..}
}
μ§κΈκΉμ§ νΈλμμ
μΆμνλ λμ
νκ³ , λ°λ³΅μ μΈ νΈλμμ
λ‘μ§μ ν΄κ²°νκΈ° μν΄ νΈλμμ
ν
νλ¦Ώλ λμ
νλ€. νμ§λ§ μλΉμ€ κ³μΈ΅μ μμν λΉμ¦λμ€ λ‘μ§λ§ λ¨κΈ΄λ€λ λͺ©νλ μμ§ λ¬μ±νμ§ λͺ»νλ€.
μ΄λ΄ λ μ€νλ§ AOPλ₯Ό ν΅ν΄ νλ‘μλ₯Ό λμ
νλ©΄ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€.
μμ€ν μ½μ μ¬μ©μ 곡κ°μ μ½λμμ 컀λ μλΉμ€(ν¨μ)λ₯Ό μμ²νλ κ³Όμ μ λ§νλ€.
μμ€ν νΈμΆ(System Call)μ μ΄μ체μ μ 컀λμ΄ μ 곡νλ μλΉμ€μ λν΄, μμ© νλ‘κ·Έλ¨μ μμ²μ λ°λΌ 컀λμ μ κ·ΌνκΈ° μν μΈν°νμ΄μ€μ΄λ€.
λ³΄ν΅ Cλ C++κ³Ό κ°μ κ³ κΈ μΈμ΄λ‘ μμ±λ νλ‘κ·Έλ¨λ€μ μ§μ μμ€ν νΈμΆμ μ¬μ©ν μ μκΈ° λλ¬Έμ κ³ κΈ APIλ₯Ό ν΅ν΄ μμ€ν νΈμΆμ μ κ·Όνκ² νλ λ°©λ²μ΄λ€.
컀λ μ½(kernel call), νΈλ©(trap)μ΄λΌκ³ λ λΆλ₯΄λ©°, μμ© νλ‘κ·Έλ¨μ΄ 컀λ κΈ°λ₯μ νμ©νλλ‘ μ 곡νλ€.
μμ€ν
νΈμΆ λΌμ΄λΈλ¬λ¦¬λ₯Ό ν΅ν΄ κ·Έ κΈ°λ₯μ μ¬μ©ν μ μλ€.
μ°λ¦¬κ° κ°λ°νλ νλ‘κ·Έλ¨μ μΌλ°μ μΌλ‘ μ μ λͺ¨λ(User Mode)μμ μ€ννλ€. νλ‘κ·Έλ¨ μ€ν μ€ μΈν°λ½νΈ(Interrupt)κ° λ°μνκ±°λ μμ€ν μ½(System Call)μ νΈμΆνκ² λλ©΄ 컀λ λͺ¨λ(Kernel Mode)λ‘ μ νλλ€.
컀λ λͺ¨λλ‘ μ νλ λμλ μ€ν μ€μ΄λ νλ‘κ·Έλ¨μ νμ¬ CPU μνλ₯Ό μ μ₯νλ€. κ·Έλ¦¬κ³ μ»€λμ΄ μΈν°λ½νΈλ μμ€ν μ½μ μ§μ μ²λ¦¬νλ€. μ²λ¦¬κ° μλ£λλ©΄ μ€λ¨λλ νλ‘κ·Έλ¨μ CPU μνλ₯Ό λ€μ 볡μνλ€.
OS 컀λμ΄ μ 곡νλ μλΉμ€λ₯Ό νλ‘κ·Έλ¨μ΄ μ΄μ©νκ³ μΆμ λ μμ€ν μ½μ μ΄μ©νλ€. μμ€ν μ½μ΄ λ°μνλ©΄ ν΄λΉ 컀λ μ½λκ° μ»€λ λͺ¨λμμ μ€νλλ€.
νλμ¨μ΄ νΉμ μμ€ν
κ΄λ ¨ κΈ°λ₯μ μ΄λ€ νλ‘κ·Έλ¨μ΄λΌλ λ°λμ μμ€ν
μ½μ ν΅ν΄μλ§ μ¬μ© κ°λ₯νλ€.
νμ§λ§ μ°λ¦¬λ κ°λ°ν λ μ§μ OS μμ€ν
μ½μ μ¬μ©ν μ μ΄ μλ€. κ·ΈλΌμλ μ°λ¦¬λ μ§κΈκΉμ§ νμΌ I/O, λ€νΈμν¬ I/O, νλ‘μΈμ€, μ€λ λ κ΄λ ¨ μμ
μ μ ν΄μλ€.
μ΄κ² μ΄λ»κ² κ°λ₯νλ κ²μΌκΉ?
μ°λ¦¬κ° μ¬μ©νλ νλ‘κ·Έλλ° μΈμ΄λ€μ΄ μμ€ν μ½μ ν¬μ₯(wrapping)νμ¬ κ°μ μ μΌλ‘ μ¬μ©ν μ μλλ‘ μ 곡νκΈ° λλ¬Έμ΄λ€.
Thread thread = new Thread();
thread.start();
μ€λ λλ₯Ό λ§λλ κ²μ μμ€ν μ½μ νμλ‘ νλ μμ μ΄λ€. κ·ΈλΌ μ μ½λλ μ΄λ»κ² λμν κΉ?
start() μ½λλ‘ λ€μ΄κ° 보면 private native void start0();
μ½λλ₯Ό λ³Ό μ μλ€. μ¦, Java Native Interfaceλ₯Ό ν΅ν΄ OSμ μμ€ν
μ½μ νΈμΆνκ² λλ κ²μ΄λ€.
μμ€ν μ½μ μ’ λ₯
μμ€ν μ½μ μ΄λ»κ² ꡬνν κΉ?
mov eax, 1
mov ebx, 0
int 0x80 //μννΈμ¨μ΄ μΈν°λ½νΈ λͺ
λ Ή
μμ€ν νΈμΆ
Application Program Interface(API)
νμν κΈ°λ₯μ΄λ μμ€ν νκ²½μ λ°λΌ μμ€ν μ½μ΄ λ°μν λ μ’ λ λ§μ μ λ³΄κ° νμν μ μλ€. μ΄λ¬ν μ λ³΄κ° λ΄κΈ΄ 맀κ°λ³μλ₯Ό μ΄μ체μ μ μ λ¬νκΈ° μν΄μλ λ€μκ³Ό κ°μ λ°©λ²μ΄ μλ€.
맀κ°λ³μλ₯Ό CPU λ μ§μ€ν° λ΄μ μ λ¬νλ€.
μ΄ κ²½μ°, 맀κ°λ³μμ κ°μκ° CPU λ΄μ μ΄ λ μ§μ€ν° κ°μλ³΄λ€ λ§μ μ μλ€.
μμ κ°μ κ²½μ°, 맀κ°λ³μλ₯Ό λ©λͺ¨λ¦¬μ μ μ₯νκ³ λ©λͺ¨λ¦¬μ μ£Όμκ° λ μ§μ€ν°μ μ λ¬λλ€.
맀κ°λ³μλ νλ‘κ·Έλ¨μ μν΄ μ€ν(stack)μΌλ‘ μ λ¬(push)λ μλ μλ€.
2, 3λ² λ°©λ²μ κ²½μ° μ λ¬λλ 맀κ°λ³μμ κ°μλ κΈΈμ΄μ μ νμ΄ μκΈ° λλ¬Έμ λͺλͺ μ΄μ체μ μμ μ νΈνλ λ°©μμ΄λ€.
μ°Έκ³ μλ£
DR-Kim, β[OS] μμ€ν νΈμΆ(System Calls)β, https://dar0m.tistory.com/264
μ¬μ΄ μ½λ, βμΈν°λ½νΈμ μμ€ν μ½μ μ€λͺ ν©λλ€!β, https://youtu.be/v30ilCpITnY
Young Hyun Bae, β03-3 μμ€ν νΈμΆκ³Ό λΌμ΄λΈλ¬λ¦¬β, https://youtu.be/bjGIf_AKtAc
ν¨μ€νΈμΊ νΌμ€, βμ»΄ν¨ν°κ³΅ν μ¬μΈμν¨ν€μ§ - αα ΅αα ³αα ¦α· αα ³α α ©αα ³α α ’αα ΅αΌ, αα ΅αα ³αα ¦α·αα ©α―αα ͺ APIβ, https://youtu.be/SuovfEG9XZw