Spring 주요 어노테이션
Spring bean을 XML로 관리 할 수 있지만, bean객체가 많아지면 XML 설정도 많아져 불편해집니다.
그래서 나온 방법이 auto wiring(bean 연결) 과 annotation wiring(bean 연결) 입니다.
annotation wiring
어노테이션 와이어링을 사용하기 위해서는 context를 관리하는 XML 설정 파일에 context 네임스페이스를 추가해야 합니다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
<context:component-scan base-package="컴포넌트를 스캔할 패키지 경로(예:net.aacii.service)"/>
</beans>
<context:component-scan base-package="net.aacii.service" />
이렇게 패키지 이름을 component-scan 으로 지정해주면 Spring이 자동으로 bean을 스캔해서 발견해줍니다.
@Autowired
Spring의 기본 의존성 주입을 위한 어노테이션입니다.
필드, 생성자, setter 메서드에 사용할 수 있습니다.
타입 와이어링을 시도 한 후 실패하면 이름 와이어링으로 후보 bean을 찾습니다.
public class CustomerSerivceImpl implements CustomerService{
@Autowired
private CustomerRepository repository;
//...
}
와이어링 할 bean이 없는 경우
@Autowired(reqired=false)
를 지정하면 null 값을 허용하게됩니다.
아래와 같이 pom.xml에 dependency를 추가하면 @Inject 어노테이션으로 @Autowired 를 대체 할 수 있습니다.
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
또한 아래와 같이 pom.xml에 dependency를 추가하면 @Resource 어노테이션으로 @Autowired를 대체 할 수 있습니다.
이것은 JNDI 리소스 와이어링 방식입니다.
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
</dependency>
@Component
해당 클래스가 Spring bean을 명시하는 범용 어노테이션입니다.
이 때 클래스명의 첫 글자를 소문자로 한 이름이 default Spring bean의 이름입니다.
만약 이 Spring bean의 이름을 바꾸고 싶으면 아래 처럼 괄호안에 직접 지정해주면 됩니다.
@Component("바꿀이름")
@Repository
해당 클래스가 데이터를 엑세스하는 repository 즉, DAO 클래스를 명시합니다. 예를 들어
@Repository
public class MemberDAOImpl implements MemberDAO {
@Inject
private SqlSession sqlSession;
...
}
@Service
클래스가 비지니스 로직을 담당하는 서비스 객체임을 명시합니다.
@Controller
클래스가 MVC 패턴에서 컨트롤러임을 명시합니다.
컨트롤러는 각족 Request로부터 parameter를 전달 받고 다양한 데이터 타입을 리턴 할 수 있습니다.
주로 문자열, 객체, 기본 자료형, JSON(ResponseEntity) 들을 리턴해 뷰에 전달해줍니다.
@RestController 으로 지정하면 REST방식의 처리를 위한 컨트롤러로 사용할 수있습니다.
@GetMapping 또는 PostMapping 또는 PutMapping ...
Http 전송 method 방식에 따라 컨트롤러의 메소드를 다르게 지정해 줄 수 있습니다.
@GetMapping("/list")
public void listGET(){
...
}
@RequestMapping
컨트롤러에서 지정하는 어노테이션으로, 특정 요청 URI에 매칭되는 클래스나 메소드임을 명시합니다.
이 어노테이션은 GET/POST 둘 다 지원합니다.
@Controller
@RequestMapping("/sample")
public class SampleController {
@RequestMapping("/list")
public void list(){
...
}
}
이렇게 지정하면 URL이 http://호스트:포트/컨텍스트루트/sample/list 으로 컨트롤러 실행이 가능합니다.
@RequestParam
request 의 파라메터 중에서 특정 parameter를 찾습니다.
@RequestHeader
request에서 HTTP헤더 정보를 추출합니다.
@ResponseBody
이 어노테이션이 적용된 메서드에서는 리턴되는 데이터 타입이 HTTP response로 전송 됩니다.
예를 들어 아래처럼 JSON을 리턴하도록 사용할 수 있습니다.
@RequestMapping("/doJSON")
public @ResponseBody ProductVO doJSON() {
ProductVO vo = new ProductVO("샘플제품",30000);
return vo; //JAVA 객체가 JSON으로 변환되어 리턴 됨.
}
주로 REST 방식의 컨트롤러에서 사용됩니다.
@PathVariable
URI에서 경로중의 일부를 변수로 삼아 처리하기 위해 사용합니다.
@CookieValue
쿠키의 이름을 이용해 쿠키 값을 추출합니다.
@ModelAttribute
해당 객체를 뷰까지 전달 합니다. 예를 들어 아래처럼
@RequestMapping("doC")
public String doC(@ModelAttribute("msg") String msg) {
logger.info("doC is called.");
return "doC";
}
라고 했을 때 request시 msg라는 이름의 parameter를 메서드 내에서 String msg로 처리하고 뷰(jsp)에 msg라는 이름의 response parameter로 전달 됩니다.
스프링MVC에서 컨트롤러, 서비스, DAO, View 사이에 데이터를 전달할 때 기본적으로 동일한 방식으로 데이터를 규격화 해서 전달할 필요가 있습니다.
서블릿 방식에는 request.setAttribute() 를 통해서 데이터를 담아서 View까지 전달했지만 스프링MVC에서는 Model이라는 특별한 객체를 이용해서 처리합니다.
예를들어 컨트롤러 클래스에서 메소드를 아래 처럼 작성했다고 합시다.
@GetMapping("/ex")
public void ex4(Model model){
model.addAttribute("message", "hello world!"); //Model 객체에 속성을 추가해서 뷰까지 전달
}
model 객체에 "message" 를 키로 "hello world!" 라는 값을 가지는 Attribute를 추가해서 view(jsp 등)에 전달하여 EL이나 JSTL 등으로 접근할 수 있습니다.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Hello page</title>
</head>
<body>
<h2>${message}</h2>
</body>
</html>
컨트롤러에서 Model 클래스 대신 DTO클래스로 생성된 인스턴스 객체들을 전달해도 마찬가지로 view에서 DTO 객체를 접근할 수 있습니다.
기본적으로 클래스 이름의 첫글자를 소문자로 바꾼 이름으로 접근할 수 있습니다.
그렇지만 컨트롤러에서 파라메터 전달 시 @ModelAttribute("바꾼객체이름") 을 사용해서 DTD객체의 이름을 바꿔서 view에 전달할 수도 있습니다.
@GetMapping("/ex")
public void ex(@ModelAttribute("dto") SomeDTO someDTO){
...
}
이러면 view에서 ${dto} 라는 이름의 객체로 접근이 가능합니다.
@SessionAttribute
세션상에서 모델의 정보를 유지하고 싶은 경우 사용합니다.
@InitBinder
parameter를 수집해서 객체로 만들 경우에 커스터마이징 합니다.
@RequestBody
request문자열이 그대로 파라미터로 전달됩니다.
즉, URI 경로에서 원하는 데이터를 추출합니다.
@ModelAttribute와 유사하지만 JSON 데이터를 객체로 변환해주는 용도입니다.