@Annotation 정리

강한친구·2022년 5월 6일
0

Spring

목록 보기
16/27

Annotation

어노테이션이란 주석이란뜻이다.

// 이건 우리가 보는 주석
@RestController // 이건 컴퓨터가 보고 읽는 주석(메타데이터)

우리가 흔히 말하는 주석과는 이런 차이가 있다.
어노테이션은

컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공한다.

소프트웨어 개발 툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보를 제공한다.

실행시(런타임시)특정 기능을 실행하도록 정보를 제공한다.

스프링을 통한 백엔드 개발에서 @Annotation은 개발의 핵심이라 할 수 있다.
이를 한번 정리해보자

@ComponentScan

@Component, @Service, @Respository, @Controller, @Configuration 같은 어노테이션들을 찾아 bean에 등록해주는 Annotation이다.

@Component

개발자가 작성한 Class를 Bean으로 등록하기 위해 달아주는 Annotation이다

@Bean

Bean은 개발자가 제어할 수 없는 외부 라이브러리를 Bean으로 만들 때 사용하는 Annotation이다.

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

@Autowired

field, setter, getter, constructor에 사용하며 Type에 맞춰서 Bean을 주입해준다. 이 Annotation을 사용하면 스프링이 자동적으로 값을 할당하고 이는 Controller에서 DAO, Service 같은 객체들 주입할 때 사용한다.

주입할 객체가 하나라면 자동으로 주입되지만 그 밖에는 DI를 통해서 직접 주입해줘야하는데

@Autowired
setter
@AllArgsConstructor (권장)

ArrayList같은 외부 라이브러리를 빈으로 등록하기 위해서는 별도로 해당 라이브러리를 반환하는 메소드를 만들고 Bean을 붙여주면 된다.

@Controller

스프링의 컨트롤러를 의미한다.

@RestController

SpringController중 View로 응답을 하지 않는 경우이다.
이 경우 반환결과는 JSON 형태이다. 즉, API통신에 주로 사용되는 Controller이다.

RestController의 메소드는 HttpResponse로 바로 응답이 가능하다. @ResponseBody 역할을 자동적으로 해주는것이다.
@Controller + @ResponseBody를 사용하면 ResponseBody를 모든 메소드에서 적용한다.

@Required

필수적으로 사용되야하는 객체에 붙여준다

RequestBody

요청이 온 데이터(JSON, XML)를 바로 클래스나 모델로 넘겨주기 위한 어노테이션이다. 즉, POST, PUT, PATCH로 요청을 받을 때, body에 있던 값들을 바로 자바타입으로 파싱해주는 기능을 하는것이다.

이러한 역할은 수행한다.

Param관련 어노테이션

스프링 Controller에서 클라이언트에서 URL에 파라미터를 같이 담아서 전달하는 경우가 있다.

1 => http://127.0.0.1?index=1&page=2
2 => http://127.0.0.1/index/1

보통 이렇게 두가지 경우가 있다.
1번의 경우 게시판등에서 자주 사용된다.
2번의 경우 rest api에서의 값 호출 주소인 경우가 많다.

@RequestParam

리퀘스트 파람 어노테이션은, 1번의 케이스를 처리할 때 사용된다.

@Controller
@RequestMapping("/springmvc/v3/members")
public class SpringMemberControllerV3 {

    private MemberRepository memberRepository = MemberRepository.getInstance();

    @GetMapping(value = "/new-form")
    public String newForm() {
        return "new-form";
    }

    @PostMapping(value = "/save")
    public String save(@RequestParam("username") String username, @RequestParam("age") int age, Model model) {
        Member member = new Member(username, age);
        memberRepository.save(member);

        model.addAttribute("member", member);
        return "save-result";
    }

    @GetMapping
    public String members(Model model) {
        List<Member> members = memberRepository.findAll();
        model.addAttribute("members", members);

        return "members";
    }
}

위 코드에서는 save controller는 save에서 username 파라미터와, age 파라미터를 받아온다.
어노테이션 괄호 안의 경우 전달인자의 이름(실제 값)이고, 박에 있는 자료는 자료형과 사용할 변수명이 된다. 만약 둘이 같다면, 실제이름을 생략해도 된다.

@PathVariable

2번형태의 URL 처리시 PathVariable을 사용한다

    @PostMapping("/{itemId}/edit")
    public String edit(@PathVariable Long itemId, @ModelAttribute Item item) {
        itemRepository.update(itemId, item);
        return "redirect:/basic/items/{itemId}";
    }

url 경로에서 각 구분자에 들어오는 값을 처리해야 할 때, pathvariable을 사용한다.

@ModelAttribute

모델 어트리뷰트는 스프링에서 JSP파일에 반환되는 Model 객체에 속성값을 주입하거나, 바인딩 할 때 사용되는 어노테이션이다.

메서드에 붙이는 경우

    @ModelAttribute("regions")
    public Map<String, String> regions() {
        Map<String, String> regions = new LinkedHashMap<>();
        regions.put("SEOUL", "서울");
        regions.put("BUSAN", "부산");
        regions.put("JEJU", "제주");
        return regions;
    }

regions은 이제 값을 가지고오는데 사용할 key가 되는것이고, 메소드가 return하는 값 Map region이 그 모델의 value가 되는것이다. 이렇게 생성된 모델은 Controller에 매핑되어 있는 모든 URL에 적용된다.

argument로 들어가는 경우

@PostMapping("/{itemId}/edit")
    public String edit(@PathVariable Long itemId, @ModelAttribute Item item) {
        itemRepository.update(itemId, item);
        return "redirect:/form/items/{itemId}";
    }

HTTP 요청에 들어있는 속성값들을 item 객체에 자동적으로 바인딩하게 된다.

0개의 댓글