백엔드

[Spring Boot] Framework

빡성 2025. 10. 11. 14:59

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