[Spring] DI 어노테이션 방식 이론

김승현·2022년 1월 11일
0

컴포넌트 스캔(component-scan) 설정

  • <bean> 등록을 하지 않고 자동적으로 생성하려면 context:component-scan 이라는 엘리먼트를 정의 해야 함

    • 스프링 컨테이너는 Class Path에 있는 클래스들을 스캔하여
    • 어노테이션이 설정된 클래스들을 자동으로 객체 생성
  • ex) <context:component-scan base-package="kr.co.spring" /> 로 설정되어 있다면?

    • kr.co.spring.controller : 스캔 대상
    • kr.co.spring.model.vo : 스캔 대상
    • kr.co.spring.test : 스캔 대상
    • kr.co.member.model.vo : 스캔 대상 아님
    • kr.co.member.controller : 스캔 대상 아님



어노테이션 종류

@Component

  • scan 설정을 했다면 스프링 설정파일에 클래스들을 일일이 <bean> 엘리먼트로 등록할 필요없음
  • @Component 클래스 선언부 위에 설정

@Autowired

  • 주로 변수 위에 설정하여 해당 타입의 객체를 찾아서 자동으로 할당

  • import : org.springframework.beans.factory.annotation.Autowired

  • 생성자나 메소드, 멤버변수 위에 모두 사용 가능

    • 대부분은 멤버변수 위에 선언하여 사용
  • 작동 절차
    1. 스프링 컨테이너가 멤버 변수 위에 @Autowired를 확인-> 해당 변수의 타입을 체크
    2. 그 타입의 객체가 메모리에 존재하는지를 확인한 후에 그 객체를 변수에 주입
    3. 만약 @Autowired가 붙은 객체가 메모리에 없다면
    컨테이너가 NoSuchBeanDefinitionException을 발생 시킴
    (대상 객체가 메모리에 존재하지 않는다는 의미)


@Qualifier

  • 특정 객체의 이름을 이용하여 의존성 주입할 때 사용(@Autowired와 함께 사용)

  • import : org.springframework.beans.factory.annotation.Qualifier

  • 의존성 주입 대상이 되는 같은 타입의 객체가 2개일때

  • 컨테이너를 어떤 객체를 할당할지 스스로 판단할 수 없어서 에러가 발생함

  • 이때 @Autowired와 @Qualifier(value="value 명") 함께 작성


@Inject

  • @Autowired와 동일한 기능을 지원 (차이점은 Autowired는 스프링 전용, Inject는 자바전용)

  • import : javax.inject.Inject


@Resource

  • @Autowired와 @Qualifier의 기능을 결합한 어노테이션

  • import : javax.annotation.Resource

  • Autowired와 Qualifier의 기능을 결합한 어노테이션

  • @Autowired는 변수의 타입을 기준으로 객체를 검색하여 의존성 주입 처리

  • @Resource를 이용하면 객체의 이름을 이용하여 의존성 주입 처리

    • name 속성을 이용하여, 스프링 컨테이너가 해당 이름으로 생성된 객체를 검색하여 의존성 주입

@Controller

  • 사용자 요청을 제어하는 Controller 클래스

@Service

  • 비즈니스 로직을 처리하는 Service 클래스

@Repository

  • 데이터 베이스 연동을 처리하는 DAO 클래스



추가 어노테이션

@RequestMapping

  • 특정 uri로 요청을 보내면 Controller에서 어떠한 방식으로 처리할지 정의 함
  • 이때 들어온 요청을 특정 메서드와 매핑하기 위해 사용
  • 속성
    • value : 요청받을 url 설정
    • method : 어떤 요청으로 받을지 정의(GET, POST, PUT, DELETE 등)

@RequestParam

  • 요청 매개변수에 들어있는 기본 타입 데이터를 메서드 인자로 받아올 수 있음
  • 데이터가 없다면 BadRequest로 http 4** 에러 발생

@SessionAttribute

  • Controller 밖(Interceptor or Filte 등)에서 만들어 준 Session 데이터에 접근할 때 사용

[참고] 파라미터에 VO 객체 이용하여 View Page의 input 태그 내의 정보를 가져 올수 있다-> input태그의 name과 VO 객체의 필드 명과 동일 해야함

profile
개발자로 매일 한 걸음

0개의 댓글