Spring 어노테이션

봄 어노테이션은 우리에게 의존성을 설정하고 자바 프로그램을 통해 의존성 주입을 구현할 수 있게 해줍니다.

봄 어노테이션

  • 봄 프레임워크는 제어 역전 (IOC) 또는 의존성 주입 (DI)의 원칙을 구현하고 장려하며 사실상 IOC 컨테이너입니다.
  • 전통적으로, 봄은 개발자가 XML 기반의 구성을 사용하여 빈 의존성을 관리할 수 있게 했습니다.
  • 빈 및 그 의존성을 정의하는 대안적인 방법이 있습니다. 이 방법은 Java 기반의 구성입니다.
  • XML 접근법과 달리 Java 기반의 구성은 빈 구성 요소를 프로그래밍 방식으로 관리할 수 있게 해줍니다. 이것이 봄 어노테이션의 도입 이유입니다.

이 기사에서는 가장 일반적으로 사용되는 봄 어노테이션을 살펴보고 몇 가지 예제 프로그램을 살펴볼 것입니다.

봄 어노테이션 목록

봄 코어 프레임워크의 일부 어노테이션은 다음과 같습니다:

  1. @Configuration: 하나 이상의 @Bean 메서드를 선언하는 클래스를 나타내는 데 사용됩니다. 이러한 클래스는 봄 컨테이너에 의해 처리되어 런타임에서 빈 정의 및 해당 빈에 대한 서비스 요청을 생성합니다.

  2. @Bean: 메소드가 스프링 컨테이너에서 관리할 빈을 생성한다는 것을 나타냅니다. 이는 가장 많이 사용되고 중요한 스프링 주석 중 하나입니다. @Bean 주석은 또한 name, initMethod 및 destroyMethod와 같은 매개변수와 함께 사용할 수 있습니다.

    • name – 빈에 이름을 지정할 수 있습니다.
    • initMethod – 컨텍스트 등록 시 호출될 메소드를 선택할 수 있습니다.
    • destroyMethod – 컨텍스트 종료 시 호출될 메소드를 선택할 수 있습니다.

    예를 들어:

    @Configuration
    public class AppConfig {
    
        @Bean(name = "comp", initMethod = "turnOn", destroyMethod = "turnOff")
        Computer computer(){
            return new Computer();
        }
    }
    
    public class Computer {
    
        public void turnOn(){
            System.out.println("운영 체제 로드");
        }
        public void turnOff(){
            System.out.println("모든 프로그램 종료");
        }
    }
    
  3. @PreDestroy@PostConstruct는 빈 initMethod 및 destroyMethod의 대체 방법입니다. 우리가 정의한 빈 클래스일 때 사용할 수 있습니다. 예를 들어;

     public class Computer {
    
        @PostConstruct
        public void turnOn(){
            System.out.println("운영 체제 로드");
        }
    
        @PreDestroy
        public void turnOff(){
            System.out.println("모든 프로그램 닫기");
        }
    }
    
  4. @ComponentScan: @Configuration 클래스와 함께 사용하기 위한 구성 요소 스캔 지시문을 구성합니다. 여기에서는 spring 구성 요소를 스캔할 기본 패키지를 지정할 수 있습니다.

  5. @Component: 어노테이션이 지정된 클래스를 “컴포넌트”로 표시합니다. 이러한 클래스는 어노테이션 기반 구성 및 클래스 경로 스캐닝을 사용할 때 자동 검색 대상으로 간주됩니다.

  6. @PropertySource: Spring의 환경에 속성 소스를 추가하는 간단한 선언적 메커니즘을 제공합니다. 속성 소스 파일 배열을 추가하는 유사한 주석이 있습니다. 예: @PropertySources.

  7. @Service: 주석이 달린 클래스가 “서비스”임을 나타냅니다. 이 주석은 @Component의 특수화로, 클래스 경로 스캔을 통해 구현 클래스를 자동으로 감지할 수 있습니다.

  8. @Repository: 주석이 달린 클래스가 “리포지토리”임을 나타냅니다. 이 주석은 @Component의 특수화로 DAO 클래스와 함께 사용하는 것이 좋습니다.

  9. @Autowired: Spring @Autowired 어노테이션은 빈의 자동 주입에 사용됩니다. Spring @Qualifier 어노테이션은 Autowired와 함께 사용되어 동일한 유형의 빈이 두 개 이상 구성되어 있을 때 혼란을 피하기 위해 사용됩니다.

