콘텐츠로 이동

Spring 학습 로드맵


Spring이란?

자바로 웹 애플리케이션을 만들 때 반복적으로 필요한 기능들을 프레임워크 수준에서 대신 처리해주는 도구다.

내가 할 일:  비즈니스 로직 (회원가입, 주문, 결제 등) 작성
Spring 할 일: 객체 생성/연결, HTTP 요청 처리, DB 연결/트랜잭션 관리, 보안 등

Spring의 핵심 철학은 좋은 객체지향 설계를 쉽게 할 수 있도록 돕는 것이다.


왜 Spring을 쓰는가

순수 자바의 한계

Spring 없이 자바로만 주문 서비스를 만든다고 하자.

public class OrderServiceImpl implements OrderService {
    // 직접 구현체를 선택하고 생성
    private MemberRepository memberRepository = new MemoryMemberRepository();
    private DiscountPolicy discountPolicy = new FixDiscountPolicy();

    public Order createOrder(Long memberId, String itemName, int itemPrice) {
        Member member = memberRepository.findById(memberId);
        int discount = discountPolicy.discount(member, itemPrice);
        return new Order(memberId, itemName, itemPrice, discount);
    }
}

이 코드의 문제는 무엇인가?

요구사항이 바뀌면 어떻게 되는가?

"정액 할인(1000원 고정)에서 정률 할인(10%)으로 바꿔주세요."

public class OrderServiceImpl implements OrderService {
    // OrderServiceImpl을 직접 수정해야 한다
    // private DiscountPolicy discountPolicy = new FixDiscountPolicy();
    private DiscountPolicy discountPolicy = new RateDiscountPolicy(); // 변경!
}

OrderServiceImpl은 주문 처리가 담당인데, 할인 정책 변경 때문에 코드를 건드려야 한다. 이는 명백한 설계 원칙 위반이다.


SOLID 원칙

좋은 객체지향 설계의 5가지 기준. Spring은 이 원칙들을 실현하는 도구다. → SOLID 원칙 상세 보기

원칙 이름 한 줄 요약
S SRP — 단일 책임 원칙 하나의 클래스는 변경 이유가 하나뿐이어야 한다
O OCP — 개방-폐쇄 원칙 확장에는 열려 있고, 변경에는 닫혀 있어야 한다
L LSP — 리스코프 치환 원칙 구현체는 인터페이스의 계약을 반드시 지켜야 한다
I ISP — 인터페이스 분리 원칙 범용 인터페이스 하나보다 작은 인터페이스 여러 개가 낫다
D DIP — 의존관계 역전 원칙 구현이 아닌 인터페이스(추상)에 의존해야 한다

학습 순서

Spring Core (기초)

단계 주제 핵심 질문
1 IoC & DI 제어권이 왜 외부로 넘어가야 하는가?
2 스프링 컨테이너 스프링은 빈을 어떻게 관리하는가?
3 싱글톤 왜 하나의 객체만 써야 하는가?
4 컴포넌트 스캔 빈 등록을 자동화하는 방법은?
5 의존관계 주입 같은 타입 빈이 여러 개면 어떻게 주입하는가?
6 빈 생명주기 초기화/소멸 시점에 어떻게 개입하는가?
7 빈 스코프 매번 새 객체가 필요할 때는?

Spring Boot & Web

단계 주제
8 Spring Boot
9 Spring MVC
10 REST API
11 Validation
12 Exception Handler
13 API 문서화 (Swagger)

공통 기능

단계 주제
14 AOP
15 Transaction
16 Logging

데이터 접근

단계 주제
17 JPA / Spring Data JPA
18 QueryDSL
19 JPA 성능 최적화

보안

단계 주제
20 Spring Security + JWT

테스트

단계 주제
21 Testing