-
[스프링부트 Step 9] - 회원 서비스 개발 본문
자 이제 이어서 회원 서비스 클래스를 개발해보려고 합니다.
회원 서비스는 회원 레포지토리랑 도메인을 활용해서 비즈니스 로직을 작성할 수 있습니다.
자 그래서
다음과 같이 service 패키지를 생성 후 클래스를 생성합니다.
회원 서비스를 만드려면 회원 레포지토리가 제일 우선적으로 있어야 합니다.
그래서 MemoryMemberRepository의 자식인 MemberRepository를 상속해서 가져옵니다.
여기서 MemberRepository가 인터페이스였고 MemoryMemberRepository는 부모 클래스였습니다.
그리고 이렇게 작성을 할 것인데, /**라고 입력하면 자동으로 파라미터 등을 입력하게끔 나옵니다.
또한 Id를 Long타입으로 선언했었기 때문에 return도 Long타입이 되어야 하므로 join메서드를 Long타입으로 만듭니다.
그리고 안에 들어갈 인자는 Member의 member가 들어갈 것이고 memberRepository에 member를 저장하는 것이 회원가입의 목표이기 때문에 Id를 반환해주는 것이 목적입니다.
그 다음에 같은 이름을 가진 회원이 있으면 안되잖아요???
그래서 중복을 허용하지 않기 위해 memberRepository에서 findByName으로 이름을 찾아봐야겠지요.
그래서 join메서드 내부에 다음과 같이 입력합니다.
이후 윈도우 기준으로 ctrl + alt + v를 누르면
이렇게 바뀝니다 ㅋㅋㅋ..
변수명은 result로 하겠습니다. 정말 편리하죠?
자 그리고
라고 입력합니다.
이렇게 하면 찾아온 getName()을 result에 저장한 뒤 이 result가 존재한다면 람다식을 이용해 풀어나갑니다.
Optional이기 때문에 ifPresent가 가능한 것입니다.
Optional은 member라는 객체를 감싸고 있다고 이해해봅시다.
그래서 과거에는 if (m == null) {~ 이렇게 입력해왔지만 이젠 Optional로 null을 포함한채로 꺼내올 수 있습니다.
이게 아니면 result.getorElse라는 함수를 이용해서 값이 없으면 꺼낸다 이렇게 쓸 수도 있습니다.
(추가적으로 IllegalStateException은 예외 처리문법입니다.)
근데 result에 꺼내와서 이걸 번거롭게 다시 ifPresent를 거치는 것이 번거롭다면 저 4줄을 쭉 드래그 한 뒤 ctrl + alt + m을 눌러서 Exctract method를 실행합니다.
이걸 하게되면 메소드를 뽑아올 수 있습니다.
이렇게 자동으로 생성이 됩니다. (중복 회가 아니라 중복 회원인데 회로 나오네요)
설명을 하자면 validateDubplicateMember라는 메서드에 member가 들어가서 정말로 회원이 존재하는지 살펴봅니다.
그래서 아래의 메서드에서 memberRepository라는 곳에 member의 name을 찾아서 만약 있으면 오류를 throw하고 이미 등록된 회원입니다. 라고 보냅니다.
이후 만약 member가 중복되지 않는다면 memberRepository에 member를 save하고 return member.getId()하여 ID를 반환해주면 끝납니다.
자 그다음 전체 회원 조회하는 기능도 만들어봅시다.
예전에 우리가 MemberRepository에서 메서드를 만들 때 findById나 findByName같은걸 보면 그냥 뭔가를 찾거나 뭔가를 저장한다는 이름이 많았습니다.
근데 이번 서비스 클래스에서 만든 메서드들을 살펴보면 join, findMembers 등 비즈니스에 가깝습니다.
보통 그래서 서비스 클래스는 비즈니스 서비스에 가까운 이름을 주로 사용합니다.
실무에서 어떤 문제가 생겼을 때 아 join을 살펴보자 이게 자연스럽지, findById를 살펴보자 이건 좀 자연스럽지 않다고 할까요..
따라서 서비스는 비즈니스에 굉장히 의존적이라고 할 수 있습니다.
반면 레포지토리는 서비스보다는 단순히 기계적으로 개발적인 용어를 쓰게 됩니다.
그래서 해당 Role에 알맞게 개발하는 습관을 길러야 겠습니다.
마지막으로 findMember와 findOne을 정의합시다.
findMember메서드는 회원을 찾는 메서드로서 List타입으로 존재할 Member들을 모두 찾을 것입니다.
따라서 return할 때는 memberRepository에 있는 모든 것들을 find해서 반환합니다.
findOne은 Long타입의 memberId를 넣을 것인데, memberId를 memberRepository에서 찾아서 반환합니다.
이렇게 정의하면, findMember와 findOne의 기능을 사용할 수 있게됩니다.
감사합니다.
'백엔드 기술 정리 > 스프링 부트' 카테고리의 다른 글
[스프링부트 Step 11] - 컴포넌트 스캔과 자동 의존관계 설정 (0) | 2022.01.01 |
---|---|
[스프링 부트 Step 10] - 회원 서비스 테스트 (0) | 2022.01.01 |
[스프링 부트 Step 8] - 회원 레포지토리 테스트 케이스 (0) | 2021.12.27 |
[스프링 부트 Step7] - 웹 앱 구조와 테스트 케이스 (0) | 2021.12.25 |
[스프링부트 Step6] - API란? (0) | 2021.12.23 |