본문 바로가기

Java/spring

[Java/스프링] 주요 어노테이션 정리 (@빈 등록, 요청 및 응답, 트랜잭션 및 AOP, Spring Boot)

들어가며

ℹ️ 어노테이션

: Annotation, 메타데이터를 코드에 추가하는 방식으로 주로 코드에 대한 부가적인 정보를 제공합니다.

  • 메타데이터 제공: 어노테이션을 기반으로 컴파일러나 프레임워크가 동작을 수행합니다. (@Override)
  • 정보 전달: 컴파일러가 경고를 무시하거나, 특정 코드를 자동으로 생성하도록 도와줍니다. (@SuppressWarnings)
  • 런타임 시 동작: 일부 어노테이션은 런타임에서 리플렉션이라는 메커니즘을 통해 동적으로 처리됩니다. (@Retention)
  • 가독성 및 유지보수성: 코드에 명시적으로 특정 동작이나 설정을 표시하여 코드의 가독성과 유지보수성을 향상시킵니다. (@Deprecated)

💡스프링 주요 어노테이션

: Spring 프레임워크에서 자주 사용하는 주요 어노테이션은 애플리케이션의 구조를 정의하고, 의존성 주입 및 설정을 쉽게 관리하는 데 사용됩니다. 아래는 그중 대표적인 어노테이션을 정리한 목록입니다.

 


 

1. 빈(Bean) 등록

어노테이션명 설명
빈 등록 직접 수행 빈 등록을 직접적으로 수행하는 어노테이션
@Configuration 스프링에서 설정 클래스를 정의할 때 사용합니다.
하나 이상의 @Bean 메서드를 포함하고, 스프링 컨테이너가 빈을 생성 및 관리하도록 설정합니다.
@Bean 메서드에 사용되어 해당 메서드의 반환 객체를 스프링 컨테이너가 관리하는 빈으로 등록합니다.
빈 등록 자동 스캔 스프링 컨테이너에 빈으로 등록하는 어노테이션
@Component 일반적인 스프링 빈으로 등록할 클래스에 사용됩니다.
스프링이 자동으로 해당 클래스를 애플리케이션 컨텍스트에 빈으로 등록합니다.
@Service @Component와 동일하게 빈으로 등록되지만, 비즈니스 로직을 처리하는 서비스 계층에 사용됨을 명시적으로 나타냅니다.
@Repository DAO에서 사용하는 어노테이션입니다. 주로 데이터베이스와의 상호작용을 처리하는 클래스에서 사용됩니다.
@Component의 특화된 형태로, 예외 변환 등 추가적인 기능을 제공합니다.
@Controller SpringMVC에서 컨트롤러 클래스를 정의할 때 사용합니다. 주로 웹 요청을 처리하고 에 데이터를 전달하는 역할을 합니다.
@RestController @Controller와 유사하지만 주로 RESTful 웹 서비스를 개발할 때 사용됩니다. 반환 값이 뷰가 아닌 JSON이나 XML 형태로 클라이언트에 전달됩니다.
빈 주입, 생명주기, 스코프 빈을 주입하거나 생명주기, 스코프를 설정하는 어노테이션
@Autowired 스프링에서 의존성을 주입할 때 사용하는 어노테이션이니다.
생성자, 필드, 메서드에 사용될 수 있고 스프링이 자동으로 해당 빈을 찾아 주입합니다.
@Scope 빈의 스코드를 정의할 때 사용됩니다. 기본적으로 빈은 싱글톤으로 생성되지만, 이 어노테이션을 사용해 프로토타입 등 다른 스코프로 지정할 수 있습니다.
ex: @Scope("prototype")
@Qualifier @Autowired와 함께 사용되어 여러 빈 중 특정 빈을 선택할 때 사용됩니다.
// 사용 예시
// 빈 등록 직접 수행
@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}

// 빈 등록 자동 스캔
@Component
public class MyComponent {
    // Bean으로 등록되는 클래스
}

@Service
public class MyService {
    // 비즈니스 로직 처리
}

@Repository
public class MyRepository {
    // 데이터베이스와 상호작용
}

@Controller
public class MyController {
    @GetMapping("/hello")
    public String sayHello(Model model) {
        model.addAttribute("message", "Hello, World!");
        return "hello";
    }
}

