🔍 DI 어노테이션
➰ @Autowired
패키지 : org.springframework.beans.factory.annotation.Autowired
- 스프링에서 제공하는 DI 어노테이션
- 적용가능한 위치 : 멤버 필드, 생성자, 파라미터가 존재하는 메소드
- 바인딩 전략 : byType 먼저, byName 다음
➰ @Resource
패키지 : javax.annotation.Resource
- 자바 표준으로 제공하는 DI 어노테이션
- 추가 라이브러리(Javax Annotation API)가 필요 👉🏻 Tmocat 9.0.71에 포함되어 있음
- 적용 가능한 위치 : 멤버필드, 파라미터가 1개인 setter
- 바인딩 전략 : byName 먼저, byType 다음
➰ @Inject
패키지 : javax.inject.Inject
- 자바 표준으로 제공하는 DI 어노테이션
- 추가 라이브러리(Javaax Inject API)가 필요 👉🏻 Spring MVC Legacy Project에는 pom.xml에 의존성이 추가되어있음
- @Autowired와 동일한 기능을 가짐
➰ @Qualifier("beanName")
DI 어노테이션의 보조기능
- 바인딩될 beanName을 직접 지정할 수 있게 도와줌
🔍 스프링 Controller 만들기
-
일반 클래스를 생성
-
클래스 정의 앞에 @Controller 어노테이션 붙이기
-
servlet-context.xml 파일에서 <context:component-scan> 태그의 base-package 속성값으로 패키지를 추가
<context:component-scan base-package="a.b.c, web.controller" /> 👉🏻 web까지만 써도 인식은 하지만 디테일하게 써주는 것이 좋음
web.controller / web.service / web.dao를 만들면 web까지만 쓰는 것이 좋지만 우리는 dao안쓰고 mybatis를 사용할 것임
➡ mybatis랑 우리가 만든거랑 충돌되기때문에 나중에 수정이 편하도록 디테일하게 작성해줘야함
-
일반 메소드를 작성
-
메소드 정의 앞에 @RequestMapping 어노테이션 붙이기
- 어노테이션의 매개변수로 value, method를 지정
- value는 url-pattern을 이용하여 URL을 매핑
- method는 요청 메소드를 매핑
🔍 Log4J 라이브러리
Logging For Java, 자바 프로그램을 위한 로그 라이브러리
- 로그를 출력할 수 있는 객체를 패키지 단위로 관리할 수 있음
- Log4J 설정으로 적용한 패키지의 객체들만 로그를 남길 수 있도록 관리됨
- 로그 출력장치(디바이스)를 지정할 수 있음 👉🏻 기본은 System.out (Console)로 되어 있음
- 로그 메시지의 레벨(등급)을 지정하여 로그 출력을 제어할 수 있음
➰ Log4J에서 정의된 레벨
- FATAL : 심각한 에러일 때 사용
- 시스템으로도 문제가 번질 정도로 문제가 있는 상황
- ERROR : 에러 레벨
- 프로그램이 중단될 정도의 문제 상황, Exception 발생 상황
- WARN : 경고 레벨
- 정상 처리 가능한지 확인이 필요한 정도의 상황
- INFO : 정보 레벨
- 일반적인 메시지
- 상태 정보, 상태 변경 알림, 일반적인 동작 정보를 표현하는 상황
- DEBUG : 디버깅 레벨
- 프로그램을 디버깅하는 상황
- 오류 상황 확인, 정상적인 동작 확인
- TRACE : 추적(트레이스) 레벨
- 프로그램의 대부분의 동작을 모두 확인할 때 사용
➰ 로그 레벨 등급의 중요도 차이
FATAL > ERROR > WARN > INFO > DEBUG > TRACE
✔ log4j.xml 파일의 <logger> 태그를 이용하여 등급별 로그 출력을 제어함
로그 레벨을 DEBUG로 설정하면 FATAL ~ DEBUG까지 출력
로그레벨을 WRAN으로 설정하면 FATAL ~ WARN까지 출력
🔍 컨트롤러 메소드의 리턴 타입
- 응답할 View(viewName)와 View에 전달할 MODEL값과 연관이 있음
- viewName으로 지정한 문자열을 이용하여 View를 찾아서 응답하도록 만듬
✔ View는 주로 JSP 파일
- viewName은 ViewResolver객체에 전달되는 데이터
- ViewResolver객체는 viewName에 해당하는 View를 찾아 응답하도록 만듬
- ViewResolver의 유형(클래스 타입)에 따라 viewName을 이용하는 방식이 다름
✔ InternalResourceViewResolver : JSP파일을 찾아서 View로 사용 👉🏻 UrlBasedViewResolver 객체의 자식클래스
✔ UrlBasedViewResolver : 요청 URL에서 viewName을 추출하여 활용
✔ BeanNameViewResolver : 스프링 빈 객체를 찾아서 View로 사용
✔ Spring Legacy Project에는 기본적으로 InternalResourceViewResolver를 적용하고 있음
- sevlet-context.xml에 설정 항목이 존재
- prefix + viewName + suffix에 해당하는 경로의 JSP 파일을 응답 View로 활용
👉🏻 /WEB-INF/views/{viewName}.jsp
➰ 컨트롤러 메소드에서 사용하는 리턴 타입
- void
- String
- ModelAndView
1. void 리턴타입
@RequestMapping에 적용된 url-pattern을 이용하여 viewName으로 적용
- URL의 첫 '/'를 제거
- 폴더 구조를 유지
- URL의 마지막으로 확장자형태를 가지고 있으면 확장자를 제거
@RequestMapping("/member/login.do")
public void login() {}
➡ viewName : "member/login"
➡ View : /WEB-INF/views/member/login.jsp
2. String 리턴타입
return 코드로 반환된 문자열을 viewName으로 적용
null값을 반환할 경우 void타입 리턴과 동일하게 동작
@RequestMapping("/member/login.do")
public String login() {
return "strMember/strLogin";
}
➡ viewName : "strMember/strLogin"
➡ View : /WEB-INF/views/strMember/strLogin.jsp
3. ModelAndView 리턴타입
Model값 지정과 viewName설정을 하나의 객체로 처리
컨트롤러 메소드의 매개변수로 선언하여 사용할 수 있음
메소드 내에서 new ModelAndView()로 생성하여 사용할 수 있음
@RequestMapping("/member/login.do")
public ModelAndView login() {
ModelAndView mav = new ModelAndView();
mav.addObject("name", value);
mav.setViewName("viewName");
return mav;
}
@RequestMapping("/member/login.do")
public ModelAndView login(ModelAndView mav) {
mav.addObject("name", value);
mav.setViewName("viewName");
return mav;
}
