본문 바로가기
JAVA/Spring

Spring 에서 자주 사용하는 Annotation 정리

by KkingKkang 2023. 7. 17.

JAVA에서 Annotation 이라는 기능이 있습니다.
사전상으로는 주석의 의미이지만 Java 에서는 주석 이상의 기능을 가지고 있습니다.
Annotation은 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종입니다.
소스코드에 추가하면 단순 주석의 기능을 하는 것이 아니라 특별한 기능을 사용할 수 있습니다.


@SpringBootApplication : spring boot application으로 설정

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class TestAppliction {
	public static void min(String[] args) {
    	SpringApplication.run(TestApplication.class, args);
     }
}

@Controller : View를 제공(반환)하는 controller로 설정

@Controller
@RequestMapping("/ex/test")
public class HelloController {

}

@RestController : REST API 를 제공하는 controller로 설정 (Json 형태로 객체 데이터를 반환)

 - 객체를 ResponseEntity로 감싸서 반환

@RestController
@RequiredArgsConstructor
public class TestController {

	private final MemberService memberService;
    
    @GetMapping("api/board/member")
    public Member findMember(@RequestParam("id") String id){
    	return memberService.findMmember(member);
    }
    
    @GetMapping("api/board/member")
    public ResponseEntity<Member> findMemberResponseEntity(@RequestParam("id") String id) {
    	return ResponseEntity.ok(memberSerivice.findMember(member));
   }
}

@RequestMapping : URL주소를 매핑

@GetMapping : Http GetMethod URL 주소 맵핑 : 서버의 리소스를 조회할 때 사용

@PostMapping : Http PostMethod URL 주소 맵핑 : 서버에 리소스를 등록(저장)할 때 사용

@PutMapping : Http PutMethod URL 주소 맵핑 : 서버의 리소스를 모두 수정

@DeleteMapping: Http DeleteMethod URL 주소 맵핑 : 서버의 리소스를 삭제

@PatchMapping : 서버의 리소스를 일부 수정


@RequestParam : URL Query Parameter 맵핑

@RequestBody: Http Body를 Parsing맵핑


@Configuration: 1개 이상의 bean을 등록할 때 설정

@Bean : 1개의 외부 library로부터 생성한 객체를 등록 시 사용

[Spring Bean]

Spring에서는 Spring의 DI Container에 의해 관리되는 POJO(Plain Old Java Object)를 Bean이라고 부르며, 이러한 Bean들은 Spring을 구성하는 핵심 요소이다. 

  • POJO(Plain Old Java Object) = Spring 애플리케이션을 구성하는 핵심 객체
  • Spring IoC컨테이너(또는 DI컨테이너)에 의해 생성 및 관리된다.
  • class, id, scope, constructor-arg 등을 주요 속성으로 지닌다. 

[Spring Bean 구성 요소]

class bean으로 등록할 java 클래스
id bean의 고유 식별자
scope bean을 생성하기 위한 방법(singleton, prototype 등)
constructor-arg bean 생성 시 생성자에 전달할 파라미터
property bean 생성 시 setter에 전달할 인수

- @Bean을 사용해 수동으로 스프링 컨테이너에 빈을 등록할 수 있다. 메소드 이름으로 빈 이름이 결정되므로 중복 조심.

@Configuration
public class TestConfig {
	@Bean
    public TestResource testResource() {
    	return new TestResource();
   }
}

- 스프링 컨테이너는 @Configuration이 붙어있는 클래스를 자동으로 빈으로 등록해두고, 해당 클래스를 파싱해서 @Bean이 있는 메소드를 찾아서 빈을 생성해준다. 

- @Configuration 안에서 @Bean을 사용해야 싱글톤을 보장받을 수 있으므로 @Bean은 반드시 @Configuration과 함께 사용해야 한다. 

- 수동으로 빈을 등록해줘야 하는 경우

  • 개발자가 직접 제어가 불가능한 라이브러리를 활용할 때
  • 애플리케이션 전범위적으로 사용되는 클래스를 등록할 때
  • 다형성을 활용하여 여러 구현체를 등록해주어야 할 때 

@Component : 1개의 Class단위로 등록할 때 사용

- 스프링 컴포넌트 스캔을 사용해 @Component 어노테이션이 있는 클래스들을 찾아서 자동으로 빈 등록을 해준다. - @Component 하위 어노테이션으로 @Configuration, @Controller, @Service, @Repository 등이 있다.


@Autowired : DI를 위한 곳에 사용

  • 스프링 컨테이너에 빈들을 모두 등록한 후에, 의존성 주입 단계가 이루어진다. 
  • 이 때 @Autowired 어노테이션이 부여된 메서드가 실행되며 필요한 인스턴스를 주입해준다. 
  • 생성자, 수정자(setter), 필드를 사용할 수 있다. 

1) 생성자 주입

  • costructor 생성자를 통해 의존 관계를 주입하는 방법이다.
  • 객체가 생성될 때 딱 한 번 호출되는 것이 보장된다. → 의존관계가 불변인 경우에 사용
  • 의존관계에 있는 객체들을 final로 선언할 수 있다. 
  • 생성자가 하나일 경우 @Autowired를 생략할 수 있다. 
@Component
public class OrderServiceImpl implemets OrderService {
	//의존해야하는 객체를 private final로 선언
	private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;
    
    @Autowired
    //생성자를 통해 해당 객체들을 주입빋음
    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
    	this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }
}

