Spring
DI와 MVC부터 JDBC, 트랜잭션까지 스프링 핵심 원리
- 01
SOLID 원칙과 OCP·DIP를 지키는 방법
객체지향 5원칙을 정리하고, 역할과 구현을 나눠도 깨지는 OCP·DIP를 AppConfig로 해결하는 과정을 살펴본다.
- 02
의존성 주입(DI)과 스프링 컨테이너
생성자 주입으로 DI를 이해하고, 스프링 빈 등록·조회 방법과 컨테이너가 빈을 싱글톤으로 관리하는 이유를 정리한다.
- 03
쓰레드 풀과 싱글톤 서블릿의 동시성 문제
WAS의 쓰레드 풀이 필요한 이유를 정리하고, 서블릿 멤버 변수에 model을 두면 왜 안 되는지 직접 부딪혀 본 기록.
- 04
FrontController 패턴과 핸들러 어댑터로 스프링 MVC 구조 이해하기
FrontController와 핸들러 어댑터를 직접 구현해 보며 DispatcherServlet이 요청을 처리하는 구조를 이해한다.
- 05
@ModelAttribute와 PRG 패턴으로 폼 요청 처리하기
@RequestParam에서 @ModelAttribute로 폼 처리 코드를 줄이고, PRG와 RedirectAttributes로 중복 등록을 막는다.
- 06
System.out 대신 SLF4J로 로그 남기기
System.out.println 대신 SLF4J 로거를 써야 하는 이유와 로그 레벨 설정, Lombok @Slf4j 사용법을 정리한다.
- 07
세션 직접 만들어 보기와 HttpSession
세션 저장소를 직접 구현해 동작 원리를 이해하고, HttpSession과 @SessionAttribute 사용법을 정리한다.
- 08
스프링 인터셉터와 예외 발생 시 오류 페이지 흐름
인터셉터의 호출 시점과 로그인 체크 구현, 예외가 WAS까지 전달된 뒤 오류 페이지가 다시 요청되는 흐름을 정리한다.
- 09
서블릿 Part와 MultipartFile로 파일 업로드 처리하기
서블릿 Part로 multipart 요청을 직접 처리해 보고, 스프링 MultipartFile이 이를 얼마나 단순하게 만드는지 비교한다.
- 10
JDBC로 CRUD 구현하기와 커넥션 풀, DataSource
순수 JDBC로 CRUD를 구현하며 커넥션과 리소스 정리를 이해하고, 커넥션 풀과 DataSource로 개선한다.
- 11
JDBC 트랜잭션에서 스프링 트랜잭션 동기화와 트랜잭션 AOP까지
커넥션을 파라미터로 넘기던 JDBC 트랜잭션을 트랜잭션 매니저와 @Transactional로 개선하는 과정을 정리한다.
- 12
JPA 변경 감지(dirty checking)와 병합(merge)
준영속 엔티티를 수정하는 두 가지 방법인 병합과 변경 감지의 차이, 그리고 변경 감지를 써야 하는 이유를 정리한다.
- 13
서블릿 컨테이너 초기화와 스프링 컨테이너 등록 과정
WAR 배포 구조부터 ServletContainerInitializer, 스프링 컨테이너와 DispatcherServlet 등록 과정을 코드로 따라간다.
- 14
싱글톤 빈의 동시성 문제와 ThreadLocal
싱글톤 객체의 필드를 여러 쓰레드가 공유할 때 생기는 동시성 문제를 재현하고 ThreadLocal로 해결하는 방법과 주의점을 정리한다.