Spring(anno)

RedNine·2023년 2월 16일
0

스프링

목록 보기
3/17
post-thumbnail

🎁어노테이션

클래스와 연관이 있고 import를 어노테이션과 연관이 있는 클래스 불러온다. 스프링의 3분의1은 어노테이션을 사용한다.

어노테이션은 한개이상 겹쳐서 나올 수가 있다.
@Required
@Autowired

🍳 사용목적

  • 1) 환경설정에 관한 어노테이션 => xml에서 사용
  • 2) 자바코딩의 간결화 => 코드대신에 사용이 가능

장점

1) 시스템 복잡성이 아니라면 어노테이션 사용은 적합하게 쓰이면 코드가 간결해지고 유지보수가 용이해진다.

2) 대형 시스템엔 계층 구조가 잘 파악되기 위해서는 xml 사용이 필수이다.
(어노테이션과 연관있는 클래스를 빈즈로 등록->xml)

단점

1) 어노테이션 은 메타정보가 소스코드에 들어가므로 파악하기 어렵다.
(재 컴파일이 필요하다.)

2) 소스코드가 같이 제공되지 않으면 사용에 제약이 따른다.
(어노테이션과 클래스를 같이 사용해야한다.)

🍳 사용방법

xml에서 @Required, @Autowired, @Resource를 사용하기위해서는 아래와 같은 빈즈클래스를 미리 등록시켜줘야 한다.

@Required
<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor" />
@Autowired
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
@Resource
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />

1. 클래스 명위에 기술

컴포넌트 스캔

컴포넌트 스캔은 스프링이 직접 클래스를 검색해서 빈으로 등록해주는 기능이다.

@Component

  • 애노테이션으로 스캔 대상을 지정하여 자동적으로 그 패키지에 들어가 있는 모든 클래스 중에서 @Component가 붙어있는 클래스를 자동으로 빈즈로 등록시켜주는 어노테이션이다.
  • 스프링이 검색해서 빈으로 등록할 수 있으려면 클래스에 @Component 어노테이션을 붙여야한다.

    1)네임스페이스를 이용

    2)component-scan 태그를 이용해서 빈즈객체를 자동으로 등록한다.
    어노테이션 및 특정 패키지에 들어가 있는 모든 클래스의 빈즈객체를 자동으로 등록시켜주는(옵션)이다.
    ex)
    com.spring.anno5 -> Camera, Camera2, Camera3
    com.spring.sub -> HomeController, HomeController2
    base-package="com.spring.*" (위에 5개만 자동으로 등록한다.)
    base-package="com.spring.sub" (sub의 2개만 등록한다.)

    특정이름으로 가져오기
    @Component -> 클래스 이름으로 등록, @Component("특정이름") -> 특정이름으로 가져오기

환경설정 어노테이션

@Configuration

<기존의 방식>
인터페이스 -> 클래스, 클래스+클래스 => xml로 작성(의존객체를 가져옴)
ex) <bean id="mybean" class="anno6.MyBeanImpl" />
<xml을 대신한 java>
.java에 @Configuration을 지정하여 xml환경설정 파일 대신에 빈클래스를 등록 시켜서 환경설정을 해주는 역할을 한다.

@Bean

<bean>태그를 이용해서 빈즈를 등록시켜주는 것과 동일하게 대신 등록시켜주는 어노테이션이다.

🎈Main.java

public class Main {
	public static void main(String[] args) {
		// TODO Auto-generated method stub	
		//2. xml파일 역할의 자바환경설정파일을 메모리에 올려줄 수 있는 클래스를 통해서 객체를 생성
		AnnotationConfigApplicationContext context=
				new AnnotationConfigApplicationContext(AppConfig.class);//환경설정클래스명.class	
		//MyBean bean=context.getBean(MyBean.class);
		MyBean bean=context.getBean("getBeanName",MyBean.class);
		System.out.println("bean => "+bean);
		System.out.println("bean.getBeanName() => "+bean.getBeanName());
		//5. context도 종료
		context.close();//메모리에 올려놓은 모든 빈즈객체들을 모두 메모리에서 해제		
	}
}

2가지 옵션
context객체명.getBean(객체를 얻어올 클래스명.class)
context객체명.getBean("빈즈클래스 구분id", 객체를 얻어올 클래스명.class)

2. 멤버변수명 위에 기술

