s
s
spring
Search…
Spring Annotation
Spring Bean을 등록하는데 있어서 2가지 방법이 있다.
  1. 1.
    컴포넌트 스캔과 자동 의존관계 설정
  2. 2.
    자바 코드로 직접 스트링 빈 등록하기

컴포넌트 스캔과 자동 의존관계 설정

Annotation
설명
@Component
@Component 어노테이션이 있으면, 스프링 빈으로 등록된다.(@ComponentScan에 의해서)
@Controller
스프링 MVC 컨트롤러
@Service
특별한 처리를 하지 않는다. 대신 개발자들이 핵심 비즈니스 계층을 인식하는데 도움이 된다.
@Repository
스프링 데이터 접근 계층으로 인식하고, 데이터 계층의 예외를 스프링 예외로 변환해준다.
@Configuration
스프링 설정 정보로 인식하고, 스프링 빈이 싱글톤을 유지하도록 추가 처리
@Autowired
객체 생성 시점에 스프링 컨테이너에서 해당 스프링 빈을 찾아서 주입한다. 스프링이 관리하는 객체에서만 동작 (서비스 간의 연결 선 역할이라고 생각하면 이해하기 쉽다.)
위에서 보이는 @Controller, @Repository, @Service 모두 내부에 @Component 어노테이션이 포함되어 있는 것을 볼 수 있다.
  • @Controller
1
@Target({ElementType.TYPE})
2
@Retention(RetentionPolicy.RUNTIME)
3
@Documented
4
@Component
5
public @interface Controller {
6
7
/**
8
* The value may indicate a suggestion for a logical component name,
9
* to be turned into a Spring bean in case of an autodetected component.
10
* @return the suggested component name, if any (or empty String otherwise)
11
*/
12
@AliasFor(annotation = Component.class)
13
String value() default "";
14
15
}
Copied!
  • @Repository
1
@Target({ElementType.TYPE})
2
@Retention(RetentionPolicy.RUNTIME)
3
@Documented
4
@Component
5
public @interface Repository {
6
7
/**
8
* The value may indicate a suggestion for a logical component name,
9
* to be turned into a Spring bean in case of an autodetected component.
10
* @return the suggested component name, if any (or empty String otherwise)
11
*/
12
@AliasFor(annotation = Component.class)
13
String value() default "";
14
15
}
Copied!
이렇게 @Component 어노테이션을 보고 스프링 빈으로 등록되는 것을 컴포넌트 스캔이라고 한다.

예제 코드

  • Controller
1
package dh0023.springmvc.member.controller;
2
3
import dh0023.springmvc.member.service.MemberService;
4
import org.springframework.beans.factory.annotation.Autowired;
5
import org.springframework.stereotype.Controller;
6
7
@Controller
8
public class MemberController {
9
10
11
private final MemberService memberService;
12
13
@Autowired
14
public MemberController(MemberService memberService){
15
this.memberService = memberService;
16
}
17
18
}
Copied!
  • Service
1
package dh0023.springmvc.member.service;
2
3
import dh0023.springmvc.member.domain.Member;
4
import dh0023.springmvc.member.repository.MemberRepository;
5
import org.springframework.beans.factory.annotation.Autowired;
6
import org.springframework.stereotype.Service;
7
8
import java.util.List;
9
import java.util.Optional;
10
11
@Service
12
public class MemberService {
13
14
15
private final MemberRepository memberRepository;
16
17
@Autowired
18
public MemberService(MemberRepository memberRepository){
19
this.memberRepository = memberRepository;
20
}
21
...
22
}
Copied!
  • Repository
1
@Repository
2
public class MemoryMemberRepository implements MemberRepository{
3
4
// 실무에서는 ConcurrentHashMap을 사용해야한다.
5
private static Map<Long, Member> store = new HashMap<>();
6
private static long sequence = 0L;
7
8
...
9
}
Copied!

자바 코드로 직접 스트링 빈 등록하기

@Service, @Repository 어노테이션으로 빈을 등록하지 않고 직접 @Bean 어노테이션으로 빈을 등록 할 수 있다.
  • Controller
1
@Controller
2
public class MemberController {
3
4
5
private final MemberService memberService;
6
7
@Autowired
8
public MemberController(MemberService memberService){
9
this.memberService = memberService;
10
}
11
12
}
Copied!
  • Service
1
public class MemberService {
2
3
4
private final MemberRepository memberRepository;
5
6
public MemberService(MemberRepository memberRepository){
7
this.memberRepository = memberRepository;
8
}
9
// ...
10
}
Copied!
  • Repository
1
public class MemoryMemberRepository implements MemberRepository{
2
...
3
}
Copied!
  • Configuration 설정
1
@Configuration
2
public class SpringConfig {
3
4
@Bean
5
public MemberService memberService(){
6
return new MemberService(memberRepository());
7
}
8
9
@Bean
10
public MemberRepository memberRepository(){
11
return new MemoryMemberRepository();
12
}
13
}
Copied!

언제 사용해야할까?

정형화된 Controller, Servcie, Repository는 컴포넌트 스캔을 사용한다.
하지만, 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다.