Programming/Spring framework

자동 의존 주입 @Autowired 의 실질적 적용 (세터 메서드, 필드). 2021-11-11

최동훈1 2021. 11. 11. 15:58

우선 처음부터 난관에 부딪혔는데, 이클립스에 메이븐 프로젝트를 import하는 과정에서 pom.xml 파일을 POM.xml 이렇게 대문자로 저장해서 처음엔 임포트가 되지 않았지만 해결했다. 

 

우선 @Autowired는 일반 클래스에 의존 주입이 필요한 "필드" 나 "메서드"에 사용된다.

 

필드에는 지난 포스팅에서 보여줬듯이.

public class MemberRegisterService {
	@Autowired private MemberDao memberdao;

	public MemberRegisterService(MemberDao memberdao) {
		this.memberdao = memberdao;
	}
	public MemberRegisterService() {
		// TODO Auto-generated constructor stub
	}
	
	public void registermember(Member m) {
		Member m1=memberdao.getidentifier(m);
		if(m1!=null) {
			throw new DuplicateMemberException("등록된 멤버의 ID가 중복되어있습니다.");
		}
		else {
	memberdao.register(m);
	System.out.println("등록완료 ID: "+m.getId()+" pwd: "+m.getPwd() );
		}
		
	}

}

이렇게 memberdao 필드를 자동주입 시켜줌으로, 굳이 생성자를 이용한 의존주입을 하지 않아도 된다.

 

이번엔 메서드에 적용하는 것인데, 내가 의존주입하는 대상이 파라미터일 경우에 사용한다.

public class MemberPrinter {
   private MemberDao dao;
	
    
    @Autowired 
   public void setMemberDao(MemberDao dao) {
	   this.dao=dao;
   }
   

public void printMember() {
	 for(Entry<Integer,Member> entry : dao.getMap().entrySet()) {
		 System.out.println();
		 System.out.printf("ID : %d PWd : %d\n",entry.getKey(),entry.getValue().getPwd());
	 }
   }

}

이렇게 세터 함수의 파라미터를 자동주입 하고 싶은 경우, @Autowired를 사용하면, @Configuration 스프링 설정 클래스에서 별도의 설정 없이도 의존주입이 이루어진다.

 

필드에 @Autowired를 한 예.

@Configuration
@Import(AppCtx2.class) 
public class AppCtx1 {
	
	@Bean
	public MemberDao memberdao() {
		MemberDao m=new MemberDao();
		return m;
	}
	@Bean
	public MemberRegisterService mrsvc() { //생성자를 통한 의존주입 없이도 동작 가능.
    //필드에 @Autowired를 한 예.
		MemberRegisterService mrsvc=new MemberRegisterService();
		return mrsvc;
	}
	@Bean
	public PasswordChangeService pcsvc() {
		PasswordChangeService pcsvc=new PasswordChangeService(memberdao());
		return pcsvc;
	}

}

메서드에 @Autowired를 한 예.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppCtx2 {
	
	
	@Bean
	public MemberPrinter printer() {
		MemberPrinter printer=new MemberPrinter();
		//printer.setMemberDao(memberdao);
        //이렇게 세터 메서드를 사용하지 않아도, 
        //@Autowired가 알아서 의존주입 해준다.
		
		return printer;
	}
	

}

 

공부시간 40분.

순공시간 40분.

 

어제 잠을 못자서 그런지 오늘은 청년 일자리 카페에 와서 공부했지만 집중이 잘 안됬다.