스프링 빈과 의존관계 + 회원관리 mvc 예제

YJ·2021년 8월 17일
0
post-thumbnail

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

@Controller, @Service, @Repository를 통해 빈으로 등록한다.

@Controller, @Service, @Repository 세 가지 어노테이션은
@Component + 추가적인 기능을 붙인 것이다. @Component
어노테이션을 클래스에 붙이게 되면 서버 실행 시 스프링
컨테이너가 자동으로 해당 어노테이션이 붙은 클래스를
스프링 빈으로 등록한다. 이를 컴포넌트 스캔이라한다.


위와 같이 MemberController를 @Controller 어노테이션으로
스프링 빈으로 등록한 후 자동 의존관계 설정을 위해
@Autowired라는 어노테이션을 기재해준다. @Autowired를
기재하면 스프링 컨테이너는 MemberService라고 등록된
빈을 찾아 자동으로 주입해준다.
이를 DI(Dependency Injection), 의존관계 주입이라고 한다.
그런데 위의 예제에서는 생성자를 통해 DI를 진행했기 때문에
생성자 주입이라고 한다. 스프링은 기본적으로 객체들을
싱글톤으로 관리하며, 생성자 주입 시 생성자가 하나라면
@Autowired를 생략 가능하다.



MemberController의 생성자에서는 MemberService를 원하고,
MemberService의 생성자에서는 MemberRepository를 원하므로
해당 클래스들을 위와 같이 bean으로 등록 해두어야한다.


의존관계 주입은 생성자 주입 뿐만 아니라 필드에 
@Autowired, setter에 @Autowired를 붙여서 
의존관계를 주입하는 필드 주입, setter 주입 등도
존재한다. 하지만 여러 문제들이 발생할 수 있어서 
권장하지 않는다. 생성자 주입을 사용하도록 하자.

생성자 주입의 이점에 관련된 링크
https://madplay.github.io/post/why-constructor-
injection-is-better-than-field-injection



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

@Service, @Repository, @Autowired 어노테이션을
제거한 후 클래스를 하나 만든다.

해당 클래스는 스프링 빈 구성정보라는 것을 의미하는
@Configuration이라는 어노테이션을 붙인다. 그 후
@Bean 어노테이션을 붙여서 해당 빈으로 등록
객체를 반환해주는 메소드를 만들어주면된다.


실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은
코드는 컴포넌트 스캔을 사용한다. 하지만 정형화 되지 않거나,
상황에 따라 구현 클래스를 변경해야 한다면 설정클래스를
통해 스프링 빈으로 등록한다.



🍋 홈 화면 추가 (화면)


localhost:8080 요청 시 “/” mapping이 있기 때문에
home.html이 요청되고 index.html은 요청되지 않는다.


컨트롤러에 매핑 값 있는지 체크 -> 있다면 해당 작업 수행
없다면 static에서 해당 명칭의 파일 있는지 찾기



🍉 회원 가입 (화면)

위의 home.html의 회원 가입을 누르게 되면 controller에서
/members/new라는 매핑 값을 찾아보게된다.

해당 url을 통해 controller의 createForm 메소드
들어오게 되며 members/createMemberForm.html로 이동시킨다.



creteMemberForm.html의 input 태그의 name 값은 서버로
넘어갈 때, key 값을 한다. 즉, 스프링을 사용하면 input 태그의
name 속성의 값을 서버에서 매개변수로 받을때, String {name}
으로 받아줄 수도 있고, 객체 안에 {name}이라는
필드 값을 생성해, 해당 객체로 받았을 시 동일한 이름의
필드값을 자동으로 채워넣는다. 예시는 바로 아래서 보겠다.
또 등록 버튼을 눌렀을 시 action에 기재된 url로 post 방식으로
보내주게된다. 이 때, url 값이 이미 MemberController에
존재하지만 해당 값은 get 방식이고, 여기서는 post 방식
사용하기 때문에 동일한 이름으로 사용해도 다른 방식으로
처리가 된다.



MemberForm을 만들고 필드 값의 변수명은 name으로
만든다. 이 때 createMemberForm의 input 태그의 name
속성 값과 같은 변수명을 지정한 것이다. 그 이유가
url로 들어온 처리 메소드를 작성할 시 매개변수로
MemberForm 객체를 사용할 시 자동으로 input 태그의
name 속성 값이 MemberForm의 필드 값에 채워지도록
하기 위해서이다.



이 화면에서 create 메소드의 매개변수로 MemberForm을
사용하고 있고, 해당 클래스의 필드 값의 변수명은 name이다.
또 createMemberForm.html의 input 태그의 name 속성 값도
name이다. 따라서 이 값은 넘어올때 자동 매핑되어
MemberForm 객체의 name 속성 값에 들어가게 된다.
즉, 이유진이란 값이 입력됐다면 MemberForm의 name에는
이유진이 들어가 있는 것이다.



🍇 회원 목록 (화면)

home.html에서 회원 목록을 클릭 시 컨트롤러에서
/members url 매핑 값을 찾아서 동작하기 때문에
MemberController에 해당 매핑 메소드를 추가해준다.


모든 회원들을 검색해서 해당 값을 model에 담아서
memberList.html로 리턴해준다.



memberList.html에서는 template engine thymeleaf를 이용해
members 안의 member 객체를 차례대로 반복문으로 돌려
member.id와 member.name을 출력해준다.




해당 포스팅은 인프런 김영한 개발자의 스프링 입문 강의를 공부목적으로 정리한 글입니다.

profile
hi

0개의 댓글