관리 메뉴

JIE0025

[Spring] 어노테이션(Annotation)정의, 종류 본문

백엔드/스프링, 스프링부트, JPA, Spring Webflux

[Spring] 어노테이션(Annotation)정의, 종류

Kangjieun11 2022. 4. 23. 21:38
728x90

annotations이 무엇일까 사전에 검색해보니 주석이라고 뜬다. 

 

 

 

스프링에서 어노테이션?

어떤 기능을 수행하도록 하는 주석 같은 느낌으로 이해하면 된다. 

 

프로그램에 추가 정보를 제공하는 메타데이터(데이터를 위한 데이터) 의 역할이기도 한다 

 

 

어노테이션(Annotation)은 클래스와 메서드에 추가되어 다양한 기능을 부여할 수 있는데

이를 활용한 예는 다음과 같다. 

- 클래스 역할 정의
- Bean(스프링 객체) 주입
- getter setter 자동 생성

 

어노테이션의 장점

- 코드 량 감소
- 유지보수 good
- 생산성 증가

 

어노테이션 종류

@Component

개발자가 정의한 클래스를 Bean으로 등록하는 어노테이션

@Component
public class Student{
	public Student(){
    	system.out.println("study")
    }
}

@Component(value="std1")
public class Student{
	public Student(){
    	system.out.println("study")
    }
}

위의 경우 추가 정보가 없으므로 > Class 이름을 카멜케이스로 변경한것이 Bean id로써 사용된다. 

아래의 경우 value를 통해 Bean의 이름이 지정된다. 

 

@Bean

개발자가 제어 불가능한 외부 라이브러리를 Bean으로 만들때 사용

@Configuration
public class Config{
	
    @Bean
    public ArrayList<String> arr(){
    	return new ArrayList<String>();
    }
}

ArrayList 와 같이

라이브러리를 Bean 으로 등록하려면 

해당 라이브러리 반환하는 메소드를 만든 후 @Bean 어노테이션을 사용한다.

 

 

@Service

클래스가 서비스 역할을 한다고 명시하기 위해 사용

 

 

 

@Controller

클래스가 컨트롤러 역할을 한다고 명시하기 위해 사용

 

@RequestMapping

@RequestMapping(value = "") 형식이고, 요청이 들어온 URI와 value값이 일치할 때 해당 메소드를 실행한다. 

Controller 객체 안 메서드, 클래스에 적용한다.

 

 

@controller 어노테이션으로  userController와 boardController 메소드를 사용한다고 한 후 예를 들어보겠다. 

@Controller 
public class userController {

    @RequestMapping(value = "/user/userJoin.do", method = RequestMethod.GET)
    public String userJoin(Locale locale, Model model) throws Exception{
    	//    /user/userJoin  요청처리
    }
    @RequestMapping(value = "/user/userJoinAction.do", method = RequestMethod.POST)
    @ResponseBody
    public String userJoinAction(Locale locale,UserVo userVo) throws Exception{
		//    post method 
        //    /user/userJoinAction 처리
    }
}

@RequestMapping이 메소드 위에만 존재하기 떄문에 value에 전체 경로를 사용해 /user/userJoin 의 요청과 

/user/userJoinAction 의 요청 두개를 처리하도록 한다.

 

 

@Controller
@RequestMapping("/board")    
public class boardController {

    @RequestMapping(value = "/boardList.do", method = RequestMethod.GET)
	public String boardList(Locale locale, Model model,HttpServletRequest req, PageVo pageVo) throws Exception{
		//    get board list
        //    /board/boardList 요청 처리
    
    }
    
    @RequestMapping(value = "/boardListAction.do", method = RequestMethod.POST)
    public String boardListAction(Locale locale, Model model,PageVo pageVo) throws Exception{
    	//   post method
    	//   /board/boardListAction 처리
    }    
}

 

컨트롤러 어노테이션 아래에 @RequestMapping("/board")를 해주었기 떄문에 boardController 클래스 아래에있는 모든 메소드는 /board 로 시작하는 요청을 처리한다. 

 

따라서 아래 두 메소드는 각각 /board/boardList 와 /board/boardListActoin을 처리한다.

 

 

@ResponseBody (응답) , @RequestBody (요청)

@ResponseBody 를 사용하면 메서드 리턴 값이 View 출력이 아닌, HTTP Response Body에 직접 쓰여지게 되고, 

return할 떄 JSON, XML과 같이 데이터를 반환한다.

 

위에 userController에 들어있었기 떄문에 다시 코드를 가져왔다. 

@Controller 
public class userController {

    @RequestMapping(value = "/user/userJoinAction.do", method = RequestMethod.POST)
    @ResponseBody
    public String userJoinAction(Locale locale,UserVo userVo) throws Exception{
		//    post method 
        //    /user/userJoinAction 처리
    }
}

 

- 비동기 통신으로 동작해야할 때를 생각해보자.

클라이언트에서 서버로 요청메세지를 보낼때, 본문에 데이터를 담아서 보내고

서버에서 클라이언트로 응답메시지를 보낼때에도 본문에 데이터를 보내야하는데 

본문이 바로 body이고

요청은 RequestBody , 응답은 ResponseBody를 담아서 보내게된다. 

 

클라이언트가 필요한 데이터를 요청할 때에 JSON을 요청 본문에 담아 서버로 보내고, 
서버에서 RequestBody를  이용해 http 요청 본문에 담긴 값을 자바객체로 변환및 저장한다. 
서버에서 응답을 보내줄때 @ResponseBody를 이요해 http 응답 본문의 객체로 변환해 클라이언트로 보내준다. 

 

 

@GetMapping

@RequestMapping(Method=RequestMethod.GET) 과 같은 역할

 

 

@PostMapping

@RequestMapping(Method=RequestMethod.POST) 와 같은 역할

 

 

@Autowired

org.springframework.beans.factory.annotation.Autowired

<타입>에 따라 bean을 알아서 주입해준다.

 

생성자 / setter / 필드 

3가지 경우에 Autowired를 사용하는데 

기본값이 true이기 때문에 의존성 주입 대상을 찾지 못할 경우 application구동 자체를 실패한다.

 

@Controller
public class BoardController {
	
	@Autowired 
	boardService boardService;
	
	@Autowired 
	UserService userService;
    

}

 

 

일단 중요한 어노테이션은 이정도로 정리해놓고 추가 설명이 필요한것들은 세세하게 글을 새로 써보곘다.