Replies: 1 comment 1 reply
-
|
정리 잘해주셨습니다... 아마도 내일은 세연님 중심으로 스터디가 진행되겠군요 ㅎㅎ |
Beta Was this translation helpful? Give feedback.
1 reply
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
4_스프링 빈과 의존관계
스프링 빈을 등록하는 방법에는 2가지 방법이 존재한다.
컴포넌트 스캔과 자동 의존관계 설정
@Controllernew로 생성해주는 방법을 사용하지 않는 이유 ?
memberService를 가져다 써야하는 경우에 이것을 new로 생성해주는 방법도 있다. 하지만, 이렇게 하게되면 이 memberService를 다른 여러 컨트롤러들이 사용할 때 마다 계속 new 하여 객체를 생성해야한다는 단점이 존재한다. 여러 개의 인스턴스를 생성할 필요 없이 하나만 생성해서 같이 공통으로 쓰면 되기 떄문에, 스프링 컨테이너에 등록하는 방법을 이용한다.
MemberController.java컨트롤러 내 필드에 MemberService를 선언하고, 생성자를 만든다음에
@Autowired어노테이션을 붙이면 스프링 컨테이너가 뜨고 이 객체가 생성이 될 때, 생성자를 호출하고 스프링 컨테이너에 있는 MemberService를 가져다가 연결을 시켜준다.=> 하지만 위의 코드에서 "memberService가 스프링 빈으로 등록되어있지 않다" 라는 오류가 발생함
@Autowired는 명시가 되어있지만, memberService에는 아무런 어노테이션이 없어서 스프링이 인식할 수 있는 방법이 없다. 따라서 memberService에도@Service어노테이션이 명시되어 있어야 한다. 그리고 레포지토리에도@Repository어노테이션을 명시하는 것이 정형화된 패턴이다. 이렇게하면 스프링이 뜰 때, 컨트롤러 서비스 리포지토리를 모두 가지고 올라온다.MemberService.javaMemberRepository.javaDI(Dependency Injection) : 의존성 주입
Controller와 Service를 연결시키기 위해
@Autowired어노테이션을 이용한다.Controller 클래스 내의 생성자에
@Autowired를 명시하면, Controller가 생성이 될 때 스프링 빈에 등록되어있는 Service 객체를 가져다가 넣어준다. 이것을 DI(의존성 주입) 이라고 한다.💡 코드로 이해하는 과정
Controller 클래스 내의 필드에 Service 객체를 선언하고 (Controller는 Service가 필요하니까)
Controller 생성자를 선언한다. (Controller 클래스니까)
이 때, 그 생성자에
@Autowired를 명시하게 되면 Controller가 생성될 때, 스프링 빈에 등록되어있는 Service 객체를 가져다가 넣어주게 된다.Service 클래스 내의 필드에는 Repository 객체를 선언하고 (Service는 Repository가 필요하니까)
Service 생성자를 선언한다. (Service 클래스니까)
이 때, 그 생성자에
@Autowired를 명시하게 되면 Service가 생성될 때, 스프링 컨테이너에 있는 Repository 객체를 가져다가 넣어주게 된다.🚨 중간에 memoryMemberRepository와 관련한 오류가 발생했음
해당 파일에도 레퍼지토리 어노테이션을 추가하니 오류가 해결됨
즉, 컨트롤러는 서비스가 필요하고, 서비스는 레퍼지토리가 필요하다.
✅ 정리
스프링 빈을 등록하는 2가지 방법 중 첫번째 방법인 컴포넌트 스캔과 자동 의존관계 설정이 어노테이션을 사용하는 방법에 해당한다.
@Service,@Controller,@Repository어노테이션에 각각 모두 들어가보면@Component어노테이션을 담고 있다는 것을 확인할 수 있다. spring을 띄울 때,@Component와 관련한 어노테이션이 존재하면, 그것들에 대한 spring 객체를 하나씩 생산하여 스프링 컨테이너에 등록한다. 그리고나서@Autowired은 연관관계를 맺어준다. (선을 연결해준다.)➕ 참고
자바 코드로 직접 스프링 빈 등록하기 ⭐
더 중요한 방법이다. 이 방법에서는 하나하나 직접 스프링에 등록하는 방법을 사용한다.
우선 Controller 파일을 제외한 Service와 Repository에서 위에서 작성한 어노테이션들을 지우고 시작한다.
Controller는 Spring이 관리하는 것이기 때문에 그냥
@Controller어노테이션과@Autowired를 사용하여 명시해줘야한다.main/java/hello/hellospring/SpringConfig.java파일 생성DI(의존성 주입)의 3가지 방법
@Autowired하는 방법이다.@Autowired를 명시하는 방법이다.Beta Was this translation helpful? Give feedback.
All reactions