Spring MVC 어노테이션

중요한 Spring MVC 어노테이션 중 일부는 다음과 같습니다:

  1. @Controller
  2. @RequestMapping
  3. @PathVariable
  4. @RequestParam
  5. @ModelAttribute
  6. @RequestBody@ResponseBody
  7. @RequestHeader@ResponseHeader

이에 대한 자세한 내용은 Spring MVC Tutorial에서 확인할 수 있습니다.

Spring Transaction Management Annotations

@Transactional은 스프링 선언적 트랜잭션 관리 주석입니다. 자세한 내용은 Spring MVC Hibernate에서 확인하세요.

Spring Security Annotations

@EnableWebSecurity@Configuration 클래스와 함께 사용되어 Spring Security 구성을 정의합니다. 자세한 내용은 Spring Security 예제에서 확인하세요.

Spring Boot Annotations

  1. @SpringBootApplication
  2. @EnableAutoConfiguration

더 자세한 내용은 Spring Boot 예제에서 확인하세요.

Spring Annotations 예제

간단한 예제를 살펴보겠습니다. 여기서는 애플리케이션에서 Spring 주석을 사용합니다. 아래 이미지는 Spring Annotations 예제 프로젝트를 설명합니다.

Spring Framework 종속성

I have created the maven project and added Spring Core Framework dependencies.

<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.journaldev.spring</groupId>
	<artifactId>spring-annotations</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>Spring Annotations</name>

	<properties>
		<spring.framework>4.3.0.RELEASE</spring.framework>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.framework}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.framework}</version>
		</dependency>

	</dependencies>

</project>

이것은 프로젝트에 대한 모든 spring core jar를 가져옵니다.

Component 클래스

다음 단계는 컴포넌트 클래스를 생성하는 것입니다. 여기서 여러 데이터베이스 컴포넌트를 모방하고 있습니다. 하나는 MySQL을 위한 것이고 다른 하나는 Oracle을 위한 것입니다. `

package com.journaldev.drivers;

public interface DataBaseDriver {
    public String getInfo();
}

DataBaseDriver`는 우리가 구현할 기본 인터페이스입니다. `

package com.journaldev.drivers;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@Component
@PropertySource("classpath:mysqldatabase.properties")
public class MySqlDriver implements DataBaseDriver {

    @Value("${databaseName}")
    private String databaseName;
    @Value("${disableStatementPooling}")
    private String disableStatementPooling;

    public String getInfo() {
        return "[ Driver: mySql" +
                ", databaseName: " + databaseName +
                ", disableStatementPooling: " + disableStatementPooling +
                " ]";
    }
}

` @Component 주석의 사용을 주목하세요. 이 클래스를 컴포넌트로 처리하도록 스프링 프레임워크에 지시합니다. 또한 @PropertySource@Value 주석을 사용하고 있습니다. 스프링은 실행 시에 이러한 변수 값을 지정된 프로퍼티 파일에서 주입하고 설정합니다. 아래는 mysqldatabase.properties 파일에 선언된 프로퍼티입니다. `

databaseName=school
disableStatementPooling=true
package com.journaldev.drivers;

public class OracleDriver implements DataBaseDriver {

    protected String url;
    protected String user;
    protected String password;
    protected String driver;
    protected Integer port;


    public String getUrl() {
        return url;
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getDriver() {
        return driver;
    }

    public void setDriver(String driver) {
        this.driver = driver;
    }

    public Integer getPort() {
        return port;
    }

    public void setPort(Integer port) {
        this.port = port;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getInfo() {
        return "[ Driver: Oracle" +
                ", url: " + url +
                ", port; " + port +
                ", user: " + user +
                ", password: " + password  +
                ", driver: " + driver +
                " ] ";
    }
}

` OracleDriver는 간단한 빈입니다. 이 빈에 속성을 주입하기 위해 서비스 클래스를 사용할 것입니다. `

` 스프링 서비스 클래스 `

package com.journaldev.service;

import com.journaldev.drivers.DataBaseDriver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
    @Qualifier("oracleDriver")
    private DataBaseDriver dataBaseDriver;

    public String getDriverInfo(){
        return dataBaseDriver.getInfo();
    }
}

` 여기서 우리는 @Service 주석을 사용하여 이를 서비스 클래스로 처리하도록 스프링 프레임워크에 지시합니다. 그런 다음 @Autowired@Qualifier("oracleDriver") 주석을 사용하여 스프링 프레임워크에게 dataBaseDriver 클래스 속성에 oracleDriver라는 이름의 빈을 주입하도록 지시합니다. 이 스프링 빈을 아직 생성하지 않았음에 유의하십시오. `

` 스프링 빈 `

` 최종 단계는 스프링 빈 및 구성 클래스를 생성하여 모든 것을 함께 연결하는 것입니다. `

package com.journaldev.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;

import com.journaldev.drivers.DataBaseDriver;
import com.journaldev.drivers.MySqlDriver;
import com.journaldev.drivers.OracleDriver;

@Configuration
@ComponentScan("com.journaldev")
@PropertySource("classpath:oracledatabase.properties")
public class AppConfig {

	@Autowired
        Environment environment;
	
	@Bean
	DataBaseDriver oracleDriver() {
        OracleDriver oracleDriver = new OracleDriver();
	oracleDriver.setDriver(environment.getProperty("db.driver"));
        oracleDriver.setUrl(environment.getProperty("db.url"));
        oracleDriver.setPort(Integer.parseInt(environment.getProperty("db.port")));
        oracleDriver.setUser(environment.getProperty("db.user"));
        oracleDriver.setPassword(environment.getProperty("db.password"));

        return oracleDriver;

	}

	@Bean
	DataBaseDriver mysqlDriver() {
		return new MySqlDriver();
	}
}

` oracleDriver를 위한 빈 정의에 주목하세요. 이 방법에서는 스프링 프레임워크에 의해 environment 변수로 설정된 oracledatabase.properties 파일에서 속성을 읽고 있습니다. 여기에 oracledatabase.properties 파일에 정의된 프로퍼티가 있습니다.

