@Service가 적용된 코드

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class MatchMaker {

@Service
public class ScoreCalculator {
    public static int calculatePriorityScore(User user1, String targetValue)
    {
        if (user1.getDetailProfile().getFirstPriority().getValue().equals(targetValue)) {
            return 20;
        } else if (user1.getDetailProfile().getSecondPriority().getValue().equals(targetValue)) {
            return 10;
        } else if (user1.getDetailProfile().getThirdPriority().getValue().equals(targetValue)) {
            return 5;
        } else {
            return 0;
        }
    }

@Service어노테이션을 붙인 이유

@Service어노테이션은 스프링 프레임워크에서 해당 클래스를 서비스 빈으로 등록하기 위하여 사용된다.

스프링 프레임워크는 클래스들을 빈(Bean)으로 관리하고, 이 빈들을 의존성 주입(Dependency Injection)등을 통해 객체들을 관리하고 제공한다.

@Service 어노테이션은 스프링에서 서비스 계층(Service Layer)에 속하는 클래스임을 표시하는 용도로 사용된다.

서비스 계층은 비즈니스 로직을 담당하는 부분으로 일반적으로 서비스 빈은 비즈니스 로직을 처리하는 메서드들을 가지고 있으며, 데이터 처리를 위해 해당 메서드들을 호출하거나 서로 연결하여 사용한다.

따라서 위의 코드에서 ScoreCalculator에서 @Service 어노테이션을 붙인 이유는 해당 클래스가 서비스 계층의 역할을 하고 있으며, 비즈니스 로직을 담당하는 메서드들을 포함하고 있기 때문이다. @Service어노테이션을 붙임으로써 스프링 컨테이너는 이 클래스를 빈으로 등록하고, 다른 클래스에서 @Autowired어노테이션 등을 이용하여 해당 빈을 주입받아 사용할 수 있게된다(의존성주입).

의존성 주입

@Autowred어노테이션은 스프링 프레임워크에서 의존성 주입을 수행하는 방법 중 한개.

@Autowired어노테이션을 사용하면 해당 타입의 빈이 스프링 컨테이너에서 자동으로 찾아져서 해당 필드에 주입된다.

이렇게 의존성을 주입받는 클래스는 스프링 컨테이너에 의해 빈으로 관리되어야 한다. 따라서 주입받는 클래스 역시 @Component, @Service, @Repository 등의 어노테이션 중 한 개로 스프링 빈으로 등록되어야 한다.