Spring Boot 한 줄 소개
Spring Boot는 Spring 기반 애플리케이션을 빠르게 시작·운영할 수 있도록 자동 설정과 내장 서버, 스타터 의존성을 제공하는 프로젝트다.
프레임워크란?
프레임워크는 애플리케이션의 기본 골조와 규칙을 제공하고, 그 규칙 안에서 작성된 코드를 프레임워크가 필요 시 호출하는 구조적 플랫폼이다. 핵심은 제어의 역전(IoC)으로, 진입점과 생명주기가 프레임워크에 있다. 이 위에서 의존성 주입(DI)과 AOP 같은 메커니즘으로 결합도를 낮추고 공통 관심사를 분리한다.
예시: 프레임워크가 흐름을 주도 (가장 작은 Boot 앱)
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.*;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args); // 프레임워크가 애플리케이션 수명주기 주도
}
}
@RestController
class HelloController {
@GetMapping("/hello")
public String hello() { return "hello world"; }
}
예시: IoC/DI로 의존성 주입
import org.springframework.stereotype.*;
import org.springframework.web.bind.annotation.*;
interface Greeter { String greet(String name); }
@Component
class SimpleGreeter implements Greeter {
public String greet(String name) { return "Hi, " + name; }
}
@RestController
class GreetController {
private final Greeter greeter;
public GreetController(Greeter greeter) { this.greeter = greeter; } // 컨테이너가 주입
@GetMapping("/greet")
public String greet(String name) { return greeter.greet(name); }
}
Framework vs Library
공통점
- 일반적인 문제 해결을 위한 재사용 코드를 제공한다.
- 개발 생산성을 높이고 일관성을 돕는다.
차이점(판별 기준)
- 제어 주체: 프레임워크는 프레임워크가 코드를 호출, 라이브러리는 개발자가 라이브러리를 호출한다.
- 진입점/수명주기: 프레임워크는 고정된 진입점과 수명주기를 제공한다.
- 확장 지점: 프레임워크는 콜백/확장 지점이 정의되어 있다.
예시: Framework — 요청 시 프레임워크가 내 메서드를 호출
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
class WebControllerFw {
@GetMapping("/fw-hello")
public String hello() {
return "framework calls this method"; // 요청 들어오면 프레임워크가 이 메서드를 호출
}
}
예시: Framework — 부팅 후 콜백(CommandLineRunner)
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
class InitRunner implements CommandLineRunner {
@Override
public void run(String... args) { // 애플리케이션 부팅 완료 후 프레임워크가 자동 호출
System.out.println("Initialized by framework");
}
}
예시: Library — 필요할 때 직접 호출
import org.apache.commons.lang3.StringUtils;
public class LibExample {
public static void main(String[] args) {
String s = " hello ";
System.out.println("[" + StringUtils.trim(s) + "]"); // [hello]
}
}
왜 프레임워크를 쓰는가?
- 효율: 기능적/비기능적 요구 분리로 구조가 선명해진다.
- 품질: 검증된 패턴과 기본값으로 일관된 코드와 테스트 용이성을 확보한다.
- 표준/호환: 업계 표준과의 정합성이 높다.
- 비용: 개발·운영·유지보수 비용을 낮춘다.
예시: AOP — 공통 관심사(로깅) 분리
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Aspect
@Component
class LogAspect {
@Before("execution(* com.example.demo.*Controller.*(..))")
public void before() { System.out.println("[LOG] before controller"); }
}
예시: PSA — 구현체 교체가 쉬운 추상화
import org.springframework.mail.*;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
@Service
class NoticeService {
private final JavaMailSender mailSender; // 인터페이스에 의존
NoticeService(JavaMailSender mailSender) { this.mailSender = mailSender; }
public void send(String to) {
SimpleMailMessage m = new SimpleMailMessage();
m.setTo(to); m.setSubject("Hi"); m.setText("Hello");
mailSender.send(m); // 구현체 교체 용이
}
}
여기서 언급한 IoC, DI, AOP는 다음 글에서 간단한 예시와 함께 차근차근 정리한다.
'백엔드' 카테고리의 다른 글
| [Spring Boot] Spring IoC - 개념 (0) | 2025.10.11 |
|---|---|
| [SpringBoot] Bean이란? (0) | 2025.10.11 |
| MySQL - 백엔드 개발자가 알아야 할 데이터베이스 기초 (0) | 2025.02.14 |
| AWS 클라우드 서비스 (0) | 2025.02.10 |
| 웹 서버의 동작 원리 (0) | 2025.02.10 |