latest: 221116
Spring MVC를 사용한 웹사이트를 구현하는 과정에서 자주 쓰였던 어노테이션들의 용법을 이해한 대로 정리하기로 했다. 자주 보이는 것을 우선적으로 정리했으며, 공부와 병행 중이어서 잘못된 정보가 있을 수 있다.
스프링 DI(Dependency Injection)에서 사용되는 어노테이션. 선언부 앞쪽에 이 어노테이션을 붙이면, 메서드 호출과 인스턴스 주입을 스프링이 자동으로 해 준다. 단, 이 어노테이션으로 호출되는 객체는 bean으로 등록되어있어야 한다.
@Autowired private MemberServiceImpl member;
// MemberServiceImpl는 @Service 어노테이션이 붙은 객체.
root-context.xml파일에서 Autowired 스캔 범위를 설정해야 정상적으로 작동한다.
<context:component-scan base-package="member" />
// 따옴표로 여러 경로를 지정 가능. 폴더를 지정하거나, 파일을 지정할 수 있다.
// 본 예제에서는 폴더를 지정했다.
의존성 주입(DI, Dependency Injection)이란?
의존 중인 객체를 외부로부터 주입받는 방식이다. 한 인터페이스를 구현하는 클래스가 여러 개일때, 클래스를 지정하지 않고 인터페이스 파라미터를 두어 외부에서 어떤 클래스를 사용할지 결정하는 방식이다.
코딩 테스트 같은 개인 개발 환경에서는 오히려 불편할 수 있지만, 프로젝트가 커지고 개발인원이 많아질 수록 의존성 주입이 중요해진다.
프로젝트를 생성하면, com.company.name 폴더 안에 HomeController라는 기본 파일이 생성되어 있다. 여기서 @Controller 어노테이션을 볼 수 있을 것이다.
@Controller는 Web MVC 코드에 사용되는 어노테이션으로, 요청에 따른 처리방식을 @RequestMapping 어노테이션으로 정의한다. @RequestMapping는 @Controller 어노테이션이 붙은 클래스 안에서만 동작한다. 쉽게 말하면, 교통정리를 하는 클래스가 누구인지 알려주는 어노테이션이다.
@Controller
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
/**
* 자동생성되는 홈 컨트롤러.
*/
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
logger.info("Welcome home! The client locale is {}.", locale);
Date date = new Date();
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
String formattedDate = dateFormat.format(date);
model.addAttribute("serverTime", formattedDate );
return "home";
}
}
그런데, 밑에서 @Controller가 @Component의 세분화라고 했잖아? 그럼 @Controller 자리에 @Component를 넣어도 되는 거 아냐?
해 봤더니 안 된다. @Controller는 @Component에 추가적으로 매핑 기능이 더해진 형태이다. @Component @RequestMapping("") = @Controller 정도로 생각된다.
@Controller 어노테이션에 @ResponseBody를 합친 어노테이션이다. 별도 어노테이션을 명시해주지 않아도 HTTP 응답데이터(body)에 자바 객체가 매핑되어 전달 된다.
들어온 요청을 특정 메서드와 매핑하기 위해 사용하는 어노테이션이다. 많은 파라미터가 있지만 대표적으로 Value와 method 두 가지를 많이 사용한다.
@RequestMapping(value = "/", method = RequestMethod.GET)
// "/"주소가 GET방식으로 호출되었을 때 해당하는 메서드가 동작한다.
// GET은 method 기본값이기 때문에 생략 가능하다.
스프링에서 관리되는 객체임을 알리는 어노테이션. 해당 어노테이션을 붙이면 스프링이 bean으로서 관리한다. 가장 기본적인 형태이며, 관점(Aspects)에 따라 세분화하면 @Controller, @Service, @Repository 등으로 나뉜다.
root-context.xml의 context:component-scan은 base package로 지정된 위치를 스캔하며 해당 태그가 붙은 클래스(=bean)를 찾는다.
본래 bean은 bean-configuration이라는 xml파일에 하나하나 선언해야 했지만, 최근에는 어노테이션으로 선언하는 경우가 많다고 한다.
@Component
public class NoticePage extends PageVO {
private List<NoticeVO> list;
public List<NoticeVO> getList() {
return list;
}
public void setList(List<NoticeVO> list) {
this.list = list;
}
}
// NoticePage.java
@Autowired private NoticePage page;
// NoticeController.java
<context:component-scan base-package="member, notice" />
// root-context.xml
안녕하세요. TmaxTibero에서 채용을 담당하고 있는 이원주매니저라고 합니다.
TmaxTibero 개발자 입사 제안을 드리고 싶은데 지원 의사가 있다면
wonju_lee2@tmax.co.kr 로 연락처 남겨주시면 감사하겠습니다:)