[Spring Boot] 어노테이션

handa·2024년 12월 11일
0
post-thumbnail

스프링 부트는 여러 어노테이션을 통해 개발자들이 코드의 간결성과 생산성을 높일 수 있도록 돕습니다.

1. @SpringBootApplication

  • 정의 : 스프링 부트 애플리케이션의 진입점에 사용하는 필수 어노테이션, 내부적으로 @Configuration, @EnableAutoConfiguration, @ComponentScan을 포함.
  • 역할
    1. @Configuration : 스프링 애플리케이션의 자바 기반 설정 클래스로 정의.
    2. @EnableAutoConfiguration : 스프링 부트가 클래스패스에 있는 라이브러리를 감지하고, 이를 자동으로 설정.
      • 예: 클래스패스에 spring-web 이 있으면 웹 관련 설정 자동 추가.
    3. @ComponentScan : 기본 패키지와 하위 패키지를 스캔하여 @Component, @Service, @Repository 등을 빈으로 등록,
  • 예시
    @SpringBootApplication
    public class MyApplication {
        public static void main(String[] args) {
            SpringApplication.run(MyApplication.class, args);
        }
    }

2. @RestController와 HTTP 매핑 어노테이션

  • @RestController : RESTful 웹 서비스를 쉽게 개발할 수 있도록 지원.

    • 내부적으로 @Controller@ResponseBody를 포함.
    • JSON 또는 XML 형식의 응답을 반환.
  • HTTP 매핑 어노테이션

    • @GetMapping : HTTP GET 요청을 처리.
    • @PostMapping : HTTP POST 요청을 처리.
    • @PutMapping : HTTP PUT 요청을 처리.
    • @DeleteMapping : HTTP DELETE 요청을 처리.
  • 예시

    @RestController
    public class ApiController {
        @GetMapping("/hello")
        public String sayHello() {
            return "Hello, World!";
        }
    
        @PostMapping("/data")
        public Data saveData(@RequestBody Data data) {
            return data;
        }
    }

3. 의존성 주입(DI) 어노테이션

  • @Autowired

    • 스프링이 관리하는 빈을 클래스의 필드, 생성자, 또는 세터에 주입.

    • 필드 주입

      @Service
      public class MyService {
        @Autowired
        private MyRepository repository;
      }
    • 생성자 주입(권장)

       @Service
       public class MyService {
       private final MyRepository repository;
      
       public MyService(MyRepository repository) {
           this.repository = repository;
       }
      }
    • 세터 주입

       @Service
      		public class MyService {
       private MyRepository repository;
      
       @Autowired
       public void setRepository(MyRepository repository) {
           this.repository = repository;
       }
      }

4. 데이터베이스와 관련된 어노테이션

  • @Entity : 데이터베이스 테이블과 매핑되는 JPA 엔터티 클래스 선언.

    • 필수 어노테이션: @Id(기본 키), @GeneratedValue(키 생성 전략).

    •  @Entity
      		public class User {
       	@Id
       	@GeneratedValue(strategy = GenerationType.IDENTITY)
       	private Long id;
      
       	private String name;
      
       	private String email;
      }
  • @Repository

    • 데이터 액세스 계층(DAO)을 선언.
    • CrudRepository 또는 JpaRepository 인터페이스와 함께 사용.

5. 비즈니스 로직 관련 어노테이션

  • @Service : 비즈니스 로직을 처리하는 클래스에 사용.

    • 스프링 빈으로 등록하며 다른 빈에서 주입 가능.

    •  @Service
      public class UserService {
       private final UserRepository repository;
      
       public UserService(UserRepository repository) {
           this.repository = repository;
       }
      
       public User findUser(Long id) {
           return repository.findById(id).orElseThrow(() -> new RuntimeException("User not found"));
       }
      }

6. 설정 관련 어노테이션

  • @Configuration

    • 빈 설정 및 환경 설정을 명시하는 클래스에 사용.
    • @Configuration
      public class AppConfig {
        @Bean
        public MyService myService() {
          return new MyService();
        }
      }
  • @ConfigurationProperties

    • 외부 설정 파일(application.yml, application.properties) 값을 자바 객체로 바인딩.

    • @ConfigurationProperties(prefix = "app")
      public class AppConfig {
        private String name;
        private String version;
      
        // Getter, Setter
      }

7. AOP 관련 어노테이션

  • @Aspect : AOP(Aspect-Oriented Programming)에서 사용.
  • @Before, @After, @Around : 메서드 실행 전후에 추가 작업 수행.
  • @Aspect
    @Component
    public class LoggingAspect {
      @Before("execution(* com.example.service.*.*(..))")
      public void logBefore() {
          System.out.println("Before method execution");
      }
    }

8. 스프링 부트 자동 설정 관련

  • @EnableAutoConfiguration
    • 스프링 부트가 클래스패스의 라이브러리를 기반으로 자동으로 설정을 구성.
  • @ConditionalOnMissingBean, @ConditionalOnProperty
    • 조건부 빈 등록 시 사용.
    • @ConditionalOnProperty(name = "feature.enabled", havingValue = "true")
      public class FeatureService {
        // Feature-specific logic
      }

profile
진짜 해보자

0개의 댓글