developer/인프런 - 스프링 입문

[인프런 - 스프링 입문] 3/19 개발공부일지 - 회원가입예제(예외 처리, 의존성 주입 등등등배가슴어깨하체)

페달파워 2023. 3. 19. 15:17

하아, 생활코딩으로 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);
}