오늘, 인생 처음으로 RuntimeException을 던져봅니다!

YI Eun Gook·2020년 5월 10일
0

null 체크로부터 자유로워지기

제가 잠깐 약을 팔아도 될까요? 😚😚😙😚
RuntimeException을 사용한다면
null 체크로부터 자유로워질 수 있습니다!
한 번 보실래요?

before

적당~한 슈도 코드를 작성해볼게요!

class MemberService {
  public Member getMember(String id) {
    Member member = mapper.getMember(id);

    // 주석 1번: 아래에서 다시 설명할게요
    /*
      boolean isMember = (member != null);
      if (isMember) {
        return member;

      } else {
        return null;
      }
    */

    return member;
  }
}

class MemberController {
  @Autowired
  MemberService service

  @GetMapping(/member”)
  public ModelView member(String id) {
    ModelView mv = new ModelView(“member“);

    Member member = service.getMember(id);
    boolean isMember = (member != null);
    if (isMember) {
      mv.set(“member”, member);
    }

    return mv;    
  }
}

적당하죠~? 이걸 한 번 바꿔보겠습니다!

after

class MemberService {
  public Member getMember(String id) {
    Member member = mapper.getMember(id);

    boolean isMember = (member != null);
    if (isMember) {
      return member;

    } else {
      String format = “member가 조회되지 않았습니다. (id: %s);
      String message = String.format(format, id);
      throw new RuntimeException(message);
    }
  }
}

class MemberController {
  @Autowired
  MemberService service

  @GetMapping(/member”)
  public ModelView member(String id) {
    ModelView mv = new ModelView(“member“);
    return mv;    
  }
}

와! null 체크로부터 자유로워졌어요! >,<!!!!!

읭 아닌데요? 여전히 null 체크를 하고 있는데요?

아닙니다. 당신이 아닌 누군가는 null 체크에서 자유로워 졌을겁니다!

완벽을 보장하는 방법

음..
이제 아까 아무 말 없이 지나간 주석 1번을 다시 읽어봐주시겠어요?

사실 before의 MemberSerivce.getMember()는 주석 1과 동일하게 동작합니다.
null인줄 알아도 그대로 null을 리턴해주는 답답한 녀석이었어요!
하지만 이제는 완벽을 보장해줍니다.

만약 null이라면, 이후 모든 작업을 정지시킵니다.
(완벽하지 않다면 차라리 부숴버리겠어)

따라서,
/member에 접속했을 때, 접속이 정상적으로 되었다면
MemberController에서도,
member 뷰에서도
혹은 이후 만들어질 모든 MemberService.getMember()를 사용하는 모든 미래에서도
member는 null 체크 없이 자유롭게 사용할 수 있을 것입니다.

에러를 어떻게 생각하세요?

사실 이 RuntimeException을 발생시키는 전략을 사용하기 전에
위의 질문이 먼저입니다. ”에러를 어떻게 생각하세요?”

  1. 에러가 발생하면, 세션을 정지시켜야 한다.
  2. 에러가 발생하면, 사용자에게 최소한의 에러 메세지를 전달해야 한다.
  3. 에러가 발생하면, 몇 번인가 재시도 해본다.
  4. 에러가 발생해서는 안 된다.

이번 경우는 1번에 해당하는 작업이었네요.
2번이라면, 컨트롤러에서 확인하여 뷰를 분기할 수 있을 것 입니다.
3번은 쉽지 않습니다. 자칫 무한루프를 만들 수 있기 때문에 조심해야 합니다.
4번이라면, 최소 4명 이상이서 회의를 해야 하는 문제입니다. 회의 전에는 우선 3번으로 진행해보세요.

에.. 그러니까 지금부터가 제가 가장 하고 싶은 말입니다.

에러를 어떻게 생각하세요? ..에 대한 답변을 갖고 코드를 짜보자!

만약 1이라면, RuntimeException을 적극적으로 사용해보세요!
이상입니다! (끝)

차회예고 (이런 것도 있었어?)

다음에는 2번을 쫌 더 쉽게 해봅시다!

profile
= v =?;;

0개의 댓글