[ Spring ] @Autowired

duck-ach·2022년 10월 31일
0

Spring

목록 보기
9/16

Container에 등록된 Bean을 가지고 오는 방법

이전에 Spring Bean Configuration File이나, @Configuration 애너테이션을 통해서 Bean 객체를 만드는 방법을 소개했었다.

이번엔 그렇게 생성된 Bean을 가지고오는 방법을 소개해보겠다.

3가지 애너테이션(Annotation)

  • @Inject
    • 타입(Class)이 일치하는 Bean을 가지고 오는 애너테이션(Annotaion)이다.
    • 동일 타입이 여러 개 있는 경우 @Qualifier를 이용해서 Bean을 식별한다.
    • 오직 타입(class)만 확인하며, 동일 타입이 다수 발견되면 @Qualifier를 통해 이름을(id)을 구분.
  • @Resource
    • 이름(id)이 일치하는 Bean을 가지고 오는 애너테이션(Annotaion)이다.
  • @Autowired
    • 타입(class)이 일치하는 Bean을 가지고 오는 애너테이션(Annotaion)이다.
    • 동일 타입이 여러개 있는 경우 자동으로 @Qualifier를 이용해서 Bean을 식별한다.
    • 실무에서 주로 사용된다.

이 중에 @Autowired를 가장 많이 사용한다고 하니 소개해보겠다.
AutoWired를 사용하는 이유 : @Inject + @Qualifier


@Autowired 특징

  • Autowired는 class를 통해 객체를 찾는다.
  • root-content.xml 에서는 Board 객체가 2개가 있기 때문에, 타입(class)를 통해 찾는것은 실패로 돌린다. (plan A)
  • 그럼 이제 (plan B) 단계로 들어서서 id(변수명)를 가져오게 된다. (그래서 아래 Autowired에서 변수명을 board1이 아닌 b1으로 바꾸게되면 찾지못하여 오류가 뜬다.)

@Autowired 사용방법

Container를 생성하는 방법

  1. root-context.xml에 bean을 추가한다.

ex)

	<bean id="service" class="com.gdu.app05.service.MemberServiceImpl" />

id에는 타입을, class에는 class를 명시한다(자동완성 가능).


  1. Java Class로 Spring Bean Configration을 만들어서 전달한다.

ex)

@Configuration
public class SpringBeanConfig {
	@Bean
	public BoardService boardService() {
		return new BoardServiceImpl();
	}
}

위와 아래는 같은 역할을 하는 코드이다.

동일한 타입의 Bean이 없을 경우

1. 필드를 이용해 Bean 가져오기

  • 필드마다 @Autowired를 추가한다. (필드가 10개면 @Autowired도 10번 작성)
  • Container의 Bean을 가져와서 여기다 넣은 것이다.
  • Autowired라는 애가 Bean을 찾아서 자동으로 값을 넣어주는 것이다. (getter/setter 없이 실행)
  • 필드가 많으면 사용하지 않는다.
@Autowired
private Board board;
@GetMapping("board/detail") // @GetMapping("/board/detail")
public void boardDetail() {
	System.out.println(board.getBoardNo());
	System.out.println(board.getTitle());
	System.out.println(board.getCreateDate());
}

2. 생성자를 이용해 Bean 가져오기

  • 생성자의 매개변수로 Bean을 가져온다.
  • @Autowired를 작성할 필요가 없다.
private Board board;
	
public MyController(Board board) { // 매개변수 Board board로 타입이 Board인 Bean을 Container에서 가져와라.
	super();
	this.board = board;
}
@GetMapping("board/detail") // @GetMapping("/board/detail")
public void boardDetail() {
	System.out.println(board.getBoardNo());
	System.out.println(board.getTitle());
	System.out.println(board.getCreateDate());
}

3. 메소드를 이용해 Bean 가져오기

  • 메소드의 매개변수로 Bean을 가져온다.
  • @Autowired를 작성해야 한다.
  • 일반적으로 setter를 사용하지만 setter가 아니어도 상관 없다.

private Board board;
// setter만 생성
@Autowired // 일반 메소드는 @Autowired를 반드시 작성해야 한다.
public void 메소드이름은상관이없다(Board board) { // 매개변수 Board board로 Board 타입의 Bean이 Container에서 
	this.board = board;
}
@GetMapping("board/detail") // @GetMapping("/board/detail")
public void boardDetail() {
	System.out.println(board.getBoardNo());
	System.out.println(board.getTitle());
	System.out.println(board.getCreateDate());
}

동일한 타입의 Bean이 여러개 등록된 경우

  • 변수명을 자동으로 식별자(@Qualifier)로 인식한다.
  • 식별자(@Qualifier)는 Bean의 이름(id)이 일치하는 Bean을 가져온다.

1. 필드를 이용해 Bean 가져오기

@Autowired
private Board board1;
	
@Autowired
private Board board2;

// 요청을 만들어 확인
@GetMapping("board/detail") // @GetMapping("/board/detail")
public void boardDetail() {
	System.out.println(board1.getBoardNo());
	System.out.println(board1.getTitle());
	System.out.println(board1.getCreateDate());
	System.out.println(board2.getBoardNo());
	System.out.println(board2.getTitle());
	System.out.println(board2.getCreateDate());
}

2. 생성자를 이용해 Bean 가져오기

private Board b1;
private Board b2;
	
public MyController(Board board1, Board board2) { // 매개변수명이 Bean의 이름(id)과 일치하므로 자동으로 주입된다.
	b1 = board1;
	b2 = board2;
}

// 요청을 만들어 확인
@GetMapping("board/detail") // @GetMapping("/board/detail")
public void boardDetail() {
	System.out.println(b1.getBoardNo());
	System.out.println(b1.getTitle());
	System.out.println(b1.getCreateDate());
	System.out.println(b2.getBoardNo());
	System.out.println(b2.getTitle());
	System.out.println(b2.getCreateDate());
}

3. 메소드를 이용해 Bean 가져오기

private Board b1;
private Board b2;

// 2개의 메소드로 나눠 Bean 가져오기
@Autowired
public void setB1(Board board1) {
	this.b1 = board1;
}
@Autowired
public void setB2(Board board2) {
	this.b2 = board2;
}

// 1개의 메소드로 통합하여 가져오기
@Autowired
public void setBoard(Board board1, Board board2) {
	this.b1 = board1;
	this.b2 = board2;
}

// 요청을 만들어 확인
@GetMapping("board/detail") // @GetMapping("/board/detail")
public void boardDetail() {
	System.out.println(b1.getBoardNo());
	System.out.println(b1.getTitle());
	System.out.println(b1.getCreateDate());
	System.out.println(b2.getBoardNo());
	System.out.println(b2.getTitle());![](https://velog.velcdn.com/images/duck-ach/post/83ad58ef-6a8f-402d-82f3-7983db4dc252/image.png)

	System.out.println(b2.getCreateDate());
}

1개의 메소드로 통합하여 가져오는 것이 훨씬 깔끔하고 코드도 단순한 것 같다.

profile
자몽 허니 블랙티와 아메리카노 사이 그 어딘가

0개의 댓글