✅ Spring

[Spring] Spring vs Spring Boot, 그리고 진짜 중요한 스프링 핵심 개념 총정리

Joyfullyever 2025. 4. 14. 19:56

✅ 정리할 내용

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 방식)