[Spring] Annotation 정리

suyeon·2022년 9월 1일

Spring

목록 보기
5/6
post-thumbnail

1. Annotation

Annotation(@)은 사전상으로 주석의 의미이지만, Java에서는 주석 이상의 기능을 가지고 있다. 즉, 프로그램에게 추가적인 정보를 제공해주는 메타데이터라고 볼 수 있다.

소스코드에 추가하면 단순 주석의 기능을 하는 것이 아니라 특별한 기능을 사용할 수 있다. Spring Framework는 해당 클래스가 어떤 역할인지 정하기도 하고, Bean을 주입하기도 하며, 자동으로 getter나 setter를 생성하기도 한다. 특별한 의미를 부여하거나 기능을 부여하는 등 다양한 역할을 수행할 수 있다.

이러한 Annotation을 통하여 코드량이 감소하고 유지보수하기 쉬우며, 생산성이 증가된다.

2. Spring Annotation

@ComponentScan

Spring Framework는 @Component, @Service, @Repository, @Controller, @Configuration이 붙은 클래스를 찾아서 Context에 bean으로 등록한다.

@ComponentScan Annotation이 있는 클래스의 하위 Bean을 등록 될 클래스들을 스캔하여 Bean으로 등록해준다.

ApplicationContext.xml에 < bean id="suyeon" class="suyeon" /> 과 같이 xml에 bean을 직접등록하는 방법도 있고, 위와 같이 Annotation을 붙여서 하는 방법도 있다.

@Component

개발자가 생성한 Class를 Spring의 Bean으로 등록할 때 사용하는 Annotation이다.

@Component
public class Woman {
    public Woman() {
        System.out.println("hi");
    }
}

@Component(value="MyWoman")
public class Woman {
    public Woman() {
        System.out.println("hi");
    }
}

Component에 대한 추가 정보가 없다면 Class의 이름을 카멜케이스로 변경한 것이 Bean의 id로 사용된다.
@Bean과 다르게 name이 아닌 value를 이용해 Bean의 id를 지정한다.

@Bean

@Bean은 개발자가 직접 제어가 불가능한 외부 라이브러리와 같은 것들을 Bean으로 만들 때 사용한다.

@Autowired

Bean을 주입받기 위하여 @Autowired를 사용한다.
Spring Framework가 Class를 보고 Type에 맞게(Type을 먼저 확인 후, 없으면 Name을 확인) Bean을 주입한다.

[Bean 객체를 주입받기 위한 방법 3가지]

  1. @Autowired
  2. setter
  3. 생성자 (@AllArgsConstructor 사용) > 권장방식

@Controller

Spring의 Controller를 의미한다. Spring MVC에서 Controller 클래스에 사용한다.

@Controller                   // 이 Class는 Controller 역할을 한다.
@RequestMapping("/user")      // 이 Class는 /user로 들어오는 요청을 모두 처리한다.
public class UserController {
    @RequestMapping(method = RequestMethod.GET)
    public String getUser(Model model) {
        //  GET method, /user 요청을 처리
    }
}

@RestController

Spring의 Controller 중 View로 응답하지 않는, Controller를 의미한다.
method의 반환 결과를 JSON 형태로 바꾸고 HttpResponse에 담아 반환한다.

즉, @RestController = @Controller + @ResponseBody 이다.

💬 스프링이 오브젝트를 JSON으로 바꾸는 것처럼 오브젝트를 저장하거나 네트워크를 통해 전달할 수 있도록 변환하는 것을 직렬화(serialization)라고 하고, 반대의 작업을 역직렬화(deserialization)라고 한다.

✅ @Controller 와 @RestController 의 차이

@Controller

API와 view를 동시에 사용하는 경우에 사용한다.
대신 API 서비스로 사용하는 경우는 @ResponseBody를 사용하여 객체를 반환한다.
view(화면) return이 주목적이다.

@RestController

