본문 바로가기
자바과정/스프링

스프링 실습 예제 (어노테이션, Configuration/Bean)

by Parkej 2021. 4. 6.

참고 : lazymankook.tistory.com/27

출처 : mangkyu.tistory.com/75

어노테이션이란 ? : velog.io/@gillog/Spring-Annotation-%EC%A0%95%EB%A6%AC


프로그램이 거대해 짐에 따라 
XML을 이용하여 IOC Container를 설정하는 것이 점점 어려워졌고 때문에 Annotation(@)이란 것이 등장했다(이하 어노테이션). 어노테이션은 코드에 메타데이터를 작성하여 직관적인 코딩이 가능하게 만들어주며 이에 따라 생산성이 증대되는 장점을 가지고 있다.

 

@Configuration

- @Configuration : Configuration 어노테이션은 스프링 IOC Container에게 해당 클래스를 Bean 구성 Class임을 알려주는 것이다.

@Bean

- @Bean : 어노테이션의 경우 개발자가 직접 제어가 불가능한 외부 라이브러리등을 Bean으로 만들려할 때 사용된다.

[ @Bean, @Configuration ]
개발자가 직접 제어가 불가능한 외부 라이브러리 또는 설정을 위한 클래스를 Bean으로 등록할 때 @Bean 어노테이션을 활용1개 이상의 @Bean을 제공하는 클래스의 경우 반드시 @Configuration을 명시해 주어야 함

 

Bean으로 만드는 annotation

어떤 클래스를 bean으로 만들기 위해선 @Bean을 사용하거나 @Component를 사용하면 된다. 그렇지만 Bean과 Component는 차이가 있다.

사용하는 관점에서 차이점은 아래와 같다.

 

  • @Component는 클래스 상단에 적으며 그 default로 클래스 이름이 bean의 이름이 된다. 또한 spring에서 자동으로 찾고(@ComponentScan 사용) 관리해주는 bean이다.

  • @Bean은 @Configuration으로 선언된 클래스 내에 있는 메소드를 정의할 때 사용한다. 이 메소드가 반환하는 객체가 bean이 되며 default로 메소드 이름이 bean의 이름이 된다.

 


어노테이션과 XML을 혼합해서 사용하는 방법

- Spring project name : FiveMVC 
- 프로젝트는 스프링 레거시 프로젝트로 생성
- 디렉터리 구조 

 

 

ApplicationConfig.java
package com.javalec.ex;

import java.util.ArrayList;

import org.springframework.context.annotation.*;

//1개 이상 Bean을 등록하고 있음을 명시하는 어노테이션
@Configuration
public class ApplicationConfig {
	
	@Bean
	public Student student1() {
		// 취미 리스트에 데이터 넣기
		ArrayList<String> hobbys = new ArrayList<>();
		hobbys.add("수영");
		hobbys.add("요리");
		
		// 생성자에 데이터 삽입
		Student student = new Student("홍길동",20,hobbys);
		// 세터에 데이터 삽입
		student.setWeight(80);
		student.setHeight(180);
		
		return student;
	}
	
//	@Bean
//	public Student student2() {
//		// 취미 리스트에 데이터 넣기
//		ArrayList<String> hobbys = new ArrayList<>();
//		hobbys.add("독서");
//		hobbys.add("음악감상");
//		
//		// 생성자에 데이터 삽입
//		Student student = new Student("팟캐스",30,hobbys);
//		// 세터에 데이터 삽입
//		student.setWeight(70);
//		student.setHeight(170);
//		
//		return student;
//	}
}

 

 

MainClass.java
package com.javalec.ex;

//import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
	
	public static void main(String[] args) {
		
//	AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ApplicationConfig.class); // scr/main/java 에서 생성된 어노테이션을 사용할시
	AbstractApplicationContext ctx	= new GenericXmlApplicationContext("classpath:applicationCTX.xml"); 
	
	Student student1 = ctx.getBean("student1",Student.class);
	System.out.println("이름 : " + student1.getName());
	System.out.println("나이 : " + student1.getAge());
	System.out.println("취미 : " + student1.getHobbys());
	System.out.println("신장 : " + student1.getHeight());
	System.out.println("몸무게 : " + student1.getWeight());
	
	Student student2 = ctx.getBean("student2",Student.class);
	System.out.println("이름 : " + student2.getName());
	System.out.println("나이 : " + student2.getAge());
	System.out.println("취미 : " + student2.getHobbys());
	System.out.println("신장 : " + student2.getHeight());
	System.out.println("몸무게 : " + student2.getWeight());
	
	ctx.close();
	}
}

 

 

Student.java
package com.javalec.ex;

import java.util.ArrayList;

public class Student {
	private String name;
	private int age;
	private ArrayList<String> hobbys;
	private double height;
	private double weight;
	
	public Student(String name, int age, ArrayList<String> hobbys) {
		this.name = name;
		this.age = age;
		this.hobbys = hobbys;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public ArrayList<String> getHobbys() {
		return hobbys;
	}

	public void setHobbys(ArrayList<String> hobbys) {
		this.hobbys = hobbys;
	}

	public double getHeight() {
		return height;
	}

	public void setHeight(double height) {
		this.height = height;
	}

	public double getWeight() {
		return weight;
	}

	public void setWeight(double weight) {
		this.weight = weight;
	}
	
	
}

 

 

applicationCTX.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">

<!-- 어노테이션에서 쓴거를 xml로 불러올때 -->
<context:annotation-config/>
<bean class = "com.javalec.ex.ApplicationConfig"/>

<bean id = "student2" class="com.javalec.ex.Student">
	<constructor-arg>
		<value>팟캐스</value>
	</constructor-arg>
	
	<constructor-arg>
		<value>30</value>
	</constructor-arg>
	
	<constructor-arg>
	<list>
		<value>독서</value>
		<value>음악감상</value>
	</list>
	</constructor-arg>
	
	<property name="weight" value ="70"/>
	<property name="height" value ="170"/>
</bean>

</beans>

실행결과


 

어노테이션을 xml에서 호출할때 오류해결법
xml


namespace > context 체크

 


DI 의존성 주입 (CGLIB 오류시)

- mvnrepository.com/ 접속

 

- CGLib 검색

 

- 맞는 버전 선택

 

- 해당 프로젝트 porm.xml 에 코드 삽입 

!!! <dependencies> 요 안에 넣어줘야 함. </dependencies>

 

 


 

어노테이션으로 호출하기 (위에와 반대방법)

 

 

 

ApplicationConfig.java
- @ImportResource("classpath:applicationCTX.xml") 추가

 

applicationCTX.xml
- context 지우기 > namespace 에서 context 체크 풀기

 

 그리고 실행.. 

 

 

반응형

댓글