2) 수정자 주입

  • setter을 생성하고, 그 위에 @Autowired를 적는다
  • 스프링 빈을 모두 등록한 후에 @Autowired가 붙은 수정자를 모두 찾아서 의존관계를 주입한다.
  • 선택적이고 변화 가능한 의존관계에 사용한다.
@Component
public class OrderServiceImpl implements OrderService {
	private MemberRepository memberRepository;
    private DiscountPolicy discountPolicy;
    
    @Autowired
    public void setMemberRepository(MemberRepository memberRepository) {
    	this.memberRepository = memberRepository;
    }
    
    @Autowired
    public void setDiscountPolicy(DiscountPolicy discountPolicy) {
    	this.discountPolicy = discountPolicy;
    }
 }

3) 필드 주입

  • 제일 간단한 방법
  • 변수에 @Autowired를 붙여서 사용한다
  • 단점이 너무 많으므로, 어플리케이션과 관련이 없는 테스트 코드에서만 한정적으로 사용하자.
@Component
public class OrderServiceImpl implements OrderService {
	@Autowired
    private MemberRepository memberRepository;
    @Autowired
    private DiscountPolicy discountPolicy;
}

@Qualifier : @Autowired 사용시 bean이 2개 이상일 때 명시적 사용

- 특정한 객체를 찾기위한 이름 지정 

@Component
@Qualifier("dog")
public class Dog implements Animal {
	public String sound() {
    	return "멍멍";
    }
}

@Component
@Qualifier("cat")
public class Cat implements Animal {
	public String sound() {
    	return "먀옹";
    }
}

@Resource : @Autowired + @Qualifier 의 개념으로 이해

- @Autowired 어노테이션이 타입을 이요해서 의존성을 주입한다면, @Resource 어노테이션은 빈 이름을 이요해서 의존성을 주입한다.

1) name 속성에 지정한 빈 객체를 찾는다

2) name 속성이 없을 경우, 동일한 타입을 갖는 빈 객체를 찾는다

3) name 속성이 없고 동일한 타입을 갖는 빈 객체가 두 개 이상일 경우, 같은 이름을 가진 빈 객체를 찾는다

4) name 속성이 없고 동일한 타입을 갖는 빈 객체가 두 개 이상이고 같은 이름을 가진 빈 객체가 없는 경우 @Qualifier를 이용해서 주입할 빈 객체를 찾는다

@Repository
public class TestDao {
	@Resource(name="BlueSqlSessionTemplate")
    private SqlSessionTemplate sqlSession;
}

AOP : Aspect Oriented Programming - 관점 지향 프로그래밍

Aspect로 모듈화하고 핵심적인 비즈니스 로직에서 분리하여 재사용하겠다는 것이 AOP의 취지

  • Aspect : 흩어진 관심사를 모듈화 한 것. 주로 부가기능을 모듈화함.
  • Target : Aspect를 적용하는 곳 
  • Advice : 실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가기능을 담은 구현체
  • JoinPoint : Advice가 적용될 위치
  • PointCut : JoinPoint의 상세한 스펙을 정의한 것.

스프링 AOP 특징

  • 프록시 패턴 기반의 AOP 구현체. 프록시 객체를 쓰는 이유는 접근 제어 및 부가기능을 추가하기 위해서
  • 스프링 빈에만 AOP를 적용 가능 
  • 중복코드, 프록시 클래스 작성의 번거로움, 객체들 간 관계 복잡도 증가 등에 대한 해결책을 지원하는 것이 목적

 

@Aspect : AOP 적용시 사용

1) 의존성 추가 

<dependency>
	<groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2) @Aspect 어노테이션을 붙여 이 클래스가 Aspect를 나타내는 클래스라는 것을 명시하고 @Component를 붙여 스프링 빈으로 등록한다.

@Component
@Aspect
public class PerfAspect {

}

@Before: AOP메소드 이전 호출 지정

@After : AOP메소드 호출 이후 지정 예외 발생 포함

@AfterReturning : AOP메소드의 호출이 정상일 때 실행

@AfterThrowing: AOP시 해당 메소드가 예외 발생시 지정


validation annotation @Vaild

@Size(min=,max=) : (int type 불가) 문자열 또는 배열이 지정된 값 사이일 경우 통과 가능

@NotNull : null 불가

@NotEmptry : null, ""불가

@NotBlank : null, "", ""불가

@Past : 과거 날짜일 경우만 통과 가능

@PastOrPresent : 오늘이나 과거 날짜일 경우만 통과 가능

@Future : 미래 날짜일 경우만 통과 가능

@FutureOrPresent : 오늘이거나 미래 날짜일 경우만 통과 가능

@Pattern(regex=, flag=) : 해당 정규식을 만족할 경우만 통과 가능

@Max(value) : 지정된 값보다 아래일 경우만 통과 가능

@Min(value) : 지정된 값보다 이상일 경우만 통과 가능

@AssertTrue / False : true/false 값만 통과 가능

@DecimalMax(value=) : 지정된 값 이하의 실수만 통과 가능

@DecimalMin(value=) : 지정된 값 이상의 실수만 통과 가능

@Digits(integer=, fraction=) : 대상 수가 지정된 정수와 소수 자릿수보다 적을 경우 통과 가능

@Valid : 대상 객체의 확인 조건을 만족하는 경우 통과 가능

반응형

댓글