뉴렉처 Spring 50강

 

Spring 설정 파일 분리하기

 

스프링 설정파일은 원하는 위치와 파일명으로 만들수있다.

이 하나로되어있는 파일을 여러개의 xml로 나누어주는 작업

 

dispatcher-servlet.xml을 복사하여 새로운 spring 폴더에 넣어주고

servlet(서블릿) , service(서비스) , security(보안) 과 관련된 context.xml 로 나누어준다.

( 이름은 자유 , 필요에따라 추가가능 ) 기본적으로 3가지

나누어주는 이유 : 프로젝트 협업시 각각의 역할을 부여해주기위함

 

스프링 설정파일 원본은 .xml을 .backup파일로 만들어주고

servlet-context.xml 과 service-context.xml 안에 각각에 맞는 설정을 넣어준다 ( 백업파일의 내용 )

 

servlet-context.xml

 

service-context.xml 

 

 

마지막으로 스프링 설정 xml의 디렉토리와 파일명을 바꾸었다면 web.xml에 알려주어야한다.

 

web.xml

init-param 태그를 이용해 name설정은 DispatcherServlet에서 넘겨받은 setter라고 보면된다

정의해놓은 이름이기때문에 스펠링이 틀리면안된다 contextConfigLocation 을 작성해준다.

value값으로는 servlet관련된 context 경로를 입력해주면된다.

 * 여기서는 파일 하나만 지정할수있다 ( 현재 servlet-context.xml 파일만 지정한 상태 )

 

나머지 두개의 파일을 지정하기위해 spring이 제공하는 listener태그를 이용한다.

listener : 톰캣이 시작될때나 끝날때 , 세션이 시작될때 끝날때 행위를 할수있는 이벤트를 처리할때 사용

listener이 가지고있는 기본적인 param설정을 context-param으로 가질수있다.

 

web.xml

모든서블릿은 url로 매핑되있고 요청왔을때 첫번째요청일시 그때 메모리에 올라간다.

요청이올때 메모리에올라갈시 첫요청일때 느린속도를 보이기때문에

servlet dispatcher설정을 미리 올리기위해 설정을 추가한다

 

<load-on-startup> 태그를 이용해서 우선 순위를 정해 톰캣실행시 우선순위로 정해주고

async-supported 태그를 true로 설정해주어 비동기적으로 로드가 가능하게한다. 


 

Annotation를 활용한 서비스 객체 DI

객체 DI를 Annotiatin으로 변경하기

 

xml로 DI하는 작업을 Annotation을 활용하는 방법으로 변경하는 작업

( spring에서는 자바설정이나 어노테이션을 많이 사용하려고한다 )

 

 

DI (Dependency Injection) 하는 부분을 Annotation을 활용해 변경해주도록한다.

 

servlet-context.xml

xml로 DI된 부분

 

<property>부분을 주석처리하고 Annotation을 활용해 변경해보도록 하겠다.

주석처리한뒤에 실행시켜보면 500오류가 보이고 DI가 되지않은것을 확인할수있다.

 

 

어노테이션으로 DI하는방법

 

DI를 했던 ListController 부분으로 이동해서 noticeService를 DI하기위해 만들어주었던 Setter 위에 

@Autowired 를 해준다 ( 소스코드를 손댈수있을때 사용가능한 방법 )

 

DI가 되면서 추가로 실행해야할것이 있을경우는 setter 를 Autowired 해주는게 바람직하다.

그것이 아닐경우에는 객체를 생성할때 Autowired 시켜주어도 된다. (이 경우 Setter는 없어도된다 )

그 후에 servlet.xml로 이동해 annotation-config를 해준다. (어노테이션을 사용하기위함)

annotation-config를 사용하기위해 네임스페이스외 내용을 추가해주고 context를통해 config 해주면된다.


service-context.xml 에서도 바인딩하고있는 property 부분을 주석처리하고 Annotation 활용해 변경해주도록한다.

 

service-context.xml

 

property부분을 주석처리한뒤 JDBCNoticeService로 이동한뒤에 Autowired를 해준다.

객체를 생성할때 Autowired 해주었으니 필요없는 Setter는 지워주도록한다.

 

service-context.xml 또한 annotation-config를 해주도록한다.


 

Annotation으로 서비스 객체 생성하기

 

service-context.xml을 보면 서비스 객체를 생성한 bean이 있다.

 

Service객체가 담긴 bean 을 주석처리해주고 Annotation으로 변경한다

 (*주석처리하게되면 객체는 Ioc 컨테이너에 담겨지지 않은 상태 , 컨트롤러에서 오류가 발생한다 )

 

JDBCNoticeService로 가서 객체를 생성하기위해 Component 라는 Annotation을 적용해준다

 

JDBCNoticeService

 

Component의 객체를 찾아주기위해서 service-context.xml로 돌아가서

패키지(com.newlecture.web.service)안에있는 클래스를 생성하기위해 context의 Component-scan 사용한다. 

 

component-scan을 사용하면 그 안에 존재하는 어노테이션까지 찾아준다 고로 annotation-config를 삭제해도 된다.

 

