Spring Annotation(2 Bean VS Component)

오성민·2022년 11월 4일
0

spring

목록 보기
5/17
post-thumbnail

Spring을 통한 개발을 진행하면서 가장 어려웠고, 공부가 가장 많이 필요하다고 느낀 부분이 바로 Annotation에 관한 내용이다. 그 중에서 이번에는 기능을 추가하다고 사용해본 Annotation 중 굉장히 비슷하지만 분명 너무 달라 혼용해서 사용한다면 컴파일 에러까지 발생시키는 것이 있어서 글을 작성한다.
중복된 내용이 있어도 계속해서 정리하며 확실히 이해하고, 까먹지 않아야겠다.

IOC

해당 내용을 이해하기에 앞서서 Spring에 장점이지만, 초보에게는 너무 어려운 개념인 IOC를 먼저 짚고 넘어가려고 한다.
IOC(Invension Of Control)은 제어의 역전이라는 말이다. 원래는 생명주기, 객체 생성, 설정, 초기화 등등 여러 가지를 사용자가 관리를 해주어야한다. 하지만 IOC는 이러한 요소를 모두 프레임워크가 대신 해준다.
이러한 것은 개발자에게 많은 이점을 가져다준다.

  • 가독성 증가
  • 코드 중복 방지
  • 유지 보수성 보장
  • 객체 간 결합도 줄이기
  • 유연한 코드 작성 가능

Spring에서는 IOC 컨테이너에 Bean(객체)을 생성하고 객체에 주입한다. 이를 DI라고 한다.

DI

DI(Dependency Injection)은 의존성 종속이라하고 클래스간의 의존관계를 스프링 컨테이너가 자동으로 연결해주는 것을 말합니다.
여기서 의존 관계는 A가 B,C와 상호작용을 한다면 A는 B,C와 의존관계입니다.

이러한 DI는 Spring을 통해 서버를 구성하다보면 쉽게 본다.

	@Autowired
    private BCryptService bCryptService;
    
    @Autowired
    private UserService userService;

    @Autowired
    private MailService mailService;

    @Autowired
    private UserRepository repository;

위는 User 관련된 비즈니스 로직을 처리하기 위한 Controller에 상단에 선언한 것이다. 이는 @Service, @Repository를 통해서 클래스를 Bean으로 등록한 것을 사용하기 위해서 선언한 것이다.

하지만 반드시 주의를 해야할 것은 getter, setter가 존재하는 dto와 같이 계속해서 값이 편하는 클래스는 DI를 사용할 수 없다고 한다.

@Bean VS @Component

둘 다 IOC Container에 Bean을 등록하도록 하는 Annotation이다.
이렇듯 사용하는 목적은 같지만 용도가 다르다.

@Bean

해당 Annotation은 개발자가 직접 제어가 불가능한 외부 라이브러리등을 사용하여서 Bean을 만들 때에 사용한다.
아무런 값도 Parameter로 전달하지 않을 경우 메소드 이름을 Bean id로 등록한다.
혹은 name이라는 값으로 id를 지정해줄 수도 있다.

@Component

해당 Annotation은 @Bean과는 다르게 개발자가 직접 작성한 Class를 Bean으로 등록할 때에 사용한다.
위와 같이 아무런 값이 없다면 클래스 명이 id가 되고, value라는 값으로 id를 지정할 수 있다.

@AutoWired

해당 Annotation을 통해서 DI가 이루어진다.
주입하려고 하는 Bean이 다형성을 가지고 있지 않다면 그냥 사용하면 되고, 다형성을 가지고 있다면 반드시 @Qualifier("Bean이름")을 사용해서 주입한다.

profile
풀스택을 지향하는 개발자

0개의 댓글