@RestController
public class MyRestController {
    @GetMapping("/api/greeting")
    public String greeting() {
        return "Hello, World!";
    }
}

// 빈 주입, 생명주기, 스코프
@Service
public class MyService {
    @Autowired
    @Qualifier("specialRepository")
    private MyRepository repository;
    
    // 'specialRepository'로 주입됨
}

@Component
@Scope("prototype")
public class MyPrototypeBean {
    // 프로토타입 스코프의 빈
}

 

2. 요청 및 응답

어노테이션명 설명
요청  
@RequestMapping HTTP 요청을 특정 컨트롤러 메서드에 매핑합니다. GET, POST, PUT, DELETE 등 다양한 HTTP 메서드를 처리할 수 있습니다.
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
HTTP 메서드별로 요청을 처리하는 @ReqeustMapping의 축약형입니다.
@RequestParams HTTP 요청 파라미터메서드의 파라미터로 바인딩합니다.
@PathVariable URL 경로에 포함된 변수 값메서드의 파라미터로 바인딩합니다.
@RequestBody HTTP 요청의 본문자바 객체로 변환해 메서드의 파라미터로 전달합니다. 주로 JSON 데이터를 객체로 변환할 때 사용합니다.
응답  
@ResponseBody 메서드의 반환 값을 HTTP 응답 본문으로 직렬화하여 클라이언트에 전달합니다. @RestController와 함께 자주 사용됩니다.
@ModelAttribute 폼 데이터를 객체로 바인딩하거나, 모델에 데이터를 추가할 때 사용됩니다.
// 사용 예시
// 요청
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello() {
    return "hello";
}

@GetMapping("/search") // PostMapping, PutMapping, DeleteMapping
public String search(@RequestParam("query") String query) {
    return "Result for: " + query;
}

@GetMapping("/users/{id}")
public User getUserById(@PathVariable Long id) {
    return userService.findById(id);
}

@PostMapping("/users")
public User createUser(@RequestBody User user) {
    return userService.save(user);
}

// 응답
@GetMapping("/greeting")
@ResponseBody
public String greeting() {
    return "Hello, World!";
}

@PostMapping("/submit")
public String submitForm(@ModelAttribute User user) {
    // user 객체에 폼 데이터가 바인딩됨
    return "formResult";
}

 

3. 트랜잭션 처리 및 AOP

어노테이션명 설명
트랜잭션  
@Transactinal 트랜잭션을 관리하는 데 사용됩니다. 트랜잭션은 DB 작업을 하나의 단위로 묶어 모두 성공하거나, 오류 발생 시 모두 롤백되도록 보장하는 기능입니다.
AOP  
@Aspect AOP에서 사용되는 어노테이션으로, 애플리케이션의 핵심 비즈니스 로직과 분리하여 부가적인 기능(트랜잭션 관리, 보안 등)을 모듈화할 때 사용됩니다.
Aspect를 정의할 때 사용합니다.
@Around AOP에서 사용되는 Advice 중 하나로, 메서드 실행 자체를 제어할 수 있습니다.
// 사용 예시
// 트랜잭션
@Service
public class UserService {
    @Transactional
    public void createUser(User user) {
        userRepository.save(user);
    }
}

// AOP
@Aspect
@Component
public class TimingAspect {
    @Around("execution(* com.example.service.*.*(..))")
    public Object measureExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        
        Object result = joinPoint.proceed(); // 실제 메서드 실행
        
        long executionTime = System.currentTimeMillis() - start;
        System.out.println(joinPoint.getSignature() + " executed in " + executionTime + "ms");
        
        return result;
    }
}

 

4. Spring Boot

어노테이션명 설명
@SpringBootApplication Spring Boot의 진입점을 나타내는 어노테이션입니다.
@SpingBootConfiguration, EnableAutoConfiguration, ComponentScan 어노테이션을 포함하고 있습니다.
@SpringBootTest 통합 테스트를 위한 어노테이션으로, 스프링 애플리케이션 컨텍스트를 로드하여 테스트를 실행합니다.
// 사용 예시
@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

@SpringBootTest
public class MyApplicationTests {
    @Test
    public void contextLoads() {
    }
}

 

 


반응형