반응형
Spring에서 자주 사용되는 @로 작성하는 어노테이션이 뭔지 알아보자
1. 어노테이션 - Annotation
어노테이션은 주로 프로그래밍 언어에서 특정 기능이나 동작을 정의하거나 설명하는데 사용되는 메타데이터를 말한다. 주로 자바, 파이썬 등에서 많이 볼 수 있다.
- 어노테이션의 출현 배경은 주로 두 가지 이유에서 비롯된다.
- 코드의 가독성 향상:
- 어노테이션은 코드의 특정 부분이 어떤 목적을 가지고, 어떻게 동작하는지를 명확하게 표현할 수 있게 한다. 따라서 개발자는 코드를 읽을 때 어노테이션을 통해 빠르게 이해할 수 있다.
- 코드의 간결성:
- 특정 패턴이나 템플릿 코드를 반복해서 작성하는 것은 번거로울 뿐만 아니라 실수를 유발할 수 있다. 어노테이션을 통해 이러한 반복적인 코드를 줄이고, 개발자가 실제 로직에 집중할 수 있게 한다.
- 특정 패턴이나 템플릿 코드를 반복해서 작성하는 것은 번거로울 뿐만 아니라 실수를 유발할 수 있다. 어노테이션을 통해 이러한 반복적인 코드를 줄이고, 개발자가 실제 로직에 집중할 수 있게 한다.
- 코드의 가독성 향상:
- 어노테이션을 @로 표현하는 이유
- "@" 기호는 일반적으로 변수나 함수, 클래스 이름 등에서 사용되지 않는 기호이기 때문에, 이를 통해 어노테이션을 명확하게 식별할 수 있다. 이렇게 하면 개발자가 코드를 읽을 때 어노테이션이 사용된 부분을 쉽게 인식할 수 있다.
- "@" 기호는 일반적으로 변수나 함수, 클래스 이름 등에서 사용되지 않는 기호이기 때문에, 이를 통해 어노테이션을 명확하게 식별할 수 있다. 이렇게 하면 개발자가 코드를 읽을 때 어노테이션이 사용된 부분을 쉽게 인식할 수 있다.
2. 스프링에서 주로 사용되는 어노테이션
- @Component
- 클래스를 스프링 Bean으로 등록하는 기본 어노테이션이다. 이는 자바 클래스를 스프링이 관리하는 빈으로 만들어주며, 빈의 이름은 기본적으로 클래스의 첫 문자를 소문자로 바꾼 것이 된다.
- 만약 빈의 이름을 명시적으로 지정하고 싶다면, **@Component("beanName")**과 같은 방식으로 사용할 수 있다.
- 클래스를 스프링 Bean으로 등록하는 기본 어노테이션이다. 이는 자바 클래스를 스프링이 관리하는 빈으로 만들어주며, 빈의 이름은 기본적으로 클래스의 첫 문자를 소문자로 바꾼 것이 된다.
- @Service, @Repository, @Controller
- 이들 어노테이션은 모두 @Component의 특별한 형태이며, 스프링 MVC에서의 계층 구조를 나타낸다. @Service는 서비스 계층, @Repository는 데이터 액세스 계층, @Controller는 프레젠테이션(웹) 계층을 나타낸다.
- 이들 어노테이션은 모두 @Component의 특별한 형태이며, 스프링 MVC에서의 계층 구조를 나타낸다. @Service는 서비스 계층, @Repository는 데이터 액세스 계층, @Controller는 프레젠테이션(웹) 계층을 나타낸다.
- @Autowired:
- 이 어노테이션은 스프링이 빈의 의존성을 자동으로 주입해주는 역할을 한다. 생성자, 필드, 세터 메서드 등에 사용될 수 있다. @Autowired가 붙은 곳에 스프링은 해당 타입의 빈을 찾아 주입한다.
- 이 어노테이션은 스프링이 빈의 의존성을 자동으로 주입해주는 역할을 한다. 생성자, 필드, 세터 메서드 등에 사용될 수 있다. @Autowired가 붙은 곳에 스프링은 해당 타입의 빈을 찾아 주입한다.
- @RequestMapping, @GetMapping, @PostMapping, @PutMapping, @DeleteMapping:
- 이들 어노테이션은 클라이언트의 HTTP 요청을 서버의 특정 메서드에 매핑하는 역할을 한다. @RequestMapping은 기본적인 매핑 어노테이션이며, HTTP 메서드 타입을 지정하지 않으면 모든 HTTP 요청을 처리한다. 나머지는 각각의 HTTP 메서드에 해당하는 요청만 처리한다.
- 이들 어노테이션은 클라이언트의 HTTP 요청을 서버의 특정 메서드에 매핑하는 역할을 한다. @RequestMapping은 기본적인 매핑 어노테이션이며, HTTP 메서드 타입을 지정하지 않으면 모든 HTTP 요청을 처리한다. 나머지는 각각의 HTTP 메서드에 해당하는 요청만 처리한다.
- @PathVariable:
- @PathVariable 어노테이션은 HTTP 요청의 URL 경로에 있는 값을 메서드의 매개변수로 바인딩해준다.
- 예를 들어, @GetMapping("/users/{id}")과 같은 메서드가 있고, @PathVariable Long id라는 매개변수(파라미터)가 있다면, /users/123 요청에서 123이 long타입을 가진 id 매개변수(파라미터)에 바인딩된다. 이제 이 바인딩된 값을 메서드 내부에서 사용해서 로직을 구성하면 된다.
- @PathVariable 어노테이션은 HTTP 요청의 URL 경로에 있는 값을 메서드의 매개변수로 바인딩해준다.
- @RequestParam:
- @RequestParam 어노테이션은 HTTP 요청의 쿼리 매개변수를 메서드의 매개변수로 바인딩한다. 예를 들어, @RequestParam String name이라는 매개변수가 있으면, /path?name=value 요청에서 value가 name 매개변수에 바인딩 된다.
- 쉽게 설명하자면 jsp에서 input 태그에 필요한 내용을 넣고 form을 submit하면 그 input 태그에 설정한 name과 value에 url에 서 쿼리스트링으로 작성한 (?name=value)값을 request에 그대로 담아서 getMapping으로 보내게 되는데 여기서 넘긴 값인 value가 @RequestParam String name 에서 name에 바인딩된다. 그럼 이 바인딩된 값을 가져다 메서드에 사용하면 된다.
- HttpServletRequest request 이렇게 메서드의 매게변수에 request를 선언하고 메서드 내부에서 request.getParam(””) 이렇게 작성해서 쿼리스트링으로 보낸 파라미터 값을 꺼내는것보다는 @RequestParam으로 적어주고 바로 값을 꺼내서 사용하는게 가독성도 좋고 효율적이다. → 타입변환도 알아서 해주고 바인딩된값이 필요한지도 설정가능하고 바인딩된값이 없을때 기본값을 설정해줄수도 있다는 장점이 있다.
- @RequestParam 어노테이션은 HTTP 요청의 쿼리 매개변수를 메서드의 매개변수로 바인딩한다. 예를 들어, @RequestParam String name이라는 매개변수가 있으면, /path?name=value 요청에서 value가 name 매개변수에 바인딩 된다.
예시코드
// 클라이언트가 /search라는 URL로 검색어(keyword=Spring)를 담아서 전송했다.
http://localhost:8080/search?keyword=Spring
// 이 요청을 처리하는 컨트롤러 메서드
@GetMapping("/search")
public String search(@RequestParam(value = "keyword", defaultValue = "spring") String keyword, Model model) {
model.addAttribute("keyword", keyword);
return "searchResult";
}
- 위의 코드에서 @RequestParam("keyword")은 HTTP 요청에서 request로 보내는 keyword라는 키값을 가진 파라미터의 value를 메서드의 keyword 매개변수에 바인딩한다. 즉, 사용자가 검색창에 "Spring"이라고 입력하고 요청을 보낸다면 keyword라는 매개변수에 "Spring"이라는 값이 들어가게 된다.
- 또한, @RequestParam에는 선택적으로 defaultValue 속성을 지정할 수 있다. 이는 해당 파라미터가 없을 경우에 사용될 기본값을 지정한다.
- 위의 코드에서는 keyword 파라미터가 요청에 없을 경우 기본값으로 "spring"이 keyword 매개변수에 설정된다.
7. @ResponseBody, @RestController:
- 이 어노테이션들은 컨트롤러 메서드의 반환 값을 HTTP 응답 본문으로 사용하도록 지정한다.
- @ResponseBody는 메서드 레벨에서 사용되며, @RestController는 클래스 레벨에서 사용되며, 해당 컨트롤러의 모든 메서드에 @ResponseBody가 적용된 것과 같은 효과를 준다.
8. @ResponseBody
- JSON을 반환하는 RESTful API를 만드는 경우에 주로 사용한다. 만약 json받는데 이 어노테이션을 안달면 오류가 발생한다.
9. @ModelAttribute:
- 주로 Form 데이터를 객체로 변환할 때 사용하는데, 이를 통해 폼 필드와 도메인 모델 객체를 자동으로 매핑하고 바인딩한다.
코드예시
// 사용자는 form에 아래의 값들을 입력해서 보낸다고 가정한다.
First Name: John
Last Name: Doe
Email: john.doe@example.com
// 이 form 데이터를 받아서 처리할 객체는 다음과 같다.
public class User {
private String firstName;
private String lastName;
private String email;
// getter and setter methods...
}
// form 데이터를 받아서 이를 User객체에 바인딩하는 컨트롤러 메서드
@PostMapping("/signup")
public String signup(@ModelAttribute User user) {
// process the user
return "success";
}
- 위의 메서드에서 @ModelAttribute 어노테이션은 HTTP 요청의 매개변수(여기서는 폼 데이터)를 User 객체로 변환하고, 이를 메서드의 매개변수로 바인딩한다.
- 폼의 입력 필드 이름과 User 클래스의 필드 이름이 일치하면, 스프링 MVC는 자동으로 해당 필드에 값을 설정한다. 이렇게 함으로써, 개발자는 HTTP 요청의 매개변수를 직접 파싱하거나 변환하는 수고를 덜 수 있다. 이런 기능은 스프링 MVC의 데이터 바인딩 기능 중 하나이다.
- 또한, @ModelAttribute는 컨트롤러 메서드의 실행 전에 특정한 메서드를 실행하도록 지정하는 용도로도 사용된다. 이런 경우에는 메서드 레벨에 @ModelAttribute를 붙여 사용하며, 이 메서드는 컨트롤러 메서드가 실행되기 전에 먼저 실행되어 결과 값을 모델에 추가한다. 이는 주로 공통적으로 사용되는 참조 데이터를 뷰에 전달할 때 사용된다.
10. @Bean:
- 이 어노테이션은 메서드에 적용되며, 해당 메서드의 반환 객체를 스프링 IoC 컨테이너에 빈으로 등록한다.
11. @SpringBootApplication:
- 이 어노테이션은 스프링 부트 애플리케이션을 나타낸다. 이 어노테이션은 @Configuration, @EnableAutoConfiguration, @ComponentScan을 결합하여 제공한다. 따라서 @SpringBootApplication 어노테이션을 사용하면 스프링 부트 애플리케이션의 핵심 설정들을 한 번에 처리할 수 있다.
- 기본적으로 이 어노테이션을 붙인 클래스는 애플리케이션의 최상단에 위치하며, 이 클래스를 실행함으로써 스프링 부트 애플리케이션이 구동된다.
만약 컴포넌트 스캔의 범위를 지정하려면 다음과 같이 할 수 있다.
@SpringBootApplication(scanBasePackages = {"com.example.myapp", "com.example.utils"})
public class Application {
// ...
}
- 이렇게 하면 스프링은 com.example.myapp 패키지와 com.example.utils 패키지에서 컴포넌트를 찾는다.
특정 자동 구성을 끄려면 exclude 속성을 사용할 수 있다.
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class Application {
// ...
}
- 위 코드는 DataSourceAutoConfiguration 자동 구성을 사용하지 않도록 설정한다. 이는 예를 들어 데이터베이스가 없는 애플리케이션에서 데이터 소스 관련 자동 구성을 끄고자 할 때 사용할 수 있다.
12. @Configuration:
- 이 어노테이션은 해당 클래스가 빈 정의를 제공한다는 것을 스프링에 알린다.
- @Bean 어노테이션이 붙은 메서드는 각각 하나의 빈 객체를 생성하고, 이를 스프링이 관리하는 애플리케이션 컨텍스트에 등록한다.
@Configuration 사용 예시코드1
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
- 이 AppConfig라는 클래스는 MyService라는 이름의 빈을 생성하는 설정을 포함하고 있다. 이 Bean은 AppConfig가 설정된 컨텍스트에서 MyService 타입의 빈이 필요할 때마다 사용된다.
- 스프링에서는 @Configuration이 붙은 클래스를 특별하게 처리하여, 해당 클래스의 @Bean 메서드가 반복적으로 호출되더라도 한 번 생성된 빈 객체를 재사용(singleton 범위를 가진 빈에 대해)한다. 즉, AppConfig 클래스에서 myService() 메서드를 호출해도 항상 같은 MyService 인스턴스를 반환한다.
- 또한, @Configuration 클래스는 다른 @Configuration 클래스를 가져와서 사용할 수 있다.
@Configuration 사용 예시코드2
@Configuration
public class OtherConfig {
@Autowired
private AppConfig appConfig;
@Bean
public OtherService otherService() {
return new OtherServiceImpl(appConfig.myService());
}
}
- 위 코드에서 OtherConfig는 AppConfig의 myService()를 호출하여 생성된 MyService 빈을 주입받아 OtherService 빈을 생성하는 데 사용한다. 이렇게 @Configuration 어노테이션을 사용하면, 각각의 @Bean 메서드가 각기 다른 빈 설정을 나타내며, 이 메서드들을 조합하여 전체 애플리케이션 설정을 구성할 수 있다.
- 스프링 부트 애플리케이션에서는 일반적으로 @SpringBootApplication 어노테이션을 사용하여 @Configuration 클래스를 자동으로 스캔한다.
@SpringBootApplication 사용 예시코드
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
- 위와같은 경우에는 @SpringBootApplication은 애플리케이션의 메인 클래스가 있는 패키지를 기반으로 @Component, @Service, @Repository, @Controller, 그리고 @Configuration 등이 붙은 클래스를 자동으로 스캔하게 된다. 따라서 @Configuration이 붙은 클래스는 @SpringBootApplication이 붙은 메인 클래스와 같은 패키지 또는 하위 패키지에 위치해야 자동으로 인식된다.
- @Import 어노테이션을 사용하는 것은 이런 자동 스캔 범위 밖에 있는 @Configuration 클래스를 명시적으로 등록하고 싶을 때 사용한다. 예를 들어, @Configuration 클래스가 메인 클래스의 패키지 구조와 완전히 다른 곳에 위치해 있다면, @Import를 사용해서 그 클래스를 불러와야 한다. (테스트코드에서 주로 사용한다.)
@Import 사용예시 코드
@SpringBootApplication
@Import(ExternalConfig.class)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
- 이렇게 하면 ExternalConfig 클래스가 메인 애플리케이션 컨텍스트에 포함되게 된다.
- @SpringBootApplication과 @Import(ExternalConfig.class)을 함께 사용할 경우, 기본적으로 자동 스캔 @ComponentScan이 되어 빈으로 등록되는 클래스들에 추가로 ExternalConfig.class에 있는 @Bean 정의도 등록이 된다.
- 즉, ExternalConfig.class에서 @Bean으로 등록해준 애들만 추가로 등록되는 것이지, 그 외의 @Component로 등록한 애들이 빈으로 등록되지 않는 것은 아니다. @Component 등으로 등록한 빈들도 계속해서 등록되게 된다.
13. @EnableAutoConfiguration:
- 이 어노테이션은 스프링 부트의 자동 설정 기능을 활성화한다. classPath에 있는 라이브러리들에 따라 필요한 빈들을 자동으로 설정하고 등록해준다.
- 예를 들어, classPath에 Spring Web MVC가 있다면 웹 애플리케이션으로 구동될 것이고, JPA가 있다면 데이터베이스와 관련된 빈들이 추가될 것이다.
14. @ComponentScan:
- 이 어노테이션은 해당 클래스가 위치한 패키지부터 시작해서 하위 패키지를 모두 탐색하여 @Component, @Service, @Repository, @Controller 등이 붙은 클래스들을 찾아서 스프링 빈으로 등록한다.
15. @Profile:
- 이 어노테이션은 특정 프로파일에서만 활성화되어야하는 빈을 정의할 때 사용된다.
16. @Transactional:
- 이 어노테이션은 메서드가 데이터베이스 트랜잭션의 일부임을 나타낸다.
17. @Value:
- 이 어노테이션은 프로퍼티 파일의 값이나 시스템 속성 등의 값을 빈의 필드나 메서드 매개변수에 주입하는데 사용된다.
- 예를 들어, @Value("${app.name}")은 'app.name'이라는 이름의 프로퍼티 값을 주입한다.
18. @Autowired와 @Qualifier를 함께 사용:
- @Autowired로 주입할 빈이 여러 개 있는 경우, @Qualifier를 함께 사용하여 어떤 빈을 주입할지 명시할 수 있다. 예를 들어, @Autowired @Qualifier("beanName")은 'beanName'이라는 이름의 빈을 주입한다.
19. @Scope:
- 이 어노테이션은 빈이 생성되는 범위를 지정한다 (예: singleton, prototype).
2023.08.08 - [Spring 기초/spring 어노테이션] - Spring Boot 심화: 커스텀 어노테이션 만들기 (2편)
반응형
'Spring 기초 > Spring 기초 지식' 카테고리의 다른 글
Spring Boot에서 REST 컨트롤러 활용하기: @RestController 어노테이션 이해하기 (0) | 2023.08.08 |
---|---|
Spring Boot 심화: 커스텀 어노테이션 만들기 (2편) (0) | 2023.08.08 |
Spring Framework 이해하기: 다형성, 개방-폐쇄 원칙(OCP), 인터페이스 활용의 장점 (0) | 2023.08.08 |
@ControllerAdvice, @RestControllerAdvice - 중앙집중 예외처리 (0) | 2023.08.07 |
스프링의 핵심: Singleton 패턴 알아보기 (0) | 2023.08.07 |