LANGUAGE/SPRING 2020. 3. 11. 12:24

갑자기 Spring4 소스를 분석해야 하는 친구를 위한 간단정리

(특정 소스를 분석하여 다른언어의 지식이 있는 Spring알못에 맞춰 열거적으로 개념을 설명한 노트이다.)

Spring ?

  • Java로 MVC패턴의 WebApplication을 쉽게 만들 수 있는 FrameWork
  • 전체적인 그림
      [View]  <=>  [ @Controller -> @Service -> @Repository -> MyBatis(.xml) ]  <=>  [DataBase]

1. Controller

@Controller

  1. 특징
    • 주로 페이지 호출을 위한 Controller
    • 주소(URL) = DOMAIN + ContextPath + Class의 RequestMapping("A") + Method의 RequestMapping("B")
    • 각 Method에서 무슨 일이 생기고 있는 거야 ??
      • Model model: (매개변수로 정의되었을 때) 특수한 객체로 JSP에서 사용할 수 있는 변수를 다룬다.
      • 매개변수로 정의되는 몇몇 특수한 객체를 제외하고는 화면에서 보낸 값들을 매개변수에 자동으로 매칭시킨다.
      • @RequestParam(".."): 스프링이 화면에서 던져주는 변수명과 매칭되는 곳에 자동적으로 값을 넣어주지만, 개발자의 의도에 따라 다른 변수에 매핑시키도록 함
      • @PathVariable(".."): @RequestMapping의 문자값 속에 {}로 선언된 부분의 명칭을 사용하여 매개변수에 매핑시키면 => URL중 해당부분에 사용자가 적은 값을 매핑시킴
      • @ModelAttribute(".."): 선언한 매개변수를 해당 명칭으로 Model객체의 속성으로 자동 추가
    • View페이지 출력 정의가 어딨어 ?
      • return "주소..": 해당경로의 JSP파일을 호출!
      • return 이 없넨 void네?: 현재 호출된 RequestMapping주소 경로의 JSP파일을 호출!
      • return "redirect:주소..": 해당 주소의 Controller를 이어서 호출!
    • View페이지가 어떻게 호출되는 거야 ???
      • web.xml에 사용할 스프링 설정파일이 설정되어 있음
      • 설정파일(PATH/TO/servlet-context.xml)을 보면
        • => InternalResourceViewResolver에 의해 prefix로는 /WEB-INF/views/, surfix로는 .jsp .. 이런식으로 설정
          • => 따라서 특정 주소가 호출되면 Controller를 거쳐 => [prefix + 호출주소 + surfix]의 파일을 가공하여 HTML로 만들어 사용자에게 제공
    • 데이터를 다루는 Controller의 Method
      • @ResponseBody가 선언된 Method는 Data를 받기 위한 Request매핑임. (Page호출X)
      • @RequestBody가 선언된 매개변수(객체)는 POST방식의 호출로 받은 Body값들을 주입받는다.
      • return 시 값을 전달한다. (Page호출X)

@RestController

  1. 특징
    • Data API목적으로 설계된 Controller이다. (Page호출X)
    • 위 @ResponseBody가 Method마다 자동으로 붙는다 생각하면됨 (따로 @ResponseBody를 선언하지 않아도 되는 장점)
    • 주로 화면에서는 데이터처리를 위해 Ajax를 이용하여 이곳으로 호출.

2. Service

@Service

  1. 특징
    • Interface가 존재 - (장단점도 있긴한데 상황에 따라 말도 많지만 일단 기계적으로 사용한다 생각하길)
    • Interface를 Implements한 Class가 따로 존재.
    • Controller단(또는 다른 어떤곳)에서 이를 참조하여 사용할시 Interface Class를 선언하여 사용. (그리고 @Inject 또는 @Autowired를 위에 선언하면 스프링이 참조시킴)
    • 주로 @Controller Class 와 @Repository Class 사이에서 데이터를 가공하는 중추적인 역할을 한다.
    • 단순하게 만들 때는 @Repository Class 로 가는 길목이 되기도 한다.

3. Repository

@Repository

  1. 특징
    • Interface가 존재
    • Service단에서 이를 참조하여 사용할시 Interface Class로 선언하여 사용. (그리고 @Inject 또는 @Autowired를 위에 선언하면 스프링이 참조시킴)
    • ~DAO 라는 명칭을 주로 사용한다.
    • MyBatis라 하여 Mapper(xml파일)에 따로 Query문을 소스코드와 분리하여 관리하는 구조의 모듈이다. (많이 사용한다)
    • 설정파일(PATH/TO/root-context.xml)을 보면
      • DriverManagerDataSource Class를 보면 DB연결정보 관리중
      • SqlSessionFactoryBean Class를 보면 Query와 WebApplication에서 Data를 받기위한 객체설정Mapper(xml)파일 위치를 관리 중