어노테이션 Annotation

앞고기랑 소금·2024년 8월 14일

스파르타 TIL

목록 보기
21/43

21일차

  • @Controller

    • Spring MVC의 Controller로 사용
    • 클래스 선언을 단순화 시켜주는 어노테이션
  • @RestController

    • Spring에서 ControllerView로 응답하지 않는 Controller를 의미
    • method의 반환 결과를 JSON 형태로 반환
  • @Controller@RestController의 차이점
    • @Controller
      • view return이 주목적
      • APIview를 동시에 사용하는 경우에 사용
      • 대신 API 서비스로 사용하는 경우는 @ResponseBody를 사용하여 객체를 반환
    • @RestController
      • data return이 주목적
      • view가 필요없는 API만 지원하는 서비스에서 사용한다.
      • @RequestMapping 메서드가 기본적으로 @ResponseBody 의미를 가정한다.

즉, @RestController = @Controller + @ResponseBody

  • @RequestMapping

    • 어떤 URL을 어떤 method가 처리할 지 매핑해주는 어노테이션
    • ControllerController의 메소드에 적용
    • 요청을 받는 형식인 GET/POST/PUT/PATCH/DELETE를 정의하기도 함 (정의하지 않으면 자동적으로 GET으로 설정)
    @RequestMapping("/")
     public String index(Model model) {
       model.addAttribute("list", bannerService.listAll());
       return "index";
     }
  • @GetMapping

    • @RequestMapping(Method=RequestMethod.GET)과 같은 역할
    • 이 외에도 @PostMapping, @PutMapping, @DeleteMapping 등의 어노테이션도 있다.
    @GetMapping("/hello")
     public String hello() {
    	 return "Hello World!!";
     }
  • @ModelAttribute

    • view에서 전달해주는 파라미터Class(VO/DTO)멤버 변수binding 해주는 어노테이션
    • <input name="id" /> 처럼 어떤 태그의 name값이 해당 Class의 멤버 변수명일치하고 setmethod명일치해야함
  • @RequestBody

    • 요청이 온 데이터를 바로 Classmodel매핑하기 위한 어노테이션
    • POSTPUT, PATCH요청을 받을때 Request로 넘어온 body값들을 자바타입으로 파싱
    • HTTP POST 요청에 대해 request body에 있는 request message에서 값을 얻어와 매핑
    • RequestData를 바로 Model이나 클래스매핑
    • JSON 이나 XML같은 데이터를 적절한 messageConverter로 읽을 때 사용하거나 POJO 형태의 데이터 전체로 받는 경우에 사용
    @PostMapping("/api/posts")
     public PostResponseDto createPost(@RequestBody PostRequestDto requestDto) {
     	return postService.createPost(requestDto);
     }
  • @RequestParam

    • @PathVariable과 유사
    • Request의 파라미터에서 가져오는 것이다. method의 파라미터에 사용
    • ?name=rara와 같은 쿼리 파라미터를 파싱
    • HTTP GET 요청에 대해 매칭되는 request 파라미터 값이 자동으로 들어감
    • URL뒤에 붙는 파라미터 값을 가져올 때 사용
      http://localhost:8080/home?user_id=rara.log
    @GetMapping("/account")
     public List<AccountInfo> getAccountByUserId ( @RequestParam("user_id") Long userId) {
     	return accountService.getAccountByUserId(userId)
    			.stream().map(AccountDto -> AccountInfo.builder()
          			.accountNumber(AccountDto.getAccountNumber())
                    .balance(AccountDto.getBalance())
                    .build()).collect(Collectors.toList());
     }
  • @PathVariable

    • method 파라미터 앞에 사용하면서 해당 URL에서 {특정값}을 변수로 받아올 수 있다
    • HTTP 요청에 대해 매핑되는 request parameter 값이 자동으로 binding
    • URI에서 각 구분자에 들어오는 값을 처리해야 할 때 사용
    • REST API에서 값을 호출할 때 주로 많이 사용
      http://localhost:8080/api/posts/1
    @GetMapping("/api/posts/{id}")   
     public PostResponseDto getPost(@PathVariable Long id) {
     	return postService.getPost(id);
     }
  • @ResponseBody

    • HttpMessageConverter를 이용하여 JSON(or xml)으로 요청에 응답할 수 있게 해주는 어노테이션
    • view가 아닌 JSON 형식의 값을 응답할 때 사용하는 어노테이션으로, 문자열을 리턴하면 그 값이 http response header가 아닌 response body에 들어간다
    • 이미 @RestController 어노테이션이 붙어 있다면, 쓸 필요가 없다.
      허나 그렇지 않은 단순 컨트롤러라면, HttpResponse로 응답 할 수 있게 해준다
    • 만약 객체를 return하는 경우 JACKSON 라이브러리에 의해 문자열로 변환되어 전송
    • context에 설정된 viewResolver를 무시한다고 보면된다

Lombok

  • @~~~Constructor

    • @NoArgsConstructor

      • 기본생성자를 자동으로 추가
      • @NoArgsConstructor(access = AccessLevel.PROTECTED)기본생성자의 접근 권한을 protected로 제한할 수도 있다
      • Entity Class를 프로젝트 코드상에서 기본생성자로 생성하는 것은 금지하고, JPA에서 Entity 클래스를 생성하도록 허용하기 위해 사용
    • @AllArgsConstructor

      • 모든 필드 값을 파라미터로 받는 생성자를 추가
    • @RequiredArgsConstructor

      • final이나 @NonNull인 필드 값만 파라미터로 받는 생성자를 추가
  • @Getter

    • Class 내 모든 필드의 Getter 메소드를 자동 생성
  • @Setter

    • Class 내 모든 필드의 Setter 메소드를 자동 생성
    • Controller에서 @RequestBody로 외부에서 데이터를 받는 경우엔 기본생성자 + Set 메소드를 통해서만 값이 할당
    • 그러나 Entity Class에서는 Setter를 사용하면 안되기 때문에 DTO클래스를 생성해서 DTO타입으로 받아야 한다

0개의 댓글