[Spring] Annotation 정리 (수정중)

SSOYEONG·2022년 4월 4일
0

스프링 입문

목록 보기
4/4
post-thumbnail

Annotation이란?

  • Annotation의 사전적 의미는 주석이다.
  • 자바에서 Annotation(@)는 코드 사이에 주석처럼 달아 특별한 기능을 수행하도록 하는 기술이다.

장점
코드량 감소 | 유지보수 용이 | 생산성 증가

사용 순서
1. Annotation을 정의한다.
2. Class에 annotation을 배치한다.
3. 코드가 실행되는 중에 Reflection을 이용하여 추가 정보를 획등하고 기능을 실시한다.

Reflection이란?

  • 컴파일 타임에 구체적인 클래스 타입을 알지 못해도 실행 중에 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API
  • Annotation 자체는 아무런 동작을 가지지 않는 단순한 표식일 뿐이지만, Reflection을 이용하면 Annotation의 적용 여부와 element 값을 읽고 처리할 수 있다.

Annotation의 종류

@ComponentScan

  • @Component, @Service, @Repository, @Controller, @Configuration이 붙은 클래스를 찾아서 Context에 Bean으로 등록한다.
  • 자동으로 등록되는 Bean의 이름은 클래스의 첫문자가 소문자로 바뀌어서 적용된다.
    Ex) HomeController -> homeController

@Component

  • 개발자가 직접 작성한 Class를 Bean으로 등록하기 위한 annotation.
@Component
public class Student {
	public Student() {
    	System.out.pritln("hi");
    }
}

@Component(value="mystudent")
public class Student {
	public Student() {
    	System.out.println("hi");
    }
}
  • @Bean과 다르게 @Component는 name이 아닌 value를 이용해 Bean의 이름을 지정한다.

@Bean

  • 개발자가 직접 제어가 불가능한 외부 라이브러리 등을 Bean으로 만들려할 때 사용되는 annotation.
@Configuration
public class SpringConfig {
	@Bean(name="myMemberService")
    public MemberService memberService(){
    	return new MemberService(memberRepository);
    }
}
  • 라이브러리 등을 Bean으로 등록하기 위해서는 별도로 해당 라이브러리 객체를 반환하는 Method를 만들고 @Bean Annotation을 사용하면 된다.
  • name이라는 값이 없다면, Bean id는 'memberService'로 등록된다.

@Configuration

  • @Bean이 있는 Method를 찾기 위해, Spring은 @Configuration이 붙어있는 class를 자동으로 Bean에 등록해두고, 해당 클래스를 파싱하여 Bean을 생성한다.
  • Singleton을 보장한다.
@Configuration
public class AppConfig {
   
   @Bean
    public MemberService memberService(){
        System.out.println("call AppConfig.memberService");
        return new MemberServiceImpl(memberRepository());     
    }
    @Bean
    public MemoryMemberRepository memberRepository() {
        System.out.println("call AppConfig.memberRepository");
        return new MemoryMemberRepository();
    }
}
  • 원래는 @Bean마다 Bean을 Spring Container에 등록하기 때문에
    new MemoryMemberRepository()가 여러 번 호출되어 여러 번 등록된다. >>Singleton 위반
  • 그러나 @Configuration 덕분에 이미 등록된 bean은 다시 등록하지 않는다.
  • @Bean만 사용하면 Spring Bean으로 등록하지만, Singleton은 보장되지 않는다.

@Autowired

@Controller
public class MemberController {
	private final MemberService memberService;
    
    @Autowired
    public MemberController(MemberService memberService) {
    	this.memberService = memberService;
    }
}
  • 생성자에 @Autowired가 있으면 Spring이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다.
  • 생성자가 1개만 있으면 @Autowired 생략 가능

@Controller

profile
Übermensch

0개의 댓글