빈 연결: @Component, @Service, @Repository
스테레오타입 애너테이션을 사용하고 @Bean으로 빈을 정의하며 컴포넌트 스캔을 이해합니다.
빈 연결: @Component, @Service, @Repository은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
스테레오타입 애너테이션
Spring은 클래스를 Spring이 관리하는 빈으로 표시하고 그 역할을 나타내는 스테레오타입 애너테이션을 제공합니다. @Component는 일반적인 역할, @Service는 비즈니스 로직, @Repository는 데이터 액세스, @Controller/@RestController는 웹 계층을 나타냅니다.
@Component: 일반 빈
@Component가 지정된 모든 클래스는 컴포넌트 스캔 중에 검색되어 Spring 빈으로 등록됩니다. 이는 다른 모든 스테레오타입의 기반입니다.
@Component
public class EmailFormatter {
public String format(String to, String subject) {
return "To: " + to + "\nSubject: " + subject;
}
}@Service: 비즈니스 로직 계층
@Service는 의미상 서비스 클래스임을 나타내는 @Component의 특수화입니다. Spring은 이를 @Component와 동일하게 처리하지만, 의도를 명확히 전달하며 AOP 어드바이저에서 사용할 수도 있습니다.
@Service
public class OrderService {
private final OrderRepository repo;
public OrderService(OrderRepository repo) { this.repo = repo; }
public Order placeOrder(Cart cart) { /* business logic */ return repo.save(new Order(cart)); }
}@Repository: 데이터 액세스 계층
@Repository는 DAO 클래스를 표시합니다. Spring은 영속성 예외를 자동으로 변환하므로 SQLException 및 공급업체별 예외가 Spring의 DataAccessException 계층으로 래핑됩니다.
@Repository
public class JdbcUserRepository {
private final JdbcTemplate jdbc;
public JdbcUserRepository(JdbcTemplate jdbc) { this.jdbc = jdbc; }
public User findById(long id) {
return jdbc.queryForObject("SELECT * FROM users WHERE id=?",
new BeanPropertyRowMapper<>(User.class), id);
}
}@Configuration 클래스의 @Bean
@Configuration 클래스 내부의 메서드에 @Bean을 사용하면 빈을 수동으로 등록할 수 있습니다. 애너테이션을 지정할 수 없는 타사 클래스에 유용합니다.
@Configuration
public class AppConfig {
@Bean
public ObjectMapper objectMapper() {
return new ObjectMapper().registerModule(new JavaTimeModule());
}
@Bean
public RestTemplate restTemplate() { return new RestTemplate(); }
}컴포넌트 스캔
@SpringBootApplication은 애플리케이션 패키지부터 하위 패키지 방향으로 컴포넌트 스캔을 시작합니다. 하위 패키지의 클래스는 자동으로 검색됩니다. 스캔 범위를 지정하려면 @ComponentScan(basePackages=...)을 사용합니다.
// Explicit scan (rarely needed in Spring Boot):
@SpringBootApplication
@ComponentScan(basePackages = {"com.example.app", "com.example.shared"})
public class MyApp { ... }빈 이름 지정
기본적으로 빈 이름은 클래스 이름의 첫 글자를 소문자로 바꾼 이름입니다(OrderService → orderService). 사용자 지정 이름을 지정할 수도 있습니다: @Service("orders") 또는 @Bean("myMapper").
@Service("orderSvc")
public class OrderService { ... }
// Inject by name:
@Autowired @Qualifier("orderSvc")
private OrderService svc;빈 범위
기본 범위는 singleton입니다(Spring 컨텍스트마다 인스턴스 하나). 그 밖의 범위로는 prototype(주입할 때마다 새 인스턴스), request, session(웹 환경에서만 사용 가능)이 있습니다.
@Service
@Scope("prototype")
public class ReportBuilder {
private List<String> lines = new ArrayList<>();
public void addLine(String line) { lines.add(line); }
}모호성 해결을 위한 @Primary와 @Qualifier
여러 빈이 동일한 인터페이스를 구현할 때는 기본 빈을 표시하려면 @Primary를 사용하고, 특정 빈을 선택하려면 주입 지점에 @Qualifier("name")을 사용합니다.
@Service @Primary
public class CacheUserService implements UserService { ... }
@Service
public class DbUserService implements UserService { ... }
// Inject specific one:
@Autowired @Qualifier("dbUserService")
private UserService userService;지연 초기화
기본적으로 싱글턴 빈은 시작할 때 생성됩니다. @Lazy를 지정하면 처음 사용할 때까지 생성을 지연할 수 있어, 거의 사용하지 않는 생성 비용이 큰 빈에 유용합니다.
@Service @Lazy
public class HeavyReportService {
public HeavyReportService() { System.out.println("Created on first use"); }
}@PostConstruct와 @PreDestroy
@PostConstruct를 사용하면 의존성 주입 후에 초기화 로직을 실행할 수 있습니다. @PreDestroy를 사용하면 빈이 소멸하기 전에 리소스를 정리할 수 있습니다.
@Service
public class CacheService {
@PostConstruct
public void init() { System.out.println("Cache warming up..."); }
@PreDestroy
public void cleanup() { System.out.println("Cache cleared."); }
}간단한 확인
@Repository는 @Component에 어떤 추가 동작을 제공합니까?
복습
비즈니스 로직에는 @Service를, DAO에는 @Repository를, 유틸리티에는 @Component를, 타사 형식에는 @Bean을 사용합니다. 여러 빈은 @Primary/@Qualifier로 구분합니다. @PostConstruct/@PreDestroy는 생명 주기 훅에 사용합니다.
자주 묻는 질문
“빈 연결: @Component, @Service, @Repository” 강의는 무료인가요?
네 — “빈 연결: @Component, @Service, @Repository” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“빈 연결: @Component, @Service, @Repository”에서 뭘 배우나요?
스테레오타입 애너테이션을 사용하고 @Bean으로 빈을 정의하며 컴포넌트 스캔을 이해합니다. 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Java Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“빈 연결: @Component, @Service, @Repository” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 자동 구성과 Spring Boot 스타터
- 애플리케이션 속성과 프로필
- 빈 연결: @Component, @Service, @Repository
- 생성자 주입과 순환 의존성