본문 바로가기
spring

[Spring] 주요 Annotation

by goblin- 2024. 10. 19.

스프링 프레임워크에서는 다양한 어노테이션을 사용하여 애플리케이션의 구성 요소를 정의하고, 빈(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