[TIL] Spring Boot 어노테이션(@)

냠냠빈·2024년 12월 11일

Spring Boot는 Java 기반의 애플리케이션을 구축할 때, 다양한 어노테이션을 통해 개발자의 작업을 간소화하고 효율적으로 만듭니다.

이번 글에서는 Spring Boot에서 자주 사용되는 주요 어노테이션들을 소개하고, 각 어노테이션의 기능을 사용 예시와 함께 보려고 합니다.

🎇 어노테이션이란 무엇인가?

어노테이션(Annotation)은 메타데이터의 일종으로, 클래스, 메서드, 변수 등에 추가되어 추가 정보를 제공하거나 동작을 제어하는 역할을 합니다. 일반적으로 컴파일러나 프레임워크가 이 정보를 바탕으로 자동으로 동작을 처리합니다.

어노테이션의 주요 특징:

  1. 주석과는 다름
    어노테이션은 주석과는 다르게 실제 프로그램 실행에 영향을 미칩니다. 주석은 단순히 코드에 대한 설명을 추가하는 반면, 어노테이션은 프레임워크나 컴파일러에 의해 처리되어, 코드 실행에 직접적인 영향을 줍니다.

  2. 애플리케이션의 설정을 외부화
    어노테이션을 사용함으로써 설정 정보를 코드 외부에서 처리할 수 있습니다. 예를 들어, XML이나 application.properties 파일을 사용하지 않고도 @Autowired@Value와 같은 어노테이션을 통해 의존성 주입이나 설정을 처리할 수 있습니다.

  3. 어노테이션은 메타 어노테이션을 가질 수 있음
    어노테이션도 다른 어노테이션을 가질 수 있습니다. 예를 들어, @Retention, @Target과 같은 메타 어노테이션은 어노테이션이 어디에 적용될 수 있는지, 언제 적용될지를 정의합니다.

    어노테이션의 예시:

// 클래스에 @Controller 어노테이션을 사용하여 이 클래스가 HTTP 요청을 처리하는 컨트롤러임을 나타냅니다.
@Controller
public class MyController {

    // 메서드에 @GetMapping 어노테이션을 사용하여 GET 요청을 처리하도록 지정
    @GetMapping("/greet")
    public String greet() {
        return "Hello, Spring Boot!";
    }
}

위 예시에서 @Controller@GetMapping은 Spring Boot에서 해당 클래스와 메서드의 역할을 지정하는 어노테이션입니다. @Controller는 이 클래스가 컨트롤러 역할을 한다는 것을 나타내며, @GetMapping은 HTTP GET 요청에 대응하는 메서드임을 나타냅니다. 어노테이션을 통해 이렇게 역할을 지정함으로써 코드가 더 직관적이고 읽기 쉬워집니다.


🎇 어노테이션이 처리되는 과정

어노테이션은 코드에 부착된 특별한 정보(메타데이터)를 읽고 처리하여, 개발자의 작업을 자동화하거나 설정을 간소화하는 데 사용됩니다. 어노테이션이 처리되는 과정은 크게 컴파일 시점에 어노테이션 프로세서(annotation processor)에 의해 수행되며, 여러 단계를 거쳐 완성됩니다. 아래에서 자세히 알아보겠습니다.

어노테이션 처리의 기본 흐름

어노테이션은 컴파일 시간에 프로세서에 의해 처리되며, 다음과 같은 과정을 거칩니다:

  1. 어노테이션 스캔
    컴파일러가 소스 코드에서 어노테이션을 스캔하여 어떤 어노테이션이 사용되었는지 확인합니다.
    예를 들어, 코드에 다음과 같은 어노테이션이 있다면:
@Controller
public class MyController {
    @GetMapping("/hello")
    public String sayHello() {
        return "Hello, World!";
    }
}
  • @Controller@GetMapping이 스캔됩니다.
  • 컴파일러는 이 어노테이션들이 무엇을 의미하는지, 어떤 작업을 해야 하는지 파악합니다.
  1. 어노테이션 프로세서 동작
    스캔된 어노테이션을 기반으로 어노테이션 프로세서(annotation processor)가 작업을 수행합니다.
  • 어노테이션 프로세서는 미리 정의된 규칙에 따라 동작하며, 필요한 코드를 자동으로 생성하거나 설정을 추가합니다.
  • 예를 들어, @GetMapping("/hello")를 보고 "이 메서드는 HTTP GET 요청을 처리해야 한다"는 코드를 생성합니다.
  1. 코드 생성 또는 수정
    프로세서가 보일러플레이트 코드(자동으로 생성되는 반복적인 코드)를 생성합니다.
  • 이런 코드 덕분에 개발자는 복잡한 설정 없이 어노테이션만으로 기능을 구현할 수 있습니다.
  • 예: Spring Boot에서는 @Controller@GetMapping 덕분에 별도 설정 없이도 웹 요청을 처리할 수 있습니다.
  1. 반복적인 프로세싱 라운드
    생성된 코드에 또 다른 어노테이션이 포함되어 있다면, 다시 프로세서가 이를 처리합니다.
  • 이런 작업은 더 이상 처리할 어노테이션이 없을 때까지 반복됩니다.
  • 예를 들어, 첫 번째 라운드에서 @Controller를 처리하고, 두 번째 라운드에서 다른 어노테이션(@Autowired 등)을 처리할 수 있습니다.
    소스코드 작성
       ↓
    어노테이션 스캔
       ↓
    어노테이션 프로세서 실행
       ↓
    보일러플레이트 코드 생성
       ↓
    (필요시) 추가 라운드 실행
       ↓
    최종 코드 생성
    

