이번 시간에는 자바코드로 직접 스프링 빈을 등록하였다~~
이전 시간에는 어노테이션을 추가해서 스프링 컨테이너에 자동으로 등록을 했는데,
이번 시간에는 직접 등록하기 위해서 애노테이션을 제거하고 진행했다.
컨트롤러는 그대로 두고 나머지 서비스, 리포지토리의 어노테이션과 Autowired도 지워줬음.
SpringConfig 자바 클래스를 생성하고 @Configuration 어노테이션을 달아준다.
이렇게 하면 스프링이 뜰 때, Configuration을 읽고, Bean 어노테이션을 확인하고 스프링 빈에 등록을 하라고 인식한다.
그리고 작성된 클래스의 로직을 호출해서 스프링 빈에 등록을 해준다.
그리고 파라미터 값을 확인하는 Ctrl + P 단축키를 눌러서 필요한 파라미터를 확인하고,
파라미터인 MemberRepository를 넣어주기 위해 다음 코드를 작성한다.
MemberRepository는 인터페이스이기 때문에 구현체인 MemoryMemberRepository를 리턴해준다.
그리고 MemberService의 파라미터값으로 memberRepository를 넣어준다.
이렇게 작성을 하면, 스프링이 뜰 때, memberService랑 memberRepository를 둘 다 스프링 빈에 등록을 하고,
스프링 빈에 등록되어있는 memberRepository를 memberService에 넣어준다.
이렇게 직접 연결시켜주면 Autowired 같은 역할을 한다~~
Controller는 어차피 스프링이 관리하는 것이기 때문에, 어노테이션이 있어야 함..ㅋㅋㅋㅋ
그래서 Controller는 컴포넌트 스캔으로 올라가고, MemberController의 파라미터인 memberService를 필요로 하는데,
아까 직접 등록한 memberService를 Autowired로 빈 객체로 등록한 컨트롤러에 넣어준다.
물론 자동으로 컴포넌트 스캔하고 Autowired로 등록하는게 편하지만, 장단점이 있음!
과거에는 자바코드말고, xml파일로 설정했지만 최근 실무에는 잘 사용하지 않음.
DI의 종류에 대해서 소개를 해주셨는데, DI에는 필드 주입, setter 주입, 생성자 주입.
이렇게 3가지가 있다고 한다.
MemberService에서 확인해보면, MemberService는 생성자를 통해서 들어옴.
이런것을 보고, 생성자 주입이라고 한다.
Controller도 마찬가지로, 생성자 메소드를 통해서 memberService가 memberController에 주입된다.
필드주입은, 생성자를 빼고 위의 코드처럼 필드에다가 직접 Autowired를 주입하는 것.
하지만 스프링 뜰 때만 의존성을 넣어주고, 바꿀수 있는 방법이 없기 때문에,
유지보수 측면에서 좋지 않다는 단점이 있음ㅜㅜ
Setter를 만들어주고 Autowired 어노테이션을 달아준다.
Setter를 통해서 주입을 해주는 방식을 Setter 주입이라고 한다.
Setter 주입의 특징은 누군가가 MemberController를 호출했을 때, Setter는 public으로 열려있어야 됨.
그렇게 public으로 노출되어 있기 때문에 안전성이 떨어진다는 단점이 있음.
이렇게 MemberService에서 Setter 주입을 해주고 Autowired 어노테이션을 추가해주면,
public으로 되어 있기 때문에, 이렇게 memberService. 을 입력해서 아무 개발자나 호출이 가능해진다.
강사님의 말씀은 개발할 때는 주의해야될 점은, 호출되지 않아야할 메소드는 호출이 되면 안된다고 한다.
여러 주입방법 중에서 실무에서는 의존관계가 실행중에 동적으로 변하는 경우가 없으므로,
생성자 주입을 권장한다고 한다.
컴포넌트 스캔으로 하면, db가 바뀔때 여러 코드를 바꿔야되지만,
직접 설정파일을 관리하게 되면, 여러 코드를 수정할 필요 없이 설정 파일만 수정해주면 된다는 장점이 있다!
댓글