[스프링부트] 개발 전 회원컨트롤러+회원서비스+회원저장소 의존관계 설정하기 @Controller, @service, @repository 06
안녕하세요 jju_developer입니다.
오늘도 어김없이 스프링부트를 개발하기 전
기초 테스트 겸 공부 겸 겸사겸사 기초적인 내용들로 스프링 빈을 등록하고
의존관계를 설정하는 부분을 해보겠습니다.
우선 지난시간에 한 내용들에 이어서 오늘은 MemberController를 생성하고
해당 컨트롤러와 지난 시간에 생성한 서비스랑 이어주는 부분을 진행을 하고자 합니다.
1. controller -> MemberController 생성
회원 컨트롤러에서 회원 서비스에 대한 내용을 사용할 것이기 때문에
생성자를 만들어주고 나서, 회원 서비스에도 그에 맞는 에노테이션을 달아주어야 합니다.
회원서비스에는 @service
회원저장소에는 @repository
회원 컨트롤러의 생성자위에는 @Autowired
이렇게 각각 에노테이션을 달아서 스프링부트에게 알려주는 것입니다.
2. service -> MemberService : @service 추가
3. repository -> MemoryMemberRepository : @repository 추가
요렇게 까지 정형화된 기본 설정을 해줍니다!
이렇게 하면 스프링이 뜰 때 컨트롤러, 서비스, 저장소까지 생기게 됩니다.
회원 컨트롤러가 등록이 될 때 dependency injection을 해야겠죠?
회원 서비스에도 생성자 위에 Autowired를 넣어주어야 합니다.
서비스를 등록할 때에 생성자도 자동으로 등록이 되게끔 해야 합니다.
구현체에 메모리회원저장소가 있으니까 그게 정상적으로 작동하도록 연결해 주는 것입니다!
package org.project.whipping.service;
import org.project.whipping.domain.Member;
import org.project.whipping.repository.MemberRepository;
import org.project.whipping.repository.MemoryMemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@Service
public class MemberService {
//회원 저장소 먼저 불러오기
private MemberRepository memberRepository = new MemoryMemberRepository();
@Autowired
public MemberService(MemberRepository memberRepository){
this.memberRepository = memberRepository;
}
//회원가입
public Long join(Member member){
validateDuplicateMember(member);
memberRepository.save(member);
return member.getId();
}
//중복 회원 검증
private void validateDuplicateMember(Member member) {
memberRepository.findByName(member.getName())
.ifPresent(m->{
throw new IllegalStateException("이미 존재하는 회원입니다.");
});
}
//전체 회원 조회
public List<Member> findMembers(){
return memberRepository.findAll();
}
public Optional<Member> findOne(Long memberId){
return memberRepository.findByID(memberId);
}
}
/* 옵셔널을 바로 반환하는것은 좋지 않다.s
Optional<Member> result = memberRepository.findByName(member.getName());
result.ifPresent(m->{
throw new IllegalStateException("이미 존재하는 회원입니다.")
});
*/
여기서 잠깐
컴포넌트는?
[ 컴포넌트 특징 ]
- 빈 이름 기본 전략 : 가장 앞 문자를 소문자로 바꾼 것이 빈 이름이 된다
ex) MemberServiceImpl --> memberServiceImpl - 빈 이름을 수동으로 지정 : @Component("지정할 이름")
- 기본적인 컴포넌트 스캔 대상
- @Component : 컴포넌트 스캔에서 사용
- @Controller : 스프링 MVC 컨트롤러에서 사용
- @Service : 스프링 비즈니스 로직에서 사용
- @Repository : 스프링 데이터 접근 계층에서 사용
- @Configuration : 스프링 설정 정보에서 사용
- 컴포넌트 스캔 범위
- @ComponentScan 어노테이션이 있는 파일의 패키지 아래를 찾는다.
- basePackages / basePackageClasses로 지정도 가능
- 권장 방법 : 구성파일에 등록 시프로젝트 최상단에 두기
(SpringBoot 사용시라면 @SpringBootApplication에 포함되어 있어서 자동으로 최상단으로 유지된다)
즉, @component라는 어노테이션이 스프링 빈으로 등록을 시켜주는 것인데
우리는 @컨트롤러 @서비스 @리포지토리 만 했을 때에도 스프링 빈으로 등록이 되었는데..
그 이유는 바로 저 세게는 @컴포넌트를 포함하고 있기 때문입니다!!!
참고로 스프링은 스프링 컨테이너에 스프링빈을 등록할 때 기본적으로 싱글톤으로 등록합니다.
그러면, 스프링 빈에 등록을 시키면 어디에서도 동일한 것을 반환할 수 있는 장점이 있죠? ㅎㅎ
다음시간에는 회원 관리 예제
회원 웹 기능: 홈화면 추가, 회원 등록, 조회를 하도록 하겠습니다.
고생하셨습니다.