-
Spring Frmework 기본공부/spring 2023. 4. 23. 18:26
Framework 이란
- 소프트웨어의 구체적인 부분에 해당하는 설계와 구현을 재사용이 가능하게끔 이련의 협업화된 형태로 클래스들을 제공하는 것
- 어떤 대상의 큰 틀이나 외형적인 구조를 의미
- 기본적으로 프로그래밍을 하기 위한 어떠한 틀이나 구조
Framework 장 단점
장
- 효율적인 코드 작성 (개발자가 애플리케이션의 핵심 로직을 개발하는 것에 집중할 수 있도록 해줌)
- 정해진 규약이 있어 애플리케이션을 효율적으로 관리할 수 있습니다
단
- 내가 사용하고자 하는 Framework에 대한 학습 필요
- 자유롭고 유연한 개발 어려움
핵심 포인트
- Framework은 기본적으로 프로그래밍을 하기 위한 틀이나 구조를 제공
Framework vs Library
- Framework : 틀
- Library : 기능 집합체
핵심 포인트
- Framework : 개발자가 애플리케이션의 핵심 로직을 개발하는 것에 집중할 수 있도록 해준다
- Library : 애플리케이션 흐름의 주도권이 개발자에게 있는 반면 Framework는 애플리케이션 흐름이 주도권이 아닌 개발자가 아닌 Framework에 있다
Spring Framework 이란
장
- POJO(Plan Old Java Object) 기반의 구성
- DI(Dependency Injection) 지원
- AOP(Aspect Oriented Programming, 관점지향 프로그래밍) 지원
- Java 언어를 사용함으로써 얻는 장점
POJO란
- JAVA로 생성하는 순수한 객체
조건
- JAVA나 JAVA의 스팩에 정의된 것 이외에는 다른 기술이나 규약에 얽매이지 않아야 한다
- 특정 환경에 종속적이지 않아야 한다
IoC란
- 애플리케이션 흐름의 주도권이 뒤바뀐 것
DI란
- 의존성 주입
Ioc 와 DI 차이
loc코드
public class Car extends Vehicle { @Override public void drive() { System.out.println("Driving a car"); } } public class Driver { private Vehicle vehicle; public Driver(Vehicle vehicle) { this.vehicle = vehicle; } public void driveVehicle() { vehicle.drive(); } } public class Main { public static void main(String[] args) { Vehicle sedan = new Sedan(); Vehicle suv = new SUV(); Driver driver1 = new Driver(sedan); driver1.driveVehicle(); // Output: Driving a sedan Driver driver2 = new Driver(suv); driver2.driveVehicle(); // Output: Driving an SUV } } public class Sedan extends Car { @Override public void drive() { System.out.println("Driving a sedan"); } } public class SUV extends Car { @Override public void drive() { System.out.println("Driving an SUV"); } } public class Vehicle { public void drive() { System.out.println("Driving a vehicle"); } }
- Sedan과 SUV 클래스는 Car 클래스 상속
- Car클래스는 Vehicle 클래스 상속
- 그러므로 Sedan, SUV클래스는 Vehicle 클래스의 메소드를 직접 사용 가능
- Driver 클래스는 Vehicle 클래스를 인자로 받아들이는 생성자를 가지고 있음
- Main 클래스에서는 Sedan,SUV 객체를 생성하고 각각을 Driver 객체에 전달
- Dirver 클래스는 어떤 종류의 Vehicle을 운전하는지 알수 없다
- 뷰와 모델 사이의 흐름을 변경하는 것이 가능하다
DI코드
public class Car { private Engine engine; public Car(Engine engine) { this.engine = engine; } public void start() { engine.start(); System.out.println("Starting the car"); } } public class ElectricEngine implements Engine { public void start() { System.out.println("Starting an electric engine"); } } public interface Engine { void start(); } public class GasolineEngine implements Engine { public void start() { System.out.println("Starting a gasoline engine"); } } public class Main { public static void main(String[] args) { Engine gasolineEngine = new GasolineEngine(); Car gasolineCar = new Car(gasolineEngine); gasolineCar.start(); Engine electricEngine = new ElectricEngine(); Car electricCar = new Car(electricEngine); electricCar.start(); } }
- Car 클래스는 Engine 인터페이스에 의존
- Car 클래스의 생성자에서 Engine 객체를 인자로 받아들이고 이를 내부에서 사용
- Main 클래스에서는 GasolineEngine,ElectricEngine 객체를 생성하고 각각을 Car 객체에 전달합니다
- Car클래스는 어떤 종류의 Engine을 사용했는지 알 필요가 없다
- 컨테이너가 Engine 객체를 생성, Car객체에 자동으로 주입
- Car클래스는 Engine 인터페이스에만 의존
- 새로운 Engine이 추가되더라도 Car클래스의 코드를 변경할 필요가 없다
- 이런 코드는 객체간의 결합도를 낮추고 유연성을 높일수 있다
차이점
- id는 개발자가 수동으로 의존성 주입
- ioc는 컨테이너가 자동으로 의존성을 주입
- id는 ioc의 일부분
- ioc는 di를 구현할 수 있는 방법중 하나
AOP란
- 애플리케이션에 필요한 기능 중에서 공통적으로 적용되는 공통 기능에 대한 관심과 관련이 있다
- 애플리케이션의 핵심 업무 로직에서 로깅이나 보안, 트랜잭션 같은 공통 기능 로직들을 분리하는
공통 관심 사항과 핵심 관심 사항
- 공통 관심 사항 : 공통적으로 사용되는 기능들
핵심 관심 사항
- 비즈니스 로직, 애플리케이션의 주목적을 달성하기 위한 핵심 로직