Spring Framework기초

post-thumbnail

Spring에 대한 기초 개념을 정리한 글 입니다.

Spring은 자바 기반 엔터프라이즈 애플리케이션 개발을 단순화하고 유연성을 높이기 위한 오픈소스 프레임워크입니다.

Spring 사용 이유 : 개발 생산성 향상, 코드의 재사용성 증가, 그리고 유지보수성 개선 때문

위와 같은 장점 때문에 사용하지만 조금 더 구체적인 내용을 알아보겠습니다.

제어의 역전 (Inversion of Control, IoC)

정의 객체의 생성과 의존성 관리를 개발자가 직접 하지 않고, 프레임워크가 대신 처리하는 설계 원칙.

  • Spring에서의 구현

    Spring IoC 컨테이너(BeanFactory 또는 ApplicationContext)가 객체(Bean)를 생성하고 관리.

    장점: 코드 결합도를 낮추고, 유연성과 테스트 용이성을 높임.

  • 예시: 개발자가 new 키워드로 객체를 생성하지 않고, Spring이 설정 파일이나 어노테이션을 통해 객체를 주입.(아래 코드 참조)

  • @Bean: Spring IoC 컨테이너에서 특별하게 관리하는 객체

  • @Configuration: Spring에서 설정 클래스임을 나타내는 어노테이션(@)

// 일반 클래스
class Car {
    void drive() {
        System.out.println("Driving a car!");
    }
}
@Configuration
class AppConfig {
    @Bean
    public Car car() {  // 메서드 이름이 Bean의 기본 ID가 됨
        return new Car();
    }
}
public class Main {
    public static void main(String[] args) {
        // IoC 컨테이너 생성 (ApplicationContext)
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

        // Bean을 컨테이너에서 호출 (new 없이 사용)
        Car myCar = context.getBean(Car.class);

        myCar.drive();
        // 출력 : Driving a car!
    }
}

Spring IoC 컨테이너

정의: Spring의 핵심으로, Bean의 생명 주기를 관리하고 의존성을 주입하는 역할을 함.

의존성 주입 (Dependency Injection, DI)

정의: IoC의 구체적인 구현 방식으로, 객체가 필요로 하는 의존성을 외부에서 주입받는 것.

  • 방법

    생성자 주입: 객체 생성 시 생성자를 통해 의존성 전달.(아래 코드 참조)
    Setter 주입: Setter 메서드를 통해 의존성 주입.
    필드 주입: @Autowired 같은 어노테이션으로 직접 필드에 주입(권장 X).
public class UserService {
    private UserRepository userRepository;

    // 생성자 주입
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

Spring Bean

정의: Spring IoC 컨테이너가 관리하는 객체.

생성 방식: XML 설정 파일, Java Config, 또는 @Component 같은 어노테이션으로 정의.

  • 스코프 종류

    Singleton(기본값): 컨테이너당 하나의 인스턴스.
    Prototype: 요청 시마다 새 인스턴스 생성.
    Request, Session, Global Session: 웹 애플리케이션에서 사용.
    참고 : Singleton외의 스코프는 어노테이션으로 선언해야한다.
@Component
public class UserService {
    // Bean으로 등록됨
}

AOP (Aspect-Oriented Programming, 관점 지향 프로그래밍)

정의: 핵심 비즈니스 로직과 공통 기능(로깅, 트랜잭션 관리 등)을 분리하여 코드 중복을 줄이고 유지보수를 쉽게 하는 기술.

개념설명
Aspect (관점)공통 기능을 모듈화한 클래스 (e.g: 로깅, 트랜잭션 관리)
Join Point (연결 지점)Advice가 적용될 수 있는 지점 (메서드 실행 등)
Advice (부가 기능)실행될 공통 코드 (e.g: 실행 시간 측정)
Pointcut (적용 대상 지정)Advice를 적용할 대상(메서드, 클래스) 지정
Weaving (위빙)Advice를 실제 객체에 적용하는 과정

Service Class

@Service
public class UserService {
    public void createUser(String name) {
        System.out.println("👤 사용자 " + name + " 생성 완료!");
    }
}

Aspect Class

@Aspect
@Component
public class LoggingAspect {
    @Around("execution(* com.example.service.UserService.*(..))")
    public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        Object result = joinPoint.proceed();
        System.out.println("⏳ 실행 시간: " + (System.currentTimeMillis() - start) + "ms");
        return result;
    }
}