db.url=localhost
db.port=4444
db.user=vasiliy
db.password=yilisav
db.driver=driver_name

저희의 봄 주석 예제 프로젝트는 테스트할 준비가 되었습니다. 요약하자면, 다음 단계를 수행했습니다:

  1. 마븐 프로젝트를 생성하고 필요한 스프링 종속성을 추가했습니다.
  2. 컴포넌트 클래스를 생성하고 리소스 파일에서 변수로 주입했습니다.
  3. 외부 컴포넌트가 있는 경우 Service 클래스를 사용하여 의존성을 주입할 수 있습니다. 우리가 OracleDriver를 UserService 클래스를 통해 수행한 것처럼요.
  4. 마지막으로, 스프링 빈을 정의하고 스프링 컴포넌트 클래스를 스캔하고 구성하기 위한 기본 패키지를 설정하기 위해 구성 클래스를 생성했습니다.

스프링 주석 예제 테스트

다음은 저희의 스프링 주석 예제 프로젝트를 테스트하기 위한 메인 클래스입니다.

package com.journaldev;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;

import com.journaldev.config.AppConfig;
import com.journaldev.drivers.DataBaseDriver;
import com.journaldev.service.UserService;

public class Main {
	public static void main(String[] args) {
	AbstractApplicationContext appContext = new AnnotationConfigApplicationContext(AppConfig.class);

	DataBaseDriver oracle = appContext.getBean("oracleDriver", DataBaseDriver.class);
	DataBaseDriver mysql = appContext.getBean("mysqlDriver", DataBaseDriver.class);
		
        System.out.println("Oracle driver info:");
        System.out.println(oracle.getInfo());
        
        System.out.println("MySQL driver info:");
        System.out.println(mysql.getInfo());

        System.out.println("UserService Information");
	UserService userService = appContext.getBean(UserService.class);
	System.out.println(userService.getDriverInfo());

	appContext.close();
	}
}

아래 이미지는 생성된 출력을 보여줍니다. 로깅 프레임워크를 구성하지 않았으므로 모든 스프링 프레임워크 로깅이 콘솔에 빨간색으로 출력됩니다. 이것이 스프링 주석에 대한 간략한 소개입니다. 여기에 대부분의 중요한 주석을 나열했지만, 특정 작업을 위한 많은 다른 주석이 있습니다. 아래 링크에서 저의 스프링 주석 예제 프로젝트를 다운로드할 수 있습니다.

다운로드 스프링 어노테이션 예제 프로젝트 다운로드

참조: API 문서

Source:
https://www.digitalocean.com/community/tutorials/spring-annotations