지금까지의 과외내용을 요약해보면 xml 파일을 설정함으로써 많은 내용들을 컨트롤 할 수 있었고, 특히 Java 소스코드를 건드리지 않고도 프로그램의 동작을 어느정도 제어할 수 있다는 것이 핵심이었다. 하지만 이와 같은 xml 파일 설정도 양이 많아지면 부담이 되기 때문에 스프링 프레임워크에서는 어노테이션을 이용한 설정을 지원하고 있다. 이번 강의에서는 어노테이션의 종류와 그 설정 방법에 대해서 알아보자.
0. 어노테이션 설정을 위한 설정(applicationContext.xml)
1) Context 네임스페이스(ns) 추가
<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
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
2) 컨포넌트 스캔(Component-scan) 설정
applicationContext.xml 파일의 <beans> 태그 안에 <context:component-scan base-package="com.itisik"></context:component-scan> 과 같이 작성해준다. 그러면 "com.itisik"로 시작하는 모든 패키지를 스캔 대상으로 삼게 된다.
1. Component 어노테이션(@Component)
지금까지 태그를 통해서 일일이 클래스를 지정해주었지만, @Component 어노테이션을 활용하면 그렇게 하지 않아도 된다. 그저 클래스 선언부 위에 @Component 어노테이션을 사용해주면 된다. 단, 이러한 설정은 해당 클래스를 인스턴스화 시키는데에 문제가 없어야 한다. 즉 기본생성자가 존재해야 한다는 의미이다. Component 어노테이션을 사용할 때는 이후의 호출을 위해서 다음과 같이 name을 주는 것이 좋다.
@Component("[name]")
만약, name 속성 부여를 생략했다면 class명의 맨 앞자를 소문자로 바꾼 것으로 호출할 수도 있다. 다만 추천하는 방법은 아니다.
2. 의존성 주입 어노테이션(@Autowired, @Qualifier, @Resource)
Autowired 어노테이션은 멤버변수, 생성자, 메서드 등에 사용 가능하지만 주로 멤버변수에 사용한다. 스프링 컨테이너는 Autowired가 붙은 멤버변수를 보면 타입 체크를 먼저 한다. 해당 타입의 객체가 메모리에 존재하는지 확인 후 존재하면, 해당 객체를 멤버변수에 주입한다. 만약 해당 객체가 메모리에 존재하지 않으면 NoSuchBeanDefinitionException을 발생시킨다.
다만, 해당 타입의 객체가 메모리에 2가지 이상 존재하는 경우에는 어느 것을 선택해야하는지 모호하여 문제가 발생되는데 이때 Qualifier 어노테이션을 사용하여 모호함을 해소해준다. 따라서 보통 아래의 코드처럼 사용한다.
@Autowired
@Qualifier("[name]")
private [Object] [ObjectName];
앞서서 살펴본 Autowired 어노테이션의 경우, 변수의 타입을 활용하여 의존성 주입을 실시했는데, Resource 어노테이션은 객체의 이름을 활용하여 의존성 주입을 처리한다. 이와 비슷한 어노테이션으로 Inject 어노테이션이 있다.
3. xml 파일 설정의 장점과 어노테이션 설정의 장점 활용하기
xml 파일로써 의존성 주입을 실시하면, 자바 소스를 수정하지 않아도 된다는 장점이 있고 어노테이션으로써 의존성 주입을 실시하면, 편리하고 직관적이라는 장점이 있다. 각각의 단점으로는 관리하기 힘들다는 것과, 자바 소스를 수정해야 한다는 점이 있는데, 이제부터 이들 장점만을 섞어서 활용해보고자 한다.
class 파일의 상위에는 @Component에 name을 부여한 것으로 작성하고, 의존성 주입을 실시할 멤버변수 위에는 @Autowired만 작성한다. xml 파일에는 실제로 주입할 객체를 bean 객체로서 작성해주면 설정은 끝나게 된다.
다만, 우리가 직접 작성한 클래스는 어노테이션과 xml 설정 중 하나를 택할 수 있지만, 라이브러리 형태로 제공되는 클래스는 반드시 xml 설정을 해주어야 한다는 사실을 잊지 말아야 한다. 대표적으로 db와 연동하는 ojdbc 라이브러리가 있다.
4. MVC 패턴을 위한 어노테이션(@Controller, @Service, @Repository)
MVC 패턴에서 가장 핵심이라고 볼 수 있는 Controller, ServiceImpl, Dao 클래스에 대해서는 단순히 Component 어노테이션을 적용하는 것이 아니라 각각에 맞는 어노테이션을 제공하여 가독성을 높이고 각 클래스에 맞는 예외를 부여할 수 있다.
구분 | 어노테이션 | 의미 |
Controller | @Controller | 사용자 요청을 제어하는 클래스 |
ServiceImpl | @Service | 비즈니스 로직을 처리하는 클래스 |
Dao | @Repository | DB에 연동하는 클래스 |
'컴퓨터 공학 > 프로그래밍 과외 기록' 카테고리의 다른 글
[Django 프레임 워크] 2. 프로젝트 생성 (1) | 2021.10.17 |
---|---|
[Django 프레임 워크] 1. Django 프레임 워크를 위한 설정 (0) | 2021.10.17 |
[스프링 프레임워크 과외] 4. 의존성 주입 (0) | 2021.10.09 |
[스프링 프레임워크 과외] 3. 컨테이너 및 설정 파일(applicationContext.xml) (0) | 2021.10.04 |
[스프링 프레임워크 과외] 2. 프레임 워크 개요 (0) | 2021.10.04 |