Spring Annotation

LeeJ·2023년 4월 4일
0

CS

목록 보기
11/11

Annotation

Annotation(@)은 사전적 의미로는 주석이라는 뜻입니다.
자바에서 Annotation은 코드 사이에 주석처럼 쓰이며 특별한 의미, 기능을 수행하도록 하는 기술입니다. 즉, 프로그램에게 추가적인 정보를 제공해주는 메타데이터라고 볼 수 있다.

  • meta data : 데이터를 위한 데이터

Annotation의 용도

  • 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공한다.
  • 소프트웨어 개발 툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보를 제공한다.
  • 실행시(런타임시)특정 기능을 실행하도록 정보를 제공한다.

Annotation의 사용 순서

  • 어노테이션을 정의한다.
  • 클래스에 어노테이션을 배치한다.
  • 코드가 실행되는 중에 Reflection을 이용하여 추가 정보를 획득하여 기능을 실시한다.

Reflection?

  • Java와 같은 객체 지향 프로그래밍 언어에서 Reflection을 사용하면 컴파일 타임에 인터페이스, 필드, 메소드의 이름을 알지 못해도 실행 중에 클래스, 인터페이스, 필드 및 메소드에 접근할 수 있습니다. 또한, 새로운 객체의 인스턴스화 및 메소드 호출을 허용합니다.
  • Java와 같은 객체 지향 프로그래밍 언어에서 Reflection을 사용하여 멤버 접근 가능성 규칙을 무시할 수 있습니다.
  • [EX] reflection을 사용하면 서드 파티 라이브러리의 클래스에서 private 필드의 값을 변경할 수 있습니다.
  • Spring에서 BeanFactory라는 Container에서 객체가 호출되면 객체의 인스턴스를 생성하게 되는데 이 때 필요하게 된다. 즉, 프레임워크에서 유연성있는 동작을 위해 쓰입니다.

Annotation 자체는 아무런 동작을 가지지 않는 단순한 표식일 뿐이지만, Reflection을 이용하면 Annotation의 적용 여부와 엘리먼트 값을 읽고 처리할 수 있습니다.

Class에 적용된 Annotation 정보를 읽으려면 java.lang.Class를 이용하고, 필드, 생성자, 메소드에 적용된 어노테이션 정보를 읽으려면 Class의 메소드를 통해 java.lang.reflect 패키지의 배열을 얻어야 합니다.

Class.forName(), getName(), getModifier(), getFields() getPackage() 등등 여러 메소드로 정보를 얻을 수 있습니다.

Reflection을 이용하면 Annotation 지정만으로도 원하는 클래스를 주입할 수 있다는 장점이 있으나, Encapsulation를 해칠 수 있습니다.

// Without reflection
Foo foo = new Foo();
foo.hello();
// With reflection
Object foo = Class.forName("complete.classpath.and.Foo").newInstance();
// Alternatively: Object foo = Foo.class.newInstance();
Method m = foo.getClass().getDeclaredMethod("hello", **new** Class<?>[0]);
m.invoke(foo);

Annotation 종류

@ComponentScan

@Component와 @Service, @Repository, @Controller, @Configuration이 붙은 클래스 Bean들을 찾아서 Context에 bean등록을 해주는 Annotation입니다.

Spring에서는 @Component로 다 쓰지 않고 @Repository, @Service, @Controller등을 사용하는 이유는, 예를들어 @Repository는 DAO의 메소드에서 발생할 수 있는 unchecked exception들을 스프링의 DataAccessException으로 처리할 수 있기 때문입니다.

또한 가독성에서도 해당 어노테이션을 갖는 클래스가 무엇을 하는지 단 번에 알 수 있다는 점이 있습니다.
자동으로 등록되는 Bean의 이름은 클래스의 첫문자가 소문자로 바뀐 이름이 자동적용된다. (MemberController > memberController)

@Component(value="name")

개발자가 직접 작성한 클래스를 빈으로 등록하기 위한 어노테이션 입니다.

@Component
public class SayHello{
	public SayHello(){
    	System.out.println("hello");
    }
}

@Bean(value="name")

외부 라이브러리를 Bean으로 만들 때 사용하는 Annotation입니다.

