들어가며
ℹ️ 어노테이션
: 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() {
}
}
반응형