Application context
XML annotation
Bean
을 배웠어요
이제,
Spring Web MVC project생성하고
서블릿과 jsp비교해서 차이점을 이해하자
1) Servlet-Context.xml 설정파일
(ApplicationContext/Bean Factory/IoC container/Spring Container/Servlet Web application context)
<context:component-scan .../>
➡️annotation방식 설정이 가능하도록 해주는 설정
class에 @Component를 찾아서 Bean으로 등록
@Conponent (Bean으로 등록해주는 annotation)
- @Controller
- @Service
- @Repository
- @Configration
Servlet-Context.xml파일은
Servlet Web Applicationcontext
=>@Controller를 관리
Root Web Applicationcontext(
=> 웹과 관련이 없는 @Service, @Repositoty를 관리
Spring의 Web project형태
1) 계층형
src/main/java -> my -> spring -> springweb
-> controller 패키지
-> service 패키지
-> vo 패키지
-> dao 패키지
방식의 하위로 내려가는 계층형 구조
✔️구조가 심플하나, 관리가 힘들다
2) domain형
src/main/java -> my -> spring -> springweb
-> member패키지 -> controller/dao/vo/service
-> board패키지 ->controller/dao/vo/service
✔️ 분업하기 좋으나 프로젝트 구조가 복잡하고 구조를 이해하기 어려울 수 있음.
하지만 주로 도메인을 많이씀
web.xml
servlet-context.xml
:view resolver설정
핸들러로부터 만약 string이 리턴되면
request > dispacher serclet > controller method
dafault servlet handler 설정
model class type의 객체가 handler parameter로 주입
Servlet을 생성할때
/hello
/hi
/haha
각각 서블릿이 생성되어 로직 처리되었으나
하나의 서블릿이 받아 분배시킬 수 있도록 처리
=> Front controller
=> dispatcher servlet 공동처리
=> controller를 만들때 servlet을 안만들어도 됨(http를 상속받지 않아도 됨 확장성이 늘어남)
web client(browser) request
Spring Web MVC
(그림첨부)
세부적으로 다시 한 번 그려보자
request->dispatcherservlet이 받음
이 url에 대해 어떤 컨트롤러 이용해야돼? > handler mapping > handler adpter> 얘를 통해서 사용> controller > 비즈니스 로직처리해야하기 떄문에> service > (dao)repository >
DB > 결과리턴 > model객체한테 결과를 담는ㄴ다. 어댑터가
어댑터는 뷰의 이름을 문자ㅕㄹ 형태로 저장 > resrolver 를 이용 뷰 객체라고 함
객체를 완성해요 dispather서블ㄹ릿를 이용해
(그림첨부 사이ㅏ사이에 뭐가 더 추가된건지 알기)
사실 handler mapping은 인터페이스이다
request mapping handler
@RequestMapping 사용할 수 있다
handler를 클래스가 아닌 method로 잡을 수도 있음
다른 구현체보다 사용하기 좋다
@RequestMapping annotation으로 사용자가 정의한 method를 특정 request URL에 대한 handler method로 지정
-View interface를 구현한 객체
-Model이 가진 정보를 어떻게 표현해야하는지에 대한 로직을 갖고있는 컴포넌트
-View interface 구현한 구현 클래스가 여러개 있어요
왜? 보여줄 데이터가 제각각이라서
-가장 대표적인것은 InternalResourseView => JSP
View view = new InternalResourseView("hello.jsp");
//이렇게 뷰 객체를 만든다. 컨트롤럴가 dispatcher servlet에 리턴해줌
return new ModelAndView(view+model);
직접적으로 뷰를 만들기 싫다면 뷰 이름에 jsp이름을 리턴함
서블릿에서는
response.sendRedirect();
특정 값으로 다시 접속하세요 라는 뜻
sendRedirect를 사용하기위해서는
controller에서 new redirectView(~);
@MashallingView -> xml
@MappingJacksonJsonViewClass -> Json
클라이언트가 컨트롤러가 선택되고 컨트롤러 내가 만들고
컨트롤러를 requestmapping을 통해 지정
코드를 만들어보자
컨르롤러 먼저>
연습
1) log4j
2) @Controller
3) @RequestMapping
4) InternalResourceView class
5) Model 객체
우리가 지금까지 사용했던, 콘솔에 sysout을 통해 출력하는것은 성능/관리의 측면에서 좋지 않음
운영 시 log생성은 필수이다
Spring에서는 log4j를 쉽게 이용할 수 있어요
(기본적인 설정도 잡혀있음)
확장버전이 있는데
-log4j2 (상위버전)
-logback(스트링부트 버전)
먼저 log4j부어 시작되고 log4j2로 변경(log4j.xml)
src/main/resources
log4j의 태그들
<appender></appender>
: 로그의 출력 위치를 지정해주는것(콘솔출력, db출력, file출력)
<layout></layout>
로그의 출력 형태를 지정. 부가적인 정보를 지정해서~
<logger></logger>
로깅메세지를 appender에 전달하는 역할
log의 출력레벨에 따라서 출력여부를 결정
로그의 레벨에 맞춰서 내가 설정한 조건이 맞으면 로그가 출력됨
Console Appender(console)
File Appender(file)
RollingFile Appender(용량 제한 file을 이용)
⭐DailyRolling Appender(일자별로 처리) 젤 많이 써요!
%P : 로그레벨을 같이 출력
%M : 로그 메시지를 출력
%D : 로그 발생 시간을 출력
%C : 어떤 파일에서 발생했는지 출력
FATAL (가장 높은 레벨)
: 시스템에 심각한 문제가 있음을 지적하는 레벨
ERROR
: 실행 중 발행한 에러
WARN
: 오류의 원인이 될 수 있는 내용을 출력
INFO⭐
: 운영에 관련된 application. 운영할때 필요한 레벨
DEBUG⭐
: 개발 시 디버깅 용도(sysout대신 사용)
TRACE
: DEBUG의 상세버전