애플리케이션 서버와 DB는 다음의 세 단계를 거쳐서 상호작용 한다.주로 TCP/IP를 통해 커넥션 연결애플리케이션 서버는 DB가 이해할 수 있는 SQL을 연결된 커넥션을 통해 DB에 전달DB는 전달된 SQL을 수행하고 그 결과를 응답하지만 각각의 데이터베이스를 사용하는
커넥션을 생성하는 과정 커넥션 풀이 필요한 이유 ☁️ 커넥션 풀(Connection Pool) ☁️ DataSource란? DriverManager 을 통해 커넥션을 획득하다가, 커넥션 풀을 사용하도록 바꾼다면 의존 관계가 바뀌므로 어플리케이션 코드에 변경이 일
데이터베이스에 데이터를 저장하는 가장 큰 이유 중 하나로, 트랜잭션은 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위를 의미한다. 🔖 트랜잭션 연산1\. 커밋(Commit) : 작업이 성공해서 데이터베이스에 반영하는 작업2\. 롤백(Rollback) : 작
여러 스레드가 같은 인스턴스의 필드에 접근하면, 처음 스레드가 보관한 데이터가 사라질 수 있다. 또한 동시성 문제가 발생한다. 이때, 스레드 로컬을 사용하여 해결할 수 있다.📚 동시성 문제같은 인스턴스 필드에 두개 이상의 스레드가 접근해서 값을 변경할 때, 저장한 값
현재 상태의 로그 추적기에는 문제가 있다. 어떤 것일까?바로 위와 같은 패턴이 Controller, Service, Repository 모두에 반복되고 있다는 것이다. 만약 클래스가 수백 개라면? 코드의 중복이 너무 심해질 것이다.따라서, 우리는 핵심 기능과 부가 기능
☁️ 들어가기 로그 추적기의 수정을 최소화하기 위해, 템플릿 메서드 패턴과 콜백 패턴까지 도입하였다. 하지만 결과적으로 수백개의 클래스에 로그를 남기고 싶다면 모두 고쳐야 한다는 단점이 존재한다. 추가된 요구사항 원본 코드를 전혀 수정하지 않고, 로그 추적기를 적용
대상 클래스 수만큼 로그 추적을 위한 프록시 클래스를 만들지 않기 위해서는, 프록시를 적용할 코드를 하나만 생성해두고 동적으로 프록시 객체를 만들어내면 된다.JDK 동적 프록시 기술이나, CGLIB 같은 프록시 생성 오픈소스 기술을 활용하면 프록시 객체를 동적으로 만들
☁️ 기존 트랜잭션 구현 방식 문제점 서비스 계층(비즈니스 로직)은 특정 기술에 종속적이지 않고 순수한 자바 코드로만 작성되어있어야 한다. 하지만, 이전에 서비스 계층에서 트랜잭션을 도입한 코드를 봐보면 다음과 같은 세가지 문제가 존재한다. 🔒 트랜잭션 문제
☁️ 예외 계층 1. 체크 예외 컴파일러가 체크하는 예외이다. 따라서, 예외를 throws로 넘기거나 try - catch 로 잡아서 반드시 처리해주어야 한다. 2. 언체크 예외(런타임 예외) 컴파일러가 체크하지 않으므로, 예외를 잡 > 🔖 예외 기본 규칙
서비스 계층에 대한 예외에 대한 의존까지 없애려면 어떻게 해야 할까? 1. 체크 예외를 런타임 예외로 전환 체크 예외인 SQLException 을 런타임 예외로 바꿔서 던진다면, 서비스에서 더이상 특정 기술에 대한 체크 예외에 종속적이지 않게 된다. 또한, 체크
핵심 기능이란, 해당 객체가 제공하는 주요 기능이다. 반면 부가 기능은 로그 추적기와 같이 핵심 기능을 보조하기 위해 사용되는 기능을 의미한다.하지만 주로 하나의 부가 기능이 여러 곳에서 동일하게 사용이 되고는 하는데, 이를 횡단 관심사(cross-cutting con
☁️ 테스트용 DB 분리 만약 로컬에서 사용하는 어플리케이션 서버와 테스트에서 같은 데이터베이스를 사용하고 있다 가정해보자. 테스트용 데이터들은 다음 테스트의 성공을 위해 끝날 때 초기화 되어 있어야 하지만, 어플리케이션 서버에서는 초기값이 필요한 경우라면? 둘이서
☁️ 트랜잭션 적용 위치 스프링 @Transactional 은 두가지 규칙이 존재한다. 우선순위 규칙 클래스에 적용하면 메서드는 자동 적용 우선순위 규칙 스프링에서 우선순위는, 항상 더 자세하고 높은 것이 우선순위를 가지게 된다. 따라서 만약 @Transact
☁️ Spring vs Spring Boot Spring Framework > 🔖* 프레임워크 vs 라이브러리* 프레임워크(FrameWork) : 프로그램 개발을 위한 여러 요소와 메뉴얼(규약)을 제공하는 프로그램이며, 코드를 제어하고 대신 실행함(ex) JUni
☁️ 트랜잭션 커밋과 롤백 기본 만약 연속으로 트랜잭션을 수행한다면? 커넥션을 재사용하고 있는 것을 볼 수 있다. 커넥션 풀이 없다고 가정한 경우 트랜잭션을 각각 사용한다면, 두 트랜잭션은 완전히 독립적으로 작동한다. ☁️ 트랜잭션 전파 하지만 만약 트랜잭션
프록시 팩토리에는 다음과 같은 두가지 문제가 있다.프록시를 생성하기 위한 설정 파일이 너무 많고 생성 코드가 적용할 클래스별로 중복된다. 10개의 객체를 빈으로 등록하고자 한다면 10개의 생성 코드가 필요하기 때문이다. 직접 @Bean 을 통해 등록하는 것이 아닌 컴