스프링 프레임워크에서는 다양한 어노테이션을 사용하여 애플리케이션의 구성 요소를 정의하고, 빈(Bean) 등록, 트랜잭션 관리, 요청 처리 등을 수행합니다. 주요 어노테이션들을 각 역할별로 나누어 설명하겠습니다.
1. 컴포넌트 스캔과 빈 등록 관련 어노테이션
스프링은 어노테이션을 통해 자동으로 빈(Bean)을 등록할 수 있습니다. 주로 계층을 명확히 구분하는 데 사용됩니다.
1.1. @Component
• 스프링에서 가장 기본적인 어노테이션으로, 스프링 컨테이너에 빈으로 등록됩니다.
• 모든 일반적인 클래스에 사용할 수 있으며, 구체적인 역할보다는 **컴포넌트(구성 요소)**로서 등록될 클래스를 나타냅니다.
@Component
public class MyComponent {
// 일반적인 스프링 빈으로 사용
}
1.2. @Service
• 서비스 계층에서 사용되는 어노테이션으로, 비즈니스 로직을 처리하는 클래스에 붙입니다.
• @Component와 기능적으로는 동일하지만, 서비스 계층이라는 의미를 명확히 하기 위해 사용됩니다.
@Service
public class MyService {
// 비즈니스 로직 처리
}
1.3. @Repository
• **데이터 접근 계층(DAO)**에서 사용됩니다.
• 데이터베이스와의 상호작용을 담당하며, @Component와 동일한 방식으로 빈으로 등록되지만, 데이터베이스 예외를 스프링의 DataAccessException으로 변환하는 역할도 합니다.
@Repository
public class MyRepository {
// 데이터베이스와의 상호작용
}
1.4. @Controller
• **프레젠테이션 계층(웹 요청 처리)**에서 사용되는 어노테이션입니다.
• 주로 HTTP 요청을 처리하고, 사용자에게 응답을 반환하는 컨트롤러 클래스에 붙입니다.
@Controller
public class MyController {
// HTTP 요청 처리
}
1.5. @RestController
• RESTful 웹 서비스를 제공하는 컨트롤러에 사용됩니다.
• @Controller와 달리 메서드에 반환하는 데이터는 자동으로 JSON이나 XML 형태로 변환됩니다.
@RestController
public class MyRestController {
@GetMapping("/hello")
public String hello() {
return "Hello World";
}
}
• 직렬화(Serialization): 자바 객체(Member)를 JSON 또는 XML로 변환하는 과정.
• 역직렬화(Deserialization): 클라이언트로부터 받은 JSON이나 XML 데이터를 자바 객체로 변환하는 과정.
따라서 @RestController를 사용하면, 응답 시 직렬화가 자동으로 처리되어 JSON 또는 XML로 반환됩니다.
2. 의존성 주입(Dependency Injection) 관련 어노테이션
스프링에서는 의존성을 자동으로 주입할 수 있도록 다양한 어노테이션을 제공합니다.
2.1. @Autowired
• 스프링이 빈을 자동으로 주입해주는 어노테이션입니다.
• 생성자, 필드, 메서드에 붙여 사용할 수 있으며, 스프링 컨텍스트에서 자동으로 적합한 빈을 찾아 주입합니다.
@Service
public class MyService {
@Autowired
private MyRepository myRepository;
}
2.2. @Qualifier
• 같은 타입의 빈이 여러 개 있을 때 특정 빈을 주입하고 싶을 때 사용합니다.
• @Autowired와 함께 사용하여 어떤 빈을 주입할지 명시합니다.
@Service
public class MyService {
@Autowired
@Qualifier("myCustomRepository")
private MyRepository myRepository;
}
2.3. @Inject (Java EE 표준)
• @Autowired와 유사하지만, Java EE 표준으로 제공됩니다. 스프링에서 호환됩니다.
@Inject
private MyRepository myRepository;
2.4. @Resource (Java EE 표준)
• 빈 이름으로 의존성을 주입할 때 사용합니다. @Autowired와 달리 이름 기반으로 주입을 합니다.
@Resource(name = "myRepository")
private MyRepository myRepository;
3. 트랜잭션 관리 관련 어노테이션
스프링에서는 트랜잭션 관리 기능을 어노테이션을 통해 손쉽게 사용할 수 있습니다.
3.1. @Transactional
• 트랜잭션 처리를 간편하게 할 수 있도록 지원하는 어노테이션입니다.
• 메서드나 클래스에 붙여서 트랜잭션을 관리하며, 메서드가 성공적으로 실행되면 커밋하고, 예외가 발생하면 자동으로 롤백합니다.
@Service
public class MyService {
@Transactional
public void processTransaction() {
// 트랜잭션 내부 처리
}
}
• 트랜잭션 전파, 격리 수준 등을 설정할 수 있습니다.
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.SERIALIZABLE)
public void processTransaction() {
// 상세 트랜잭션 설정
}
4. AOP (Aspect-Oriented Programming) 관련 어노테이션
스프링에서는 AOP를 사용하여 횡단 관심사를 처리할 수 있습니다. AOP는 로깅, 트랜잭션, 보안 등 공통적으로 적용되는 로직을 분리합니다.
4.1. @Aspect
• **AOP(Aspect-Oriented Programming)**를 구현하기 위한 어노테이션입니다.
• 공통 기능을 애스펙트로 분리하여 적용할 수 있습니다.
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.demo.*.*(..))")
public void logBeforeMethod() {
System.out.println("메서드 실행 전 로그");
}
}
4.2. @Before
• 메서드 실행 전에 특정 로직을 실행할 때 사용합니다.
@Before("execution(* com.example.demo.*.*(..))")
public void logBeforeMethod() {
System.out.println("메서드 실행 전 로그");
}
4.3. @After
• 메서드 실행 후에 특정 로직을 실행할 때 사용합니다.
@After("execution(* com.example.demo.*.*(..))")
public void logAfterMethod() {
System.out.println("메서드 실행 후 로그");
}
4.4. @Around
• 메서드 실행 전후에 모두 특정 로직을 실행할 때 사용합니다.
@Around("execution(* com.example.demo.*.*(..))")
public Object logAroundMethod(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("메서드 실행 전");
Object result = joinPoint.proceed(); // 메서드 실행
System.out.println("메서드 실행 후");
return result;
}
5. 데이터 바인딩과 검증 관련 어노테이션
스프링에서는 HTTP 요청의 데이터를 바인딩하고 검증하는 기능을 제공합니다.
5.1. @RequestMapping
• HTTP 요청 경로를 지정할 때 사용됩니다.
• GET, POST, PUT, DELETE 등 다양한 HTTP 메서드에 매핑할 수 있습니다.
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello() {
return "Hello, World!";
}
5.2. @GetMapping, @PostMapping
• @RequestMapping을 더 명확하게 사용하기 위해 등장한 축약형 어노테이션입니다.
@GetMapping("/hello")
public String hello() {
return "Hello, World!";
}
5.3. @RequestParam
• HTTP 요청 파라미터를 메서드의 파라미터로 바인딩할 때 사용됩니다.
@GetMapping("/search")
public String search(@RequestParam("query") String query) {
return "검색어: " + query;
}
5.4. @PathVariable
• URL 경로에서 값을 추출할 때 사용됩니다.
@GetMapping("/users/{id}")
public String getUser(@PathVariable("id") Long id) {
return "User ID: " + id;
}
5.5. @Valid
• 스프링에서 입력 값의 유효성을 검증할 때 사용하는 어노테이션입니다. Bean Validation과 함께 사용되어, 객체의 유효성을 검증합니다.
@PostMapping("/user")
public String createUser(@Valid @RequestBody User user) {
return "User created";
}
5.6. @RequestBody
• 클라이언트가 전송하는 JSON, XML, 혹은 기타 포맷의 데이터를 컨트롤러 메서드의 파라미터로 직접 받아 처리할 수 있도록 해줍니다.
• @RequestBody는 주로 JSON 요청 데이터를 처리하는 데 사용되며, 자동으로 JSON 데이터를 매핑하여 자바 객체로 변환해줍니다.
@RestController
@RequestMapping("/api/users")
public class UserController {
@PostMapping("/create")
public ResponseEntity<User> createUser(@RequestBody User user) {
// RequestBody로 전달된 JSON 데이터를 User 객체로 변환
return ResponseEntity.ok(user);
}
}
• 클라이언트가 다음과 같은 JSON 요청을 보낼 때:
{
"id": 1,
"name": "John",
"age": 25
}
실제 프로젝트에서는 요청 데이터를 DTO(Data Transfer Object)를 사용하여 받는 것이 일반적입니다.
ex) @RequestBody UserRequestDto userRequestDto
6. 스프링 데이터 JPA 관련 어노테이션
6.1. @Entity
• JPA에서 사용되는 데이터베이스 엔티티임을 나타내는 어노테이션입니다.
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
6.2. @Table
• 데이터베이스의 테이블과 매핑되는 엔티티 클래스에 붙입니다.
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
6.3. @Id
• JPA 엔티티의 기본 키를 지정할 때 사용됩니다.
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
결론
스프링에서 사용되는 주요 어노테이션들은 의존성 주입, 트랜잭션 관리, AOP, 데이터 바인딩 등 다양한 기능을 간편하게 사용할 수 있도록 도와줍니다. 스프링 애플리케이션을 개발할 때 이 어노테이션들을 적절히 사용하면 더 효율적이고 유지보수하기 쉬운 코드를 작성할 수 있습니다.
'spring' 카테고리의 다른 글
[Spring] @JsonCreator로 Enum 역직렬화하기 (3) | 2024.10.30 |
---|---|
[Spring] CustomError 작성법 (0) | 2024.10.20 |
[Spring] Bean (1) | 2024.10.12 |
[Spring] Spring과 Tomcat (0) | 2024.10.12 |
[Spring] DTO (0) | 2024.10.04 |