Layered Architecture 구조별 테스트 작성법
Persistence, Business, Presentation 계층의 역할과 계층별 테스트 범위, @SpringBootTest·@DataJpaTest·@WebMvcTest의 차이와 @Transactional(readOnly = true) 사용법을 정리합니다.
Persistence, Business, Presentation 계층의 역할과 계층별 테스트 범위, @SpringBootTest·@DataJpaTest·@WebMvcTest의 차이와 @Transactional(readOnly = true) 사용법을 정리합니다.
Mockito의 @Mock·@Spy·@InjectMocks와 스프링 부트의 @MockBean·@SpyBean이 각각 무엇을 가짜 객체로 대체하는지 예제 코드로 비교하고, 테스트 준비 코드를 @BeforeEach·given·when에 나누는 문제를 정리합니다.
실무 프로젝트 전반에 REQUIRES_NEW가 걸려 있던 원인을 프록시 패턴과 롤백 시점, 컨트롤러에 걸린 AOP 트랜잭션 설정에서 찾아 분석한 과정을 정리합니다.
@Component에 붙은 Target, Retention 같은 메타 어노테이션의 의미와, @Service처럼 @Component를 품은 어노테이션을 Spring이 ClassPathBeanDefinitionScanner의 doScan으로 찾아 빈으로 등록하는 과정을 정리합니다.
같은 서비스 안에서 @Transactional 메서드를 자기 호출해 롤백이 안 되는 문제를 실제 운영 코드에서 겪고, 트랜잭션 이름을 직접 확인하며 별도 서비스로 분리해 해결한 과정을 기록합니다.
DB 커넥션을 매번 새로 맺을 때 거치는 여섯 단계와 그 문제를 흐름도로 정리하고, 커넥션 풀과 DataSource 추상화가 이를 어떻게 해결하는지 설명합니다.
@Transactional 안에서 try ~ catch로 예외를 잡으면 롤백이 동작하지 않는 원인을 TransactionAspectSupport와 rollbackOn 내부 동작으로 분석하고, catch에서 Unchecked Exception을 다시 던지는 해결 방법을 정리합니다.
Spring이 제공하는 HTTP 클라이언트 RestTemplate의 특징과 주요 메서드를 정리하고, exchange()로 요청을 보내는 예시와 응답 상태에 따라 예외가 처리되는 흐름을 그림과 함께 설명합니다.
트랜잭션 매니저 빈이 여러 개 등록된 환경에서 테스트 코드가 NoUniqueBeanDefinitionException을 남긴 원인과, @Transactional에 트랜잭션 매니저 이름을 지정해 해결한 과정을 정리합니다.
순수 JPA로 기본 CRUD 리포지토리를 만들어 본 뒤, 스프링 데이터 JPA의 공통 인터페이스 JpaRepository로 대체하고, 스프링 데이터 JPA가 구현 클래스를 만들어 주입하는 방식과 주요 메서드를 정리합니다.
스프링 데이터 JPA 공통 인터페이스 구현체인 SimpleJpaRepository의 @Repository·@Transactional 적용 방식과, save() 메서드가 isNew로 persist와 merge를 나누는 기준, Persistable로 판단 로직을 바꾸는 방법을 정리합니다.
클린 코드 학습을 11장까지 진행한 상황을 돌아보고, Spring 기초를 보완한 뒤 12장부터 이어가겠다는 계획을 정리합니다.
FetchType.LAZY와 FetchType.EAGER로 연관된 Team을 조회하는 시점이 어떻게 달라지는지 프록시 관점에서 정리하고, 즉시 로딩이 일으키는 N+1 문제와 실무에서 지연 로딩을 쓰는 이유를 짚습니다.
회원 도메인과 메모리 기반 리포지토리를 인터페이스로 설계하고, JUnit으로 저장·조회 기능을 테스트하며 @AfterEach로 테스트를 서로 독립시키는 과정을 정리합니다.
회원가입 중복 검증 로직을 담은 Service 계층을 구현하고, given-when-then 패턴으로 정상 케이스와 예외 케이스를 테스트하며 @BeforeEach로 저장소를 주입하는 과정을 정리합니다.
Thymeleaf로 홈, 회원 등록 폼, 회원 목록 화면을 구성하고 HomeController에서 등록·조회 요청을 처리하는 과정을 정리합니다.
순수 JDBC로 MemberRepository를 구현하고, SpringConfig의 빈 설정만 바꿔서 메모리 저장소를 DB로 교체하는 과정을 정리합니다.
JPA 라이브러리와 설정을 추가하고 Member 엔티티 매핑과 EntityManager 기반 리포지토리를 구현한 뒤, SpringConfig의 빈 설정만 바꿔 JDBC 구현체를 JPA로 교체하는 과정을 정리합니다.
중복이 있던 AppConfig를 리팩터링해 역할과 구현이 한눈에 드러나도록 정리하고, 그 과정에서 지켜지는 SOLID 원칙을 살펴봅니다.
순수 자바 코드로 작성했던 AppConfig를 @Configuration과 @Bean으로 전환해 스프링 컨테이너에 빈을 등록하고, ApplicationContext에서 빈을 조회해 사용하는 과정을 정리합니다.
스프링 컨테이너의 최상위 인터페이스인 BeanFactory와, 이를 상속해 국제화·환경변수·이벤트·리소스 조회 같은 부가 기능을 제공하는 ApplicationContext의 역할을 정리합니다.
자바 코드 대신 XML로 스프링 빈을 설정하는 방법과, 자바 코드·XML 같은 다양한 설정 형식을 가능하게 하는 BeanDefinition 추상화와 BeanDefinitionReader의 역할을 정리합니다.
요청마다 new로 객체를 생성하던 AppConfig의 문제를 직접 구현한 싱글톤 패턴과 스프링 컨테이너로 각각 해결해 보고, 싱글톤 패턴의 문제점을 정리합니다.
싱글톤 빈은 여러 클라이언트가 하나의 객체를 공유하기 때문에 무상태로 설계해야 한다는 점을, 공유 필드 때문에 다른 사용자의 주문 금액이 조회되는 StatefulService 예제로 확인합니다.
AppConfig에서 memberRepository()가 여러 번 호출되는 것처럼 보여도 싱글톤이 보장되는 이유를 @Configuration과 CGLIB 바이트코드 조작으로 확인하고, @Bean만 사용할 때와 비교합니다.
설정 정보 없이 스프링 빈을 자동으로 등록하는 컴포넌트 스캔과 @Autowired 의존관계 자동 주입의 동작, 탐색 위치 지정과 기본 스캔 대상을 정리합니다.
수정자 주입 대신 생성자 주입을 권장하는 이유와, 롬복의 @RequiredArgsConstructor로 생성자 코드를 줄이는 방법을 정리합니다.
스프링에서 @Autowired로 조회한 빈이 2개 이상일 때 발생하는 충돌을 필드명 매칭, @Qualifier, @Primary로 해결하는 방법과 둘을 함께 쓸 때의 우선순위를 정리합니다.
문자열로 적는 @Qualifier는 오타가 나도 컴파일 시점에 잡히지 않습니다. 전용 애노테이션을 직접 만들어 의존관계를 주입하는 방법을 정리합니다.
스프링 빈을 자동 등록과 수동 등록 중 어떤 기준으로 선택해야 하는지, 업무 로직과 기술 지원 로직을 나누어 정리합니다.
스프링 빈의 생명주기와 초기화·소멸 콜백을 인터페이스, 설정 정보, @PostConstruct/@PreDestroy 세 가지 방식으로 비교해 정리합니다.
싱글톤과 프로토타입 빈 스코프의 차이를 살펴보고, 싱글톤 빈이 프로토타입 빈을 주입받을 때 발생하는 문제를 예제로 정리합니다.
싱글톤 빈이 프로토타입 빈을 매번 새로 받아 쓰지 못하는 문제를 ObjectProvider로 해결하는 방법을 정리합니다.
웹 스코프와 request 스코프의 동작 방식을 살펴보고, ObjectProvider와 CGLIB 프록시로 스코프 문제를 해결하는 방법을 정리합니다.
@Component 애노테이션이 붙은 클래스를 스프링 빈으로 자동 등록하고, 생성자를 통해 의존관계를 자동으로 주입받는 컴포넌트 스캔 방식을 회원 예제로 정리합니다.
아직 데이터베이스가 정해지지 않은 상황에서 SpringConfig 자바 클래스에 @Configuration과 @Bean을 붙여 스프링 빈을 직접 등록하는 방법을 정리합니다.
H2 데이터베이스를 설치해 member 테이블을 만들고, build.gradle과 application.properties를 설정해 스프링 프로젝트와 연동하는 과정을 정리합니다.
@SpringBootTest와 @Transactional로 회원 서비스의 회원가입, 중복 검증, 조회 기능을 통합 테스트하는 과정을 정리합니다.
JpaRepository를 상속한 인터페이스만으로 리포지토리 구현체가 만들어져 스프링 빈으로 등록되는 스프링 데이터 JPA 사용법과, SpringConfig에서 이를 주입받는 방법을 정리합니다.
회원 서비스의 메서드마다 넣은 실행 시간 측정 코드를 예로 들어 핵심 관심사항과 공통 관심사항을 나누는 AOP의 필요성과, @Aspect와 @Around로 시간 측정 AOP를 작성하는 방법을 정리합니다.