MDP

스프링 프레임워크 본문

공부일지/Spring_공부일지

스프링 프레임워크

모다팡 2024. 7. 10. 16:49

Spring과 Spring Boot 모두 스프링 프레임워크를 기반으로 한 자바 웹 개발 프레임워크

스프링 프레임 워크

- 자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크

- 동적인 웹 사이트를 개발하기 위해 여러 가지 서비스를 제공 

- 제어 역전 (IOC) : 기존 사용자가 모든 작업을 제어하던 것을 특별한 객체에 모든 것을 위임하여 객체의 생성부터 생명주기 등 모든 객체에 대한 제어권이 넘어 간 것을 IOC, 제어의 역전 이라고 합니다.

- 기존 사용 방식 - 

class Engine {
    public void start() {
        System.out.println("Engine started");
    }
}

class Car {
    private Engine engine;

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

    public void start() {
        engine.start();
        System.out.println("Car started");
    }
}

public class Main {
    public static void main(String[] args) {
        Car car = new Car(); // 직접 객체 생성
        car.start();
    }
}


- Car 클래스에서 Engine 객체를 직접 생성하고 있음

- Engine 클래스가 변경되면 Car 클래스도 변경해야하는 문제가 발생

 

- IoC 방식으로 구현 -

1. 의존성 주입 - 

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.3.15</version>
    </dependency>
</dependencies>

 

// Engine 클래스
public class Engine {
    public void start() {
        System.out.println("Engine started");
    }
}
//Car 클래스
public class Car {
    private Engine engine;

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

    public void start() {
        engine.start();
        System.out.println("Car started");
    }
}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean
    public Engine engine() {
        return new Engine();
    }

    @Bean
    public Car car() {
        return new Car(engine());
    }
}
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        Car car = context.getBean(Car.class);
        car.start();
    }
}

- @Configuration : 이 클래스가 스프링의 설정 클래스임을 나타내고 있음, Bean 메서드를 포함하고 있음, Bean 주입이 가능하게 함

- @Bean : 스프링 컨테이너가 관리하는 빈 객체를 생성하는 메서드 . 스프링 컨테이너에 의해 관리되며, 의존성 주입과 같은 스프링의 다양한 기능을 사용할 수 있음.

- 스프링 컨테이너 : 스프링 프레임워크의 핵심 개념으로, 애플리케이션에서 빈 객체를 생성, 관리, 소멸하는 역할을 담당. 설정된 정보를 읽고 , 이를 기반으로 빈을 생성하고 의존성을 주입합니다.

 

- 의존성 주입 -

 

1. 생성자 주입 : 생성자를 통해 의존성을 주입 받는 방식

 

-  자바를 활용한 방식 -

public class Engine {
    public void start() {
        System.out.println("Engine started");
    }
}

public class Car {
    private Engine engine;

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

    public void start() {
        engine.start();
        System.out.println("Car started");
    }
}

public class Main {
    public static void main(String[] args) {
        Engine engine = new Engine();
        Car car = new Car(engine); // 의존성 주입
        car.start();
    }
}

 

-스프링 사용했을 때 의존성 주입-

public class Engine {
    public void start() {
        System.out.println("Engine started");
    }
}

public class Car {
    private Engine engine;

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

    public void start() {
        engine.start();
        System.out.println("Car started");
    }
}

@Configuration
public class AppConfig {
    @Bean
    public Engine engine() {
        return new Engine();
    }

    @Bean
    public Car car() {
        return new Car(engine());
    }
}

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        Car car = context.getBean(Car.class);
        car.start();
    }
}

 

2. 세터 주입 : setter 메서드를 통해 의존성을 주입받는 방식

 

- 자바를 활용 - 

public class Engine {
    public void start() {
        System.out.println("Engine started");
    }
}

public class Car {
    private Engine engine;

    // 세터 주입
    public void setEngine(Engine engine) {
        this.engine = engine;
    }

    public void start() {
        engine.start();
        System.out.println("Car started");
    }
}

public class Main {
    public static void main(String[] args) {
        Engine engine = new Engine();
        Car car = new Car();
        car.setEngine(engine); // 의존성 주입
        car.start();
    }
}

 

- 스프링을 사용 - 

public class Engine {
    public void start() {
        System.out.println("Engine started");
    }
}

public class Car {
    private Engine engine;

    // 세터 주입
    public void setEngine(Engine engine) {
        this.engine = engine;
    }

    public void start() {
        engine.start();
        System.out.println("Car started");
    }
}

@Configuration
public class AppConfig {
    @Bean
    public Engine engine() {
        return new Engine();
    }

    @Bean
    public Car car() {
        Car car = new Car();
        car.setEngine(engine());
        return car;
    }
}

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        Car car = context.getBean(Car.class);
        car.start();
    }
}

 

3. 필드 주입 : 직접 필드에 주입하는 방식 . @Autowired 어노테이션을 사용

public class Car {
    @Autowired
    // 필드 주입
    private Engine engine; 

    public void start() {
        engine.start();
        System.out.println("Car started");
    }
}

 

@Configuration
public class AppConfig {
    @Bean
    public Engine engine() {
        return new Engine();
    }

    @Bean
    public Car car() {
        return new Car();
    }
}

 

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        Car car = context.getBean(Car.class);
        car.start();
    }
}

2.  서비스 로케이터 

- 서비스 로케이터는 클라이언트가 필요한 서비스의 인스턴트를 검색하고 제공하는 방식. 

- 서빗의 위츠를 추적하는 중앙 레지스트리 역할을 하는 객체

public class ServiceLocator {
    private static Map<String, Object> services = new HashMap<>();

    public static void registerService(String key, Object service) {
        services.put(key, service);
    }

    public static Object getService(String key) {
        return services.get(key);
    }
}

public class Main {
    public static void main(String[] args) {
        ServiceLocator.registerService("engine", new Engine());
        Car car = new Car((Engine) ServiceLocator.getService("engine"));
        car.start();
    }
}

3. 이벤트 기반 프레임 워크

- 이벤트 기반 프레임워크에서는 이벤트를 통해 제어의 흐름을 역전시키는 방식

- 객체는 특정 이벤트가 발생하면 미리 정의된 핸들러를 호출

public class Event {
    private String message;

    public Event(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}

public interface EventListener {
    void onEvent(Event event);
}

public class EventPublisher {
    private List<EventListener> listeners = new ArrayList<>();

    public void registerListener(EventListener listener) {
        listeners.add(listener);
    }

    public void publishEvent(Event event) {
        for (EventListener listener : listeners) {
            listener.onEvent(event);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        EventPublisher publisher = new EventPublisher();
        publisher.registerListener(event -> System.out.println("Received event: " + event.getMessage()));
        publisher.publishEvent(new Event("Hello, World!"));
    }
}

 

 

'공부일지 > Spring_공부일지' 카테고리의 다른 글

SpringBoot를 활용한 MariaDB 연결  (0) 2024.07.17
Jar 파일 - BOOT-INF 영역  (0) 2024.07.11
Apache Tomcat  (0) 2023.11.01
API  (0) 2023.11.01
웹 서버  (0) 2023.11.01