관심쟁이 영호
[#9.2] 스프링 부트 ㅣ Spring Boot ㅣ Member 서비스 개발 본문
아키텍처를 살펴보면 Controller와 Repository를 연결해주는 Service가 필요하다.
1. Service Pakage를 생성한다. 코드를 입력해준다.
// MemberService.class
//Repository와 똑같이 @Conponent를 가지고 있다. 똑같이 spring Component scan 단계를 거치도록 하기 위함인 듯 하다.
@Service
@Transactional(readOnly = true) //데이터 변경은 기본적으로 트랜잭션안에 있어야 한다.
@RequiredArgsConstructor // 자동 주입
public class MemberService {
//@Autowird를 추가한다면,
//EntityManager의 @PersistenceContext와 똑같이 자동 주입을 위함이겠지?
// 스프링 Bean에 등록되어있는 MemberRepository를 주입해줄 것이다!!
private final MemberRepository memberRepository;
@Transactional
//회원가입
public Long join(Member member){
validateDuplicateMember(member); //중복 회원 검증
memberRepository.save(member);
return member.getId();
}
private void validateDuplicateMember(Member member) {
//Exception
List<Member> findMembers = memberRepository.findByName(member.getName());
if(!findMembers.isEmpty()){
throw new IllegalStateException("이미 존재하는 회원입니다.");
}
}
//회원 전체 조회
public List<Member> findMembers(){
return memberRepository.findAll();
}
//회원 1명 조회
public Member findOne(Long memberId){
return memberRepository.findOne(memberId);
}
}
- db에 접근하는 리포지토리에게 실질적으로 명령을 내리는 클래스이다.
- @Service 어노테이션을 달고 Component Scan을 시켜준다.
- join, findMembers, findOne 메서드를 생성한다.
- vaildateDuplicateMember 매서드는 중복 회원을 찾아내는 매서드이다. 여기서 if문으로 가게된다면 예외가 터진다.
- 회원 정보 변경에 대한 모든 정보는 Transaction 내에서 이루어져야한다.
그래서 @Transaction을 달아준다.
여기서 옵션을 넣을 수가 있는데 (@Transaction(readonly = true))는 조회와 같은 메서드인 정보 조회분일때, 이용하는 것이다.
이렇게 옵션을 달아주면 스프링이 내부에서 최적화시켜 사용한다고 한다.
- 반대로 set처럼 정보를 변경하는 곳에서는 @Transaction만 해준다. default값이 @Transaction(readonly = false)이다.
- 여기서 @Autowired를 이용하여 MemberRepository를 주입해줄 수가 있는데, 이 방법을 이용하면 나중에 MemberRepository를 변경해야할 때, 번거롭다고 하신다.
그래서 새롭게 제안한 부분이
생성자에서 받아와서 주입을 해주는 것이다.
근데 그거마저 번거롭다하셔서
lombok에서 제공해주는 @RequiredArgsConstructor를 해준다.
이것은 final로 선언되어있는 피주입 객체에 주입을 해준다.
※ 좋은 꿀팁인 느낌이 있다. 하지만 아직까진 고통을 느껴보지못해서.. 유레카수준은 아니다!
본 강의는 인프런의 김영한 개발자님이 강의하고 계신
"실전! 스프링 부트와 JPA활용1 - 웹 애플리케이션 개발"을 수강하면서 정리한 글입니다.
'Bank-End > 인프런- Spring 공부' 카테고리의 다른 글
[#10] 스프링 부트 ㅣ Spring Boot ㅣ 상품 도메인 개발 (0) | 2021.04.14 |
---|---|
[#9.3] 스프링 부트 ㅣ Spring Boot ㅣ 기능 테스트, 테스트 코드 짜기 (0) | 2021.04.13 |
[#8] SpringBoot ㅣ 스프링 부트 ㅣ어플리케이션 아키텍쳐 (0) | 2021.04.10 |
[#7.4] Spring Boot ㅣ 스프링 부트 ㅣ 작성한 Entity Class 점검, 기타 내용 (0) | 2021.04.09 |
[#7.3] Spring Boot ㅣ 스프링 부트 ㅣ Entity Class 개발3 (0) | 2021.04.08 |