0Pricing
Java Academy · 강의

빈 연결: @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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 자동 구성과 Spring Boot 스타터
  2. 애플리케이션 속성과 프로필
  3. 빈 연결: @Component, @Service, @Repository
  4. 생성자 주입과 순환 의존성
← Java Academy(으)로 돌아가기