스프링 프레임워크에서 빈을 자동으로 스캐닝 하는것과 관련된 어노테이션 Stereotyping Annotations @Compo…

 

스프링 프레임워크에서 빈을 자동으로 스캐닝 하는것과 관련된 어노테이션

Stereotyping Annotations

@Component,@Repository,@Service,@Controller,@RestController

 

작성자 : 이종철

 

스프링 컨테이너는 base-package의 클래스를 검색해서 자동으로 자바 빈으로 등록하는 데 이에 해당하는 것이 스테레오타입 어노테이션(Stereotype Annotation) @Component, @Repository, @Service, @Contoroller, @RestController 어노테이션이다.

 

@Controller, @Service, @RepositoryPresentation, Service, Data Access 계층을 나타내기 위한 @Component의 특별한 형태이다.

 

자동스캔을 위해서 XML 기반의 설정에서는 <context:component-scan base-package="onj.edu.spring, a.b.c" /> 과 같이 base-package를 기술하며, 자바설정 기반인 경우 @ComponentScan 어노테이션을 사용하면 된다.

 

n  @Component : 일반적인 용도의 컴포넌트들을 표시하는 기본 스테레오 타입, 멤버변수와 getter, setter만 가지고 있는 DTO, VO 같은 컴포넌트를 지칭한다. 스프링이 @Component 붙은 자바 클래스를 클래스패스 경로에서 자동으로 찾아 Application Context안에 이름을 부여하고 빈으로 등록한다. 빈의 기본 Scope songleton이며 @Scope 어노테이션으로 변경 가능하다.

@Component

//요청이 있을 때 마다 빈 생성, 생략하면 Singleton으로 생성된다.

@Scope("prototype")

public class Student {

.....

}

 

n  @Repository : 영속성 계층(Persistence Layer, Data Access Layer, 주로 DB와 관련된 작업을 수행) DAO 컴포넌트에 부여하는 어노테이션, @Component의 역할과 유사하며 DAO 메소드가 던지는 예외(Unckecked Exception)를 스프링의 DataAccessException으로 변환한다.

 

@Repository

public class EmpRepositoryImpl implements EmpRepository {

.....

}

 

n  @Service :  비즈니스 로직을 담고 있는 서비스 레이어의 컴포넌트를 가리키며 @Component 어노테이션과 동작은 같지만 서비스 계층의 클래스들은 @Service 어노테이션을 부여하는 것이 코드 가독성이 좋다.

 

@Service

public class EmpServiceImpl implements EmpService {

.....

@Autowired

EmpRepository empRepository;

}

 

 

n  @Controller : 프리젠테이션 레이어의 컨트롤러 컴포넌트, Spring MVC의 컨트롤러에 부여

@Controller
public class EmpController  {
 @Autowired
 private EmpService sempService;
 ...
}

 

 

2-4-1-1. Auto-Scanning Component 실습예제

 

1. File >> New >> Spring Legacy Project   프로젝트명 : autoscantest

 

2. Emp.java

package test.autoscan.model;

 

import org.springframework.stereotype.Component;

 

import lombok.Data;

 

@Data

@Component

public class Emp {

      int empno;

      String ename;

}

 

3. EmpDao.java

package test.autoscan.repository;

 

import org.springframework.stereotype.Repository;

 

import test.autoscan.model.Emp;

 

@Repository

public class EmpDao {

      public Emp createEmp() {

            System.out.println("EmpDao createEmp...");

            Emp e = new Emp();

            e.setEmpno(1001);

            e.setEname("SMITH");

            return e;

      }

}

 

4. EmpService.java

package test.autoscan.service;

 

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

import org.springframework.stereotype.Service;

 

import test.autoscan.model.Emp;

import test.autoscan.repository.EmpDao;

 

@Service

public class EmpService {

      @Autowired

      private EmpDao empDao;

     

      public Emp createEmp() {

            System.out.println("EmpSerevice... createEmp");

            return empDao.createEmp();

      }

}

 

5. beans.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-4.2.xsd

            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">

     

      <context:component-scan

    base-package="test.autoscan.model, test.autoscan.service, test.autoscan.repository" />

</beans>

 

6. MainApp.java

package test.autoscan;

 

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

 

import test.autoscan.service.EmpService;

 

public class MainApp {

      public static void main(String[] args) {

            ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

            EmpService empService = context.getBean(EmpService.class);

            System.out.println(empService.createEmp());

      }

}

 

7. 실행결과

EmpSerevice... createEmp

EmpDao createEmp...

Emp(empno=1001, ename=SMITH)

 

 


 

Comments