새로 알게 된 annotation들이 많다. 

 

그 중, Spring MVC 모델을 만드는데 사용하였던 annotation을 정리.

 

Structure :

Spring MVC 모델에서 어노테이션은 주로 Controller에 잡히게 된다. 프로그램이 실행되면 xml과 dispatcher 그리고 handler mapping을 거쳐 controller로 가게되는데, 어떠한 service를 제공할 것인지 Client Request를 구분하고 이를 제공하기 위해 실제 Service 파일과 DAO등에 접근 실행을 하는 곳이 바로 '컨트롤러'이다.

 

(정의가 틀렸다면 수정하겠습니다)

 

때문에 annotation 태그들은 대부분 컨트롤러에 모여있으며, dispatcher는 폴더를 뒤져 이를 읽어낸다. 

실제로 dispatcher.xml 에 작성된  코드이다.  @component 태그를 모두 스캔하여 해당 매서드를 활성화 하는 것인데, scanning 할 위치는 base-package 이하로 한다.  

	<context:component-scan base-package="user.bean" />
	<context:component-scan base-package="user.dao" />
	<context:component-scan base-package="user.service" />
	<context:component-scan base-package="spring.conf" />

 

아래는 controller에 작성된 @annotation이 적용된 코드이다.

	@PostMapping(value="write")
	@ResponseBody
	public void write(@ModelAttribute UserDTO userDTO) {
		userService.write(userDTO);
	}
	
	@PostMapping(value="checkId")
	@ResponseBody
	public String checkId(@RequestParam String id) {
		return userService.checkId(id);
	}
	
	@GetMapping(value="list")
	public String list() {
		return "/user/list";
	}

 

여기서 헷갈 릴 수 있는 것은, 우리가 XML을 통해서 IoC Container를 생성하지만 파일 상에 확인할 수 없듯이, dispatcher와 핸들러 또한 마찬가지라는 것이다. dispatcher와 mapper는 우리 눈에 보이지 않지만 Spring 내부에서 돌고 있다.

아래 이미지가 설명에 가장 적당할 것같다.

 

이미지 출처. https://yoonbing9.tistory.com/80

 

 

정리해보면,

 

(1) 우리가 생성한 dispatcher는 http//:~ /user/form(jsp) 라는 사용자의 https 요청을 받고 user 앞의 /를 통해 요청받은 파일의 위치를 인식한다.