view가 필요없는 API만 지원하는 서비스에서 사용한다. (Spring 4.0.1부터 제공)
@RequestMapping 메서드가 기본적으로 @ResponseBody 의미를 가정한다.
data(json, xml 등) return이 주목적이다.

@GetMapping

@RequestMapping(Method=RequestMethod.GET)과 같다.
@PostMapping, @PutMapping, @PatchMapping, @DeleteMapping 등도 있다. ( (Spring 4.3부터 제공)

@PostMapping

@RequestMapping(Method=RequestMethod.POST)과 같다.

@PathVariable

URL의 경로로 넘어오는 값을 변수로 받을 수 있다.
REST API에서 값을 호출할 때 주로 많이 사용한다.
http://localhost:8080/1

@GetMapping("/{id}")
	//(required = false) > 이 매개변수가 꼭 필요한 것은 아니라는 뜻.
	public String testControllerWithPathVariables(@PathVariable(required = false) int id) { 
        return "Hello World! ID " + id;
    }

[@RequestParam와 @PathVariable 동시 사용]

@GetMapping("/user/{userId}/invoices")
public List<Invoice> listUsersInvoices(@PathVariable("userId") int user,
	                                  @RequestParam(value = "date", required = false) Date dateOrNull) {
}

위의 경우 GET /user/{userId}/invoices?date=190101 와 같이 URI가 전달될 때,
구분자 {userId}는 @PathVariable(“userId”)로,
뒤에 이어붙은 parameter는 @RequestParam(“date”)로 받아온다.

@RequestParam

@PathVariable과 비슷하다.
?moviename={moviename} 와 같이 요청 매개변수로 넘어오는 값을 변수로 받을 수 있다.
HTTP GET 요청에 대해 매칭되는 request parameter 값이 자동으로 들어간다.
url 뒤에 붙는 parameter 값을 가져올 때 사용한다.
http://localhost:8080/home?page=2

@GetMapping("/home")
public String show(@RequestParam("page") int pageNum {
}

@RequestBody

Body에 전달되는 데이터를 메소드의 인자와 매칭시켜, 데이터를 받아서 처리할 수 있는 Annotation이다.
클라이언트가 보내는 HTTP 요청 본문(JSON 및 XML 등)을 Java 오브젝트로 변환한다.

클라이언트가 body에 json, xml과 같은 형태로 값(주로 객체)을 전송하면, 해당 내용을 Java Object로 변환한다.

@ResponseBody

@ResponseBody은 메소드에서 리턴되는 값이 View로 출력되지 않고 HTTP Response Body에 직접 쓰여지게 된다. return 시에 json, xml과 같은 데이터를 return 한다.

이미 RestController Annotation이 붙어 있다면, 쓸 필요가 없다.

3. Lombok Annotation

@NoArgsConstructor

매개 변수가 없는 생성자(기본 생성자)를 구현해 준다.

@AllArgsConstructor

클래스의 모든 멤버 변수를 매개변수로 받는 생성자를 구현해 준다.

@Getter

클래스의 모든 멤버 변수의 Getter method를 생성해 준다.

@Setter

클래스의 모든 멤버 변수의 Setter method를 생성해 준다.

@ToString

클래스의 모든 멤버 변수의 ToString method를 생성해 준다.

@Data

@Getter @Setter @EqualsAndHashCode @AllArgsConstructor을 포함한 Lombok에서 제공하는 필드와 관련된 모든 코드를 생성해 준다.

실제로 사용하지 않는것이 좋다.

@Builder

Builder는 오브젝트 생성을 위한 디자인 패턴 중 하나다.
어느 필드에 어떤 값을 채워야 할지 명확하게 정하여 생성 시점에 값을 채워준다.


참고 자료
🔗 https://melonicedlatte.com/2021/07/18/182600.html#1-annotation%EC%9D%B4%EB%9E%80
🔗 https://jang8584.tistory.com/299?category=282648

0개의 댓글