3. 메서드명 위에 기술

@Override
메서드명이 오버라이딩이 된 메서드인지 확인해주는 기능을 가진 어노테이션이다.

@Required
이 메서드를 반드시 호출해야되는데 만약에 호출하지 않으면 에러를 유발시킨다, 멤버변수와 관련된 에러메세지를 출력시켜준다.


  xml에서 @Required를 사용하기 위해서 빈즈클래스 등록

@Required
<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor" />

@Autowired
스프링 빈에 의존하는 다른 빈을 자동으로 주입하고 싶을 때 사용한다.
ex) 같은기능(<bean> autowire="byType"/>)

🎈app2.xml
<bean id="moniter" class="anno2.SystemMoniter" />
<!--
<bean id="sender" class="anno2.SmsSender" />
-->
🎈SystemMoniter.java
@Autowired
public void setSender(SmsSender sender) {
	this.sender = sender;
	System.out.println("setSender() 호출됨 => "+sender);//sender.toString
}

  @Autowired 특징
1 생성자, 멤버변수(=속성), 메서드에 지정이 가능하다.
2 @Autowired메서드를 호출하면서 매개변수가 의존성객체를 자동으로 얻어서 넣어준다.(멤버변수에)
3 Setter Method외에 다른 메서드에서 동일하게 적용이 된다.
4 해당하는 빈즈객체가 없거나 두 개이상 존재시 에러를 유발한다.
✔두 개이상 존재시 에러가 발생한 경우 : @키워드(속성명=속성값,,,속성명2=속성값2,,,)
Autowired(required=true)무조건 가져와서 옵션을 부여하지만, 가져올 빈 객체가 없으면 에러가 유발된다.

멤버변수에 @Autowired을 준다면
간소화하여 자동으로 주입한다.

🎈app2.xml
<bean id="moniter" class="anno2.SystemMoniter" />
<bean id="sender" class="anno2.SmsSender" />
🎈SystemMoniter.java
@Autowired
private SmsSender sender;
        ,,,
/*
@Autowired(required=false)
public void setSender(SmsSender sender) {
 	this.sender = sender;
	System.out.println("setSender() 호출됨 => "+sender);//sender.toString
}
*/

@inject
@Inject는 @Autowired와 유사하게 주입하려고 하는 객체의 타입이 일치하는 객체를 자동으로 주입한다.

pom.xml에 기술해서 다운로드 후 사용가능

🎈pom.xml에 추가

<dependency>
	<groupId>javax.inject</groupId>
	<artifactId>javax.inject</artifactId>
	<version>1</version>
</dependency>

@Autowired , @Inject의 차이점

  • @Autowired =>xml 파일에 빈즈클래스 등록 (O)
  • @Inject =>xml 파일에 빈즈클래스 등록 (X)

@Resource
같은 클래스 자료형이 여러개 있을때 각각의 객체를 구분하기 위해서 사용한다.
주입하려고 하는 객체의 이름(id)이 일치하는 객체를 자동으로 주입한다.
형식)
형식) @Resource(name="빈즈의 구분자id")

  • 멤버변수에 적용->setXXX 메서드 생략가능하다.
  • 자동으로 연결할 의존객체를 얻어올때 사용
    🎈HomeController
  • @Resource 을 사용하기위해서 다운로드
    🎈pom.xml에 추가
		<dependency>
		    <groupId>javax.annotation</groupId>
		    <artifactId>javax.annotation-api</artifactId>
		    <version>1.3.2</version>
        </dependency>

🎈app2.xml에 추가

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />

@Resource와 @Autowired

  • @Resource - byName(이름으로 찾아서 자동으로 객체를 넣어주는 개념)
  • @Autowired - byType(같은 자료형을 찾아서 자동으로 객체를 넣어주는 개념)
    공통점 : 자동으로 객체를 넣어준다. (멤버변수)
    차이점 : byName vs byType

@PostConstruct
빈즉객체 생성전에 초기화 작업을 하고자할때(=생성자) 먼저 실행을 시킨다.

  • 물건 사기전에 돈을 지불(=선불)

@PreDestroy
객체가 생성된 후에 작업을 한다.

  • 메모리 작업해제, p91 close와 비슷하다.
  • 물건을 받고 나중에 돈을 지불(후불)

@PostConstruct와 @PreDestroy

0개의 댓글

관련 채용 정보