Framework/SPRING

[SPRING 이론] [04] 인스턴스화 / 어노테이션

오류나면꽥꽥 2024. 3. 4. 10:25

new 객체화

: 프로그램의 수행 순서를 제어하거나, 문장들의 수행 횟수를 조정하는 문장 new 한다는 것은 객체화 의미

▶ 스프링 프레임워크를 이용하여 IoC(제어의 역행)이 되었기 때문에

직접 new 하지 않고 프레임워크를 활용하여 객체화

 

 

 

✅ 인스턴스화

 

  • XML 설정 파일을 사용하여 빈을 정의하고 빈을 생성하는 것은 그 자체로 인스턴스화

 

 

 

 

⛔ .xml <bean>으로 사용 시 단점

  1. 설정이 과다해짐
  2. 가독성 떨어짐
  3. 구조파악이 어려움

 

ex)

.xml <bean>을 사용하여 객체 생성

applicationContext.xml

 
// applicationContext.xml
<bean class="test.GalaxyPhone" id="gp" />

 

 

📍 .xml  ▶  .java  @어노테이션 사용하여 단점 해결!

 

@ 어노테이션 사용 시 장점

  1. JAVA의 구조파악에 도움을 줌
  2. .xml이 줄어듦 -> 가독성 좋아짐
  3. context 네임스페이스를 추가해야 @을 사용할 수 있음

 

 

✅ @ 어노테이션 방식으로 객체화 방법

네임스페이스

applicationContext.xml에서

@을 사용하기 위해서는 먼저 Namespaces 로 들어가서 context 네임스페이스를 추가

 

 
 
 
 
 
 
 

 

✅ @Component / @Autowired

 

  • 스프링 프레임워크에서 의존성 주입(Dependency Injection)을 위해 사용되는 주요한 어노테이션

 

 

@Component @Autowired
스프링에서 빈(Bean)으로 등록할 클래스를 지정할 때 사용
스프링 컨테이너가 해당 타입의 빈을 자동으로 찾아 주입

 

 

 

ex)

@Component 어노테이션을 사용한 빈 등록

// java
import org.springframework.stereotype.Component;

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

 

@Autowired 어노테이션을 사용한 의존성 주입

// java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Car {
    private Engine engine;

    @Autowired
    public Car(Engine engine) {
        this.engine = engine;
    }

    public void drive() {
        engine.start();
        System.out.println("Car is driving!");
    }
}
// java
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {
    public static void main(String[] args) {
        // 스프링 컨테이너 초기화
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

        // Car 빈 가져오기
        Car car = context.getBean(Car.class);

        // 자동차 주행
        car.drive();

        // 컨테이너 종료
        context.close();
    }
}

 

 

 

 

 

 

 

@Autowired는 메모리에 있는 객체의 자료형을 보고 의존 주입을 해주게 되는데,

만약 같은 자료형의 객체가 2개 이상이라면?

 

 

⚠️BeanCreationException 오류 발생!

 

 

 

  1. 빈의 이름을 명시해서 오류 해결
    @Component("빈명")​
  2. @Autowired 어노테이션과 함께 @Qualifier 사용하여 오류 해결
    @Autowired
    @Qualifier("빈명")