스프링 빈과 의존관계

링딩·2022년 7월 1일
0

스프링 입문

목록 보기
2/2

섹션4- 스프링 빈과 의존관계

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

*스프링 빈 생성과정

  1. 스프링이 생성시, 스프링 컨테이너 통이 처음으로 생긴다.
  2. @Controller 표시가 되어있는 클래스는 해당 객체를 생성 및 스프링에 소위 담아둠.
    => 이 과정을 스프링 컨테이너에서 ‘스프링 빈’을 관리한다고 >함.

Q, 스프링 빈으로 자동 등록된 이유? (답): 컴포넌트 스캔 때문이다.

  • 생성자에 @Autowired
  • MemberController 객체 생성시에 ‘스프링 빈’에 등록되어 있는 memberService 객체를 ‘스프링 컨테이너’에서 찾아서 이어주게 된다.
  • ‘의존성 주입’(DI) : 이렇게 객체 의존관계를 외부에서 넣어주는 것을 말함.


🎉 스프링 빈을 등록하는 2가지 방법

1. 컴포넌트 스캔과 자동 의존관게 설정(@Component, DI)
2. 자바 코드로 직접 스프링 빈 등록하기.(다음 시간)


1번: @Component 애노테이션을 포함되었다면 자동등록!

  • 다음과 같이 포함되어있는 (@Controller,  @Service, @Repository )  애노테이션들 또한 ‘스프링 빈’으로 자동 등록됨.

2. 자바 코드로 직접 스프링 빈 등록하기

  1. MemberService와 MemoryMemberRepository에 있던 기존 애노테이션들(@Service , @repository, @Autowired) 제거함.
  2. 컨트롤러의 애노테이션들은 삭제하지 않은 상태로, Service 항목의 파일에 직접 빈을 등록시킴.


✨(참고사항) DI 주입 방법.

1. 생성자 주입 (강력추천~~)

2. 필드 주입

3. Setter 주입

단점) 누군가 해당 클래스를 호출하면 언제던 이 메소드는 public 상태를 유지해야 함.
-> 이로써 잘못 호출 및 바꾸는 실수로 문제가 생길 수 있음.

*(참고사항3)

  • 실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 ‘컴포넌트 스캔’을 사용함.
  • 그리고 정형화 되지 않거나, 상황에 따라 (ex 아직 데이터저장소 선정x) 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록해준다.

=>(2번의 장점임) 1번과 달리, 이후에 구현체 코드를 일절 손대지 않고도 다른 저장소로 바꿔치기가 가능.

*(참고사항4)

  • @Autowired를 통한 DI는 스프링이 관리하는 객체에서만 동작(helloController, memberService...)

=> 즉 스프링 빈으로 등록하지 않고, 내가 직접 생성한 객체라면 DI 동작하지 X..








섹션5- 회원관리예제 (웹 MVC 개발)

회원 웹 기능 _홈화면 추가

  1. 홈 컨트롤러 추가 ->home.html
    ->처음 화면 제공
  1. 회원 관리용 홈 (home.html)

Q. 여기서 문제 왜 기존에 index.html로 넘어가지 않고 home.html이 바로 실행될까?

=> 정적 컨텐츠의 실행 순서는 1. 입력받은 url을 스프링에서 관련 컨트롤러가 있는지 찾아봄 2. 없다면 넘기고 .static 폴더에서 있는지 찾아보게 됨.
=> 1번에서 해당 컨트롤러가 명시되어있어서 2번까지 가지 않고 바로 해당 리턴값의 경로로 실행되었기 때문에 index.html을 거치지 않은 것이다.



회원 웹 기능 _등록

@GetMapping -> 데이터를 조회할 때 (조사)
@PostMapping -> 데이터를 담아서 전달, 등록할 때 (
조사)

  • “redirect: 주소” -> 이 주소로 넘겨라

(@GetMapping 전달과정)

  1. 리턴값대로 templates 폴더의 경로로 보내줌.
  2. ‘뷰 리졸버’를 통해 해당 html을 띄워줌.

  1. 해당 html에서 입력받은 name 값이 MemberForm으로 전달받고 setName()으로 인해 저장됨.
  2. method=“post”타입으로 해당 컨트롤러로 보내줌

(질문?) @PostMapping 리턴값이 ‘redirect:/’ 은 뭐인가?
답: 홈화면으로 보냄




회원 웹 기능 _조회

  1. service 내의 MemberService의 전체 멤버 조회인 findMembers()를 메소드 실행 결과를 members 객체에 넣어줌
  2. 이 members 객체를 model에 넘겨줌
  3. memberList.html이 실행

<memberList.html>

  • ${members} 는 model 안의 members 객체를 넘겨줬음.
  • each=“” 는 타임리프 문법으로 루프를 도는 것이다.(반복)
  • ${member.id}와 ${member.name}은 id와 name이 private이기 떄문에 getter setter에서 받아옴.
profile
초짜 백엔드 개린이

0개의 댓글