Spring

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

KkingKkang 2023. 7. 17. 17:43
728x90

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 : 대상 객체의 확인 조건을 만족하는 경우 통과 가능

728x90