gone

[Spring] @Configuration, @Component, @Service, @Controller, @RestController, @Repository 역할 본문

개발일지(TIL)/Spring

[Spring] @Configuration, @Component, @Service, @Controller, @RestController, @Repository 역할

예쁨받는 돌맹이 2025. 2. 2. 23:49

Spring에서는 @Configuration, @Component, @Service, @Controller 모두 Spring 컨테이너에 자동으로 Bean을 등록하는 역할을 한다.
즉, 모두 "Bean 등록"이라는 공통된 기능을 제공하지만, 각각의 역할과 용도가 다르다.

 


 

1️⃣ @Configuration (설정 클래스)

@Configuration
public class DatabaseConfig {

    @Bean
    public DataSource dataSource() {
        return DataSourceBuilder.create()
                .url("jdbc:mysql://localhost:3306/mydb")
                .username("user")
                .password("password")
                .build();
    }
}

📌 설명

  • Spring의 설정 클래스(Bean 정의)를 위한 어노테이션.
  • @Bean 메서드를 통해 직접 Bean을 등록 가능.
  • @ComponentScan을 사용하여 특정 패키지 내 Bean을 자동으로 스캔할 수도 있음.

주로 설정 클래스를 만들 때 사용 (예: Redis, DB, 외부 API 설정 등).
@Bean을 사용하여 특정 객체를 직접 생성하고 Bean으로 등록할 때 사용.


 

2️⃣ @Component (가장 기본적인 Spring Bean)

@Component
public class MyComponent {
    public String getMessage() {
        return "Hello from Component";
    }
}

📌 설명

  • Spring이 자동으로 Bean을 등록하는 기본 어노테이션.
  • 다른 어노테이션(@Service, @Repository, @Controller)도 결국 내부적으로 @Component를 포함하고 있음.

범용적인 Bean 등록 용도로 사용.
기능적으로 구분할 필요가 없는 클래스에서 사용.


3️⃣ @Service (비즈니스 로직 담당)

@Service
public class MyService {
    public String process() {
        return "Processing service logic";
    }
}

📌 설명

  • @Service는 비즈니스 로직(데이터 처리, 트랜잭션 관리 등)을 담당하는 계층.
  • @Component와 기능적으로 차이는 없지만, 의미적으로 "이 클래스는 비즈니스 로직을 처리하는 역할"이라고 명확하게 표현.
  • AOP(Aspect-Oriented Programming)와 결합하여 트랜잭션 관리(@Transactional) 등에서 주로 사용됨.

비즈니스 로직을 담당하는 클래스에서 사용.
다른 개발자가 봤을 때 "아, 이 클래스는 서비스 계층이구나!"라고 쉽게 이해 가능.


4️⃣ @Controller (MVC 컨트롤러)

@Controller
public class MyController {

    @GetMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("message", "Hello from Controller");
        return "hello";
    }
}

📌 설명

  • @Controller는 Spring MVC 패턴에서 "컨트롤러(Controller)" 역할을 하는 클래스에서 사용.
  • HTTP 요청을 처리하고 View(JSP, Thymeleaf, HTML)로 데이터를 전달하는 역할.
  • 내부적으로 @Component를 포함하고 있어 자동으로 Bean 등록됨.

Spring MVC 패턴에서 HTTP 요청을 처리하는 컨트롤러 클래스에서 사용.
View를 반환하는 경우(return "hello")에서 사용.


5️⃣ @RestController (@Controller + @ResponseBody), RESTful API Controller

@RestController
public class MyRestController {

    @GetMapping("/api/hello")
    public String hello() {
        return "Hello from REST Controller";
    }
}

📌 설명

  • @Controller와 다르게 View를 반환하지 않고, JSON이나 데이터를 반환하는 컨트롤러.
  • 내부적으로 @ResponseBody가 포함되어 있음 → 모든 메서드가 JSON 응답을 반환.

RESTful API를 만들 때 @RestController 사용.
View를 반환하지 않고, 데이터(JSON)를 직접 반환할 경우 사용.


6️⃣ @Repository (데이터 액세스 계층, DAO)

@Repository
public class MyRepository {
    public String fetchData() {
        return "Fetching data from DB";
    }
}

📌 설명

  • DAO(Data Access Object) 역할을 하는 클래스에서 사용.
  • JPA, MyBatis, JDBC 등을 사용하여 DB와 직접 연결되는 레이어.
  • 데이터 예외 변환 (Persistence Exception Translation) 기능을 제공 → @Repository가 붙은 클래스에서 발생하는 예외가 Spring의 DataAccessException으로 변환됨.

JPA나 MyBatis를 사용할 때 Repository 계층을 명확하게 구분할 수 있도록 사용.
Spring이 자동으로 예외 변환을 처리해 주므로, @Repository를 붙이는 것이 권장됨.

 


# @Component를 @Controller, @Service, @Repository에서 사용해도 될까?

@Component
public class MyController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello from Component Controller";
    }
}

📌 문제점

  • @Component만 사용하면 Spring MVC의 컨트롤러로 인식되지 않음.
  • @GetMapping("/hello") 같은 Spring MVC 애너테이션이 정상적으로 동작하지 않음.
  • @Controller나 @RestController를 사용해야 정상 동작.

컨트롤러는 @Controller 또는 @RestController를 사용해야 한다!
데이터 액세스 계층은 @Repository, 비즈니스 로직은 @Service로 구분하는 것이 가독성과 유지보수에 좋다! 🚀🔥

 

 

# @Component vs @Configuration 차이점

비교 항목 @Component @Configuration
역할 일반적인 Bean 등록 설정 클래스 (Bean 수동 등록)
사용위치 서비스, 유틸리티 클래스 등 DB 설정, 외부 API 설정 등
자동 Bean 등록 Spring이 자동으로 스캔하여 등록 @Bean을 사용하여 직접 등록
직접 객체 생성 가능 ❌ 불가능 ✅@Bean을 사용하여 직접 생성 가능

'개발일지(TIL) > Spring' 카테고리의 다른 글

[Spring] RedisTemplate  (0) 2025.02.02