🎇 Spring Boot에서 자주 사용하는 주요 어노테이션 설명

1. @GetMapping

설명
@GetMappingHTTP GET 요청을 처리하는 메서드에 사용됩니다. 주로 데이터를 조회하는 요청을 처리할 때 사용됩니다.

@GetMapping("/greet")
public String greet() {
    return "Hello, Spring Boot!";
}

위 코드에서는 /greet 경로로 들어오는 GET 요청에 대해 "Hello, Spring Boot!"라는 문자열을 반환하는 메서드를 정의했습니다.

2. @Controller

설명
@Controller는 Spring MVC에서 사용되는 어노테이션으로, 웹 애플리케이션에서 HTTP 요청을 처리하는 컨트롤러 클래스를 나타냅니다. 이 어노테이션을 사용하면 Spring IoC 컨테이너에 해당 클래스를 빈(Bean)으로 등록할 수 있습니다.
@GetMapping, @PostMapping 등 다양한 요청 처리 메서드를 선언할 수 있습니다.

@Controller
public class MyController {

    @GetMapping("/home")
    public String home() {
        return "home";
    }
}

위 코드에서는 /home 경로로 들어오는 GET 요청을 처리하는 메서드를 정의했습니다. 이 메서드는 home.html과 같은 뷰를 반환합니다.

3. @ResponseBody

설명
@ResponseBody는 메서드에서 반환된 값을 HTTP 응답 본문으로 반환할 때 사용됩니다. 주로 JSON, XML, 텍스트 등과 같은 데이터를 클라이언트에 전달할 때 사용됩니다.

@GetMapping("/data")
@ResponseBody
public String getData() {
    return "This is a response body.";
}

위 코드에서는 /data 경로로 들어오는 GET 요청에 대해 메서드에서 반환된 문자열을 HTTP 응답 본문으로 반환합니다.

4. @RestController

설명
@RestController@Controller@ResponseBody를 합친 어노테이션으로, 주로 RESTful API를 구축할 때 사용됩니다. @RestController가 선언된 클래스 내의 모든 메서드는 기본적으로 HTTP 응답 본문에 데이터를 반환합니다.

@RestController
public class MyRestController {

    @GetMapping("/json")
    public Map<String, String> getJson() {
        Map<String, String> response = new HashMap<>();
        response.put("message", "Hello, REST!");
        return response;
    }
}

위 코드에서는 /json 경로로 들어오는 GET 요청에 대해 JSON 형식의 데이터를 반환합니다. @RestController로 인해 @ResponseBody를 별도로 명시할 필요가 없습니다.

5. @Component

설명
@Component는 스프링 IoC 컨테이너에 해당 클래스를 빈(Bean)으로 등록하여 DI(Dependency Injection)를 받을 수 있게 합니다. @Component가 선언된 클래스는 스프링 컨테이너에서 자동으로 관리되므로 개발자는 new 키워드를 사용하여 객체를 생성할 필요가 없습니다.

@Component
public class MyComponent {

    public String greet() {
        return "Hello, Component!";
    }
}

위 코드에서 MyComponent 클래스는 @Component 어노테이션 덕분에 스프링 IoC 컨테이너에 자동으로 등록됩니다.

6. @Service

설명
@Service@Component의 특수화된 형태로, 주로 서비스 계층에서 사용됩니다. 비즈니스 로직을 처리하는 클래스에 사용되며, 스프링 IoC 컨테이너에 빈으로 등록됩니다.

@Service
public class MyService {

    public String process() {
        return "Service Processing";
    }
}

위 코드에서 MyService 클래스는 비즈니스 로직을 처리하는 서비스 계층 클래스로, 스프링 IoC 컨테이너에서 관리됩니다.

7. @Repository

설명
@Repository@Component의 특수화된 형태로, DAO(Data Access Object) 클래스에 사용됩니다. 데이터베이스와 상호작용하는 클래스에 사용되며, 예외를 변환해주는 역할을 합니다.

@Repository
public class MyRepository {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public List<String> getNames() {
        return jdbcTemplate.queryForList("SELECT name FROM employees", String.class);
    }
}

위 코드에서 MyRepository 클래스는 데이터베이스와의 상호작용을 담당하는 클래스입니다.

8. @Bean

설명
@Bean메서드 레벨 어노테이션으로, 해당 메서드에서 반환되는 객체를 스프링 IoC 컨테이너에 빈으로 등록합니다. 보통 @Configuration 클래스 내에서 사용됩니다.

@Configuration
public class MyConfig {

    @Bean
    public MyComponent myComponent() {
        return new MyComponent();
    }
}

위 코드에서는 myComponent() 메서드에서 반환되는 객체를 스프링 IoC 컨테이너에 빈으로 등록하고 있습니다.

9. @Configuration

설명
@Configuration은 클래스 레벨에서 사용되며, 해당 클래스가 스프링 설정 클래스임을 나타냅니다. 이 클래스 내에서 @Bean 어노테이션을 사용하여 빈을 정의할 수 있습니다.

@Configuration
public class AppConfig {

    @Bean
    public MyService myService() {
        return new MyService();
    }
}

위 코드에서는 @Configuration을 사용하여 AppConfig 클래스가 설정 파일임을 나타내고, @Bean으로 빈을 정의하고 있습니다.


참고한 블로그 : JAVA Annotation 완전 정복기

profile
다 먹어버릴거야!

0개의 댓글