[인프런 - 스프링 입문] 3/19 개발공부일지 - 회원가입예제(예외 처리, 의존성 주입 등등등배가슴어깨하체)
하아, 생활코딩으로 java 맛보기하고 바로 실무 입문강의로 달려든 내가 무식해서 용감했다. 그래도 용감해서 부딪치면서 배운다.
어려움 개념들 투성이:)
나자신 칭찬...해 ㅋㅋ
주석 생성
콘솔에 /** + return 입력하면 아래처럼 주석이 생성된다.
Optional 선언 단축키
⌘+⌥+v 입력
memberRepository.findByName(member.getId());
이 코드가
요렇게 바뀐다. 그리고 이름 설정하면 된다.
Method 추출
코드가 많아지면 method는 별도 추출해낸다
⌃ + v 입력 후 Extract Method 선택하거나, ⌘+⌥+v 입력
코드에 오류 발생
(줄바꿈 시 세미콜론 사용 주의)
private void validateDuplicateMember(Member member) {
memberRepository.findByName(member.getId());
.ifPresent(m -> {
throw new IllegalStateException("이미 존재하는 회원입니다.");
});
}
확인해보니, ifPresent도 memberRepository.findByName(member.getId())에서 실행할 method인데,
세미콜론(;)으로 코드를 구별해놓았으니, method를 실행할 객체 없으니 오류가 날 수밖에 ㅎㅎ
오늘도 실패를 즐기자 ㅋㅋㅋ
repository class는 간결한 용어로 method 정의했지만, - 기계적으로 기능 구현에만 충실하게!
service class는 비즈니스에 관련된 용어들로 코드 작성해야 한다! - 비즈니스 의존적으로 설계한다.
자료형 이름
제일 앞글자는 대문자로
ex)String, List, Long and etc
Test 코드 작성
단축키: ⌘+⇧+T
네모박스 확인하고 체크하고 OK 선택!
테스트코드 method는 한글로 바꿔도 된다. 과감히!!
쉽게 알아보도록!
테스트 코드 작성 시 큰 뼈대를 잡기 위한 주석: given when then
//given 주어진 상황
//when 실행했을 때
//then 원하는 결과치
이 틀로 개발을 시작하고 100% 모든 경우에 맞지는 않으니 수정해가면서 사용하도록 추천!
자료형 입력 확인 (String vs Long)
String 입력해야 하는 자리에 Long으로 입력했더니 오류가 나는 것은 당연...
⌥+return 입력 후 되는 대로 선택했는데 내용 잘 확인하고 전체 코드가 어떤 식으로 구성되어 있는지 확인하면서 모든 선택에 대한 근거를 확인하자.
그냥 되는 대로 따라 가다가는 나는 어디로 흘러가 있을지.. 배우면서 최대한 따라간다지만 내 방향은 내가 잡고 가자.
method, class 파라미터 확인.
파라미터를 호출하려고 method를 입력했는데, method의 return값이 Long 인지, String 인지도 잘 확인해야겠다.
class type도 잘 확인해야 한다. 강사님은 현업에서 오래 하셨으니 자연스러운 게 당연한데, 나는 그런 시행착오들이 없었으니 지금의 시행착오가 당연한 거지 ㅋㅋㅋ
실패시여 반갑습니다.(꾸벅)
녹색불 영접!!! 하지만!!
TEST는 예외가 훨씬 더 중요하다!... 흑흑
예외 처리 TEST
그래서 예외 처리 코드 작성하고 build 했는데
코드 뜯어보니
member2 값이 null이어서 그런 듯 하다 ㅋㅋㅋㅋㅋ
작은 오타에도 예민하게 하자.
수정 후 성공적
throw new IllegalStateException("이미 존재하는 회원입니다.");
--------------------------------------------------------------------------
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.123");
코드 실행 시 출력하는 메시지에 대해 검증해보면
원래 나와야 하는 값과 다른 값이 나오니까 test fail로 뜬다. 정상 작동!
try catch로 예외 처리 코드 작성
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("이미 존재하는 회원입니다.");
}
}
하지만 동일한 기능 구현을 위한 다른 method 코드를 작성한다.
assertThrows(IllegalStateException.class, () -> memberService.join(member2));
회원가입 및 중복 회원 예외 처리 시 확인사항
서로 다른 method를 동작시킬 때, 먼저 실행된 method에 의해 생성된 값으로 다른 method 실행 시 영향을 미칠 수 있으므로 method 실행 후 데이터 저장소를 비워주는 기능을 추가해야 한다.
다음 코드를 추가해준다.
@AfterEach
public void afterEach() { //method 하나가 실행 종료될 때마다 실행되는 method!!(call-back method)
memberRepository.clearStore(); //테스트 종료마다 자료를 비워줌! - method 간 의존관계를 없애기 위해!
}
의존성 주입(Dependency Injection(=D.I.)
MemberService에서 MembereRepository를 사용도록 외부에서 넣어줌.
MemberService.class
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository; //MemberRepository 외부에서 넣어주도록 설정
}
MemberServiceTest.class
@BeforeEach
public void beforeEach() {
memberRepository = new MemoryMemberRepository();
memberService = new MemberService(memberRepository);
}