JavaConfig, 어노테이션 실습

Minkyeong Kim·2021년 11월 16일
0

[boostcourse] Web-Backend

목록 보기
25/55

Java Config

  • 자바 클래스 파일을 설정 파일로 사용
  • @Configuration이라는 어노테이션을 붙여 사용

어노테이션

  • 특수한 의미를 부여하는 역할을 수행
  • 컴파일, 런타임 시에 해석됨

@Configuration

스프링 설정 클래스를 선언하는 어노테이션

@Bean

bean을 정의하는 어노테이션
-> AnnotationConfigApplicationContext는 자동으로 실행해 결과로 리턴하는 객체들을 싱글턴으로 관리해줌

@ComponentScan

@Controller, @Service, @Repository, @Component 어노테이션이 붙은 클래스를 찾아 컨테이너에 등록

@Component

컴포넌트 스캔의 대상이 되는 애노테이션 중 하나로써 주로 유틸, 기타 지원 클래스에 붙이는 어노테이션

@Autowired

주입 대상이되는 bean을 컨테이너에 찾아 주입하는 어노테이션

ApplicationConfig 실습 1

ApplicationConfig.java

package kr.or.connect.diexam01;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ApplicationConfig {
	@Bean
	public Car c(Engine e) {
		// 파라미터를 받아들이지 않는 객체 생성
		Car c= new Car();
		c.setEngine(e);
		return c;
	}
	
	@Bean
	public Engine engine() {
		return new Engine();
	}
}
  • ApplicationContext는 파라미터를 받아들이지 않는 bean 생성 메서드를 먼저 다 실행해 반환받은 객체 관리
    -> 파라미터에 생성된 객체들과 같은 타입이 있는 객체가 있을 경우 파라미터로 전달해 객체 생성

ApplicationContextExam03.java

package kr.or.connect.diexam01;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ApplicationContextExam03 {
	public static void main(String[] args) {
		// ApplicationConfigs에서 설정해준 Bean들을 만들어 가지고 있다가 사용자의 요청에 의해 결과 반환
		ApplicationContext ac = new AnnotationConfigApplicationContext(ApplicationConfig.class);
		
		// Bean을 객체의 이름에 따라 요청하는 과정
		//Car car=(Car) ac.getBean("car");
		// Bean을 객체의 타입에 따라 요청하는 과정 -> 객체의 이름에 상관없이 가져올 수 있다
		Car car = (Car) ac.getBean(Car.class);
		car.run();
	}
}
  • AnnotationConfigApplicationContxext는 @Bean이 붙어있는 메서드들을 자동으로 실행해 그 결과로 리턴하는 객체들을 싱글턴으로 관리하게 함
    -> 이전 실습의 xml파일 가져오는 모듈과 다름!

ApplicationConfig 실습 2

Engine.java

package kr.or.connect.diexam01;

import org.springframework.stereotype.Component;

//컴포넌트 어노테이션 추가
@Component
public class Engine {
	public Engine() {
		System.out.println("Engine 생성자");
	}
	public void exec() {
		System.out.println("엔진이 동작합니다.");
	}
}

Car.java

package kr.or.connect.diexam01;

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

@Component
public class Car {
	@Autowired
	private Engine v8;
	public Car() {
		System.out.println("Car 생성자");
	}
	public void setEngine(Engine e) {
		this.v8=e;
	}
	public void run() {
		System.out.println("엔진을 이용하여 달립니다.");
		v8.exec();
	}
}
  • @Autowired: Engine타입의 객체가 생성된 것이 있다면 Car객체에 주입하라는 의미를 가진 어노테이션

ApplicationConfig2.java

package kr.or.connect.diexam01;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration

//어노테이션 붙은 클래스를 자동으로 등록할 수 있도록 함
//반드시 정확한 패키지명을 입력해줘야 패키지 내의 컴포넌트를 스캔함
//컨트롤러, 서비스, 레포지토리, 컴포넌트 등의 어노테이션이 붙어있는 클래스들을 Bean으로 등록해줌
@ComponentScan("kr.or.connect.diexam01")
public class ApplicationConfig2 {

}

ApplicationContextExam04.java

package kr.or.connect.diexam01;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class ApplicationContextExam04 {
	public static void main(String[] args) {
		ApplicationContext ac = new AnnotationConfigApplicationContext(ApplicationConfig.class);
		Car car = (Car)ac.getBean(Car.class);
		car.run();
	}
}
  • 에러 발생할 경우 같은 클래스의 객체들의 이름을 통일하면 해결됨
    -> 이전 실습의 ApplicationConfig.java 파일에서 Car 클래스의 객체 이름을 car로 설정

0개의 댓글