코딩딩/Spring

Spring 기초 2

전낙타 2023. 9. 19. 09:08

IoC(Inversion of Control)컨테이너의 사용

  • 어노테이션을 이용한 객체주입
    • 컨테이너가 어노테이션 기호를 보고 객체를 생성해서 자동으로 연결시켜준다.
    • 스프링컨테이너가 생성될때 설정파일에 등록된 패키지를 스캐닝해서 어노테이션 기호가 추가된 객체들을 생성하고 관계를 설정한다.
    • 컨테이너가 생성될때 특정 패키지를 읽어서 작업해야 하므로 <context:component-scan> 태그를 이용해서 생성하고 싶은 객체가 있는 패키지를 등록해야 한다.
    • 생성자, 필드, setter메소드를 통해서 주입받을 수 있다.

    1. 빈생성

      스프링 컨테이너가 관리할 수 있도록 하려면

      @component : 기본빈으로 정의하고 등록할때

      @Service : 서비스 역할을 하는 빈을 등록

      @Repository : db연동을 위한 빈을 등록

      @Controller : 스프링웨 MVC에서 사용하는 컨트롤러로 등록

      ⇒ <bean></bean>으로 등록하는 것과 동일

      ⇒ 빈의 이름을 등록하지 않으면 클래스의 첫 글자를 소문자로 바꾼 이름으로 등록한다.

    1. 객체연결

      @Autowired : 같은 타입의 빈이 컨테이너 내부에 존재하면 자동으로 연결

      같은 타입의 빈이 2개 이상 있는 경우 어떤 빈을 매칭해야 하는지 찾을 수 없다

      @Qualifier : 같은 타입의 빈이 여러 개인 경우 정확하게 매칭시킬 빈의 이름을 명시해야 한다.

스프링 MVC의 구조

  • 스프링 MVC는 역할을 분리
  • 기본으로 frontController패턴이 적용됨
  • 이 모든 구성 요소가 내부에서 웹 요청을 위해 동작하고 각각의 상황에 맞게 작업할 수 있도록 HandlerMapping, ViewResilver, View등은 다양하게 여러개가 제공
  • 사용자가 설정파일에 정의하지 않으면 기본으로 처리되는 컴포넌트들이 미리 정해져있다.
  • 뷰를 요청하는 것도 스프링을 통해서 실행되도록 처리

  1. DispatcherServlet : 클라이언트의 요청을 받아서 요청을 분석하고 spring MVC 구조를 구성하는 컴포넌트를 호출해서 작업
  1. HandlerMapping : DispatcherServlet이 전달한 매핑정보(요청path)를 이용해서 실행할 컨트롤러를 찾아서 DispatcherServlet에 전달
  1. HandlerAdapter : DispatcherServlet에서 전달받은 컨트롤러를 실행하고 실행결과를 DispatcherServlet에 넘겨주는 작업을 수행 ModelAndView객체로 만들어서 리턴 (Model과 View에 대한 정보를 담고 있는 객체)
  1. Controller : 개발자가 웬에서 처리하고 싶은 내용을 기술 (서블릿에서 작업했던 내용을 컨트롤러에서 작업) 이전 버전에서는 Controller의 역할을 하기 위해 상속받아야 하는 클래스와 인터페이스가 존재, 3.0이후부터는 어노테이션으로 작업하면서 기본클래스로 작업이 가능 (@Contriller어노테이션을 반드시 추가해야 함) 서블릿과 다르게 컨트롤러에 모든 내용을 넣지 않고

    컨트롤러 → 서비스 → DAO 의 구조로 개발

  1. ViewResolver : DispatcherServlet이 넘겨준 뷰의 정보를 기반으로 설정파일에서 어떤 뷰를 만들어야 하는지 정보를 찾아서 넘겨주는 작업
  1. View : 실제 응답할 뷰를 만들어 리턴

컨트롤러

  • spring mvc 프레임워크에서 웹에서 서비스 되도록 하려면 컨트롤러를 만들어야 한다.
  • 컨트롤러로 인식되기 위해서 @Controller를 클래스 위에 추가
  • 메소드를 정의해서 처리하고 싶은 일들을 처리하도록 작업
  1. 메소드 정의
    1. 메소드명은 사용자 정의로 작성

      public 리턴타입 메소드명 (매개변수…) {

      // 서블릿에서 처리하던 작업을 구현

      }

    1. 리턴타입
      • 허용되는 타입 안에서 원하는 타입을 정의
        • String : view에 대한 정보만 명시, InternalResourceViewResolver인 경우 prefix와 suffix가 결합해서 뷰의 정보를 생성하므로 폴더명과 뷰 이름을 결합해서 리턴정보를 작성
        • ModelAndView : Model과 View의 정보가 모두 저장된 객체
          • Model : 웹페이지에서 공유할 데이터
    1. 매개변수
      • 허용되는 타입 안에서 원하는 타입을 정의
    1. 메소드 선언부 위에 매핑정보를 정의
      • @RequestMapping 을 이용해서 정의

      @RequestMapping(”/main”)

      public String test() {

      return “main/test”;

      }

      ⇒ 클라이언트가 /context명/main으로 요청하면 test메소드를 실행하겠다는 의미