[Spring] Spring vs Spring Boot, 그리고 진짜 중요한 스프링 핵심 개념 총정리
✅ 정리할 내용
Spring과 Spring Boot의 차이
왜 XML 대신 어노테이션을 쓰는가
스프링의 핵심 개념인 IoC, DI, AOP
설정 파일, 주입 방식, 구조와 설계 철학
✅ 1. Spring? Spring Boot? 차이점은?
항목 | Spring (Legacy) | Spring Boot |
설정 방식 | XML 중심 | 어노테이션 중심 |
설정 난이도 | 높음 (장황함) | 낮음 (자동 설정) |
개발 방식 | 설정 위주 | 설정 최소화, Convention |
배포 방식 | 보통 WAR | 보통 JAR (내장 톰캣 포함) |
💡 스프링 부트란?
XML 설정 없이, 어노테이션(@)을 통해 Java 코드 기반 설정을 가능하게 만든 Spring Framework의 확장판
XML에서 하는 길고 복잡하고 가독성 떨어지는 설정을 자바에서 한줄로 처리할 수 있게 됨
// XML 설정 없이도 가능한 코드 예시
@SpringBootApplication
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
}
⚙️ 2. 스프링이 뭔데 이렇게까지 쓰는가?
❇️ “IoC와 AOP를 지원하는 경량의 프레임워크” ❇️
• 경량이란? → POJO 기반 (Plain Old Java Object, 일반적인 자바 객체 사용)
• 서블릿처럼 무거운 구조가 아닌, 일반 클래스로 웹개발이 가능
🔄 3. IoC (제어의 역전) 이란?
기존 방식
FrontController fc = new FrontController(); // 개발자가 직접 new
Spring에서
@Controller
public class FrontController { ... }
// 어노테이션 기반 객체 생성, 스프링 컨테이너가 new 함
new를 직접 하지 않고, 스프링이 대신 객체 생성, 관리, 주입까지 맡아주는 구조
• 객체 생성 타이밍, 순서도 개발자가 아닌 컨테이너가 제어
• 결과적으로 결합도↓, 테스트 용이성↑, 유지보수성↑
🧩 4. DI (의존성 주입)
객체 간의 관계를 외부에서 주입 → 결합도 낮추기 위함
방식
1. 생성자 주입
• 의존 객체가 먼저 생성되어 있어야 함
2. Setter 주입
• 기본 생성자 호출 후, setter로 주입
@Autowired
public MyService(MyRepository repo) { // 생성자 주입
this.repo = repo;
}
@Autowired
public void setRepo(MyRepository repo) { // Setter 주입
this.repo = repo;
}
👓 5. AOP (관점 지향 프로그래밍)
• 핵심 로직과 공통 관심사(로깅, 보안, 트랜잭션 등) 를 분리
• 높은 응집도를 유지하게 도와줌
• 비즈니스 로직은 그대로, 부가 기능만 분리하여 코드가 깔끔해짐
@Around("execution(* com.myapp.service.*.*(..))")
public Object logMethod(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("메서드 실행 전 로그");
Object result = joinPoint.proceed();
System.out.println("메서드 실행 후 로그");
return result;
}
🏗️ 6. 스프링 프로젝트 구조 & 설정
📦 패키지 구조
com.회사명.프로젝트명.단계명(회사마다 상이함)
📁 기본 디렉토리 구조
• Java 소스: src/main/java
• 리소스 파일: src/main/resources
⚙️ 설정 파일
• 스프링 설정 파일: applicationContext.xml (기본 설정 위치)
• 부트 설정 파일: application.properties 또는 application.yml
🧪 7. 의존성 테스트, 결합도 낮추는 법
• 다형성 + 인터페이스 + 팩토리 패턴 = 결합도 ↓
• 실제 객체가 없어도 테스트 가능 (Mock 객체 등)
// 키위가 없으면 키위 테스트 못하는 구조는 결합도 높은 구조
Fruit fruit = new Kiwi(); // X
Fruit fruit = FruitFactory.create(); // O
🏁 마무리 요약
개념 | 설명 |
IoC | 객체 생성/관리를 스프링 컨테이너가 담당 |
DI | 필요한 객체를 외부에서 주입, 결합도 ↓ |
AOP | 공통 기능 분리, 응집도 ↑ |
Spring Boot | XML 없이 자바 코드로 설정, 개발자 편의성 ↑ |
applicationContext.xml | 스프링 컨테이너 설정파일 (XML 방식) |