Spring Boot 기초: 어노테이션 활용하기 (1편)

2023. 8. 8. 09:03·Spring/Spring 기초 지식
반응형

Spring에서 자주 사용되는 @로 작성하는 어노테이션이 뭔지 알아보자

 


 

1. 어노테이션 - Annotation


어노테이션은 주로 프로그래밍 언어에서 특정 기능이나 동작을 정의하거나 설명하는데 사용되는 메타데이터를 말한다. 주로 자바, 파이썬 등에서 많이 볼 수 있다.
  • 어노테이션의 출현 배경은 주로 두 가지 이유에서 비롯된다.
    1. 코드의 가독성 향상:
      • 어노테이션은 코드의 특정 부분이 어떤 목적을 가지고, 어떻게 동작하는지를 명확하게 표현할 수 있게 한다. 따라서 개발자는 코드를 읽을 때 어노테이션을 통해 빠르게 이해할 수 있다.
    2. 코드의 간결성:
      • 특정 패턴이나 템플릿 코드를 반복해서 작성하는 것은 번거로울 뿐만 아니라 실수를 유발할 수 있다. 어노테이션을 통해 이러한 반복적인 코드를 줄이고, 개발자가 실제 로직에 집중할 수 있게 한다.

  • 어노테이션을 @로 표현하는 이유
    • "@" 기호는 일반적으로 변수나 함수, 클래스 이름 등에서 사용되지 않는 기호이기 때문에, 이를 통해 어노테이션을 명확하게 식별할 수 있다. 이렇게 하면 개발자가 코드를 읽을 때 어노테이션이 사용된 부분을 쉽게 인식할 수 있다.


 

2. 스프링에서 주로 사용되는 어노테이션


  1. @Component
    • 클래스를 스프링 Bean으로 등록하는 기본 어노테이션이다. 이는 자바 클래스를 스프링이 관리하는 빈으로 만들어주며, 빈의 이름은 기본적으로 클래스의 첫 문자를 소문자로 바꾼 것이 된다.

    • 만약 빈의 이름을 명시적으로 지정하고 싶다면, **@Component("beanName")**과 같은 방식으로 사용할 수 있다.

  2. @Service, @Repository, @Controller
    • 이들 어노테이션은 모두 @Component의 특별한 형태이며, 스프링 MVC에서의 계층 구조를 나타낸다. @Service는 서비스 계층, @Repository는 데이터 액세스 계층, @Controller는 프레젠테이션(웹) 계층을 나타낸다.

  3. @Autowired:
    • 이 어노테이션은 스프링이 빈의 의존성을 자동으로 주입해주는 역할을 한다. 생성자, 필드, 세터 메서드 등에 사용될 수 있다. @Autowired가 붙은 곳에 스프링은 해당 타입의 빈을 찾아 주입한다.

  4. @RequestMapping, @GetMapping, @PostMapping, @PutMapping, @DeleteMapping:
    • 이들 어노테이션은 클라이언트의 HTTP 요청을 서버의 특정 메서드에 매핑하는 역할을 한다. @RequestMapping은 기본적인 매핑 어노테이션이며, HTTP 메서드 타입을 지정하지 않으면 모든 HTTP 요청을 처리한다. 나머지는 각각의 HTTP 메서드에 해당하는 요청만 처리한다.

  5. @PathVariable:
    • @PathVariable 어노테이션은 HTTP 요청의 URL 경로에 있는 값을 메서드의 매개변수로 바인딩해준다.

    • 예를 들어, @GetMapping("/users/{id}")과 같은 메서드가 있고, @PathVariable Long id라는 매개변수(파라미터)가 있다면, /users/123 요청에서 123이 long타입을 가진 id 매개변수(파라미터)에 바인딩된다. 이제 이 바인딩된 값을 메서드 내부에서 사용해서 로직을 구성하면 된다.

  6. @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으로 적어주고 바로 값을 꺼내서 사용하는게 가독성도 좋고 효율적이다. → 타입변환도 알아서 해주고 바인딩된값이 필요한지도 설정가능하고 바인딩된값이 없을때 기본값을 설정해줄수도 있다는 장점이 있다.
예시코드
// 클라이언트가 /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 Boot 심화: 커스텀 어노테이션 만들기 (2편)

커스텀한 어노테이션(Custom Annotation)이란 무엇일까? 그리고 우리가 주로 사용하는 어노테이션을 분석해보자 1. 커스텀 어노테이션을 만드는 방법 Java에서는 사용자 정의 어노테이션을 만들 수 있

curiousjinan.tistory.com

반응형

'Spring > Spring 기초 지식' 카테고리의 다른 글

스프링에서의 데이터베이스 접근 방법: DAO, Mapper, 그리고 @Mapper 어노테이션 사용법  (0) 2023.08.09
스프링에서 데이터 전달의 핵심: VO와 DTO의 이해 및 활용  (0) 2023.08.09
Spring Boot에서 REST 컨트롤러 활용하기: @RestController 어노테이션 이해하기  (0) 2023.08.08
Spring Boot 심화: 커스텀 어노테이션 만들기 (2편)  (0) 2023.08.08
@ControllerAdvice, @RestControllerAdvice - 중앙집중 예외처리  (0) 2023.08.07
'Spring/Spring 기초 지식' 카테고리의 다른 글
  • 스프링에서 데이터 전달의 핵심: VO와 DTO의 이해 및 활용
  • Spring Boot에서 REST 컨트롤러 활용하기: @RestController 어노테이션 이해하기
  • Spring Boot 심화: 커스텀 어노테이션 만들기 (2편)
  • @ControllerAdvice, @RestControllerAdvice - 중앙집중 예외처리
Stark97
Stark97
문의사항 또는 커피챗 요청은 링크드인 메신저를 보내주세요! : https://www.linkedin.com/in/writedev/
  • Stark97
    오늘도 개발중입니다
    Stark97
  • 전체
    오늘
    어제
    • 분류 전체보기 (240)
      • 개발지식 (20)
        • 스레드(Thread) (8)
        • WEB, DB, GIT (3)
        • 디자인패턴 (8)
      • JAVA (21)
      • Spring (88)
        • Spring 기초 지식 (35)
        • Spring 설정 (6)
        • JPA (7)
        • Spring Security (17)
        • Spring에서 Java 활용하기 (8)
        • 테스트 코드 (15)
      • 아키텍처 (5)
      • MSA (14)
      • DDD (7)
      • gRPC (9)
      • Apache Kafka (18)
      • DevOps (23)
        • nGrinder (4)
        • Docker (1)
        • k8s (1)
        • 테라폼(Terraform) (12)
      • AWS (32)
        • ECS, ECR (14)
        • EC2 (2)
        • CodePipeline, CICD (8)
        • SNS, SQS (5)
        • RDS (2)
      • notion&obsidian (3)
  • 링크

    • notion기록
    • 깃허브
    • 링크드인
  • hELLO· Designed By정상우.v4.10.0
Stark97
Spring Boot 기초: 어노테이션 활용하기 (1편)
상단으로

티스토리툴바