| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 백준
- 문자열
- 생성형AI
- reverse()
- StringBuilder
- Component
- putty
- 생활코딩
- 다이얼
- vscode
- prettier
- spring
- 문자열 반복문
- Service
- 일관성
- Generic
- mobaXterm
- JAVA 설치
- RestController
- redis
- Controller
- 런타임에러
- 가독성
- SPLIT
- StringTokenizer
- Repository
- 백준 문자열
- Java
- outfitanyone
- JDoodle
- Today
- Total
gone
[Spring] @Configuration, @Component, @Service, @Controller, @RestController, @Repository 역할 본문
[Spring] @Configuration, @Component, @Service, @Controller, @RestController, @Repository 역할
예쁨받는 돌맹이 2025. 2. 2. 23:49Spring에서는 @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 |
|---|