전체 글

github: https://github.com/belljun3395 email: belljun3395@gmail.com
· 개발
Mockito의 목(Mock) 처리 메커니즘@MockBean 또는 Mockito.mock()으로 생성된 목 객체는 내부적으로 MockHandlerImpl을 가진다. 이 핸들러는 목 객체에 대한 모든 상호작용을 가로채 처리하며, InvocationContainerImpl을 통해 스터빙 규칙을 관리한다. // Mockito 내부 코드 (간략화) public class MockHandlerImpl implements MockHandler { private final InvocationContainerImpl invocationContainer; // ... public MockHandlerImpl(MockCreationSettings mockSettings) { ..
· 개발
데이터베이스 테스트를 위한 전제 조건형상 관리 시스템에 데이터베이스 유지모든 개발자를 위한 별도의 데이터베이스 인스턴스 사용데이터베이스 배포에 마이그레이션 기반 방식 사용 데이터베이스를 형상 관리 시스템에 유지데이터베이스 스키마를 일반 코드로 취급하는 것이다. 일반 코드와 마찬가지로 데이터베이스 스키마는 Git과 같은 형상 관리 시스템에 저장하는 것이 최선이다.모델 데이터베이스를 사용하는 것은 데이터베이스 스키마를 유지하는 데 상당히 좋지 못한 방법이다. 그 이유는 다음과 같다.변경 내역 부재: 데이터베이스 스키마를 과거 특정 시점으로 되돌릴 수 없다. 이는 운영 환경에서 버그를 재현할 때 중요할 수 있다.복수의 원천 정보: 모델 데이터베이스는 개발 상태에 대한 원천 정보를 둘러싸고 경합하게 된다. 이렇..
· 개발
시스템 끝에서 상호 작용 검증하기public interface IMessageBus { void SendEmailChangedMessage(int userId, string newEmail);}public class MessageBus: IMessageBus { private readonly IBus _bus; public void SendEmailChangedMessage(int userId, string newEmail) { _bus.Send("Type: USER EMAIL CHANGED; " + $"ID: {userId}; "+ $"NewEmail: {newEmail}"); }}public interface IBus { void Send(string messa..
· 개발
단위 테스트 영역에서 가장 많이 오해하는 주제 중 하나는 인터페이스 사용이다. 인터페이스를 둔 이유를 개발자들이 자주 잘못 설명하고, 그 결과 남용하는 경향이 있다. 인터페이스와 느슨한 결합많은 개발자가 데이터베이스나 메시지 버스와 같은 프로세스 외부 의존성을 위해 인터페이스를 도입한다. 심지어 인터페이스에 구현이 하나만 있는 경우에도 그렇다. 이 관습은 오늘날 널리 퍼져 있어서 아무도 의문을 제기하지 않는다. 인터페이스를 사용하는 일반적인 이유는 아래와 같다.프로세스 외부 의존성을 추상화해 느슨한 결합을 달성한다.기존 코드를 변경하지 않고 새로운 기능을 추가해 공개 폐쇄 원칙(OCP)을 지키기 때문이다. 이 두 가지 이유 모두 오해다. 단일 구현을 위한 인터페이스는 추상화가 아니며, 해당 인터페이스를 ..
· 개발
통합 테스트는 무엇인가?우선 단위 테스트는 아래 세 가지 요구 사항을 충족하는 테스트다.단일 동작 단위를 검증한다.빠르게 수행한다.다른 테스트와 별도로 처리한다. 이 세 가지 요구 사항 중 하나라도 충족하지 못하는 테스트는 통합 테스트 범주에 속한다. 단위 테스트가 아닌 모든 테스트가 통합 테스트에 해당한다. 실제로 통합 테스트는 대부분 시스템이 프로세스 외부 의존성과 통합해 어떻게 작동하는지 검증한다. 그리고 통합 테스트는 프로세스 외부 의존성과 도메인 모델을 연결하는 코드를 확인한다. 모든 외부 의존성을 목으로 대체하면 테스트 간에 공유하는 의존성이 없어지므로 테스트 속도가 빨라지고 서로 격리될 수 있다. 그러나 대부분의 애플리케이션은 목으로 대체할 수 없는 프로세스 외분 의존성이 있다. 단위 테스트..
· 스프링
커넥션과 트랜잭션은 다르다커넥션: DB와의 네트워크 세션트랜잭션: DB 작업을 원자적으로 묶는 논리적 단위HikariCP는 애플리케이션 시작 시 DB에 미리 물리 커넥션을 여러 개 생성하지만, 이는 트랜잭션을 시작하지 않는 idle 상태다. 트랜잭션이 열리는 호출 흐름// TransactionAspectSupportprotected TransactionInfo createTransactionIfNecessary(@Nullable PlatformTransactionManager tm, @Nullable TransactionAttribute txAttr, final String joinpointIdentification) { // If no name specified, apply me..
belljun
belljundev