Component는 범용적으로 사용하는 것이고 의미론적으로 사용하는
@Controller , @Service , @Repository 라는 특화된 이름을 가지고있는 것들을 사용해주는것이 좋다.

 


 

Annotation으로 URL 매핑하기

 

Controller를 객체화 하는 작업

 

servlet-context.xml을 보면 Ioc컨테이너에 담긴 컨트롤러들이 보인다.

 

servlet-context.xml

먼저 Annotation으로 URL 매핑으로하기위해 Ioc 컨테이너에 담긴 IndexController를 주석처리해준다.

 

IndexController를 객체화하기위해  IndexController 로 이동한다.

IndexController위에 Controller 어노테이션을 적용해주고 @RequestMapping으로 URL을 받아주는 메소드를 만든다.

 

IndexController

 

어노테이션의 장점

Controller 라는 어노테이션과 RequestMapping( )만 가지고 사용할수있기때문에

ModelAndView를 오버라이드 할 필요성이없다 ( 컨트롤러를 구현하지 않아도된다 )

 

이렇게 설정했으면 servlet-context.xml로 이동해서 컨트롤러를 객체화할수있게 component-scan을 해준다.

또한 사용자 요청을 수반할수 있도록 하는역할 (RequestMappiong( ) ) 을 사용할수있도록

<mvc:annotation-driven/> 을 작성해준다 (중요)

 

이렇게 실행을 시켜주게되면 콘솔창에 print한 내용이 출력된다.

아무런 반환값이 없어도 url을 통한 기본적인 Resolver를 이용해 페이지를 찾아준다


HomeController 만들기

 

IndexController를 Controller 답게 내용을 수정해보도록한다.

 

더이상 IndexController는 URL에 매핑되는 컨트롤러가 아니다 

URL에 매핑되는것은 클래스가 아니라 메소드이기때문에 IndexController 하나에 여러개의 URL을 담을수있다.

 

(EX) 이런식으로 여러개의 URL을 메소드가 매핑할수있다.

 

 

IndexController를 루트에 존재하는 (View단에 존재하는) 컨트롤러를 담당하는 컨트롤러로 만들어준다

루트폴더에있는 컨트롤러를 담는 그릇 이라고 생각하면된다 ( 폴더개념 )

IndexController는 더이상 IndexController가아닌 컨트롤러를 담당하는 그릇같은 개념이기 때문에 

이름을 HomeController로 바꾸어준다.

그리고 /index 라는 URL을 매핑시켜주기위한 index 메소드를 만들어준다.

이때 View정보를 반환하기위해서 return root.index를 사용해 반환한다 (tiles에서 Resolver 가능해진다)

 

이때 반환타입이 void 또는 return값이 없다면 반환값이 없기때문에 404에러가 발생한다.

뉴렉처 Spring 56강 개념정리


 

Notice 컨트롤러 정리하기

notice 내용을 가지고있는 DetailController , ListController또한 어노테이션을 사용해

NoticeController라는 그릇을 만들어 두개의 컨트롤러를 담아주도록한다.

 

customer 폴더안의 notice 폴더안의 detail.jsp와 list.jsp가 있는것을 알수있다.

물리아키텍처를 사용해 NoticeController의 파일 구조를 잡아준다.

noitce의 detail , notice의 list

NoticeController 를 생성한다. 

URL또한 위의 폴더 루트와 같이 적어준다.

/cumtomer/notice/list를 매핑하기위한 메소드 안에는

서비스를 받을 NoticeService 객체로 반환하면서 리스트를 받아올 getlist를 사용해주고

 

NoticeController

클래스단위가 아닌 메소드단위로 URL을 매핑시키는것을 볼수있다.

 

servlet-context.xml로 가서 Ioc컨테이너에 담긴 내용들을 지워준다.

Ioc컨테이너에 담긴 컨트롤러들을 주석처리

 

 

매핑주소에 /customer/를 추가했기때문에 header부분에 이상이 생길수있다 

고객센터를 클릭했을시에 /customer/notice/list URL로 갈수있도록 수정해준다.

서버를 시작하면 index 부터 list 까지 잘실행되는것을 볼수있다.

list 목록은 데이터베이스 관련된것은 모델을 심지않았기때문에 아직 나오지않는다.

 

 

마지막으로 NoticeController의 공통분모인 URL을 복사하여서 지우고 위에다 한번써준뒤

메소드에는 나머지 URL을 입력해준다

클래스에 URL매핑한것은 메소드에 붙어있는 URL매핑과 결합된다.

 

HomeController도 마찬가지로 공통분모인 URL은 클래스에 붙여주도록한다.


 

뉴렉처 Spring강의 55강 완

 

'Step by Step' 카테고리의 다른 글

Spring 공부 2021-04-12  (0) 2021.04.12
Spring 공부 2021-04-07  (0) 2021.04.07
Spring 공부 2021-04-02  (0) 2021.03.30
Spring 공부 2021-03-29  (0) 2021.03.29
Spring 공부 2021-03-22  (0) 2021.03.22

+ Recent posts