[면접 회고] part. Spring

falsovsveritas·2025년 3월 27일

기술면접

목록 보기
6/10
  • 스프링에서 제공하는 기능 중 가장 핵심적인 것
  • 어노테이션을 붙이면 별도로 클래스에 생성자를 호출하지 않아도 다른 객체에 주입해서 사용할 수 있는 특징 -> 의존성 주입?
  • 어노테이션이 달린 객체들을 스프링이 읽어들여서 어노테이션이 붙어있는 bean 객체들을 어디에 저장? -> application-context cf)pom.xml의 역할 - 선언하는 것
  • Spring과 Spring boot의 차이
  • spring 없이 spring boot 쓸 수 있는지?

1. 스프링에서 제공하는 기능 중 가장 핵심적인 것

스프링 프레임워크의 가장 핵심적인 기능은 IoC(Inversion of Control, 제어의 역전)와 DI(Dependency Injection, 의존성 주입) 입니다.
이 외에도 AOP(Aspect-Oriented Programming), 트랜잭션 관리, MVC(Model-View-Controller) 웹 프레임워크 등이 중요한 기능입니다.

1️⃣ 제어의 역전(Inversion of Control, IoC)이란?

제어의 역전(IoC, Inversion of Control)객체의 생성 및 흐름 제어를 개발자가 직접 관리하는 것이 아니라, 스프링 프레임워크와 같은 컨테이너가 대신 관리하는 방식을 의미합니다.

🔹 쉽게 말해서?

기존에는 객체를 직접 생성하고, 필요한 곳에서 호출하여 사용해야 했지만, IoC를 사용하면 객체의 생성과 관리 권한을 프레임워크가 담당하게 됩니다.

✅ IoC가 적용되지 않은 코드 (전통적인 객체 생성 방식)

개발자가 직접 객체를 생성하고 사용해야 합니다.

public class Car {
    private Engine engine;

    public Car() {
        this.engine = new Engine(); // 직접 객체를 생성함
    }

    public void start() {
        engine.run();
    }
}

🔴 문제점

  • Car 클래스가 Engine 객체를 직접 생성하므로, CarEngine이 강하게 결합되어 있음 (높은 결합도).
  • Engine 객체가 변경되면 Car 코드도 수정해야 함.

✅ IoC 적용 코드 (제어의 역전)

이제 객체의 생성과 관리 권한을 스프링 컨테이너가 담당하게 만듭니다.

@Component // 스프링이 객체를 관리하도록 함
public class Engine {
    public void run() {
        System.out.println("Engine is running...");
    }
}

@Component
public class Car {
    private final Engine engine;

    @Autowired // 스프링이 자동으로 Engine 객체를 주입
    public Car(Engine engine) {
        this.engine = engine;
    }

    public void start() {
        engine.run();
    }
}

📍 IoC의 장점

객체의 생성과 관리를 프레임워크(Spring 컨테이너)가 담당 → 개발자가 직접 객체를 생성하지 않아도 됨.
의존성 주입(DI)과 함께 사용하면 결합도를 낮추고 유지보수성을 높일 수 있음.
객체의 변경이 필요할 때도 코드 수정이 최소화됨 (확장성 향상).


2️⃣ 의존성 주입(Dependency Injection, DI)이란?

의존성 주입이란 객체를 직접 생성하지 않고 외부에서 필요한 객체를 주입받는 방식을 의미합니다.

예제

@Component
public class Car {
    private final Engine engine;

    // 생성자 주입 (의존성 주입)
    @Autowired
    public Car(Engine engine) {
        this.engine = engine;
    }
}

위 코드에서 Car 클래스는 Engine 객체를 직접 생성하지 않고, 외부에서 주입받음으로써 결합도를 낮추고 유지보수성을 높일 수 있음.

3️⃣ IoC vs. DI (의존성 주입)

개념설명
IoC (제어의 역전)객체의 생성과 관리를 개발자가 직접 하지 않고, 스프링 컨테이너가 대신 담당하는 것
DI (의존성 주입)IoC의 한 방법으로, 필요한 객체를 스프링 컨테이너가 자동으로 주입해 주는 것

즉, IoC는 객체의 생성과 흐름 제어를 프레임워크가 담당하는 개념이고,
DI(의존성 주입)는 IoC를 실현하는 방법 중 하나입니다. 🚀


2. 스프링이 어노테이션이 달린 객체들을 저장하는 파일: ApplicationContext

  • 스프링은 @Component, @Service, @Repository, @Controller 등의 어노테이션이 붙은 객체(Bean)를 ApplicationContext에 저장하고 관리합니다.
  • ApplicationContext스프링 컨테이너로서, Bean을 생성하고 필요한 곳에 주입해주는 역할을 합니다.
// Bean 등록
@Component
public class MyComponent { }

// ApplicationContext에서 Bean 가져오기
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
MyComponent myComponent = context.getBean(MyComponent.class);

