전체 글270 @Transactional 어노테이션에 대한 작동방식 1. @Transactional이란@Transactional은 Spring에서 제공하는 선언적 트랜잭션 관리 방식입니다. 이 어노테이션 하나로 다음과 같은 복잡한 트랜잭션 처리 코드들을 자동으로 처리할 수 있습니다:데이터베이스 커넥션 획득트랜잭션 시작 (setAutoCommit(false)) (비즈니스 로직 실행)정상 완료시 커밋 또는 예외 발생시 롤백커넥션 반환2. @Transactional 동작 원리@Transactional의 동작은 Spring AOP를 기반으로 합니다.프록시 객체는 다음과 같은 트랜잭션 관련 코드를 자동으로 삽입합니다:1) 메서드 호출 전데이터베이스 연결 (Connection 객체 생성).트랜잭션 시작 (setAutoCommit(false)).트랜잭션 동기화 (현재 트랜잭션 정보.. 2024. 12. 16. private 메소드는 어떻게 테스트 할까(feat 객체 분리) 상위 public 메소드로 하위 private 메소드를 테스트 할 때 문제점extractNumbers메소드에서 호출되는 메소드들은 다 private 메소드들입니다. 각 기능들을 테스트 하기 위해 extractNumbers메소드를 호출하여 결과중심의 테스트로 private 메소드들을 테스트하였습니다. 문제점은 테스트에 실패했을 때 어느 메소드에서 실패했는지 모르는 것입니다. 유지보수를 위해 잘게 메소드로 나누었지만, 어느 메소드가 잘못됐는지 알지 못하는 모순되는 상황에 봉착 했습니다.```java// private 메소드 양만 봐도 어지럽습니다..public class StringParser { private static final String BLANK = ""; private static f.. 2024. 12. 13. 서블릿 컨테이너와 스프링 컨테이너의 완벽한 이해 1. 웹 애플리케이션의 기본 구조 이해하기1.1 Web Server와 WAS의 구분Web ServerApache, Nginx와 같은 서버HTML, CSS, JavaScript 등 정적 파일 제공간단한 요청-응답 처리빠른 처리 속도가 장점WASWeb Server + web ContainerTomcat, JBoss와 같은 서버비즈니스 로직 처리데이터베이스 연동동적 컨텐츠 제공1.2 Web Server와 Web Container가 같이 있을 경우WAS는 웹 서버의 기능을 포함하기 때문에 웹 서버의 기능을 제공할 수 있다.WAS와 DB만으로도 시스템 구성이 가능하지만, WAS가 너무 많은 기능을 담당해 서버 과부하의 우려가 생긴다.정적 컨텐츠의 요청까지 WAS가 처리한다면 정적 데이터 처리로 인해 서버에 부하가.. 2024. 12. 13. 동기 방식으로 외부 서비스를 호출할 때 외부 서비스 장애 조치 방법 외부 서비스 장애로 인해 응답이 오래 걸린다고 했을 때 외부 API 응답으로 대기하는 자원들이 운영 서버 내부에 쌓이면서 성능에 악영향을 줄 수 있습니다. 이를 해결하기 위한 가장 기본적인 방법은 타임아웃을 설정하는 것입니다. 크게 타임아웃에는 커넥션 타임아웃과 리드 타임아웃, HTTP 커넥션 풀 타임아웃을 설정해 볼 수 있습니다.다음과 같이 특정 서비스의 장애가 전체 서비스에 영향을 주는 경우는 어떻게 해결할 수 있을까요? 🤔이 경우는 벌크헤드 패턴을 적용해 볼 수 있습니다. 벌크헤드 패턴은 기능의 종류마다 자원 사용을 분리하는 것을 의미하는데요. 자원을 격리하여 서비스 일부에 장애가 발생해도 전체로 전파되지 않도록 보장해 주는 패턴입니다. 위 예시에서는 외부 서비스마다 다른 HTTP 커넥션 풀을 사.. 2024. 12. 11. 실생활 예시로 이해하는 동기/비동기 & 블로킹/논블로킹 동기 (Synchronous)패스트푸드점에서 햄버거를 주문하고 카운터 앞에서 기다리는 상황주문 접수 → 조리 → 완성 → 수령의 순서가 보장됨다른 손님의 주문이 중간에 끼어들 수 없음블로킹 (Blocking)식당에서 1시간 웨이팅을 하는 상황웨이팅 동안 자리에서 이탈할 수 없음 (다른 일 불가능)내 차례가 되기 전까지 계속 기다려야 함 🔍 핵심 차이점:동기: 작업의 순서와 결과에 초점 (A 작업 후 B 작업)블로킹: 다른 작업 수행 가능 여부에 초점 (다른 작업 불가능한 상태)비동기 (Asynchronous)배달 앱으로 음식을 주문하고 다른 일 하는 상황주문 후 배달되는 동안 다른 일을 할 수 있음여러 가게에 동시에 주문할 수 있음논블로킹 (Non-blocking)식당 웨이팅 등록 후 전화나 문자로 알.. 2024. 12. 10. OSIV OSIV(Open Session In View)OSIV(open session in view) 는 영속성 컨텍스트를 뷰까지 열어둔다는 의미입니다. 영속성 컨텍스트가 살아있으면 엔티티는 영속 상태로 유지될 수 있어, 뷰에서도 지연 로딩을 사용할 수 있어요. OSIV의 핵심은 뷰에서도 지연 로딩이 가능하도록 하는 것입니다. 가장 단순한 구현은 클라이언트 요청이 들어올때 필터나 인터셉터에서 트랜잭션을 시작하는 방법인데요. 이를 트랜잭션 방식 OSIV라고 합니다. 하지만, 트랜잭션 방식 OSIV는 표현 계층에서도 엔티티를 수정할 수 있기 때문에 유지보수하기 어려운 코드를 만들 수 있습니다.트랜잭션 방식의 OSIV의 문제는 어떻게 풀어볼 수 있을까요? 🤔최신 방식의 OSIV는 트랜잭션 방식의 문제를 해결합니다... 2024. 12. 10. 공유 락과 배타 락 공유 락(Shared Lock)은 무엇인가요? 😀공유 락은 읽기 락(Read Lock)이라고 부르며, 공유 락이 걸린 데이터는 읽기(SELECT)연산만 **가능**하며, 쓰기(UPDATE, DELETE)는 **불가능**합니다. 공유 락이 걸린 데이터에 대해서 **다른 트랜잭션에서도 공유 락을 획득**할 수 있지만, 배타 락은 획득할 수 없습니다. 즉, 공유 락을 사용하면 **트랜잭션 내에서 조회한 데이터가 변경되지 않는**다는 것을 보장합니다.SELECT * FROM table_name WHERE id = 1 FOR SHARE;배타 락(Exclusive Lock)은 무엇인가요? 🤔배타 락은 쓰기 락(Write Lock)이라고 부르며, 배타 락을 획득한 트랜잭션은 읽기, 쓰기 연산 모두 **가능**합니.. 2024. 12. 10. MySQL 아키텍쳐 1. MySQL 아키텍쳐1-1. MySQL 구조 && 동작과정쿼리 파서(Parser) -> 전처리기(Preprocessor) -> 쿼리 옵티마이저(Query Optimizer) -> 쿼리 실행기(Query Execution) -> 핸들러(스토리지 엔진)MySQL Connectors에 요청이 도착합니다.사용자 스레드가 할당되고 요청이 MySQL 엔진에 전달됩니다.쿼리 파서가 SQL을 MySQL이 이해 가능한 최소 단위로 잘라내고, 문법 유효성을 검증합니다.쿼리 문장을 토큰(MySQL 이 인식할 수 있는 최소 단위의 어휘나 기호)으로 분리해 트리 구조로 만드는 과정이며, 쿼리의 문법 오류가 이 단계에서 확인 되며, 문법 오류가 있을 경우 사용자에게 오류 메세지가 전달 됩니다.전처리기가 컬럼명, 테이블명 등이.. 2024. 11. 26. MySQL 인덱스 👉 쿼리의 성능을 좌우하는 것은, **어떻게 디스크 I/O 를 줄이는 것이 핵심**1. 디스크 읽기 방식1-1. HDD(기계식) && SSD(전자식)HDD: 데이터 저장용 플래터(원판)SSD: 플래시 메모리데이터를 가져오는 방법:기계식에서는 원판을 돌려서 데이터 위치를 찾고 가져옵니다. 그러나 SSD는 전자식이라 이런 과정이 없습니다. 디스크의 성능은 디스크 헤더의 위치 이동횟수인데, SSD는 원판이 없으므로 HDD보다 빠른 것입니다.1-2. 순차적 I/O && 랜덤 I/O순차적 I/O:연속된 데이터를 접근하기 때문에 헤더가 일정한 방향으로 이동랜덤 I/O:랜덤 I/O는 데이터가 디스크 여러 곳에 흩어져 있어 헤더가 불규칙하게 더 많이 이동1-3. HDD의 I/O 방식순차 I/O연속된 섹터를 읽거나 씀.. 2024. 11. 26. 이전 1 2 3 4 5 6 7 ··· 30 다음