(2) 가상에 생성된 handler는 어떠한 Controller 객체가 요청받은 내용을 수행 할 지 user 이하의 '/' 를 통해 정보를 받아오며 (아래 캡쳐의 user/upload, Mapping 작업을 수행한다.

(3) Controller 이하 작업 시작.

 

(4) (5) (6)의 내용은 추후에 다시 정리하고, 일단 controller에 도달하기까지의 내용이다.

 

직접 선언하는게 아니라 spring 내부적으로작동한다

/user/upload중에 upload는 mapper가 찾는것이 아니라 dispatcher가 찾는거고 HandlerMapping은 @어노테이션을 이하 value 값으로 찾는다. 

 

@PostMapping(value="upload")
	@ResponseBody
	public void upload(@RequestParam MultipartFile img) {
		//가상폴더
		String filePath = "D:\\Spring\\workspace\\chapter06_SpringWebMaven\\WebContent\\storage";
		String fileName = img.getOriginalFilename();
		
		File file = new File(filePath, fileName); //파일 생성

 


 

 @annotation

 

  • @Configuration: 빈 설정을 담당할 클래스를 설정한다. 이 클래스 안에서 @Bean 어노테이션이 동봉된 메소드를 선언하면, 그 메소드를 통해 스프링 빈을 정의하고 생명주기를 설정하게 된다. 자바 기반의 config가 싫다면 XML 쓰면 된다.
  • @Component: 빈을 선언하는 클래스를 작성하기 위해 넣는 어노테이션이며 @ComponentScan 의 주요 스캔 대상이다.
  • @Service:  @Component 어노테이션의 차이점을 알려면 캡슐화 개념에 대한 이해가 필요하다. 이 말은 즉슨, 보통 이 어노테이션을 달은 클래스에는 '비즈니스 레이어' 로직에 맞게 짜기 때문에 보통 별도의 데이터를 가지고 있지 않을 것이다. 이건 아주 올바른 사용 케이스이다. 이 어노테이션을 단 클래스는. 그저 업무 메소드만 정의하면 된다. 다른 빈에서 가져와 처리를 하고 결과를 제공하는 그저 비즈니스 로직만 정의하면 된다. 
  • @Autowired: 이 어노테이션은 필드, 메소드, 생성자에다가 넣을 수 있다. 아는 그대로다. 스프링 빈을 가져오는 가장 기본적인 방법이다. 해당 클래스에 맞는 빈을 가져오는데, 만약 하나만 있으면 이름을 아무렇게나 해도 가져오고, 만약 2개 이상이면 시그니처 명칭에 맞는 빈을 가져온다. 오류가 있을 시 NoUniqueBeanDefinitionException 예외가 발생한다.
  • @Bean: @Configuration 선언한 빈 설정 클래스에 빈 선언을 담당하는 어노테이션으로, 메소드에만 넣을 수 있다. 보통은 메소드 이름이 곧 빈 이름으로 탄생한다.
  • @Primary: @Configuration 선언한 빈 설정 클래스에 빈 선언을 담당하면서, 기본 빈 요소를 정의할 때 사용한다. 만약 같은 클래스로 여러 개의 빈을 설정했을 때, 이 어노테이션을 추가로 달면, @Autowired 어노테이션을 통해 빈을 주입 시 이 어노테이션을 가진 빈을 우선적으로 가져온다고 보면 된다. 
  • @Value: 생성자, setter 따위의 메소드, 필드 등에다가 스프링에서 설정한 값을 주입할 수 있다.

 

MVC annotation

  • @ResponseBody: 컨트롤러 메소드 리턴값에 이 어노테이션을 선언함으로써 스프링은 해당 응답 객체를 클라이언트가 요구하는 요청 내용 유형(Content-Type)에 따라 응답하도록 도와주는 어노테이션이다. 보통은 Jackson 모듈에 의해 json 유형으로 응답하며, 클라이언트가 xml 응답을 요청하면 xml 응답을 해주기도 한다.
  • @RestController: 이 어노테이션을 달면, 모든 컨트롤러 메소드는 @ResponseBody 어노테이션이 달린 반환 값을 달고 다니게 된다. 주로 REST API 설계 시 필수 어노테이션이라 보면 된다. 물론 ModelAndView 처럼 특수한 유형은 스프링이 평소 그대로 처리하여 응답해준다.
  • @RequestMapping(method = RequestMethod.GET, value = "/path"): 메소드에 달면, 해당 메소드는 이 어노테이션이 설정한 경로를 호출했을 때 메소드가 설정한 응답값을 받게 되며, 컨트롤러 클래스에 달면, 클래스에 설정한 경로를 기준삼아 각 메소드는 클래스 경로의 하위 경로로 추가되어 경로가 잡히게 된다. 또한 method 설정으로 GET만 받거나, POST로 받는 등 특정 HTTP 메소드에만 응답 가능하도록 설정할 수 있으며, GET 의 경우 @GetMapping 같이 메소드 별칭 어노테이션이 있으니 이걸 활용해도 된다. 거기에다가 consumes 속성으로 요청 값에 대한 유형을 한정지을 수 있으며, produces 속성을 통해 응답 유형을 강제할 수 있다. 이들 둘이 설정 시 지정 타입 안맞으면 400 Bad Request 응답을 뱉도록 스프링에서 설정되어 있다.
  • @RequestParam(value="name", defaultValue="World"): 컨트롤러 메소드 인자에서 요청값을 받을 때, 요청 주소(URL)에 ? 뒤로 시작하는 질의 문자열, POST 전송 시 요청받을 키/값, 등을 받을 수 있으며, required 속성으로 필수 여부를 지정할 수 있고, defaultValue 속성을 통해 요청이 없을 경우 대체 기본값을 설정할 수 있다. 만약 required = true 일 경우 해당 파라미터 없이 호출하면 400 Bad Request 응답을 반환하도록 설정되어 있다.  

 

annotation 파트 참고

https://dev.to/composite/-40c0

'Backend > Spring' 카테고리의 다른 글

STS4 SPRING BOOT - JPA  (0) 2022.07.14
사진 업로드 (SpringProject)  (0) 2022.06.28
STS Error - Tomcat / Oracle  (0) 2022.06.23
Spring + myBatis 환경 설정  (0) 2022.06.21
Spring Basic Bean  (0) 2022.06.18

+ Recent posts