관심쟁이 영호

[#9.2] 스프링 부트 ㅣ Spring Boot ㅣ Member 서비스 개발 본문

Bank-End/인프런- Spring 공부

[#9.2] 스프링 부트 ㅣ Spring Boot ㅣ Member 서비스 개발

관심쟁이 영호 2021. 4. 12. 17:57
반응형

어플리케이션 아키텍처

아키텍처를 살펴보면 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 - 웹 애플리케이션 개발"을 수강하면서 정리한 글입니다.

300x250
Comments