장점

✅ 비즈니스 로직과 공통 기능 분리 → 코드 가독성 증가
✅ 중복 코드 제거 → 유지보수 편리
✅ 로깅, 보안, 트랜잭션 관리 등 다양한 공통 기능 적용 가능

Spring MVC (Model-View-Controller)

정의: 웹 애플리케이션 개발을 위한 프레임워크로, 요청을 처리하고 응답을 생성.

  • 구성 요소

    Controller: 요청을 처리하는 로직(@Controller).
    Model: 데이터를 담는 객체.
    View: 사용자에게 보여줄 화면(JSP, Thymeleaf 등).

  • 흐름

    클라이언트 요청 → DispatcherServlet
    Handler Mapping → 적절한 Controller 호출
    Controller → Model 생성 및 View 반환
    View 렌더링 → 클라이언트 응답.

@Controller
public class HomeController {
    @GetMapping("/home")
    public String home(Model model) {
        model.addAttribute("message", "Hello, Spring!");
        return "home"; // home.html 반환
    }
}

Spring 프레임워크 장단점 간략 정리

구분내용
장점DI/IoC: 의존성 주입으로 코드 결합도 ↓, 테스트 쉬움
경량화: POJO 기반, 불필요한 복잡성 제거
모듈화: Spring Boot, Security 등 필요한 기능만 골라 사용 가능
통합성: JDBC, JPA 등 기존 기술과 쉽게 연동
생산성: 설정 자동화로 개발 속도 ↑
커뮤니티: 풍부한 자료와 활발한 지원
단점학습 곡선: 방대한 기능 때문에 초보자가 익히기 어려움
복잡성: 커스터마이징 많아지면 설정이 꼬일 수 있음
성능: 의존성 주입으로 약간의 오버헤드 발생 가능
추상화: 내부 동작 파악이 어려울 수 있음
의존성 충돌: 모듈 많을 때 버전 관리 주의 필요

Spring Boot

Spring Boot는 Spring 프레임워크를 기반으로 설정을 자동화하고 빠른 개발을 지원하는 경량화된 솔루션입니다.

Spring Boot는 Spring의 설정을 자동화하고, 빠른 개발을 지원하는 확장판입니다. 기본 설정을 제공하며, 내장 서버(Tomcat 등)를 포함해 별도 WAS 없이 실행 가능합니다.

대표적인 기본 설정 종류

자동 설정: Spring Boot가 자동으로 환경에 맞는 설정을 처리.
스타터 의존성: 기능별로 필요한 라이브러리를 한번에 모아서 설정.
프로퍼티 파일 설정: application.properties 또는 application.yml 파일을 통해 설정.
자바 기반 설정: 자바 클래스를 이용해 직접 설정을 작성하는 방법.

내장 서버 종류

  • Tomcat -> 아파치 재단에서 개발된 가장 널리 사용되는 오픈소스 서블릿 컨테이너입니다.
  • Jetty -> 경량화된 서블릿 컨테이너로, 빠르고 메모리 효율성이 뛰어남.
  • Undertow -> Red Hat에서 개발한 고성능 비동기 웹 서버로, 논블로킹 I/O를 지원.

Spring vs Spring Boot 차이점

구분스프링 (Spring)스프링 부트 (Spring Boot)
설정수동 설정 (XML, Java Config)자동 설정 (Auto-Configuration)
개발 속도초기 설정 많아 느림최소 설정으로 빠름
배포WAR 파일, 외부 WAS 필요JAR 파일, 내장 서버로 독립 실행
의존성 관리수동으로 버전 관리BOM으로 자동 관리
목적유연성, 대규모 프로젝트빠른 개발, 마이크로서비스

스프링은 유연성을, 스프링 부트는 편의성과 속도를 강조한 차이가 핵심입니당.

profile
The learning never stops. 😂

0개의 댓글