본문 바로가기
코딩 공부/web & Java

[Spring] 중요한 어노테이션 정리 및 복습

by 현장 2023. 10. 9.

@Configuration

@Bean 메서드가 하나 이상 선언함을 나타냅니다. Spring 컨테이너에서 처리하여 Bean 정의를 생성합니다. @Configuration을 선언하므로서 Java 설정 파일을 만든다는 것을 의미합니다.

@Configuration
public class GamingConfiguation {
    // Spring Bean(Spring에서 관리하는 것들을 의미) 정의 가능

    @Bean
    public GamingConsole game() {
        var game = new PacmanGame();
        return game;
    }

    @Bean
    public GameRunner gameRunner(GamingConsole game) {
        return new GameRunner(game);
    }
}

Java 설정 파일에서는 메서드를 몇개든 정의 할 수 있고 이러한 메서드에 @Bean 어노테이션을 추가할 수 있습니다. 그러면 메서드로 반환되는 모든 값에 Spring이 Bean을 자동으로 생성합니다.

@ComponentScan

컴포넌트를 스캔할 특정 패키지를 ComponentScan을 통해서 정의합니다. 스캔할 패키지를 지정하거나 @ComponentScan을 넣기만 하면 되고 패키지를 지정안하면 현재 패키지만 스캔됩니다. 또한, 현재 패키지 뿐만아니라 하위 패키지까지 스캔을 하게됩니다.

@Configuration
@ComponentScan
public class TestContextLuncherApplication {

    public static void main(String[] args) {
        try (var context =
                     new AnnotationConfigApplicationContext
                             (TestContextLuncherApplication.class))
        {
            Arrays.stream(context.getBeanDefinitionNames())
                    .forEach(System.out::println);
        }

    }
}

@Component

어노테이션한 클래스가 컴포넌트임을 나타냅니다. @Component 클래스가 @ComponentScan에 속하면  Spring Bean이 생성됩니다.

@Component
public class PacmanGame implements GamingConsole {
    @Override
    public void up() {
        System.out.println("위로 이동");
    }

    @Override
    public void down() {
        System.out.println("아래로 이동");
    }

    @Override
    public void left() {
        System.out.println("왼쪽으로 이동");
    }

    @Override
    public void right() {
        System.out.println("오른쪽으로 이동");
    }
}

@Service

@Service 어노테이션한 클래스에 비지니스 로직이 있음을 나타내는 @Component의 한 종류입니다.

@Service
public class BussinessService {
    // 비지니스 로직 ...

}

@Controller

@Controller 어노테이션한 클래스가 컨트롤러임을 나타내는 @Component로 웹컨트롤러를 예로 들 수 있습니다. 일반적으로 웹 애플리케이션과 REST API에서 컨트롤러를 정의하는 데 사용이 됩니다.

@Controller
public class ControllerClass {
    // 컨트롤러 내용...
}

@Repository

@Repository 어노테이션한 클래스가 DB에서 데이터를 검색, 조작하는데 사용됩니다.

@Repository
public class MySqlDbDataService implements DataService {
    // DB 검색, 조작
}

@Primary

여러 Bean이 단일 값 의존성이 자동 연결될 후보일 때 특정 Bean에 우선 순위를 부여해야 함을 나타냅니다.

@Component
@Primary
public class PrimaryComponent {
	// 내용
}

@Qualifier

자동 연결 시 후보 Bean의 한정자 필드나 매개 변수에 사용됩니다.

@Component
@Qualifier("TestQualifier")
public class TestQualifierClass {
	// 내용
}

사용 시 아래와 같이 사용합니다.

@Component
public class UseQualifier {
    private TestQualifierClass test;

    public TestQualifierClass (@Qualifier("TestQualifier") TestQualifierClass test) {
        this.test = test;
    }

}

 

@Primary는 일반적인 우선 순위를 정할 때 사용하고, @Qualifier는 아주 구체적이며 딱 이것만 사용하려고 할 때 @Qualifier를 사용합니다.

 

@Lazy

Spring Bean은 일반적으로 컨텍스트가 실행되는 대로 즉시 초기화됩니다. 하지만 Bean을 지연 초기화 하려고 한다면 @Lazy 어노테이션을 사용하면 됩니다.

@Component
@Lazy
class LazyClass {
    // 내용
}

@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)

기본 값은 싱글톤으로 해당 빈을 몇번을 참조하더라도 같은 인스턴스가 실행됩니다. 하지만 프로토타입 스코프를 특정 컴포넌트에 정의하게 되면 해당 Bean을 참조할 때마다 인스턴스가 새로 만들어 집니다. 

@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Component
class PrototypeClass {
	// 내용
}

 

@PostConstruct

의존성이 주입이 수행된 이후 초기화를 위해 실행될 메서드를 나타냅니다. 모든 의존성을 Bean에 주입 후 초기화 하려는 경우, 모든 의존성이 준비된 이후 DB에서 몇가지 값을 가져오는 경우에 사용됩니다.

@Component
class SomeClass {
   @PostConstruct
    public void initialize() {
        someDependency.getReady();
    }

}

@PreDestroy

컨테이너에서 인스턴스를 삭제하는 과정을 거치고 있음을 알려주는 콜백 알림을 수신하는 메서드를 나타냅니다. 보통 특정 Bean이 보유하고 있는 리소스를 해제하는 경우 사용이 됩니다. 컨테이너나 Spring IoC 컨텍스트에서 Bean이 삭제되기 전에 @PreDestroy 어노테이션이 붙은 메서드를 호출합니다.

@Component
class SomeClass {
    @PreDestroy
    public void cleanup() {
        // 데이터 베이스 등에 연결 될 경우 종료를 위한 메소드
        System.out.println("Clean up!");
    }
}

@Named

CDI 어노테이션이며 @Component와 비슷합니다.

@Named
class NamedTestClass {
	// 내용
}

@Inject

@AutoWired와 비슷합니다.

@Named
class InjectTestClass {
    private DataService dataService;

    @Inject
    public void setDataService(DataService dataService) {
        System.out.println("Setter Injection");
        this.dataService = dataService;
    }
}