Spring

Spring Boot 🌼 어노테이션

doridam 2023. 6. 14. 11:38


Annotation

Annotation은 사전적 의미로는 주석이라는 뜻이다.
자바에서 Annotation은 코드 사이에 주석처럼 쓰이며 특별한 의미, 기능을 수행하도록 하는 기술이다.
예약어 앞에 @를 붙여 사용한다.

SpringBoot Annotation

Spring에서는 다양한 어노테이션을 제공한다. 이러한 어노테이션은 필드, 메서드, 클래스에 적용되며 Bean 등록, 의존성주입, urlMapping, MVC 패턴 적용등의 역할을 한다.

주요 Annotation

@SpringBootApplication : SpringBoot 어플리케이션을 시작하는 main 클래스에 적용하는 어노테이션@ComponentScan, @EnableAutoConfiguration, @SpringBootConfiguration 등을 포함하고 있다.
해당 어노테이션으로 인해 main Class 이하 패키지에 포함된 컴포넌트 또는 클래스들을 자동으로 Bean 으로 등록 시켜준다.

@SpringBootApplication
public class ApiTestApplication {
	public static void main(String[] args) {
		SpringApplication.run(ApiTestApplication.class, args);
	}
}

@Configuration : @Configuration 어노테이션이 적용된 설정 클래스를 스캔하여 빈 구성을 로드하고 애플리케이션 컨텍스트에 등록한다.

@Configuration
public class AppConfig {
    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

@Autowired : DI(Dependency Injection) 대상으로 지정, 필드, 생성자, setter 메서드에 적용하여 DI를 할 수 있다.

@Service
public class RestApiServiceLogic implements RestApiService {
    private final RestApiRepository apiRepository;
      @Autowired
      public RestApiServiceLogic(RestApiRepository apiRepository) {
          this.apiRepository = apiRepository;
      }

@Bean : @Configuration 내부에서 사용되며, 메소드 단위로 사용한다. 직접 제어가 불가능한 외부 라이브러리등을 Bean으로 만들려할 때 사용된다. 사용시 해당 객체를 반환하는 getter와 비슷한 메소드를 만들고 리턴에 new를 붙여 생성과 리턴한다. Bean id를 지정하지 않을 경우 메서드의 이름을 camelCase로 변경한것이 bean id로 지정된다.

@Configuration
public class AppConfig {
    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

@Component : 클래스를 @ComponentScan의 대상으로 지정한다. 해당 클래스를 스캔되면 자동으로 Bean 등록이 된다.

@Component
public class comTest {
}

@ComponentScan : 스캔에 대한 범위를 지정하고 해당 패키지를 스캔하여 @Component 어노테이션이 붙은 Class들을 Bean 등록하거나 제외 시킨다.

@Configuration
@ComponentScan("com.api.")
public class comScaner {
}

@RequestMapping : 요청 URL과 메핑되는 메서드를 지정하는 어노테이션

    @RequestMapping("/logout")
    public void logout(){
    }

만약 클래스 레벨에 적용시킬 경우 공통 URL 경로를 지정할 수 있다.

@RestController
@RequestMapping("/member")
public class RestApiController {
    @RequestMapping("/logout") // "/member/logout"
    public void logout(){
    }

@GetMapping : RequestMapping과 유사하지만 Post, Put, Patch등 메서드에 따라 구체적으로 지정할 수 있다.

    @GetMapping("/request")
    public String postmanTest(){
        return "";
    }

@Controller : URL mapping 관련 어노테이션 및 모델 및 뷰에 데이터를 반환하는 ModelAndView 등 View와 Model을 잇는 MVC패턴중 Controller 클래스에 사용된다.

@Controller
public class RestApiController {
	...
}

@ResponseBody : 메서드의 반환값을 JSON, XML로 할때 사용한다. HTTP 응답 body에 직접 쓰기위해 사용됨.

@GetMapping("/request")
    @ResponseBody
    public String postmanTest(){
        return "asd";
    }

@RestController : @ResponseBody와 @Controller가 결합된 형태, RESTful 웹 서비스 컨트롤러 클래스를 정의함. 메서드가 반환하는 데이터를 HTTP body에 쓰기 위해 사용된다. 데이터를 View로 응답하지 않기때문에 API 구현시 사용하며, 모든 메서드에 @ResponseBody를 적용한다.

@RestController
public class RestApiController {
	...
}

@Service : streotype 중 하나, 비즈니스 로직을 담당하는 Service 클래스를 나타냄. Bean 등록, DI, @Transactional 어노테이션을 이용한 트랜잭션을 관리할 수 있다.

@Service
public class RestApiServiceLogic {
	...
}

@Repository : streotype 중 하나, 데이터 액세스 클래스로 사용되며 데이터베이스와 상호작용 기능을 제공한다. DataAccessException 를 사용하여 예외처리 및 로깅을 보다 쉽게 할 수 있다.

@Repository
public class RestApiRepositoryLogic{
	...
}

@Slf4j : Logger 객체 생성 없이 바로 log.debug()로 로그를 찍어볼 수 있다.

@Slf4j
public class apiTest{
	public void testMethod(String msg){
    	log.debug("msg : " + msg);
    }
}

AOP에서 사용하는 Annotation

AOP에서 사용되는 Annotation
@Aspect : AOP 클래스를 정의하는 어노테이션

	@Aspect
   	class A{
    }

@Before : 메서드를 실행하기 이전에 작동될 함수로 지정한다.

	@Before("b()")
    public void test2(){
   	}

@After : 메서드를 실행한 이후에 작동될 함수로 지정한다.

	@After Returning("b()")
  	public void test3(){
  	}

@Around : 타겟 메서드 실행 전후로 적용될 함수를 지정한다.

    	@Around("b()")
		public void test(){
        }

@Pointcut : AOP를 적용시킬 지점을 설정해주는 함수

    @Pointcut("execution(* com.test)")
    public void serviceMethods() {
    }

@AfterReturning : 메서드 호출 성공시 적용될 함수를 지정한다.

   	@After Returning("b()")
 	public void test3(){
 	}

@AfterThrowing : 메소드 호출시 예외발생시 실행할 함수를 지정한다.

 	@After Throwing("b()")
   	public void test4(){
 	}

Lombok에서 사용하는 Annotation

Lombok은 반복되는 Getter, Setter, 생성자, toString, builder 등 여러 메소드를 어노테이션으로 처리해주는 라이브러리다.

주로 Model 클래스에서 사용하게 되는데, 해당 어노테이션을 붙이면 Getter, Setter와 같은 메서드가 자동생성된다.

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int userNo;
    private String userId;
    private String userPw;
}

@Getter : 필드 변수들의 Getter를 자동으로 생성한다.
@Setter : 필드 변수들의 Setter를 자동으로 생성한다.
@AllArgsConstructor : 모든 필드 변수들이 포함된 생성자를 생성한다.
@NoArgsConstructor : 기본 생성자를 자동으로 생성한다.
@Builder : Builder 패턴을 사용하기 위한 어노테이션. 메서드체이닝을 사용한 가독성 있는 객체 생성가능
-※ @AllArgsConstructor와 충돌이 발생할 수 있기때문에 사용시 기본생성자를 생성하거나 해당 어노테이션을 사용하지 말아야한다.

이처럼 필드에 메소드를 작성하지 않더라도 라이브러리로 인해 Getter, Setter등 어노테이션이 있다면 자동으로 작성된다.