DEV&OPS/Java

Spring 주요 어노테이션

ALEPH.GEM 2025. 11. 5. 11:31

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 데이터를 객체로 변환해주는 용도입니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90