@Configuration
public class ApplicationConfig {    
    @Bean
    public ArrayList<String> array(){
        return new ArrayList<String>();
    }   
}

@Autowired

속성(field), setter method, constructor(생성자)에서 사용하며 Type에 따라 알아서 Bean을 주입 해줍니다.
무조건적인 객체에 대한 의존성을 주입시킵니다.
이 Annotation을 사용할 시, 스프링이 자동적으로 값을 할당하고, Controller 클래스에서 DAO나 Service에 관한 객체들을 주입 시킬 때 많이 사용합니다.

즉, Dependency Injection를 위한 곳에 사용되는 어노테이션 입니다.

예를 들어 OrderService라는 클래스가 MemberRepository와 DiscountPolicy 클래스에 의존한다고 가정하면,

@Component
public class OrderServiceImpl implements OrderService {
	private final MemberRepository memberRepository;
	private final DiscountPolicy discountPolicy;
	@Autowired
	public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
            this.memberRepository = memberRepository;
            this.discountPolicy = discountPolicy;
	}
}

※ Bean을 주입받는 방식 (3가지)

  • @Autowired
  • setter
  • 생성자 (@AllArgsConstructor 사용) <<< 권장됨

@Controller

Spring의 Controller를 의미합니다.. Spring MVC에서 Controller클래스에 쓰이게 되는 어노테이션 입니다.

@RestController

Spring에서 Controller 중 View로 응답하지 않는, Controller를 의미합니다.
method의 반환 결과를 JSON 형태로 반환합니다.
이 Annotation이 적혀있는 Controller의 method는 HttpResponse로 바로 응답이 가능하게 됩니다.
@ResponseBody 역할을 자동적으로 해주는 Annotation입니다.

@Controller 와 @RestController 의 차이

@Controller

  • API와 view를 동시에 사용하는 경우에 사용한다.
  • 대신 API 서비스로 사용하는 경우는 @ResponseBody를 따로 사용하여 객체를 반환한다.
  • view(화면) return이 주목적이다.

@RestController

  • view가 필요없는 API만 지원하는 서비스에서 사용한다.
  • Spring 4.0.1부터 제공
  • @RequestMapping 메서드가 기본적으로 @ResponseBody 의미를 가정한다.
  • data(json, xml 등) return이 주목적이다.
  • 즉, @RestController = @Controller + @ResponseBody

@Service

Service Class에서 쓰입니다.
비즈니스 로직을 수행하는 Class라는 것을 나타내는 용도.

@Repository ***

DAO class에서 쓰입니다.
DataBase에 접근하는 method를 가지고 있는 Class에서 쓰이게 됩니다.

@Configuration

@Configuration을 클래스에 적용하고 @Bean을 해당 Class의 method에 적용하면 @Autowired로 Bean을 부를 수 있게 됩니다.

1개 이상의 bean을 등록할 때 설정합니다.

@Required

setter method에 적용해주면 Bean 생성시 필수 프로퍼티 임을 알립니다.
SQL에서 NOT NULL과 비슷한 역할을 수행합니다.

@RequestMapping

요청 URL을 어떤 method가 처리할지 mapping해주는 Annotation입니다.

Controller나 Controller의 method에 적용하게 됩니다.

요청을 받는 형식인 GET, POST, PATCH, PUT, DELETE 를 정의하기도 합니다.

요청 받는 형식을 정의하지 않는다면, form과 마찬가지로 자동적으로 GET으로 설정되게 됩니다.

@RequestMapping("/index")
@RequestMapping("/home, /user");
@RequestMapping("/trip", method=RequestMethod.GET)

@RequestMapping("/trip", method=RequestMethod.GET) 과 같은 방식이 귀찮을 수 있는 사람들에게 스프링은 @GetMapping와 같은 어노테이션도 제공합니다. 물론 [@PostMapping, @PutMapping, @DeleteMapping] 모두 가능합니다.

@SessionAttributes

@SessionAttributes("key") 라고 하면 model의 key로 되어있는 값이 자동으로 session에 저장됩니다.

@RequestParam

?action=list&param1=1&parma2=2 일때,
public String show(@RequestParam("param2") 로 param2를 받아올 수 있습니다.

profile
헤응

0개의 댓글