📌 참고: pom.xml의 역할

  • pom.xml은 Maven 프로젝트의 설정 파일로, 의존성을 선언하는 역할을 합니다.
  • 여기에 spring-boot-starter-web과 같은 의존성을 추가하면 스프링 관련 라이브러리를 자동으로 다운로드하여 사용할 수 있습니다.
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

3. Spring과 Spring Boot의 차이

1️⃣ Spring Framework

  • 핵심 개념: Spring은 DI(Dependency Injection), AOP(Aspect-Oriented Programming), 트랜잭션 관리 등 엔터프라이즈 애플리케이션 개발을 위한 핵심 기능을 제공하는 프레임워크입니다.
  • 설정 방식: XML 또는 Java 기반의 설정을 통해 애플리케이션을 구성해야 합니다.
  • 웹 개발: Spring MVC를 사용하여 웹 애플리케이션을 개발할 수 있으며, 수동으로 서블릿 컨테이너(Tomcat 등)를 설정해야 합니다.
  • 빌드 및 실행: 독립 실행형 애플리케이션이 아니라 별도의 WAS(Web Application Server)에 배포해야 합니다.
  • 유연성: 필요한 기능을 선택해서 사용할 수 있지만, 설정이 복잡합니다.

2️⃣ Spring Boot

  • Spring을 간편하게 사용하도록 만든 프레임워크입니다.
  • 설정 자동화: @SpringBootApplication을 사용하면 필요한 설정이 자동으로 적용됩니다.
  • 내장 웹 서버 제공: Tomcat, Jetty, Undertow 등의 내장 서버를 포함하고 있어 별도의 WAS 설치 없이 실행할 수 있습니다.
  • 의존성 관리 간소화: spring-boot-starter를 사용하면 필요한 라이브러리를 쉽게 관리할 수 있습니다.
  • Production-Ready 기능 제공: 모니터링, 헬스 체크, 로깅 등의 기능을 쉽게 추가할 수 있습니다.
  • 기본값 기반 설정: Spring Boot는 기존 Spring의 복잡한 설정을 줄이고, 대부분의 설정을 기본값으로 제공하여 빠르게 개발할 수 있도록 도와줍니다.

3️⃣ 비교 요약

항목Spring FrameworkSpring Boot
설정 방식수동 설정 (XML 설정 또는 Java 설정 필요)자동 설정 (@SpringBootApplication)
웹 서버없음 (Tomcat 등 외부 WAS 별도 설정 필요)내장 웹 서버 제공 (Tomcat, Jetty 등)
의존성 관리수동 추가spring-boot-starter-*를 사용해 자동 관리
실행 방식배포 후 실행독립 실행 가능 (java -jar)
사용 편의성복잡한 설정 필요설정 최소화
기본 프로젝트 구조사용자가 직접 설정spring-boot-starter 사용으로 기본 구조 제공
목적유연하지만 설정이 많음빠르게 개발 가능하도록 지원

즉, Spring Boot는 Spring을 더 쉽게 사용할 수 있도록 도와주는 프레임워크이며, 별도의 설정 없이도 빠르게 애플리케이션을 개발하고 실행할 수 있습니다.


4. Spring 없이 Spring Boot를 사용할 수 있는가?

불가능합니다.
Spring Boot는 Spring Framework를 기반으로 동작하는 프레임워크이기 때문에, Spring 없이 Spring Boot만 따로 존재할 수 없습니다.

📌 Spring Boot는 정확히 뭘 포함하고 있을까?

Spring Boot는 내부적으로 Spring Framework를 포함한 라이브러리 모음입니다.
즉, Spring Boot를 설치하면 Spring도 자동으로 따라오기 때문에, 따로 Spring을 설치할 필요는 없습니다.

📦 Spring Boot의 주요 구성 요소:
1. Spring Core → IoC 컨테이너, 의존성 주입(DI) 기능 포함
2. Spring Web (Spring MVC) → 웹 개발을 위한 기능 제공
3. Spring Data → 데이터베이스 연동을 쉽게 해주는 기능
4. Spring Security → 인증 및 보안 관련 기능
5. Spring Boot Starter → 위의 기능들을 쉽게 가져올 수 있도록 도와주는 패키지

이처럼 Spring Boot는 Spring의 기능을 자동 설정하고 쉽게 사용할 수 있도록 확장한 것입니다.

📌 그렇다면 "Spring 없는 Spring Boot"를 만든다면?

만약 Spring 없이 Spring Boot 같은 걸 만들고 싶다면?
👉 결국 Spring의 IoC 컨테이너, DI, 트랜잭션 관리, AOP, MVC 같은 기능을 직접 구현해야 하는데
👉 그러면 사실상 Spring을 다시 만드는 것과 다름없다.

📌 결론:
✔ Spring Boot는 Spring 없이 동작할 수 없음.
✔ 하지만 Spring Boot를 설치하면 Spring이 포함되므로, 따로 Spring을 설치할 필요는 없음.
✔ "Spring 없는 Spring Boot"는 결국 존재할 수 없고, 있다면 그것은 Spring이 아닌 완전히 다른 프레임워크일 것.

0개의 댓글