Spring

[Spring] 컴포넌트 스캔(component-scan)

jane.dev 2021. 9. 8. 23:15
반응형
component-scan 설정
bean 으로 등록될 준비를 마친 클래스를 스캔하여 bean으로 등록

 

component-scan 설정

servlet-context.xml 에서 Namespaces 탭 - mvc 체크 → context:component-scan 태그 사용 가능

 

base-package 속성으로 스캔할 범위를 지정

<context:component-scan base-package="패키지명" />

 

component-scan 활용

아래 두가지 조건을 만족하면 객체를 컴포넌트 스캔 처리 가능

1. 위에서 지정한 패키지 범위안에 존재

2. 클래스명 위에 어노테이션 작성

    @Component 용도가 애매한 객체에 사용

    @Controller 컨트롤러에 사용

    @Service 서비스 객체에 사용

    @Repository DAO 객체에 사용

 

스프링 MVC

스프링 MVC는 컨트롤러 파일에 메서드를 작성

예시 1 (String 타입으로 결과 페이지 반환)

// @Controller: Servlet-context.xml 가장 하단의 component-scan으로 해당 파일을 컨트롤러로 인식
// bean-container에 삽입 - 해당 어노테이션이 부여된 class들을 자동으로 스캔해 bean 으로 등록
@Controller
public class MvcController{
    
    // @RequestMapping: 기본 url 이후 주소를 정의해 접속시 작동
    // 기본 주소(localhost:8181)뒤에 "/goA"를 작성하면 goA() 메서드 실행
    @RequestMapping(value="/goA")
    public String goA(){
        // 결과 페이지는 views 폴더 아래의 A.jsp(.jsp를 생략하고 작성)
        return "A";
    }

 

예시 2 (주소 뒤 ?값=값 형태로 들어오는 결과 페이지 반환_파라미터 내부 변수 값과 주소 뒤 값이 일치)

    @RequestMapping(value="/goB")
    // 주소 뒤 ? 뒤의 값을 파라미터 값으로 처리 - 작성하지 않으면 결과 페이지에 접근하지 못함
    public String goB(int num, Model model){
        // 파라미터 값 전달 - addAttribute("name", value);
        mdoel.addAttribute("num", num);
        return "C";
    }

 

예시 3 (주소 뒤 ?값=값 형태로 들어오는 결과 페이지 반환_파라미터 내부 변수 값과 주소 뒤 값이 불일치)

    @RequestMapping(value="/goC")
    // @RequestParam("대체이름") - 작성한 변수명 대신 대체이름으로 받아옴
    public String goC(@RequestParam("c")int num, Model model){
        model.addAttribute("num", num);
        return "C";
    }

 

예시 4 (결과 페이지가 같은 주소를 공유하지만 접근방식에 따라 다른 값을 반환)

    // 하나의 로직으로 작동하는 메서드라는 것을 알려주기 위해 같은 주소를 사용
    // form 에서 method=post 로 제출시에만 해당 메서드가 실행됨
    @RequestMapping(value="/goD", method=RequestMethod.POST)
    public String goD(int d, Model model){
        model.addAttribute("d", d);
        return "D";
    }
    
    // 주소창을 검색하여 이동하는 것은 get 방식으로 간주되어, 주소창에 /goD 입력 시 해당 메서드가 실행됨
    @RequestMapping(value="/goD", method=RequestMethod.GET)
    public String goDForm(){
        return "DForm";
    }

@RequestMapping의 Method=get, post 방식 구분을 넣는 파라미터는

1. 위처럼 각각 사용하거나

2. array로 묶어 method = {RequestMethod.GET, RequestMethod.POST} 사용하거나

3. get 방식만을 전제로 하는 @GetMapping(), post 방식만을 전제로 하는 @PostMapping()로 사용 가능

 

예시 5 (url 패턴으로 특정 파라미터 값 받아와 결과 페이지 반환)

    // '/주소값/숫자'에서 숫자 위치에 있는 값을 page 값으로 간주
    @RequestMapping(value="/goE/{page}")
    public String goE (@PathVariable int page, Model model){
        model.addAttribute("page", page);
        return "E";
    }

 

예시 6 (void 타입은 반환할 값이 없기 때문에 반환될 결과 페이지의 이름은 'url패턴.jsp' 로 자동 지정)

    @RequestMapping(value="/goF", method=RequestMethod.GET)
    public void goF(int f, Model model){
        model.addAttribute("f", f);
    }