스프링 핵심 원리 - 기본편 - 인프런 | 강의
스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 백엔드 개발자가 되어보세요! 📢
www.inflearn.com
본 글은 인프런 김영한 님의 스프링 강의를 기반으로 작성하였습니다.
강의 자료의 출처는 위와 같음을 알립니다.
멤버 서비스 구현

리포지토리 패키지 내에 service 패키지와 MemberService 클래스를 만들어준다

코드를 다음과 같이 생성해준다
중복 회원 검사
우리는 같은 이름의 회원이 있어서는 안된다
어떻게 구현해야 할까???

위와 같이
memberRepository의 findByName 메서드로
member에서 넘어온 파라미터를 getName()을 통해 받아준 후
비교를 한다
팁 : Optional 객체 생성



우와 같이 Optional<Member> result에 넣어주고
검사를 해준다
result.ifPresent() 는 값이 있으면 실행
없으면 넘어간다
Optional의 장점
위 메서드는 Optional이기 때문에 가능하다.
Optional이 아니었다면 NULL이기 넘어오기 때문에
ifNull의 메서드를 사용했을 것이다
Optional로 감싸주면
Optional 내에 멤버 객체가 있는 것이기 때문에
Optional을 통해 더 많은 메서드를 사용할 수 있다
사실 위와 같은 코드보다 더 가독이 좋게 코딩할 수 있다

Optional 없이 깔끔하게 만들 수 있다

사실 이렇게 기능이 생겨버리는 경우에는 따로 메소드로 추출하는 것이 좋다
팁 : 메서드 추출




최종적으로 join이라는 메서드가
멤버의 복수성을 검사하고 통과하면
memberRepository에 저장한다고
코드를 이해할 수 있다
참고 : 서비스 쪽 명명은 좀 더 비즈니스적인 용어(join)를 선택하고
리포지토리 쪽은 기계적인 용어(save)를 택하는 경향이 있다
public List<Member> findMembers(){
return memberRepository.findAll();
}
public Optional<Member> findOne(Long memberId){
return memberRepository.finById(memberId);
}
우와 같이 나머지 기능은 리포지토리 패키지의 메서드로 쉽게 구현할 수 있다
회원 서비스 테스트
팁 : 테스트 생성


그러면 다음과 같이 테스트를 위한 프레임이 만들어진다


Test 코드 작성
test 코드는 실제 코드에 반영되지 않기 때문에 과감하게 한글로 작성해도 좋다

1. given
2. when
3. then 으로 구성하여 테스트하면
편리하게 테스트를 진행하고 코드를 이해할 수 있다.
예외 처리
@Test
void 회원가입() {
//given
Member member = new Member();
member.setName("hello");
//when
Long saveId = memberService.join(member);
//then
Member findMember = memberService.findOne(saveId).get();
assertThat(member.getName()).isEqualTo(findMember.getName());
}
위 코드는 성공적으로 돌아가지만 반쪽자리 테스트라고 할 수 있다
join() 메서드의 중요한 검증 절차 중 하나는
중복에 의한 예외가 정상적으로 작동하는지도
테스트 해보아야 한다
@Test
public void 중복_회원_예약(){
//given
Member member1 = new Member();
member1.setName("spring");
Member member2 = new Member();
member2.setName("spring");
//when
memberService.join(member1);
try {
memberService.join(member2);
fail();
} catch (IllegalStateException e){
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
}
}
try-catch 구문을 통해 에러를 검사해 볼 수 있다


하지만 try-catch 구문은 복잡하니
우리는 assertThrows를 통해 편리하게
에러를 날릴 수 있다
@Test
public void 중복_회원_예약(){
//given
Member member1 = new Member();
member1.setName("spring");
Member member2 = new Member();
member2.setName("spring");
//when
memberService.join(member1);
IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
혹은 이렇게 만들 수 있다
이 test 역시 할 때마다 DB 값을 clear 해주어야 한다


test에서 이렇게 인스턴스를 다르게 하면
이전에서 static으로 선언되지 않은 경우
repository가 달라지면서 문제가 발생할 수 있다
따라서 한 인스턴스로 선언하는 좋다
통합 방법



이것을 DI(Dependency Injection)이라고 한다
'Spring' 카테고리의 다른 글
| [Spring / 스프링 입문] 04. 회원 관리 예제(1) - 백엔드 개발 (0) | 2023.07.04 |
|---|---|
| [Spring / 스프링 입문] 03. Spring 웹 개발 기초 (0) | 2023.07.03 |
| [Spring / 스프링 입문] 02. View 환경 설정 및 빌드 & 실행 (0) | 2023.06.30 |
| [Spring / 스프링 입문] 01. 스프링 환경 설정 (0) | 2023.06.27 |