본문 바로가기
java spring/spring mvc

spring mvc 05 - annotation으로 DI하기(@Service, @Controller)

by 킹차니 2021. 5. 6.

 

@Service

전 포스팅에서 생성된 빈 객체들을 @Autowired를 사용하여 조립하였다. 이제 빈 객체들을 하나씩 어노테이션을 사용해서 생성하도록 해보자.

service-context.xml

지난 포스팅에서 위 xml의 24라인을 어노테이션으로 바꿧다. 

의존성 주입을 위해서는 @Autowired가 필요하지만

빈 객체를 생성하기 위해서는 @Component가 사용된다. 

또한 @Component 어노테이션을 사용하기 위해서는 14라인의 코드가 필요하다. 해당 코드는 base-pakage에 적힌 패키지들을 둘러보며 @Component 어노테이션이 있는지 찾아보라는 것이다. 또한 이 코드가 13라인의 코드를 포함하므로 13라인은 생략할 수 있다.

이제 23라인의 JDBCNoticeService 클래스에 어노테이션을 사용해보자.

22라인을 보면 @Component대신 @Service를 사용한 것을 볼 수 있다. @Service, @Repository, @Controller모두 @Component의 역할을 수행한다.(즉 ioc컨테이너에 bean객체를 생성해주는 역할) 하지만 각 어노테이션마다 특화된 계층이 다르다. JDBCNoticeService는 Service역할을 하기 때문에 @Service 어노테이션을 사용한다.

 

 

@Controller

이전의 컨트롤러들을 인터페이스를 구현하고, ModelAndView객체에 뷰파일 정보를 심어주는 역할을 했어야 하지만 @Controller와 @RequestMapping을 사용하면 훨씬 쉽게 바꿀 수 있다.

우선 url매핑을 위해서는 아래 파란색 밑줄의 태그가 필요하다.

servlet-context.xml

 

그 후 바뀐 컨트롤러들은 다음과 같다.

HomeController

우선 index페이지를 보여주는 클래스를 컨트롤러 패키지 안에 새로 만들었다. 뷰 페이지 파일들이 폴더에서 분리되는 방식으로 컨트롤러도 분리하여 두면 관리가 훨씬 쉬어진다.

위의 코드를 보면 8번 라인에서 @Controller를 사용하여 HomeController클래스를 빈 객체로 생성해준다. 그리고 그 아래에 @RequesstMapping이라는 어노테이션이 있는데, 이는 URL매핑을 위해 필요하다.

이전에 xml에서 <bean id="/index" class="해당 클래스 루트" /> 방식으로 해줬던 것을 위와 같이 쉽게 바꿀 수 있다.

그리고 9라인의 "/"url은 아래 12라인의 "index"와 합쳐져서 "/index"로 요청을 받으면 index()메소드를 실행하게 된다.

즉 "/index"요청을 보내면 index()메소드가 실행되어 "root.index"를 문자열로 리턴하고, servlet-context.xml의 viewResolver가 나머지 경로를 붙여주어 뷰페이지를 사용자에게 보여준다.

 

notice관련 controller를 보자.

NoticeController

이전에 xml방식을 사용할 때는 notice/list를 위한 컨트롤러 클래스, notice/detail을 위한 클래스가 따로 존재했으나 

어노테이션을 사용하면 그럴 필요가 없다. 15라인 처럼 /customer/notice/를 상위로 가지는 url들을 클래스 안에 메소드로 두고, 

customer/notice/ + list 또는 customer/notice/ +detail 처럼

한 클래스에 안에 여러가지 url매핑이 가능해진다.( notice앞에 coutomer가 붙은 이유는 아래 이미지처럼 실제 뷰 페이지인 jsp파일들의 notice폴더가 customer폴더 안에 있기 때문)

controller를 만들 때 위와 같은 jsp파일의 폴더들을 따라 만들면 controller관리가 수월해진다.

 

아래는 뉴렉처님 강의

https://www.youtube.com/watch?v=OS-Oo-DdxG4&list=PLq8wAnVUcTFWhDFFmpJ5fUeoJI53Z83g6&index=30