본문 바로가기

전체 글40

스택 트레이스와 예외 포함의 중요성 Stack Trace란?● 프로그램이 예외를 던질 때 예외가 어디서 발생했고, 어떤 경로를 거쳐 호출되었는지 알려주는 로그 정보 ● 어떤 메서드에서 예외가 발생했고 그 메서드를 누가 호출 했는지 계속 따라가는 호출 경로 ● 최근 → 과거 호출 순서대로 쌓인다. [Test worker] ERROR c.f.d.j.exception.basic.CheckedTest -- Internal Server Errorjava.sql.SQLException: db error at com.futuregoing.dbaccessv1.jdbc.exception.basic.CheckedTest$Repository.call(CheckedTest.java:31) at com.futuregoing.dba.. 2025. 6. 10.
자바 예외 이해하기 (체크 예외, 런타임 예외) 예외 클래스 계층도Object● 자바에서 모든 객체의 최상위 부모는 Object이다. ● 예외도 객체이므로 예외의 최상위 부모도 Object이다. Throwable ● throw, throws 키워드로 던질 수 있는 객체는 반드시 Throwable을 상속받아야 한다. ● 하위에 Exception과 Error가 있다. Error● 메모리 부족이나 심각한 시스템 오류와 같이 애플리케이션에서 복구 불가능한 시스템 예외 ● 애플리케이션 개발자는 이 예외를 잡으면 안된다. 예외 처리 시 주의 할 점 ● 상위 예외를 catch로 잡으면 그 하위 예외까지 함께 잡는다. ● Throwable을 예외로 잡으면, 처리하면 안되는 Error 예외도 함께 잡힌다. ● 따라서 애플리케이션 로직에서는 Except.. 2025. 6. 9.
Spring의 트랜잭션 추상화로 JDBC 기반 트랜잭션 처리의 문제점 해결하기 트랜잭션은 왜 필요할까?A가 B에게 10000원을 이체하는 경우를 생각해보자.START TRANSACTION;UPDATE member SET balance = balance - 10000 WHERE id = 'A';UPDATE member SET balance = balance + 10000 WHERE id = 'B';COMMIT; A의 잔고를 줄이고 B의 잔고를 늘리면 되므로 간단해 보인다.@Slf4j@RequiredArgsConstructorpublic class MemberService { private final MemberRepository memberRepository; public void accountTransfer(String fromId, String toId, int amount) t.. 2025. 4. 27.
Isolation Level - 트랜잭션 격리 수준 깊게 이해하기 InnoDB 스토리지 엔진을 사용하는 mysql 기준으로 정리한다. 먼저 MVCC와 undo log, read view에 대한 이해가 필요하다. MVCC 깊게 이해하기: Undo Log 기반 다중 버전 동시 제어의 원리InnoDB 스토리지 엔진을 사용하는 mysql 기준으로 정리한다. MVCC (Multi Version Concurrency Control) 여러 트랜잭션이 동시에 같은 데이터를 조회하거나 수정할 때 서로 간섭하지 않고도 일관된 데이터를 읽cactuslog.tistory.com 트랜잭션의 Isolation Level 왜 중요한가?동시에 실행되는 트랜잭션들은 서로 영향을 주지 않고 독립적으로 실행되어야 한다. 하지만 완벽하게 격리시키면 모든 트랜잭션이 직렬로 실행되는 것과 동일한 효과를 가지.. 2025. 4. 12.
MVCC 깊게 이해하기: Undo Log 기반 다중 버전 동시 제어의 원리 InnoDB 스토리지 엔진을 사용하는 mysql 기준으로 정리한다. MVCC (Multi Version Concurrency Control) 여러 트랜잭션이 동시에 같은 데이터를 조회하거나 수정할 때 서로 간섭하지 않고도 일관된 데이터를 읽을 수 있게 해주는 동시성 제어 기술  각 트랜잭션은 자신만의 스냅샷을 유지하며, 다른 트랜잭션이 데이터를 변경하더라도 스냅샷 기준으로 데이터를 읽는다.여기서 스냅샷은 ReadView이며 구조는 다음과 같다.필드설명low_limit_idlow_limit_id 이상의 트랜잭션이 만든 변경 내용은 절대 보이면 안된다.즉 이 값은 보이지 않는 트랜잭션의 시작선이다.low_limit_id 이상이 변경한 row는 undo log로 복원하거나 무시한다.up_limit_idup_l.. 2025. 3. 29.
트랜잭션과 ACID 트랜잭션은 하나의 작업 단위를 묶은 것으로이 안에 있는 여러 작업은 모두 성공하거나 하나라도 실패하면전부 실패한 것으로 처리한다. 예를 들어 A가 B에게 10000원을 계좌 이체 한다고 할 때 A의 잔고는 10000원 감소하고 B의 잔고는 10000원 증가해야 한다. 계좌 이체는 이렇게 2가지 작업이 하나의 작업처럼 동작해야 한다. 두 작업 중 하나만 성공하면 심각한 문제가 발생된다. 트랜잭션을 사용하면 두 작업 다 성공해야 저장하고, 하나라도 실패하면 이전 상태로 돌아갈 수 있다. 모든 작업이 성공해서 데이터베이스에 정상 반영되는 것을 Commit이라 한다 작업 중 하나라도 실패해서 이전으로 되돌리는 것을 Rollback이라 한다. 트랜잭션의 특성 ACIDAtomicity 원자성트랜잭션 안의 작업은 모.. 2025. 3. 23.
커넥션 풀과 DataSource 데이터베이스와의 connection은 비용이 많이 드는 작업이다.매 요청마다 새 커넥션을 생성하면 성능 저하와 리소스 낭비가 발생한다.Connection Pool을 사용하면 미리 생성된 연결을 재사용하여 성능을 높이고 안정적인 트랜잭션 처리를 보장할 수 있다. 데이터베이스 connection을 획득할 때 다음과 같은 복잡한 과정을 거친다.1. 애플리케이션 로직은 DB 드라이버를 통해 커넥션을 조회 2. DB 드라이버는 DB와 TCP/IP 커넥션을 연결 3. DB 드라이버는 TCP/IP 커넥션이 연결되면 ID, PW와 기타 부가정보를 DB에 전달 4. DB는 ID, PW를 통해 내부 인증을 완료하고, 내부에 DB 세션을 생성 5. DB는 커넥션 생성이 완료되었다고 응답 6. DB 드라이버는 커넥션 객체를 .. 2025. 3. 22.
JDBC 기초부터 이해하기 SQL Mapper 또는 ORM을 사용해도 결국 모든 것은 JDBC 위에서 동작한다. JDBC의 필요성애플리케이션 서버와 DB의 일반적인 사용법은 다음과 같다.TCP/IP를 사용하여 커넥션 연결커넥션을 통해 DB에 맞는 SQL 전달DB는 전달받은 SQL을 수행하고 결과를 응답 문제는 각각의 데이터베이스마다 커넥션을 연결하는 방법, SQL 전달 방법, 결과를 응답 받는 방법이 모두 다르다데이터베이스를 변경하면 애플리케이션 서버에 개발된 데이터베이스 관련 코드도 전부 변경해야한다개발자가 각각의 데이터베이스마다 커넥션 연결, SQL 전달, 결과 응답 받는 방법을 새로 학습해야한다이 문제를 해결하기 위해 JDBC라는 자바 표준이 등장한다. JDBC 표준 인터페이스JDBC(Java Database Connecti.. 2025. 3. 10.
젠킨스 플러그인 설치 실패 이슈 Jenkins가 설치된 서버가에 SSL 인증서가 설정되어 있지 않은 경우 통신에 실패하기 때문에 발생업데이트 사이트의 프로토콜을 http로 변경또는 서버 SSL 인증서 설정    Dashboard > Jenkins 관리 > Plugins   재시작sudo systemctl restart jenkins 2024. 11. 29.