MDP
스프링 프레임워크 본문
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 |