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 : 대상 객체의 확인 조건을 만족하는 경우 통과 가능
'Spring' 카테고리의 다른 글
김영한 스프링 부트 - 핵심 원리와 활용 강의로 스프링 부트 시작하기 (0) | 2024.08.27 |
---|---|
웹 애플리케이션의 이해 (0) | 2023.11.07 |
댓글