본문으로 바로가기
반응형

안녕하세요, 여러분. 이번에는 Java Spring Framework에서 인터페이스를 구현하는 클래스를 만들고, @Autowired 어노테이션을 사용하는 방법에 대해 알아보도록 하겠습니다.

인터페이스와 구현 클래스란?
인터페이스는 메소드의 시그니처만을 정의하고, 이를 구현하는 클래스에서 실제 동작을 정의합니다. 인터페이스를 사용하면 구현체를 바꾸어도 코드의 나머지 부분에는 영향을 주지 않으므로, 유연성과 확장성을 높이는 데 도움이 됩니다.

@Autowired 어노테이션의 역할
@Autowired는 Spring에서 제공하는 어노테이션으로, 의존성 주입(Dependency Injection)을 담당합니다. 이 어노테이션을 사용하면 개발자가 직접 객체를 생성하거나 연결하지 않아도 Spring 컨테이너가 알아서 해당 타입의 빈을 찾아 자동으로 연결해줍니다.

코드 예시
다음은 인터페이스와 이를 구현하는 클래스, 그리고 @Autowired 사용 예제입니다.

public interface SampleService {
    String sayHello();
}

@Service
public class SampleServiceImpl implements SampleService {
    @Override
    public String sayHello() {
        return "Hello, Spring!";
    }
}

@Controller
public class SampleController {
    @Autowired
    private SampleService sampleService;

    @RequestMapping("/hello")
    @ResponseBody
    public String hello() {
        return sampleService.sayHello();
    }
}

이 코드는 SampleService 인터페이스와 이를 구현하는 SampleServiceImpl 클래스, 그리고 SampleController를 정의합니다.



SampleService 인터페이스는 sayHello라는 메소드를 정의하고 있습니다.
SampleServiceImpl 클래스는 SampleService 인터페이스를 구현하고 sayHello 메소드를 오버라이드하여 "Hello, Spring!"를 반환합니다.
SampleController는 SampleService 타입의 필드에 @Autowired 어노테이션을 붙여 SampleServiceImpl의 빈을 자동으로 주입받습니다. 그리고 "/hello" URL로 요청이 오면 sayHello 메소드를 호출하여 반환값을 응답합니다.

Java Spring Framework에서 인터페이스를 사용하면 코드의 유연성과 확장성을 높일 수 있습니다. 또한, @Autowired 어노테이션을 활용하면 의존성 관리를 Spring에 맡겨 코드를 간결하게 유지할 수 있습니다.


여기에서 만약 SampleService를 구현한 클래스가 2개 이상이면?

SampleService를 구현하는 클래스가 2개 이상인 경우, @Autowired 어노테이션만으로는 Spring 컨테이너가 어떤 빈을 주입해야 할지 알 수 없습니다. 이런 상황을 해결하기 위해 @Primary 어노테이션 또는 @Qualifier 어노테이션을 사용할 수 있습니다.

@Primary 어노테이션 사용하기
@Primary 어노테이션을 사용하면, 해당 타입의 빈이 여러 개 있을 때 기본적으로 사용할 빈을 지정할 수 있습니다. 다음 코드는 SampleServiceImpl1를 기본 빈으로 설정하는 예입니다.

@Service
@Primary
public class SampleServiceImpl1 implements SampleService {
    @Override
    public String sayHello() {
        return "Hello from ServiceImpl1!";
    }
}

@Service
public class SampleServiceImpl2 implements SampleService {
    @Override
    public String sayHello() {
        return "Hello from ServiceImpl2!";
    }
}

@Qualifier 어노테이션 사용하기
@Qualifier 어노테이션을 사용하면, 주입할 빈을 직접 지정할 수 있습니다. @Qualifier 어노테이션에 주입할 빈의 이름을 지정하면 됩니다. 다음 코드는 SampleServiceImpl2 빈을 주입하는 예입니다.

@Controller
public class SampleController {
    @Autowired
    @Qualifier("sampleServiceImpl2")
    private SampleService sampleService;

    @RequestMapping("/hello")
    @ResponseBody
    public String hello() {
        return sampleService.sayHello();
    }
}

위 예제에서 SampleServiceImpl2 클래스의 이름인 "sampleServiceImpl2"를 @Qualifier 어노테이션에 지정했습니다.

이렇게 @Primary와 @Qualifier 어노테이션을 사용하면, 동일한 타입의 빈이 여러 개 있을 때도 원하는 빈을 주입할 수 있습니다. 이 두 어노테이션은 각각 상황에 맞게 사용하면 됩니다.

반응형