도담도담

어노테이션 (annotation) 본문

IT 공부/KH 정보교육원

어노테이션 (annotation)

Zinisang 2021. 6. 16. 21:57

어노테이션 (annotation) 은 메타데이터(metadata) 라고 볼수 있다. 메타데이터는 데이터들을 위한 데이터로써, 컴파일과정이나 런타임과정에서 코드를 어떻게 처리할 것인지 알려주는 정보라고 할 수 있다.

 

어노테이션의 용도는 크게 3가지로 나타낼수 있다.

  1. 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공
  2. 소프트웨어 개발툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보 제공
  3. 실행시(런타임시)특정 기능을 실행하도록 정보를 제공

@Component

@Component 뒤에 아무것도 안붙이면 자동으로 이름이 부여된다
public class LgTV implements TV { } 부분의
=> LgTV -> "lgTV"


@Autowired 

@Autowired 를 이용한 의존성 주입 : 주로 컴포넌트(클래스)의 멤버 변수상단에 사용...
Spring Container는 @Autowired를 만나는 순간 해당 변수의 데이터 타입을 확인

Spring Container의 객체중 해당 타입을 가진 객체를 자동 주입.

@Autowired
private Speaker speaker;

위의 경우 Speaker 타입을 가진 객체를 검색...
검색 결과가 없으면 해당 변수에 객체를 주입할 수 없기 때문에 ... 찾을 수 없다는 예외처리 발생..

(
NoSuchBeanDefinitionException: No matching bean of type [di.anno.Speaker] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=apple)}
)


해결방법1 : 설정파일에 <bean ~~~></base> 태그(엘리먼트)를 이용하여 컨테이너 구동시 자동 생성될 수 있도록 설정

해결방법2 : 해당 타입을 갖는 클래스선언부 위에 @Component를 설정하여 설정 파일의 <context:component-scan ~~></context:component-scan> 에 의해서 자동 검색할 수 있도록 설정...


@Qualifier

@Qualifier 를 이용하는 경우 : 
Spring Container 내에 동일한 타입을 갖는 객체가 여러 개일 경우..
특정 객체를 지정하여 Spring Container 가 혼돈하지 않도록 설정..

예) SonySpeaker / AppleSpeaker 이 클래스가 Speaker 인터페이스를 구현받았다고 가정
<bean id="sony" class="di.anno.SonySpeaker"></bean>  <== Speaker 타입
<bean id="apple" class="di.anno.AppleSpeaker"></bean> <== Speaker 타입

@Component("tv")
public class LgTV implements TV {

@Autowired => Speaker 타입 객체를 검색
@Qualifier("apple") <== 와 같이 특정 객체를 설정...
private Speaker speaker;

//중략..
}




@Qualifier("apple")을 지정하지 않았을 경우에 발생하는 에러

(
Could not autowire field: private di.anno.Speaker di.anno.LgTV.speaker; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [di.anno.Speaker] is defined: expected single matching bean but found 2: [apple, sony]
)


@Resource

@Resource 를 이용하여 의존성 주입: 객체 이름을 이용하여 주입..
참고: @Autowired는 타입을 이용하여 의존성 주입..

즉, 동일한 타입의 객체가 여러 개일 경우, @Autowired는 @Qualifier("apple")와 같이 추가로 지정해주어야 하지만, 
@Resource는 @Resource(name="apple")와 같이 지정할 수 있다..


따라서, @Autowired가 있는 멤버 변수의 타입과 동일한 타입을 갖는 객체가 1개만 조재할 경우에는  @Autowired를 사용.
여러개일 경우에는 @Resource가 편리.


만약 지정한 객체 이름이 없을 경우, 아래와 같이 찾을 수 없다는 예외처리...

(
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'apple1' is defined
)



어노테이션과 XML 설정을 병행하여 사용


1. 특정 컴포넌트에 주입되는 객체가 자주 변경되어야 할 경우에는 <bean ~~></bean> 으로 설정

2. 특정 컴포넌트에 주입되는 객체가 고정일 경우에는 
주입되는 클래스에는 @Component 를 설정하고
주입받는 클래스 내부의 변수에는 @Autowired를 이용하여 설정
또는 주입받는 클래스 내부의 변수엔는 @Autowired와 @Qualifier("객체명")를 이용하여 설정


단, ~~.jar 처럼 라이브러리 형태로 제공되는 클래스는 반드시 설정파일 내에 <bean ~~></bean> 의 형태로 설정한다!!

예) 개발자가 선언하는 클래스는 어노테이션 또는 xml 형태를 선택
아파치 톰캣, 스프링 프레임워크가 제공하는 클래스는 반드시 <bean ~~></bean> 으로 지정
스프링이 제공하는 DispatcherServlet 클래스 처럼!!


비지니스 로직실습:

BoardWeb_DI_boardService 프로젝트 생성 후, 불필요한 폴더 및 파일 삭제..
Properties 메뉴에서 자바버전 및 Runtime 을 톰캣으로 설정.. (project facets)
pom.xml 에서 자바버전 및 스프링 릴리즈 수정. (자바 : 1.8 / 스프링 릴리즈 : 4.2.4)

BoardWeb_DI_boardService => src => main => webapp => WEB-INF => lib폴더 생성 => ojdbc8.jar 파일추가..
(공식적으로는 오라클사에서 더이상 pom.xml 에서 사용되는 Dependency를 제공하지 않는다고 해서, 오라클 드라이버 라이브러리는 직접 넣어서 사용.)


Spring 의 비지니스 영역 작업 시,


서비스( 즉, 비지니스 로직 처리 부분) 는 interface를 이용하여 구현한다!

서비스 클래스는 @Service("서비스명")

데이터 접근 클래스(DAO)는 @Repository


파일위치 용도

src/main/java : 완성된 자바 파일
src/main/resource : 앱관련 리소스 (설정파일 등...)
src/test/java : 완성하기 전 자바 테스트 파일
src/test/resource : 완성하기 전 테스츠용 앱관련 리소스 (설정파일 등...)

'IT 공부 > KH 정보교육원' 카테고리의 다른 글

어노테이션을 이용한 MVC  (0) 2021.06.18
AOP(Aspect Oriented Programming)  (0) 2021.06.17
의존성 주입 (DI : Dependency Injection)  (0) 2021.06.16
Spring 사용방법 (개념)  (0) 2021.06.15
xml 기본 틀  (0) 2021.06.13
Comments